Release Notes 2023-07-08

Version Information

OpenEdge Release

Version Information

11.7.9, 11.7.10, 11.7.11, 11.7.12, 12.2, 12.6, 12.7 CQC

Release 11.7 #76823@2023-07-08

Security Bulletin - log4j CVE-2021-44228

Further details: log4j CVE-2021-44228

OpenEdge 12.7 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.7. We hereby declare OpenEdge 12.7 fully supported for the SmartComponent Library as of the release of  May 10th 2023.

OpenEdge 12.6 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.6. We hereby declare OpenEdge 12.6 fully supported for the SmartComponent Library as of the release of  October 4th 2022.

OpenEdge 12.2 support!

We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.2. We hereby declare OpenEdge 12.2 fully supported for the SmartComponent Library as of the release of April 09th 2020.

.NET Framework Version 4.7

.NET 4.7 is not supported with OpenEdge 11.x, see: Is .NET 4.7 certified and supported for OpenEdge? 

Progress has reported severy issues with OpenEdge GUI for .NET and .NET 4.7: GUI .Net Application crashes after .Net upgrade to 4.7

When using the .NET Framework 4.7, please make sure, you upgrade to OpenEdge 11.6.4 or OpenEdge 11.7.2 or later. Also, it may be required to recompile the application on a PC running .NET Framework 4.7 when applications are also executed on a PC with .NET Framework 4.7.

Introducing the SmartComponent Library developer forum

Got questions about using the SmartComponent Library? Wish to discuss feature requests with other users of the SmartComponent Library? To facilitate networking in the growing number of SmartComponent Library users and developers, we've added a developer forum on our new home-page. The developer forum can be found at: https://www.consultingwerk.com/support/forum 

A login is required to participate in the forum. Don't be shy - create your account today!

Release Notes

Following the release of the OpenEdge 11.7 Release we have completed our testing of the SmartComponent Library on this release of Progress and are proud to announce formal support for the SmartComponent Library on OpenEdge 11.7 with the 2017-04-24 release of the SmartComponent Library. Generally we recommend customers on OpenEdge 11 to upgrade to OpenEdge 11.7 quickly. Starting the 2017-07-14 release we are supporting OpenEdge 11.7 Service Pack 1 (11.7.1).

Starting the 2015-10-09 release the Business Entity Designer will feature a start page with links to most recent release note articles on this site.

With SCL-751 we have adopted native Enums for OpenEdge 11.6. To activate this feature customers must add a definition to products.i. SCL-751 provides details for this.

With SCL-1113 we have modified the templates for SmartWindowForms and SmartTabFolderPages generated from the Business Entity Designer. We have removed the initialization of the viewer controls SmartTableIOState property (value was set to "NoDataSource" within the InitializeComponent method). Customers using their own set of templates should adopt the same fix to their templates.

OpenEdge 11.7.3 compatibility

During our tests on OpenEdge 11.7.3 we have experienced the following issues: 

  • [SCL-2216] - 11.7.3 Visual Designer disabling properties of ABL user controls

The issue has been resolved by Progress Software with hotfix 007 for OpenEdge 11.7.3.

OpenEdge 11.7.2 compatibility

During our tests on OpenEdge 11.7.2 we have experienced two issues: 

  • [SCL-2007] - Correct support for WebHandler in CcsServiceManager
  • [SCL-2008] - Closing SmartWindowForm causes crash on OpenEdge 11.7.2

We consider it mandatory for customers using OpenEdge 11.7.2 to use at least the release #44166@2017-11-27 of the SmartComponent Library. 

Due to an fix for

  • [SCL-1924] - SmartViewerControl: copy mechanism cannot cope with clob datatype

from Progress Software for in OpenEdge 11.7.2.001 we further recommend all customers to apply this hotfix as well. 

New Versions of Proparse .NET Assemblies (30 December 2018)

We have updated proparse with further enhancements in this release (see https://github.com/consultingwerk/proparse/releases/tag/4.0.1.1177). Please download the .NET Assemblies ZIP file from our ESD and replace the proparse.net.dll in your environment with the latest one. The new assembly reference is:

<assembly name="proparse.net, Version=4.0.1.1177, Culture=neutral, PublicKeyToken=cda1b098b1034b24"/>

As proparse is used by our Business Entity Generator, this new version of the proparse.net Assembly is also relevant for customers not doing GUI for .NET development and require support for parsing new ABL language constructs.

This version of proparse provides additional debug information when errors are thrown from proparse.net.dll.

New Version of the Consultingwerk.SmartComponents Assemly (09 January 2019)

To support the new SmartFilterControl and the "Filter" link between the SmartFilterControl/SmartDynamciFilterControl and a SmartBusinessEntityAdapter or SmartDatasetChildAdapter we have updated the Consultingwerk.SmartComponents.dll. The new Assembly reference is:

<assembly name="Consultingwerk.SmartComponents, Version=2.2.0.49856, Culture=neutral, PublicKeyToken=10603cb31df311b3"/>

Customers need to update this Assembly in order to compile the latest releases of the SmartComponent Library.

Hybrid Realm now using IAuthenticationService

We've updated the SmartHybridRealm class used for http authentication to leverage the IAuthenticationService. It is therefor required that for AppServers requiring http Authentication (e.g. REST or Web) the correct IAuthenticationService implementation is registered (using service.xml files).

Customers relying on the previous behavior should ensure that the Consultingwerk.SmartFramework.Authentication.AuthenticationService is regsitered as the IAuthenticationService. This implementation will auhtenticate users against the password stored in the SmartUser database table. 

When users with no Login Company set should be able to login using the SmartHybridRealm, it's required to set the Login Company Tennant Domain (similar to the field in the Login Company Maintenance) in the .restapplicationsettings / .applicationsettings, e.g.:


 "DefaultAuthenticationDomain": "consultingwerk" 

This is required as the Hydrid Realm Interface from Progress does not provide the domain name to the authentication method. 

Web Handler overview

This is an overview of the web handlers supported by this release

defaultHandler=OpenEdge.Web.CompatibilityHandler
handler1=Consultingwerk.OERA.JsdoGenericService.WebHandler.CatalogWebHandler: /Catalog/{EntityName}
handler2=Consultingwerk.OERA.JsdoGenericService.WebHandler.CatalogsWebHandler: /Catalogs/{PackageName}
handler3=Consultingwerk.OERA.JsdoGenericService.WebHandler.CountWebHandler: /Resource/{EntityName}/count
handler4=Consultingwerk.OERA.JsdoGenericService.WebHandler.ResourceSubmitWebHandler: /Resource/{EntityName}/SubmitData
handler5=Consultingwerk.OERA.JsdoGenericService.WebHandler.InvokeMethodWebHandler: /Resource/{EntityName}/{MethodName}
handler6=Consultingwerk.OERA.JsdoGenericService.WebHandler.ResourceWebHandler: /Resource/{EntityName}
handler7=Consultingwerk.OERA.JsdoGenericService.WebHandler.BusinessServicesWebHandler: /BusinessServices/{OutputFormat}/{PackageName}
handler8=Consultingwerk.Web2.WebHandler.SmartMenuWebHandler: /SmartMenu/{MenuStructureId}
handler9=Consultingwerk.Web2.WebHandler.SmartMenuStructureWebHandler: /SmartMenuStructure
handler10=Consultingwerk.Web2.WebHandler.SmartRoutesWebHandler: /SmartRoutes
handler11=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{EntityName}/{ViewName}/{DetailTemplate}
handler12=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{EntityName}/{ViewName}
handler13=Consultingwerk.Web2.Services.SmartViewsHandler.SmartGridWebHandler: /SmartViews/Grid/{CustomViewName}
handler14=Consultingwerk.Web2.Services.SmartViewsHandler.SmartViewerWebHandler: /SmartViewer/Viewer/{EntityName}/{ViewName}
handler15=Consultingwerk.Web2.Services.SmartViewsHandler.SmartViewerWebHandler: /SmartViewer/Viewer/{ObjectName}
handler16=Consultingwerk.Web2.Services.SmartViewsHandler.SmartFormWebHandler: /SmartForm/{FormTemplate}/{EntityName}/{ViewName}
handler17=Consultingwerk.Web2.Services.SmartViewsHandler.SmartFormWebHandler: /SmartForm/{FormTemplate}/{ObjectName}
handler18=Consultingwerk.Web2.WebHandler.SmartMessageWebHandler: /SmartMessage/{MessageGroup}/{MessageNumber}
handler19=Consultingwerk.Web2.WebHandler.GetImageWebHandler: /Image/{FileName}
handler20=Consultingwerk.Web2.WebHandler.SmartValueListWebHandler: /ValueList/{ValueList}
handler21=Consultingwerk.Web2.WebHandler.SmartAttachmentsWebHandler: /Attachments/{Table}/{KeyValues}
handler22=Consultingwerk.Web2.WebHandler.SmartAttachmentWebHandler: /Attachment/{Guid}
handler23=Consultingwerk.Web2.WebHandler.SessionContextWebHandler: /SessionContext
handler24=Consultingwerk.Web2.WebHandler.ContextPropertiesWebHandler: /ContextProperties/{PropertyName}
handler25=Consultingwerk.Web2.WebHandler.ContextPropertiesWebHandler: /ContextProperties
handler26=Consultingwerk.Web2.WebHandler.SessionInfoWebHandler: /SessionInfo
handler27=Consultingwerk.Web2.WebHandler.FileSearchWebHandler: /FileSearch/{FileName}
handler28=Consultingwerk.Web2.WebHandler.ExecuteAblWebHandler: /ExecuteAbl
handler29=Consultingwerk.Web2.WebHandler.SmartLanguagesWebHandler: /Languages
handler30=Consultingwerk.OERA.RestResource.RestEntitiesWebHandler: /Entities
handler31=Consultingwerk.OERA.Swagger.SwaggerWebHandler: /Swagger/{EntityName}
handler32=Consultingwerk.OERA.Swagger.SwaggerRestEntitiesWebHandler: /SwaggerEntities/{OutputType}
handler33=Consultingwerk.Web2.WebHandler.SmartTokenSecurityCheckWebHandler: /TokenSecurityCheck/{ObjectName}
handler34=Consultingwerk.Web2.WebHandler.SmartTokenSecurityCheckWebHandler: /TokenSecurityCheck
handler35=Consultingwerk.Web2.WebHandler.SmartEntityTableMappingHandler: /EntityTableMapping/{EntityName}/{TableName}/{UiTypeCodes}
handler36=Consultingwerk.Web2.WebHandler.SmartTreeRootNodeWebHandler: /SmartViews/TreeRootNode/{rootnodeid}
handler37=Consultingwerk.Web2.WebHandler.SmartTreeChildNodesWebHandler: /SmartViews/TreeChildNodes/{parentnodeid}
handler38=Consultingwerk.Web2.WebHandler.SmartSecurityCheckWebHandler: /IsRestricted/{SecurityRealmCode}/{SecurityItemGuid}
handler39=Consultingwerk.Web2.WebHandler.SmartFieldSecurityCheckWebHandler: /RestrictedFields/{TableName}
handler40=Consultingwerk.Web2.WebHandler.GetImageNamesHandler: /ImageNames
handler41=Consultingwerk.Web2.WebHandler.ExecuteQueryWebHandler: /ExecuteQuery
handler42=Consultingwerk.Web2.WebHandler.TranslationProviderWebHandler: /GetTranslation

UTF-8 based deployments available

Starting August 14th 2016 we ship our source code also as UTF-8 encoded. The ZIP files ending with _utf8.zip contain the source code encoded with that code page. The source code in the remaining archives is still encoded in ISO8859-1. Also on Github there is a new branch containing the OpenEdge 11 based source code in UTF-8.

Related article (Progress K-Base): How to get Progress Developer Studio to save in UTF-8 encoding

New Feature Documentation

Download Link

http://esd.consultingwerkcloud.com/

https://github.com/consultingwerk/SmartComponentLibrary

Overview of included tickets


Bug

SCL-4156 Fixed potential memory leak when saving changes through the user business entity

Description:

We have resolved a memory leak that might have caused a ProDataset to remain in the session memory after calling into a Business Entities SaveChanges method without passing the dataset with the updates BY-REFERENCE to the method.

SCL-4163 Fixed "Attempt to define too many indexes for area 6 database" when dumping many Repository Objects from GUI

Description:

We have fixed a memory leak that was occurring when exporting repository objects from the ABL GUI Client connected to an AppServer. The memory leak did not occur in a client-server session.

SCL-4164 Fixed error when generating DatasetModel Proxy method via BusinessEntity Designer

Description:

We have fixed an issue that might have occured in the BusinessEntity Designer when regenerating a Business Entity and DatasetModel classes:

Invalid character 'I' following '&' in SUBSTITUTE. (2920)

Improvement

SCL-4084 The Temp-table Statistics Monitor Service only shows changes made to temp-tables during the current request.

Description:

When enabled, the Temp-table Statistics Monitor Service will only show changes made to temp-tables during the current request.

There are also formatting changes to more closely match the output of the User Table Stats Monitoring Service, such as separation of table and index reads into their own sections.

The Temp-table Statistics Monitor Service can be enabled by updating the Consultingwerk/OERA/TempTableStatistics/services_temp-table_monitor.xml file, and setting the disabled element of that service to FALSE.

SCL-4096 ABL Legacy GUI Viewer/Grid migration now supports regenerate

Description:

The ABL Legacy GUI migration tools for Frames and Browse widgets now supports to regenerate an existing object master. This allows to update the fields in a viewer or columns in a grid while keeping the master. Previously to regenerate a MetaViewer or MetaGrid master had to be deleted, which had impact on instances of those in a Form or other container.

When a MetaViewer or MetaGrid object master with the given object name already exists, the tools will now prompt if the existing object master should be updated. Earlier the tools just kept failing with a duplicate unique key error.

In addition the code functionality of the ABL GUI Frame and Browse migration utility have been moved to those services:

||*Service Interface*||*Default implementation*||
|Consultingwerk/Studio/LegacyGuiMigration/Frame/IAblFrameMigrationService|Consultingwerk/Studio/LegacyGuiMigration/Frame/AblFrameMigrationService|
|Consultingwerk/Studio/LegacyGuiMigration/Frame/IAblFrameMigrationService|Consultingwerk/Studio/LegacyGuiMigration/Frame/AblFrameMigrationService|

This will simplify scripting migration routines.

SCL-4135 Headers and cookies that are mapped as part of a RestMethod annotation are included in Swagger documentionation

Description:

If Business Service method is annotated with a RestMethod annotation that includes either a HeadersMap or a CookiesMap attribute, then these header and/or cookie names will be generated as individual parameters in the Swagger documentaion. Any properties mapped to a header or cookie will be removed from the request body documentation (so a property value can only be specified once per request).

SCL-4136 If a Business Service’s .annotations file refers to a method that is no longer in the Business Service class, a AnnotatedMethodNotFoundException exception will be raised

Description:

If a Business Service’s .annotations file refers to a method that is no longer in the Business Service class, a Consultingwerk.OERA.Swagger.AnnotatedMethodNotFoundException exception will be raised when generating the Swagger documentation for that Business Service.

SCL-4138 Invokable method parameters that contain nested serializable properties are shown as examples in Swagger

Description:

Invokable method parameters that contain nested serializable properties are shown as examples in Swagger documentation.



For example, the ScanPalletRequest class has a LocationChangeContext property that also implements Consutlngwerk.IJsonSerializable .

CLASS Example.ScanPalletRequest
    INHERITS ParameterObject 
    SERIALIZABLE:

    {Consultingwerk/JsonSerializableProperty.i PalletID CHARACTER} .
    {Consultingwerk/JsonSerializableProperty.i Context Example.LocationChangeContext} .
    
    CONSTRUCTOR PUBLIC ScanPalletRequest():
        SUPER().
        THIS-OBJECT:AddSerializableProperties().
    END CONSTRUCTOR.
END CLASS.

CLASS Example.LocationChangeContext
    INHERITS ParameterObject 
    SERIALIZABLE:

    {Consultingwerk/JsonSerializableProperty.i CurrentState CHARACTER} .
    {Consultingwerk/JsonSerializableProperty.i CurrentPallet CHARACTER} .
    {Consultingwerk/JsonSerializableProperty.i CurrentLocation CHARACTER} .
    {Consultingwerk/JsonSerializableProperty.i MessageWaitTime INTEGER} .
    {Consultingwerk/JsonSerializableProperty.i MachineType CHARACTER} .
    {Consultingwerk/JsonSerializableProperty.i PalletDataSource CHARACTER} .
    {Consultingwerk/JsonSerializableProperty.i ReusablePalletList CHARACTER} .
    
    CONSTRUCTOR PUBLIC LocationChangeContext():
        SUPER().
        THIS-OBJECT:AddSerializableProperties().
    END CONSTRUCTOR.
END CLASS.    



The Swagger example that is shown for this parameter will show the properties for the ScanPalletRequest and the nested LocationChangeContext classes .

{
  "plcParameters": {
    "PalletID": "string",
    "Context": {
      "CurrentState": "string",
      "CurrentPallet": "string",
      "CurrentLocation": "string",
      "MessageWaitTime": 0,
      "MachineType": "string",
      "PalletDataSource": "string",
      "ReusablePalletList": "string"
    }
  }
}


SCL-4140 Swagger: Allow configuration of backend servers

Description:

By default the backend server URL (the URL used to perform sample requests from the Swagger UI) has been determined based on the URL of the Swagger JSON file itself.

Now it’s possible to configure multiple backend server URL’s in the .restapplicationsettings file in the “swagger” section. The “swagger” section is a JSON object with optionally a nested “servers” object. In the “servers” object, you can maintain a list of servers with an informative label (not used in the Swagger file generation) as the attribute name and the server URL as the attribute value.

SCL-4147 Dropped CCS folder from SmartComponent Library deployments

Description:

We have dropped the CCS Folder ( https://github.com/progress/CCS ) from the SmartComponent Library code base and deployments. All supported OpenEdge releases now include the CCS folder. This is also to avoid potential issues with differences between the community based variants of the files and the variants that Progress Software ships with OpenEdge.

SCL-4149 If a @RestMethod annotation does not include a ParameterClassName, the type name will be determined using reflection at runtime

Description:

If the @RestMethod annotations for an invokable method in a Business Service do not include a ParameterClassName attribute, then the RestEntitiesWebHandler will attempt to determine the name of the class to use based on the defined parameters for the method.

If the parameter’s OOABL type is used, a Consultingwerk.Exceptions.InvalidValueException will be raised if that type is a not instantiable (ie an interface, enum or abstract class).

In addition, if the value of the ParameterClassName attribute in the @RestMethod annotation is empty/blank, the invokable method is assumed to have no parameters.

SCL-4150 Implemented API to reset stored settings in GUI for .NET SmartDataBrowser

Description:

We have added a new method to the SmartDataBrowser class:

/**
 * Purpose: Resets stored grid settings
 * Notes:   Re-applies the initial layout of the grid and wipes stored
 *          settings in the user-profile
 */
METHOD PUBLIC VOID ResetGridSettings():



Developers can use this method to provide functionality (e.g. context-menu or shortcut key) to allow users to reset the stored grid settings (column order, visibility, widith, …) at runtime to the developers default.

SCL-4151 Implemented validations in Deletion Business Entity

Description:

We have implemented a minimum set of validations in the DeletionBusinessEntity.

SCL-4152 Implemented tool to process deletions in SmartDeletion table

Description:

The SmartComponent Library did support the deployment of deletions from one system to another through the XML export of the DeletionBusinessEntity (GenericDataExporter, GenericDataImporter).

Now we’ve implemented the new procedure

Consultingwerk/SmartFramework/Tools/Import/execute-deletions.p

as a standard routine to process deletions in a target system and actually delete the records. Previously customers had to implement the delete routine themselves.

SCL-4153 PropathHelper:MakeAbsolute injected backslashes into path on Linux

Description:

The PropathHelper was occasionally injecting backslashes into the PROPATH on Linux. This has been resolved now. The tool now consistently uses forward slashes.

SCL-4162 The oBusinessEntityDescriptor class-wide/instance variable removed from SwaggerDefinitionGenerator

Description:

The oBusinessEntityDescriptor variable has been removed as a class-wide variable from the Consultingwerk.OERA.Swagger.SwaggerDefinitionGenerator class, and been converted to method-scoped variables and/or parameters.

The following methods have had a parameter with a type of Consultingwerk.OERA.BusinessEntityDescriptor.IBusinessEntityDescriptor added to them.

* AddComponentsSchema
* GetDefinitions
* GetPathOperations
* GetSchema

Any customer code that extends the SwaggerDefinitionGenerator class must be updated to support the additional parameter.

Story

SCL-4137 JsonHelper Get*ByPath now allow for mixed delimiter values in the path

Description:

Previously the JsonHelper API’s to retrieve values from a JSON Object by a path did not support the usage of the supported path delimiters (period, slash and backslash) as an attribute name. So in this JSON document

{
    "paths": {
        "/GetEmailData": {
            "POST": {
            }
        }
    }
}



It was not possible to process the attribute name “/GetEmailData” as the attribute name contained a supported path dellimiter.

This has now been resolved by supporting the tilde as an escape character for path delimiters. Note that in ABL code, it will be required to pass a double-tilde to escape the tilde itself like this:

oPath = JsonHelper:GetJsonObjectByPath (oJson,
                                        "paths.~~/GetEmailData.POST":U) .