Migration notes 6.1

This page explains the changes required to migrate to the stated version of Atoti Sign-Off.

Migrate to 6.1.0

Upgrading from version 6.0.0, see Atoti Sign-Off 6.1.0 Release Notes.

Atoti Sign-Off is using Atoti Server 6.1.4, Atoti UI ~5.2.6, and Sign-Off API 4.2.0 .

For new features and fixes included in these releases, please see:

Headline announcement

  • Starter changes: Multiple classes have been removed from the starter module. See Starter changes for more details.
  • Package restructure: The package structure in the signoff-activeviam module has been reorganized to improve maintainability. See Package changes for more details.
  • Validation error changes: A new method has been added to the API for validation errors to support accurately reporting indexes. See Validation error changes for more details.
  • Workflow Service API changes: The ISignOffProcessDefinitionWorkflowService and ISignOffProcessInstanceWorkflowService APIs have been updated and a new method has been added to accommodate workflow file attachments. See Workflow Service API changes for more details.
  • Application server communication changes: Atoti Sign-Off has changed how it communicates with the application server. See Application server communication changes for more details.
  • Exact location required for adjustments: Adjustments can only be performed at the exact location defined by the filters in SupportedAdjustmentDTO.

Exact location required for adjustments

Adjustments can only be made at the specific locations defined by the filters in SupportedAdjustmentDTO instances. If a filter is not explicitly specified in the supported adjustment configuration, the corresponding value at that location cannot be adjusted.

If you want to display a hierarchy in the UI during adjustment, even if it isn’t directly related to the adjustment logic, include it as an optional filter.

Starter changes

Most of the signoff-starter module has been moved into signoff-activeviam. The goal of these changes is ultimately to improve the developer experience when migrating, particularly in the context of client customizations.

The following classes have been migrated from signoff-starter to signoff-activeviam:

Class Name Old Package New Package
SignOffAdjustmentDefinitionRestService com.activeviam.signoff.starter.adjustments.definition.rest.impl com.activeviam.signoff.adjustments.rest
SignOffAdjustmentExecutionRestService com.activeviam.signoff.starter.adjustments.execution.rest.impl com.activeviam.signoff.adjustments.rest
SignOffAdjustmentStatusRestService com.activeviam.signoff.starter.adjustments.status.rest.impl com.activeviam.signoff.adjustments.status.rest
ISignOffAdjustmentStatusService com.activeviam.signoff.starter.adjustments.status.service com.activeviam.signoff.adjustments.status.service
SignOffAdjustmentStatusService com.activeviam.signoff.starter.adjustments.status.service.impl com.activeviam.signoff.adjustments.status.service.impl
SignOffSupportedAdjustmentsRestService com.activeviam.signoff.starter.adjustments.support.rest.impl com.activeviam.signoff.adjustments.support.rest
ISignOffSupportedAdjustmentsService com.activeviam.signoff.starter.adjustments.support.service com.activeviam.signoff.adjustments.support.service
SignOffSupportedAdjustmentsService com.activeviam.signoff.starter.adjustments.support.service.impl com.activeviam.signoff.adjustments.support.service.impl
ApplicationStatusConfig com.activeviam.signoff.starter.cfg com.activeviam.signoff.cfg
DatastoreConfiguratorSetup com.activeviam.signoff.starter.cfg com.activeviam.signoff.cfg
InitialLoad com.activeviam.signoff.starter.cfg com.activeviam.signoff.cfg
AdjustmentsCubeConfig com.activeviam.signoff.starter.cfg.cache.pivot.adjustements com.activeviam.signoff.cfg.pivot.adjustments
AdjustmentsExecutionCubeConfig com.activeviam.signoff.starter.cfg.cache.pivot.adjustements com.activeviam.signoff.cfg.pivot.adjustments
SignOffProcessDefinitionCubeConfig com.activeviam.signoff.starter.cfg.cache.pivot.definition com.activeviam.signoff.cfg.pivot.definition
SignOffProcessInstanceCubeConfig com.activeviam.signoff.starter.cfg.cache.pivot.instance com.activeviam.signoff.cfg.pivot.instance
IObserver com.activeviam.signoff.starter.observable com.activeviam.signoff.observable
ApplicationServerAndStatus com.activeviam.signoff.starter.server com.activeviam.signoff.server
ApplicationStatusService com.activeviam.signoff.starter.server com.activeviam.signoff.server
ApplicationStatusTask com.activeviam.signoff.starter.server com.activeviam.signoff.server
ProcessNotifyingApplicationStatusObserver com.activeviam.signoff.starter.server com.activeviam.signoff.server
SignOffProcessEventHandlers com.activeviam.signoff.starter.workflow com.activeviam.signoff.workflow.service

The following classes have been migrated from signoff-starter to signoff-activeviam and renamed to better reflect their purpose:

Old Package New Package
com.activeviam.signoff.starter.cfg.RestTemplateConfiguration com.activeviam.signoff.cfg.SignOffBasicAuthRestClientBuilder

Any beans exposed by these classes have been annotated with @ConditionalOnMissingBean which allows you to define your own implementations to override the defaults. See the Getting Started guide for more information.

Package changes

The packages in the signoff-activeviam module have been reorganized to improve maintainability. The table below lists the classes affected by this change. If you have custom classes that depend on any of these classes, you will need to update the package imports accordingly.

Class Name Old Package New Package
AtotiServerWithDatastoreConfig com.activeviam.signoff.cache.cube.cfg com.activeviam.signoff.cfg.datastore
DatastoreSchemaDescriptionConfig com.activeviam.signoff.cache.cube.cfg com.activeviam.signoff.cfg.datastore
SignOffSchema com.activeviam.signoff.cache.cube.cfg.store com.activeviam.signoff.cfg.datastore
AAdjustmentsDefinitionDatastoreConfig com.activeviam.signoff.cache.cube.impl.adjustements.definition com.activeviam.signoff.cfg.datastore.adjustments.definition
AdjustmentsDefinitionDatastoreConfig com.activeviam.signoff.cache.cube.cfg.store.adjustments.definition com.activeviam.signoff.cfg.datastore.adjustments.definition
IAdjustmentsDefinitionCacheService com.activeviam.signoff.workflow.cache.adjustments.definition com.activeviam.signoff.cfg.datastore.adjustments.definition
AdjustmentsDatastoreDefinitionCacheService com.activeviam.signoff.cache.cube.impl.adjustements.definition com.activeviam.signoff.cfg.datastore.adjustments.definition
AAdjustmentsExecutionDatastoreConfig com.activeviam.signoff.cache.cube.impl.adjustements.execution com.activeviam.signoff.cfg.datastore.adjustments.execution
IAdjustmentsExecutionCacheService com.activeviam.signoff.workflow.cache.adjustments.execution com.activeviam.signoff.cfg.datastore.adjustments.execution
AdjustmentsDatastoreExecutionCacheService com.activeviam.signoff.cache.cube.impl.adjustements.execution com.activeviam.signoff.cfg.datastore.adjustments.execution
AdjustmentsExecutionDatastoreConfig com.activeviam.signoff.cache.cube.cfg.store.adjustments.execution com.activeviam.signoff.cfg.datastore.adjustments.execution
ASignOffProcessDefinitionDatastoreConfig com.activeviam.signoff.cache.cube.impl.definition com.activeviam.signoff.cfg.datastore.definition
SignOffProcessDefinitionDatastoreConfig com.activeviam.signoff.cache.cube.cfg.store.definition com.activeviam.signoff.cfg.datastore.definition
ISignOffProcessDefinitionWorkflowCacheService com.activeviam.signoff.workflow.cache.definition com.activeviam.signoff.cfg.datastore.definition
SignOffProcessDefinitionWorkflowDatastoreCacheService com.activeviam.signoff.cache.cube.impl.definition com.activeviam.signoff.cfg.datastore.definition
ASignOffProcessInstanceDatastoreConfig com.activeviam.signoff.cache.cube.impl.instance com.activeviam.signoff.cfg.datastore.instance
SignOffProcessInstanceDatastoreConfig com.activeviam.signoff.cache.cube.cfg.store.instance com.activeviam.signoff.cfg.datastore.instance
ISignOffProcessInstanceWorkflowCacheService com.activeviam.signoff.workflow.cache.instance com.activeviam.signoff.cfg.datastore.instance
SignOffProcessInstanceWorkflowDatastoreCacheService com.activeviam.signoff.cache.cube.impl.instance com.activeviam.signoff.cfg.datastore.instance
ActivePivotCoreConfig com.activeviam.signoff.cache.cube.cfg com.activeviam.signoff.cfg.pivot
ISignOffCubeBuilderFunction com.activeviam.signoff.cfg.cache.pivot com.activeviam.signoff.cfg.pivot
PivotConfig com.activeviam.signoff.cache.cube.cfg.pivot com.activeviam.signoff.cfg.pivot
PivotManager com.activeviam.signoff.cache.cube.cfg com.activeviam.signoff.cfg.pivot
CubeFormatProperties com.activeviam.signoff.cfg com.activeviam.signoff.cfg.properties
RestApiProperties com.activeviam.signoff.cfg com.activeviam.signoff.cfg.properties
SignOffApplicationConfigurationProperties com.activeviam.signoff.cfg com.activeviam.signoff.cfg.properties
SignOffServerSettingRestController com.activeviam.signoff.server.service.rest com.activeviam.signoff.server.settings.rest
SignOffSettingsDTO com.activeviam.signoff.server.service.rest.dto com.activeviam.signoff.server.settings.rest.dto
SignOffRestConstants com.activeviam.signoff.rest com.activeviam.signoff.util.rest
SignOffRestUtils com.activeviam.signoff.rest com.activeviam.signoff.util.rest

Validation error changes

A new method has been added to IValidationError and an existing method was removed.

New method added
/**
   * Sets the 0-based index of the object in the list of objects processed by the validator.
   *
   * @param index the 0-based index of the object
   */
  void setIndex(Integer index);

If you have a custom implementation of IValidationError, you will need to implement this method in your custom class. This method allows for the index set on the errors to be updated after the errors are initially created. This is important because all validation errors in the default validators are initially created with an index of 0 since the validation is performed on a single object at a time. If the validator is invoked in the context of a list of objects, such as from the SignOffDefinitionListConstraintValidator or SignOffAdjustmentListConstraintValidator, the indexes on the resulting errors need to be updated to reflect the actual index of the object in the list.

Removed method

The getAction() method has been removed from IValidationError. All information about the error, including any recommended resolution steps, should now be provided in the getReason() method. If you have a custom implementation of IValidationError, you can safely remove the getAction() method.

Workflow Service API changes

To support file attachments in the Atoti Sign-Off workflows, the methods associated with workflow actions in ISignOffProcessDefinitionWorkflowService and ISignOffProcessInstanceWorkflowService have been updated to include a variables parameter of type Map<String, Object> that is used to store a reference to the saved file. A new method, processInstanceHistory, has also been added in both APIs to support retrieving these workflow variables as part of the workflow history. If you have a custom implementation of these interfaces, you will need to update the existing method signatures and implement the new processInstanceHistory method to match the updated APIs:

ISignOffProcessDefinitionWorkflowService
ISignOffProcessInstanceWorkflowService
IWorkflowTaskActionsService new method

A new method getWorkflowTaskActions(UserTask task, String activitiProcessId) has been added to the IWorkflowTaskActionsService. This is to support retrieving the workflow variables associated with a task so that file attachments can be retrieved as part of the history records.

If you have a custom implementation of IWorkflowTaskActionsService, you will need to implement the new method:

/**
 * Get the actions of a user task.
 *
 * @param task the user task for which to retrieve actions
 * @param activitiProcessId the ID of the process to apply the action consumer
 * @return a list of {@link WorkflowTaskActionDTO}
 */
List<WorkflowTaskActionDTO> getWorkflowTaskActions(UserTask task, String activitiProcessId);

Application server communication changes

Previously, Atoti Sign-Off communicated with the application server using a custom RestTemplate that was configured to use basic authentication. This was configured in RestTemplateConfiguration. To conform with more modern Spring APIs and to improve extensibility, this has been replaced with a RestClient.Builder bean that is exposed via ISignOffRestClientBuilder.

ISignOffRestClientBuilder

This interface exposes a RestClient.Builder for each server that Atoti Sign-Off connects to, allowing you to build and send authenticated requests to the Atoti servers. We use a builder pattern to allow for easy configuration of the RestClient instances, such as setting the URL, authentication, and custom headers.

By default, the RestClient.Builder is configured to use JWT authentication with the credentials defined in the sign-off.application.rest-apis.* properties. You can revert this to use Basic authentication by setting the sign-off.application.authentication-mode property to basic.

JWT authentication requires that only a username is present, so you can now remove any passwords from your application.yml files if you continue to use the JWT authentication.

Configuration Properties

Properties added

signoff-activeviam
Property Name Comment Value
sign-off.application.rest-apis.* Defines the servers that Atoti Sign-Off connects to. None
sign-off.cubes.formatters.integer-format Defines the format for measures of type INTEGER in the Sign-Off cubes. INT[#,###]
sign-off.export.timeout-in-milliseconds Defines the time in milliseconds to wait for an export to finish. 3600000
sign-off.workflow.process-definition-key Defines the workflow type used by the Sign-Off Definition workflow. sign-off-process-definition
sign-off.workflow.file-attachments-are-read-only When set to true, the file attachments in the workflow are set to read-only on the file system. You may disable this if you encounter difficulties uploading file. true
sign-off.workflow.allowed-file-upload-extensions The file types allowed to be uploaded as attachments in the workflow. pdf, jpeg, png, csv, xls, xlsx, doc, docx, txt, ppt, pptx, eml, msg
sign-off.workflow.file-storage-path The folder where the workflow attachments are stored. This can be an absolute or relative path. sign-off/workflow/attachments
sign-off.application.emitter-timeout The timeout on each Event Source that a client opens to receive real-time updates on Sign-Off definitions and tasks. 8h

Properties removed

signoff-activeviam
Property Name Comment
application.rest-apis.* This property has been replaced by sign-off.application.rest-apis.* and is no longer populated by default.
cube.format.integer This property has been replaced by sign-off.cubes.formatters.integer-format.
sign-off.export.timeout-delay-in-milliseconds This property has been replaced by sign-off.export.timeout-in-milliseconds.
workflow.sign-off-process-definition.create.process-definition-key This property has been replaced by sign-off.workflow.process-definition-key.

Files modified

application.yml

New properties:

Property Name Comment Value
sign-off.application.rest-apis.* Defines the servers that Atoti Sign-Off connects to. None

Deleted properties:

Property Name Comment
application.rest-apis.* This property is replaced by sign-off.application.rest-apis.

Other changes

Validation error changes

The structure of validation errors has been streamlined to improve readability and usability. If you have custom validation errors in your project, you’ll need to migrate them accordingly.

IValidationError changes
  • new method added: String getFieldName() - returns the name of the field containing the error.
  • method getLineNumber() was renamed to getIndex().
  • method getColumnIndex() was removed and replaced by getFieldName().
  • method getSource() was removed.

Spring Configuration changes

The primary configuration class for the signoff-actieviam module is now SignOffCoreAutoConfiguration which is a Spring AutoConfiguration class. Most of the imports from SignOffAppConfig in the starter module have been moved to this new autoconfiguration class.

Additionally, many service imports have been removed in favor of exposing the services as Spring beans marked as @ConditionalOnMissingBean, making them easier to override if you want to implement a custom service. To override a default service implementation, create your own implementation of the respective interface and expose it as a Spring bean. The @Primary annotation is no longer required if the bean for the default implementation is marked as @ConditionalOnMissingBean.