Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Further details: log4j CVE-2021-44228

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.

...

SCL-3889 RestResourcesJsonReader now ignores empty restResourcesCacheFile value in .restapplicationsettings

Description:

Previously the RestResourcesJsonReader did cause errors written to the AppServer logfile when the value of the restResourcesCacheFile entry in .restapplicationsettings was referring to an invalid cache file name:

No Format
2022-12-13T14:08:47.176+0100 715374 715380 1 AS-7 ?:?:? ServiceLoa     ### Initializing Service: Consultingwerk.OERA.RestResource.RestResourceService
2022-12-13T14:08:47.207+0100 715374 715380 1 AS-7 ?:?:? RestResour     Unable to parse file "?"
2022-12-13T14:08:47.207+0100 715374 715380 1 AS-7 ?:?:? RestResour     An Consultingwerk.Exceptions.InvalidValueException has occurred:
2022-12-13T14:08:47.207+0100 715374 715380 1 AS-7 ?:?:? RestResour     Invalid value "?" for File Na



When the empty value is used for the restResourcesCacheFile we are now ignoring the value. When an invalid file name is provided, we will write a qualified error message to the AppServer logfile.

SCL-3897 GenericDictionary's Keys property may have return too large CharacterList

Description:

We have resolved an issue in the GenericDictionary implementation that was potentially causing the Keys property to return a CharacterList with too many entries. The Keys property now returns a CharacterList who’s size matches the size (Count) of the GenericDictionary.

SCL-3898 Label of field in dynamic SmartViewerControl hidden by security no longer remains visible.

Description:

We have fixed an issue where the label control associated with a field in a dynamic SmartViewerControl instance remained visible also when the control was hidden by security.

SCL-3899 MetaGrid in GUI for .NET does now hide columns that should not be visible by security

Description:

The MetaGrid in GUI for .NET now honors columns that are disabled by security.

Improvement

SCL-3391 Supporting filtering of menu functions and containers in security assignment

Description:

To better support security assignment in larger applications we’re now supporting the filtering of menu functions and containers in the security assignment by product module or object type.

SCL-3796 Implemented optional blocking of overwriting of existing records by the GenericDataImporter

Description:

When the importing of data using the GenericDataImporter previously, we have always been overwriting existing records with new data.

The ImportBusinessEntityData method of the GenericDataImporter now provides an additional LOGICAL parameter that allows to control if existing records should be overwritten or skipped during the import. The parameter may be provided through the “SkipExistingRecords” parameter passed from ANT to the import-data.p procedure:

Code Block
languagexml
    <!-- Import SmartDb Data -->
    <macrodef name="importBusinessEntityData">
        <attribute name="BusinessEntity" />
        <attribute name="FileName" />
        <attribute name="SkipFields" />
        <attribute name="SkipExistingRecords" />
        <attribute name="ThrowErrors" />
        <sequential>
            <PCTDynRun
                taskname="SFR-import-data"
                procedure="Consultingwerk/SmartFramework/Tools/Import/import-data.p"
                graphicalMode="false" dlcHome="${dlc}" cpinternal="${cpinternal}" cpColl="${cpcoll}" cpstream="${cpstream}"
                inputchars="32000" token="4000" stackSize="500" msgBufferSize="${Mm}" maximumMemory="65000"
                dirSize="10000" paramFile="performance.pf" quickRequest="true"
                ttBufferSize="10000" >

                <propath>
                    <pathelement path="${installroot}" />
                    <pathelement path="${installroot}/src" />
                    <pathelement path="${installroot}/SmartComponentLibrary.pl" />
                </propath>

                <DBConnectionSet refid="smartdbset" />

                <Parameter name="BusinessEntity" value="@{BusinessEntity}" />
                <Parameter name="FileName" value="@{FileName}" />
                <Parameter name="SkipFields" value="@{SkipFields}" />
                <Parameter name="SkipExistingRecords" value="@{SkipExistingRecords}" />
                <Parameter name="ThrowErrors" value="@{ThrowErrors}" />
            </PCTDynRun>

            <echo/>
        </sequential>
    </macrodef>

...

SCL-3831 Providing OnBeforeBrowse callback with the Consultingwerk.CefSharpSupport assembly

Description:

Through the ChromiumWebBrowserEventHelper control we’re now also providing an ability to implement the OnBeforeBrowse callback of the CefBrowser control.

We have implement support for handling this event through the Consultingwerk.Windows.CefBrowser.ICefBrowserRequestCallbackService service The method

No Format
/**
 * Purpose: Called before browser navigation
 * Notes:   If the navigation is allowed FrameLoadStart and FrameLoadEnd will be called.
 *          If the navigation is canceled LoadError will be called with an ErrorCode value of Aborted.
 * @param poBrowserParent The reference to the Control/Form that holds the CefBrowser control
 * @param poCefBrowser The reference to the CefBrowser Control
 * @param poArgs The reference to the OnBeforeBrowseEventArgs with the data for this callback
 */
method public void BeforeBrowse (poBrowserParent as System.Windows.Forms.Control,
                                 poCefBrowser as ChromiumWebBrowser,
                                 poArgs as OnBeforeBrowseEventArgs) .



A sample implementation of this method in the service looks like this:

No Format
/**
 * Purpose: Called before browser navigation
 * Notes:   If the navigation is allowed FrameLoadStart and FrameLoadEnd will be called.
 *          If the navigation is canceled LoadError will be called with an ErrorCode value of Aborted.
 * @param poBrowserParent The reference to the Control/Form that holds the CefBrowser control
 * @param poCefBrowser The reference to the CefBrowser Control
 * @param poArgs The reference to the OnBeforeBrowseEventArgs with the data for this callback
 */
method public void BeforeBrowse (poBrowserParent as System.Windows.Forms.Control,
                                 poCefBrowser as ChromiumWebBrowser,
                                 poArgs as OnBeforeBrowseEventArgs):

    if poArgs:Request:Url = "<https://www.dhl.de/de/privatkunden.html":U> then
        poArgs:CancelNavigation = true .

end method .



The poArgs instance provides access to the URL the browser is about to navigate to and allows to set the CancelNavigation property.

The ICefBrowserRequestCallbackService service is used by both the BrowserForm and BrowserControl implementations.

SCL-3832 CefSharp updated to version 107

Description:

We updated the CefSharp library we use to embed the Chromium Browser to Version 107. This includes the latest Chromium Browser engine as well as various bug and security fixes.

SCL-3861 Added new API to determine if a file was passed in via stdin to a batch mode client

Description:

Based on the discussion in https://stackoverflow.com/questions/74564182/how-to-determine-if-a-procedure-was-passed-a-file-to-standard-input-when-run-via we have added a new method to the Consultingwerk.Util.SessionHelper: InputIsRedirected

The method returns TRUE if a Progress session is started with input redirection.

SCL-3893 Added new template for a simple class file to scl-gen

Description:

We have added a new simple class file template to scl-gen. This template can for instance be used from the command-line within VS Code to generate a class.

No Format
scl-gen class MyNewClass

...

SCL-3895 Added OpenEdge 12.7 to ProVersion Enum

Description:

To support our testing efforts for OpenEdge 12.7, we have added OpenEdge 12.7 to ProVersion Enum

SCL-3896 Added OpenEdge 12.7 to Business Entity Designer Configuration

Description:

To support our testing efforts for OpenEdge 12.7, we have added OpenEdge 12.7 to the Business Entity Designer configuration dialog (launcher configuration).

SCL-3900 Implemented support for SecurityKey when rendering dynamic viewer or updatable browser

Description:

The rendering services for dynamic Viewer and Grid instances now assign the viewers or grids Instance Name as the SecurityKey. The SecurityKey of a TableIO target allows to assign toolbar security based on the linked table io target and not just the toolbar item (button) name.

SCL-3901 Implement support for maintaining toolbar items in dynamic forms as security items

Description:

The toolbar security item maintenance now supports maintaining toolbar items in dynamic (rendered) forms based on the name of the dynamic viewer or form as the SecurityKey.

SCL-3904 SmartViewerControl subscribing to CheckStateChanged

Description:

To better support the 3-state UltraCheckEditor the SmartViewerControl is now subscribing to the CheckStateChangedEvent instead of the CheckedChanged event to support changes made by the user. See

https://www.infragistics.com/community/forums/f/ultimate-ui-for-windows-forms/43527/threestate-ultracheckeditor-checkedchanged-event-not-firing

SCL-3905 Implemented optional failing of the GenericDataImporter when importing of data fails

Description:

When the importing of data using the GenericDataImporter failed previously, we have just been logging this to the console when executed from an ANT script (batch mode session). We are now providing the option to fail the build on import errors (e.g. data validation, unique key issues, etc.).

The ImportBusinessEntityData method of the GenericDataImporter now provides an additional LOGICAL parameter that allows to control if errors should be thrown and thus failing the import job. The parameter may be provided through the “ThrowErrors” parameter passed from ANT to the import-data.p procedure:

Code Block
languagexml
    <!-- Import SmartDb Data -->
    <macrodef name="importBusinessEntityData">
        <attribute name="BusinessEntity" />
        <attribute name="FileName" />
        <attribute name="SkipFields" />
        <attribute name="SkipExistingRecords" />
        <attribute name="ThrowErrors" />
        <sequential>
            <PCTDynRun
                taskname="SFR-import-data"
                procedure="Consultingwerk/SmartFramework/Tools/Import/import-data.p"
                graphicalMode="false" dlcHome="${dlc}" cpinternal="${cpinternal}" cpColl="${cpcoll}" cpstream="${cpstream}"
                inputchars="32000" token="4000" stackSize="500" msgBufferSize="${Mm}" maximumMemory="65000"
                dirSize="10000" paramFile="performance.pf" quickRequest="true"
                ttBufferSize="10000" >

                <propath>
                    <pathelement path="${installroot}" />
                    <pathelement path="${installroot}/src" />
                    <pathelement path="${installroot}/SmartComponentLibrary.pl" />
                </propath>

                <DBConnectionSet refid="smartdbset" />

                <Parameter name="BusinessEntity" value="@{BusinessEntity}" />
                <Parameter name="FileName" value="@{FileName}" />
                <Parameter name="SkipFields" value="@{SkipFields}" />
                <Parameter name="SkipExistingRecords" value="@{SkipExistingRecords}" />
                <Parameter name="ThrowErrors" value="@{ThrowErrors}" />
            </PCTDynRun>

            <echo/>
        </sequential>
    </macrodef>

...

SCL-3906 Assigning Name property of Controls Rendered by the SmartDynamicFilterControl

Description:

When rendering the Controls within the SmartDynamicFilterControl we are not assigning the Name property of the filtre controls to the name of the filtered field (ProBindingSource column). This will simplify accessing those controls to modify the value programmatically if needed.

To the Label Control attached to the Control we are assigning the binding source column name suffixed with “_Label”.

New Feature

SCL-3628 Introducing SystemOwned flag to certain tables in the SmartDB database

Description:

We have added a new LOGICAL field to these tables in the SmartDB database:

* SmartAttachmentRole
* SmartCommentRole
* SmartConfigurationValue
* SmartFieldSecurityItem
* SmartGenericTable
* SmartGroup
* SmartLanguage
* SmartLoginCompany
* SmartMessage
* SmartModule
* SmartProduct
* SmartSchedulerJob
* SmartSchedulerJobPlan
* SmartSecurityAssignment
* SmartSecurityObject
* SmartSecurityObjectToken
* SmartSecurityToken
* SmartToolbarSecurityItem
* SmartTranslation
* SmartUiTranslation
* SmartUser
* SmartValueList
* SmartValueListEntry
* SmartWorkflow
* SmartWorkflowActivity
* SmartWorkflowStatus
* SmartWorkflowStatusActivity
* SmartWorkflowSwimlane

Customers can use the SystemOwned flag to filter data relevant to deployments. In addition there is row-level authorization for update and delete associated to those records now. Users need to be authorized for the “SystemOwned” token to be allowed to modify or delete those records.

SCL-3845 ServiceAdapter and SmartBusinessEntityAdapter support for native ABL serialization for save changes parameter objects

Description:

In order to support the use of native ABL serialization of objects (ie classes defined with the SERIALIZABLE keyword in the CLASS statement) for saving Business Entity data, 3 new methods are added to the Consultingwerk.OERA.IServiceAdapter interface and consequently to the Consultingwerk.OERA.ServiceAdapter implementation.

The methods are named SubmitData2 and have similar signatures to the existing SubmitData methods. The major difference is that the parameter object is defined as INPUT poParameter AS Progress.Lang.Object , instead of the input Consultingwerk.ISerializable parameter in the SubmitData methods. The parameter object is returned as a return value for cases where the service returns changed values (either to the existing parameter object, or a new or different parameter object). Note that SubmitData2 returns a different instance of the parameter object to the caller than the one which as passed in. Code that relies on properties of the returned object instance need to access those from the returned reference instead of expecting that the input object gets updated.

The method signatures are below. Note that only those SubmitData methods that take a parameter object as input are overridden.

No Format
    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     *          The phContextDataset parameter is intended to be passed by-reference
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param pcContext INPUT-OUTPUT The context to be passed to the business entity
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @param phContextDataset The handle of the context dataset for this call
     * @return The parameter object. May be updated/different from the input object
     */
    method public Progress.Lang.Object SubmitData2 (pcPartition    as character,
                                                    pcEntityName   as character,
                                                    input-output dataset-handle hChangesDataset,
                                                    input-output pcContext      as character,
                                                    poParameter                 as Progress.Lang.Object,
                                                    phContextDataset as handle) .

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param pcContext INPUT-OUTPUT The context to be passed to the business entity
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @return The parameter object. May be updated/different from the input object
     */
    method public Progress.Lang.Object SubmitData2 (pcPartition as character,
                                                    pcEntityName as character,
                                                    input-output dataset-handle hChangesDataset,
                                                    input-output pcContext as character,
                                                    poParameter as Progress.Lang.Object) .

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @return The parameter object. May be updated/different from the input object
     */
    method public Progress.Lang.Object SubmitData2 (pcPartition as character,
                                                    pcEntityName as character,
                                                    input-output dataset-handle hChangesDataset,
                                                    poParameter as Progress.Lang.Object).

    /**
     * Purpose: Saves modified (Create, Update, Delete) data to a Business Entity
     * Notes:   It's recommended but not required to just pass a changes dataset
     *          The phContextDataset parameter is intended to be passed by-reference
     * @param pcPartition The name of the AppServer partition for this call or "" for the default partition
     * @param pcEntityName The name of the business entity
     * @param hChangesDataset INPUT-OUTPUT DATASET-HANDLE The dataset with the modifications to the submitted
     * @param poParameter An optional serializable parameter object to be exchanged with the business entity
     * @param phContextDataset The handle of the context dataset for this call
     * @return The parameter object. May be updated/different from the input object
     */
     method public Progress.Lang.Object SubmitData2 (pcPartition      as character,
                                                     pcEntityName     as character,
                                                     input-output dataset-handle hChangesDataset,
                                                     poParameter      as Progress.Lang.Object,
                                                     phContextDataset as handle).



The methods validate that the input parameter objects are either defined as SERIALIZABLE or that they implement Consultingwerk.ISerializable . Parameter objects that are neither will cause a Consultingwerk.OERA.Exceptions.NoSerializableTypeException to be thrown.

A new preprocessor named {{UsePLOforSmartBusinessEntityAdapterSaveChangesParameter}} in Consultingwerk/produits.i

The Consultingwerk.SmartComponents.Implementation.SmartBusinessEntityAdapter optionally changes the datatype of its SaveChangesParameter property from Consultingwerk.ISerializable to Progress.Lang.Object, in order to support ABL-serializable parameter objects. This behaviour is controlled by a new new preprocessor named {{UsePLOforSmartBusinessEntityAdapterSaveChangesParameter}} in Consultingwerk/products.i . If the preprocessor is defined, then the SaveChangesParameter property in the SmartBusinessEntityAdapter, as well as the SaveChangesParameter property in the Consultingwerk.SmartComponents.Implementation.BeforeSubmitChangesToBackendEventArgs class are defined as Progress.Lang.Object. In the absence of this preprocessor, these properties continue to be defined as _Consultingwerk.ISerializable_.

If the SmartBusinessEntityAdapter’s PreferNativeSerialization property is TRUE (the default value) and the is {{UsePLOforSmartBusinessEntityAdapterSaveChangesParameter}} preprocesor defined , then the property value is set to the return value of the call made to the Service Adapter’s SubmitData2 or InvokeTask2 method.

SCL-3851 New Consultingwerk.Util.CodepageHelper method to remove codepage-incompatible characters from a LONGCHAR

Description:

A new static method ConvertToCodepage has been added to the Consultingwerk.Util.CodepageHelper class. This method converts an input {{LONGCHAR}} value into a specified codedpage {{LONGCHAR}} value. Any characters that cannot be converted are skipped from the new value.

SCL-3887 Providing CefSharp as a Browser UserControl

Description:

In addition to the CefSharp based Consultingwerk.Windows.CefBrowser.BrowserForm we’re now also providing the BrowserControl UserControl. The Control provides the following methods to control the browser:

* NavigateTo (URL)
* NavigateBack ()
* NavigateForward ()

and the following properties:

* Title
* Url
* CancelEnabled
* NavigateBackEnabled
* NavigateForwardEnabeld

along with events raised when those properties change.