Dear customer
In this release we’ve changed to the "semantic versioning" numbering, dropping the "-Sxxx" suffix.
We made changes in process execution and interfaces and implemented the possibility to run service tasks with security disabled.
The exception handling during the expression evaluation has been improved.
The Actions interface was extended with a "group" attribute and it’s easier to customise the available actions.
We’ve also made an overview of third party libraries available through the UI.
For detailed information please see the relevant sections.
Best regards,
the edorasware team
Support changes
As of this release we no longer support the following browsers:
-
Internet Explorer 9
-
Internet Explorer 10
In addition we no longer support the legacy form engine or the Java applet for editing documents. Existing form definitions are fully supported by the new view engine without migration.
Announced support changes
We are also announcing some upcoming changes. In the near future
-
we will no longer support Java 7. Java 8 will be the minimum required Java version.
-
the support for single and shared tenants will be dropped (a single tenant will just be a multi-tenant system with only one configured tenant).
-
the CKEditor form component support will be dropped. No migration will be provided for old forms that used this experimental component.
Run Service tasks with tenant-wide access
Service tasks now have an option to disable security during the service task execution. With this option enabled, all work objects in the tenant will be accessible for the duration of the service task execution. System wide access remains available through explicit query hints.
Improved handling of exceptions during expression evaluation
If an expression resulted in an exception this could be silently ignored, with the expression
evaluating to a null
value. The use of server startup property expression.propagate.unresolved.object.error
has now been extended to cover more use cases, so the exception will now result in failure of the operation
when this property is set to true
. When it is set to false
the exception will be ignored as before, but
a message will be written to the server log to report the problem.
Actions unification and interface changes
The REST endpoints /CAS/{ambiguousCaseClientId}/availableActions
and /permissions/actions/context/{contextId}
are
merged into /permissions/actions/context/{contextId}
. The merged REST endpoint provides a list of Actions.
The Action DTO has merged information from both sources too.
A "group" attribute was added which governs grouping of the actions. The default implementation includes actions from the current and ancestor WorkObjects and groups by WorkObject name. Changing this behaviour has been made easy via a custom ActionProvider implementation.
A json Action serialization example:
{
"id" : "assign",
"name" : "Assign",
"description" : "",
"icon" : "assign",
"hidden" : false,
"enabled" : true,
"url" : "",
"form" : "",
"endpoint" : "",
"buttonLabel" : "Assign",
"group" : "My Case Instance",
"referencedWorkObject" : {
"globalId" : "CAS-1234567890",
"type" : "CAS"
}
}
The action REST endpoint implementation was refactored. The DefaultActionManager
implementation collects all actions from
all configured providers. The default configuration is:
<util:list id="actionProviders" value-type="com.edorasware.one.action.ActionProvider"
list-class="java.util.ArrayList">
<ref bean="oneActionProvider"/>
<ref bean="cmmnService"/>
</util:list>
This implementation provides an extension point to customize actionProviders.
Action DTO and REST endpoint are not yet part of the public API and both can be changed without notice. |
ActionProvider customization example
The task is to customize ActionProvider
to provide actions for given workObject (if exists) and all its descendants (the default includes all actions from ancestors).
The example uses the WorkObject’s name as a group for given action.
public class HierarchyActionProvider implements ActionProvider {
...
@Override
public List<Action> getActions(ActionContext actionContext) {
LOG.debug("Getting actions for actionContext {}", actionContext);
if (actionContext.getWorkObject().isPresent()) {
return getActionsWithHierarchy(actionContext);
}
LOG.debug("returning actions from default actionProvider");
return this.actionProvider.getActions(actionContext);
}
private List<Action> getActionsWithHierarchy(final ActionContext actionContext) {
LOG.debug("Returning actions with workObject hierarchy for actionContext {}", actionContext);
if (actionContext.getWorkObject().isPresent()) {
List<? extends WorkObject<?, ?, ?>> workObjects = this.genericWorkObjectService.findWorkObjects(
AnyWorkObjectQuery.builder().
predicate(AnyWorkObject.HIERARCHY.descendantOfOrEq(actionContext.getWorkObject().get().getId())).
hints(AnyWorkObjectQuery.Hint.OMIT_ALL_RELATIONS).
build()
);
return FluentIterable.from(workObjects).transformAndConcat(new Function<WorkObject<?, ?, ?>, Iterable<Action>>() {
@Override
public Iterable<Action> apply(final WorkObject<?, ?, ?> workObject) {
return
FluentIterable.from(HierarchyActionProvider.this.actionProvider.getActions(
new ActionContext(actionContext.getType(), actionContext.getQualifier(),
actionContext.getContext(), Optional.of(workObject))
)).transform(new Function<Action, Action>() {
@Override
public Action apply(Action action) {
return Action.builder(action).
group(workObject.getName()).
build();
}
});
}
}).toList();
}
throw new IllegalArgumentException("WorkObject is mandatory for providing actions through workObject hierarchy");
}
...
Provider implementation overrides actionProviders
bean in the spring configuration:
<bean id="hierarchyActionProvider" class="com.edorasware.acme.action.HierarchyActionProvider">
<constructor-arg name="actionProviders" ref="actionProviders"/>
<constructor-arg name="genericWorkObjectService" ref="genericWorkObjectService"/>
</bean>
<bean id="actionManager" class="com.edorasware.one.action.internal.DefaultActionManager">
<constructor-arg name="genericWorkObjectService" ref="genericWorkObjectService"/>
<constructor-arg name="actionProvider" ref="hierarchyActionProvider"/>
</bean>
This example is provided as part of the bootstrap project.
Custom Properties
We’ve improved availability of Custom Properties. Custom Properties are set at design time and stored on the definitions. BPMN Shapes that may benefit from Custom Properties now have them, others have been cleaned up. Custom Properties can now be referenced Create Document and Email Tasks.
edoras API tempData namespace
TempData namespace has been added to the edoras API. It allows to get & set temporary data from the default form of the current view
To access the $temp data using the edoras API use:
edoras.currentState.tempData.get()
To modify the $temp data using the edoras API use:
edoras.currentState.tempData.set('foo', 'bar')
edoras.currentState.formData.set('$temp.foo', 'bar')
List of dependencies and licenses
A list of the product dependencies and their licenses has been added. You can get the list from the Licensing Information link in the edoras one footer.
IE autocomplete behaviour bug fixed
A bug that made it difficult to unselect an option in the autocomplete component in Internet Explorer has been fixed. The current behavior is similar to other browsers: When the user presses delete, the current option gets deleted and the list shows all available entries.
Upgrade notes
Please have a detailed look at the upgrade notes for this version so that you are able to upgrade to the newer version in a controlled manner.
If you have issues viewing the email then click here to view the online version. If you want to unsubscribe from the release notes please send an email to unsubscribe@edorasware.com.