3 hours ago
flowable-engine

Flowable 8.0.0 Release

Breaking Changes

  • Upgrade to Spring Framework 7 and Spring Boot 4 - Flowable 8 is now based on Spring Framework 7 and Spring Boot 4. There is no support for Spring Boot 3 anymore.
  • Upgrade to Jackson 3 - Jackson 3 is now the default JSON library. Jackson 2 is still supported via a compatibility layer
  • Remove JUnit 3 and JUnit 4 support - JUnit 3 and JUnit 4 testing support, deprecated in 7.2.0, has been removed. Use JUnit 5 (Jupiter) exclusively

New Features

  • Lambda Expression support in expressions - Lambda expressions are now supported in expressions. The planItemInstances keyword has been expanded to support filtering based on a predicate using lambda expressions
  • The method stream() can be used to obtain a java.util.stream.Stream from a collection. e.g. ${customers.stream().filter(customer -> customer.type eq 'premium').toList()} to get a list of premium customers or ${customers.stream().map(customer -> customer.name).toList() to get the names of all the customers.
  • The planItemInstances now expose a filter(Predicate<DelegatePlanItemInstance> predicate) method that can be used to provide custom filter options.
  • Date variables with milliseconds - Date variables will now include the milliseconds when they are returned over REST. E.g., up to now a date variable with the value of 2020-05-04T09:25:45.583Z would have been returned as 2020-05-04T09:25:45Z. However, now it would be returned as 2020-05-04T09:25:45.583Z which is still ISO 8601 compliant.
  • Date properties in UTC - Date properties e.g., Process Instance start time will be returned as an ISO 8601 in the UTC timezone. E.g., if the start time was returned as 2025-09-24T09:58:12.609+02:00 now it is returned as 2025-09-24T07:58:12.609Z.
  • Access definition information in expressions during deployment - Expressions can now access some of the definition information in expressions resolved during deployment. e.g. in Start Timer expression ${variableContainer.definitionKey} to access the definition key
  • Case and Process instance migration improvements:
    • Support for updating more task properties when doing case and process instance migration
    • Case and process instance migration validation is now available in the REST API
    • Option to automatically create plan item instances for new plan items during case instance migration
  • End user tracking - Added endUserId for historic process/case instances and state for historic process instances
  • Case and Process end interceptor - Added case and process end interceptor support
  • Business status events - Dispatch events when updating the business status of a case or process
  • Event Registry hookpoints - Added hookpoints to event registry for event payload types
  • Possibility to disable DMN history persistence - Added option to disable history persistence when executing DMN decisions
  • Support Java Records in Expressions

Performance Improvements

  • Improve Expression coercion performance
  • Long String variables now store a cached value, avoiding repeated deserialization
  • Reduce unnecessary ObjectMapper instance creation - reuse the one from engine configuration

Bug Fixes

  • Fix issue with multiple case reactivations with a parent case instance
  • Fix NPE when having two sentries, and one doesn't have an ifPart
  • Fix case / process instance ended invoked twice when undeploying deeply nested app
  • Fix issue with moving parallel multi-instance activities to a single activity
  • Ensure that multiple character events for the same element are handled correctly in XML parsing
  • Make sure that BeanELResolver and DMN Expression resolution propagates the exception cause
  • Avoid 'Invalid reference in diagram interchange definition' warning message in logs when plan items are part of a plan fragment
  • Unlock exclusive jobs when unacquiring all jobs of a worker
  • Unacquiring external worker job should unlock the exclusive scope if the external worker job is exclusive
  • Address security concerns raised via GitHub issue

Jackson 3

Important: If you have scripts or expressions that call methods on a JsonNode, you need to carefully check if these work with Jackson 3, as many method signatures have changed (see details below). If you are unsure, we recommend starting with Jackson 2 configured first (flowable.variable-json-mapper=jackson2), and then testing for an upgrade to Jackson 3 over time. We do recommend looking into upgrading to Jackson 3, since Jackson 2 will eventually stop receiving updates. See Jackson Releases for the latest support information.

Jackson 3 is used for Flowable internal json manipulation. There is still support for Jackson 2 variables. With Spring Boot this can be enabled by setting flowable.variable-json-mapper to jackson2. By default, Jackson 3 is being used for variables. When configuring Flowable without Spring Boot then the variableJsonMapper on the process, cmmn, and app engine configurations should be set to be org.flowable.common.engine.impl.json.jackson2.Jackson2VariableJsonMapper and the org.flowable.common.rest.variable.Jackson2JsonObjectRestVariableConverter should be added to the appropriate rest response factories.

Notable changes when using JSON in expressions / scripts:

  • Packages have changed from com.fasterxml.jackson.databind and com.fasterxml.jackson.core to tools.jackson.databind and tools.jackson.core
  • elements() no longer returns Iterator<JsonNode> and instead returns Collection<JsonNode>
  • values() no longer returns Iterator<JsonNode> and instead returns Collection<JsonNode>
  • Iterator<String> fieldNames() replaced by Collection<String> propertyNames()
  • Iterator<Map.Entry<String, JsonNode>> fields() replaced by Set<Map.Entry<String, JsonNode>> properties()
  • JsonNode with(String) replaced by ObjectNode withObject(String), and if not using a pointer then it is better to use ObjectNode withProperty(String)
  • TextNode textNode(String) replaced by StringNode stringNode(String)
  • List<String> findValuesAsText(String) replaced by List<String> findValuesAsString(String)
  • List<String> findValuesAsText(String, List<String>) replaced by List<String> findValuesAsString(String, List<String>)
  • boolean isContainerNode() replaced by boolean isContainer()
  • boolean isEmpty(SerializerProvider) replaced by boolean isEmpty(SerializationContext)
  • JsonNode put(String, JsonNode) replaced by JsonNode replace(String, JsonNode)
  • JsonNode putAll(Map<String, ? extends JsonNode>) replaced by JsonNode setAll(Map<String, ? extends JsonNode>)
  • JsonNode putAll(ObjectNode) replaced by JsonNode setAll(ObjectNode)
  • JsonParser traverse() removed without replacement
  • JsonParser traverse(ObjectCodec) replaced by JsonParser traverse(ObjectReadContext)
  • void serialize(JsonGenerator, SerializerProvider) replaced by void serialize(JsonGenerator, SerializationContext)
  • void serializeWithType(JsonGenerator, SerializerProvider, TypeSerializer) replaced by void serializeWithType(JsonGenerator, SerializationContext, TypeSerializer)

Methods deprecated in Jackson 3:

  • String asText() replaced by String asString()
  • String asText(String) replaced by String asString(String)
  • boolean isTextual() replaced by boolean isString()
  • String textValue() replaced by String stringValue()

There is also a behaviour change in the different xxxValue and asXXX methods. In Jackson 3 those methods would fail if the node is not of the appropriate type and / or if it cannot coerce the value to the requested type. e.g.

  • When using stringValue on a non StringNode or NullNode it would fail, in Jackson 2 it would return null.
  • When using asString on a ObjectNode or ArrayNode it would fail, in Jackson 2 it would return an empty string.

Dependency Upgrades

  • Upgrade to Spring Framework 7 / Spring Boot 4
  • Upgrade to Jackson 3 (with Jackson 2 compatibility)
  • Various other dependency updates
9 hours ago
Activiti
1 days ago
selenium

Nightly

Commits

  • 8dd092c: [dotnet][rb][java][js][py] Automated Browser Version Update (#17140) (Selenium CI Bot) #17140
  • aa3168d: [java] Catch exception on .contentAsString with binary content (#17139) (tim-burke-systemware) #17139
  • 2f71272: [dotnet] [bidi] Wait until events are dispatched when unsubscribing (#17142) (Nikolay Borisenko) #17142
  • e23507e: [dotnet] Any WebDriver can be disposed asynchronously (#17119) (Nikolay Borisenko) #17119