Release Notes 2024-02-19
Version Information
OpenEdge Release | Version Information |
---|---|
11.7.17, 12.2, 12.7, 12.8 | Release 11.7 #79266@2024-02-19 |
Security Bulletin - log4j CVE-2021-44228
Further details: log4j CVE-2021-44228
OpenEdge 12.8 support!
We are pleased to announce that we are not aware of any issues using the SmartComponent Library on OpenEdge 12.8. We hereby declare OpenEdge 12.8 fully supported for the SmartComponent Library as of the release of January 15th 2024.
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.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.
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.
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:
|
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 |
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
- Support for RESTful invocation of Business Task and Business Entity Methods
- Invalid Proparse code-page setting corrupts temp-table field labels during "Refresh from Include"
- Generic Factory Service
- Using Invokable Business Entity Methods with Dataset Model Classes
- Using the Business Entity method FetchDataByKeyTable
- PASOE management scripts
- Business Entity Designer Launcher
- Searching data using ROWID's within the SmartBusinessEntityAdapter
- Business Entity Count Method
- SmartFramework ERD Designer
- Changes to the SmartDB and SmartDB upgrade and migration utility
- How to implement dynamic initial values
- How do I control the amount of details provided for error messages caused by our web handler
- Using custom log entry types
- Strong-typed Query Support
- Swagger REST API Documentation for RESTful Services
- Swagger REST API Documention for JSDO Generic Service
- Scaffolding utility for common helper classes
- RESTful services
- JSON Configuration File Format
- Common Component Specification (CCS)
Download Link
http://esd.consultingwerkcloud.com/
https://github.com/consultingwerk/SmartComponentLibrary
Overview of included tickets
Bug
SCL-4313 MemberTableViewerControl of Business Entity Designer now consistently asking to rename before-table
Description:
When renaming a temp-table in the Business Entity Designer, the property viewer is now consistently asking if the before table should be renamed as well.
SCL-4379 Resolved potential issue in RestResourceService's GetClassNames method
Description:
In situations where the .annotation files have been out of sync with renamed or moved Business Services the RestResourceService GetClassNames method might have failed as it was returning the reference to the previously handled Progress.Lang.Class when checking for the left over .annotation file. This issue is fixed now.
SCL-4381 Dynamic Browsers: FilterRow is no longer scrolling out of view
Description:
In some situations the FilterRow of a dynamic SmartDataBrowser (MetaGrid in the repository) was scrolling out of view with the rows of the Grid. This issue is resolved now.
Improvement
SCL-3719 Dataset Cache Service implemented
Description:
The SmartComponent Library supports developer-controlled caching of ProDataSets using the Consultingwerk.SmartFramework.System.SmartCache.ISmartCacheService . Developers may choose to save a dataset in the SmartCacheService, and retrieve it at a later time. Cached datasets persist across AVM sessions and application restarts, and are available until they expire.
For more details, see the https://consultingwerk.atlassian.net/wiki/spaces/SCL/pages/8094768/Developers+Reference
SCL-3873 Implement service interface for listing all known Business Entities for InMyData integration
Description:
Implement service interface for InMyData integration in Consultingwerk/OERA/Integrations/InMyData/getDataServiceList.p . This service interface returns a temp-table containing the names of all classes that can be found in the application that implement the Consuiltingwerk.OERA.IBusinessEntity interface. The procedure accepts a username and password for a (typically) system user.
The service interface’s parameters are defined as follow.
define input parameter pcUserName as character no-undo. define input parameter pcPassword as character no-undo. define output parameter table for ttDataServices.
The schema for the ttDataServices temp-table is
define temp-table ttDataServices no-undo field ServiceName as character index ServiceName is unique primary ServiceName .
SCL-3874 Implement service interface for Business Entity schema retrieval for InMyData integration
Description:
Implement service interface for InMyData integration in Consultingwerk/OERA/Integrations/InMyData/getDataServiceSchema.p . The service interface takes the name of a Business Entity. The procedure also accepts a username and password for a (typically) system user.
The service interface returns an empty ProDataSet that is the schema for the Business Entity.
The parameters are defined as follows.
define input parameter pcUserName as character no-undo. define input parameter pcPassword as character no-undo. define input parameter pcEntityName as character no-undo. define output parameter dataset-handle phDataset .
SCL-3875 Implement service interface for Business Entity data retrieval for InMyData integration
Description:
Implement service interface for InMyData integration in Consultingwerk/OERA/Integrations/InMyData/getDataServiceData.p . The service interface takes the name of a Business Entity, a query string and a series of batching/paging paramteters. The query string may be empty. The context value that is returned from a call should be used as an input to a subsequent call, allowing the retrieval of batches of data. The procedure also accepts a username and password for a (typically) system user.
The service interface returns a ProDataSet containing data, and a flag indicating whether there is more data available for the query (ie whether this is the last batch of data).
The parameters are defined as follows.
define input parameter pcUserName as character no-undo. define input parameter pcPassword as character no-undo. define input parameter pcEntity as character no-undo. define input parameter pcQuery as character no-undo. define input parameter piStopAfter as integer no-undo. define input parameter piBatchSize as integer no-undo. define input-output parameter pcContext as character no-undo. define output parameter plMoreRecords as logical no-undo. define output parameter dataset-handle phDataSet.
SCL-4277 Single datasets returned from invokable methods may exclude the dataset
Description:
If a invokable method is annotated to return only a single ProDataset, the ProDataset name may be excluded from the returned JSON object by adding {{:no-envelope}} to the dataset name in the {{response}} annotation value.
For example {{response="dsCustomer:no-envelope"}} will return properties for the temp-tables only.
This value is ignored for cases where multiple datasets are returned, or when the return value is also returned.
For more information, see https://consultingwerk.atlassian.net/wiki/spaces/SCL/pages/8094254/Support+for+RESTful+invocation+of+Business+Task+and+Business+Entity+Methods
SCL-4292 Implement new IFileUploadService
Description:
The Consultingwerk.Web2.Services.FileUpload.IFileUploadService interface and Consultingwerk.Web2.Services.FileUpload.FileUploadService implementation are a service that extracts uploaded files (file names and contents) from an HTTP request.
interface Consultingwerk.Web2.Services.FileUpload.IFileUploadService: /** * Purpose: Parses a request for uploaded file(s) and context * Notes: * @param poRequest The IWebRequest instance * @return The uploaded files and any context */ method public IFileUploadResult ParseFileUpload (poRequest as IWebRequest). end interface.
The files and context are returned as an implementation of the Consultingwerk.Web2.Services.FileUpload.IFileUploadResult interface.
interface Consultingwerk.Web2.Services.FileUpload.IFileUploadResult: /** * Purpose: Context/identifier about the request used to upload these files. * Notes: Typically <http-method>:<relative-url> ; might be a header value */ define public property Request as character no-undo get. /** * Purpose: Context about the request used to upload these files. * Notes: */ define public property Context as JsonConstruct no-undo get. /** * Purpose: An array of file names. These may be empty (though not unknown). * Notes: */ define public property FileName as character extent no-undo get. /** * Purpose: An array of MIME types of the files; defaults to application/octet-stream * Notes: */ define public property FileType as character extent no-undo get. /** * Purpose: An array of binary data representing the files. * Notes: */ define public property FileData as IMemptrHolder extent no-undo get. end interface.
Request format
The files must be uploaded using a PUT or POST request as standard multipart/form-data , with at least one part. This part contains the file being uploaded; the file name must be priovided using a Content-Disposition header with a fileName or fileName* parameter (per [https://developer.mozilla.org/en-US/docs/Web/ HTTP/Headers/Content-Disposition |https://developer.mozilla.org/en-US/docs/Web/ HTTP/Headers/Content-Disposition ]). There may be multiple files uploaded in a single request.; each should have their own part. Filenames are not unique, although duplicate file names should be avoided.
An additional, optional, part contains context for the upload. This part should have a Content-Disposition header with a name=context parameter value. The data in the part must be JSON; the structure and content of this context data is left to the application.
SCL-4327 Implemented support for returning records of a single temp-table only
Description:
If a invokable method is annotated to return only a single ProDataset, a single temp-table may be returned from the dataset. The response attribute value will have the form dataset-name:table-name as in the example below.
@RestMethod (address="/Orders/{OrderNum}/GetItemOnly", requestMethod="post", request="parameter", parameterClassName="Consultingwerk.IntegerHolder", response="dsOrder:eItem"). @ParameterSchema (datasetname="dsOrder", schemafile="Consultingwerk/SmartComponentsDemo/OERA/Sports2000/dsOrder.xsd"). method public void GetOnlyItems (input-output dataset dsOrder, poParameter as IntegerHolder): end method.
The table data will be returned as an array of objects (records) without a table name envelope. If no records are available, an empty JSON array is returned.
This attribute value can be modified to add :first which returns the first record as a JSON object. Again, there is no table name envelope. If there are no records in the table, an empty JSON object is returned.
An attribute value of {{response="dsOrder:eItem:first"}} for the same endpoint would return just the single record.
This value is ignored for cases where multiple datasets are returned, or when the return value is also returned.
For more information, see https://consultingwerk.atlassian.net/wiki/spaces/SCL/pages/8094254/Support+for+RESTful+invocation+of+Business+Task+and+Business+Entity+Methods
SCL-4355 Implement support for rendering the WebClassList property on a Button field into classList JSON setting
Description:
The rendering of Buttons for Angular viewers (JSON markup) now supports rendering the WebClassList property from the Repositor yin the to the classList attribute of the JSON markup of the Button component.
SCL-4359 ConfigurationProvider now includes the json filename to an error when a parsing error occurs
Description:
When the ConfigurationProvider fails to parse a JSON file, we’re not including the name of that JSON file in the error message for easier analysis of the issues.
The feature is based on a new method ParseFile in the JsonHelper that handles the error accordingly.
SCL-4360 Added flex-group class options in the WebClassList-Values property for viewer fields
Description:
We have added the CSS style class names
* group-linked-field - used to mark the group that contains the field as a “flex-group“
* flex-0-field - the field will take only the maximum necessary space to be displayed (ex. the “CHR(3)“ button field)
* flex-1-field - the field will extend in the available space (ex. the “Lookup Values“ text field)
* no-label-bottom-aligned - used for bottom aligning the fields with no label (ex. the “CHR(3)“ button)
to the list of proposed values of the WebClassList property of fields in a MetaViewer.
SCL-4361 Proparse TreeViewForm now opens .p/.cls/.w file when opened in editor
Description:
When opening ABL source code in the ProparseTreeViewForm, the tool now also opens the file in an embedded ABL procedure editor.
SCL-4365 BufferDataSource now supporting a local buffer
Description:
A BufferDataSource can now be initialized with the handle of an existing database or temp-table buffer. Previously the component was always creating a new dynamic buffer object handle.
SCL-4368 Improved error handling when initializing REST methods
Description:
We have improved error handling during the initialization of REST methods. Class files with more or less empty .annotation files are no longer causing issues during the initialization.
And issues during the initialization now log the class name causing the issue in the PASOE log file for simpler analysis.
SCL-4369 StringHelper:SplitText now supports leaving white spaces in the resulting text parts
Description:
We have implemented a SplitText2 method which leaves trailing white-space characters (space, line-break, …) in the text segments returned.
SCL-4385 All business services invoked during the startup of a PASOE session are now invoked during the ServiceManager
Description:
We have observed a few calls to Business Services invoked during a typical PASOE session startup being made through the Service Adapter - instead of using the Service Manager or directly invoking the Business Service.
This has been fixed now.
SCL-4386 Business Entity Designer now showing work directory in window title
Description:
To simplify distinction of multiple running instance of the Business Entity Designer, the tool is now showing the working directory in the Window title.
SCL-4387 When Business Entity Name is changed, Business Entity Designer now prompts developer if other components should be updated
Description:
When a developer changes the name of a Business Entity in the Business Entity Designer, the tool now prompts if other components (Data Access class, Dataset, …) should also be renamed to match the new name of the Business Entity.
SCL-4390 SmartPanelController now exposes reference to UltraToolbarController instance
Description:
We have added a property named ToolbarsManager to the SmartPanelController class. This property now gives direct access to the UltraToolbarsManager instance within the SmartPanelController.
SCL-4391 DynamicControlGroupLogic and DynamicFormLogic now provide access to SmartPanelController instances
Description:
We have added a method GetSmartPanelControllerInstance to the DynamicControlGroupLogic and DynamicFormLogic base classes. This method allows to retrieve a typed reference to a SmartPanelController in a Form.
New Feature
SCL-4307 Implemented RcodeInfo and RcodeInfoHelper classes
Description:
The Consultingwerk.Util.RcodeInfo.RcodeInfo class represents an rcode file. It provides a rcode-version-safe mechanism for querying an rcode file’s information. If an invalid file name (i.e. cannot be found on disk) is provided, or the extension of the file is not .r , an exception is thrown from the constructor.
The class has the following properties
* FileName: The rcode file name, as provided to the constructor
* RcodeVersion: The rcode version. Only rcode files with versions from OpenEdge 10.0 and later are supported.
* IsClass: TRUE if the rcode represents a OOABL type. Will always be FALSE for OpenEdge 10 rcode
* CrcValue: The CRC value of the rcode
* SignatureValue; The digest of the rcode, if it exists in the rcode.
The Consultingwerk.Util.RcodeInfoHelper class’s GetRcodeInfo() method provides a means to obtain a RcodeInfo instance for a given file name. The GetRcodeInfo() method takes file names that have a .cls, .r, .w, .p or .r extension.
SCL-4363 Implements StringHelper Method SplitText for splitting long texts
Description:
The StringHelper:SplitText method supports splitting a long text into an array of text segments of a given length. The methods intends to find the optimal length for each resulting text line by looking for the right-most text separating character (e.g. space, comma, new-line, etc.).
SCL-4366 Allow Validator implementation to update values shown in the ComplexInputPrompt Dialog
Description:
An extension has been implemented to the ComplexInputPrompt Dialog. The Validator instance (when used) can now modify property values of the parameter object and those values will be displayed in the dialog while the dialog is shown.
Task
SCL-4380 StartupParameterAppServerServiceManager now support secondary AppServer connection for async calls
Description:
The StartupParameterAppServerServiceManager now supports a second AppServer connection referenced as “async” to support asynchronous calls to the AppServer backend. This second connection is opened using the same connection parameters as the regular AppServer connection intended for synchronous calls.