A compact and highly efficient workflow and Business Process Management (BPM) platform for developers, system admins and business users.

Overview

Flowable (V6)

Maven Central:
Maven Central

Docker Images:
Docker Hub

License:
license

Flowable Actions CI

Homepage: https://www.flowable.org/

flowable / flowəb(ə)l /

  • a compact and highly efficient workflow and Business Process Management (BPM) platform for developers, system admins and business users.
  • a lightning fast, tried and tested BPMN 2 process engine written in Java. It is Apache 2.0 licensed open source, with a committed community.
  • can run embedded in a Java application, or as a service on a server, a cluster, and in the cloud. It integrates perfectly with Spring. With a rich Java and REST API, it is the ideal engine for orchestrating human or system activities.

Introduction

License

Flowable is distributed under the Apache V2 license (http://www.apache.org/licenses/LICENSE-2.0.html).

Download

The Flowable downloads can be found on https://www.flowable.org/downloads.html.

Sources

The distribution contains most of the sources as jar files. The source code of Flowable can be found on https://github.com/flowable/flowable-engine.

JDK 8+

Flowable runs on a JDK higher than or equal to version 8. Use the JDK packaged with your Linux distribution or go to https://adoptopenjdk.net and click on button "Latest release". There are installation instructions on that page as well. To verify that your installation was successful, run "java -version" on the command line. That should print the installed version of your JDK.

Contributing

Contributing to Flowable: https://github.com/flowable/flowable-engine/wiki.

Reporting problems

Every self-respecting developer should have read this link on how to ask smart questions: http://www.catb.org/~esr/faqs/smart-questions.html.

After you've done that you can post questions and comments on https://forum.flowable.org and create issues in https://github.com/flowable/flowable-engine/issues.

Comments
  • WIP: Added basic external authentication with a Keycloak Default handler

    WIP: Added basic external authentication with a Keycloak Default handler

    WIP for getting external authentication in flowable. With the code as it is, it's possible to register/login with OAUTH (KeyCloak for example, but I also tested with another OAuth from a client).

    remark: SAML should also be possible

    Short description of what happened:

    I've added an SSOHandler interface which you can inject yourself to add your custom logic/sso. This SsoHandler should provide the correct external url to the sso login page. When everything works out the SSOHandler has to return a SSOUserInfo object. This userinfo is used to decide wether to Login the user or to register a new account for that user. When:

    • registering: the user gets a random password (UUID4) and possibly gets a tenant and privileges. If not, the user has to wait for an admin to grant him/her some privileges
    • logging in: the normal login flow is followed.

    Comments and remarks are super welcome, as this can be improved A LOT.

    What it doesn't do (yet)

    • When revoking some privileges in you OAuth, flowable will not update these yet.
    • Right now the way to get to the OAuth login page is through a URL beneath the login form. In the future it should be possible to redirect to that URL directly (so now regular accounts can be used)
    opened by mattydebie 26
  • Error trying to deploy flowable chart using HELM 3

    Error trying to deploy flowable chart using HELM 3

    I am trying to deploy flowable using helm chart

    helm install flowable/flowable --name-template flowable -f dpa-flowable/values-flowable.yaml -n dpa-flowable

    and I am getting the following error:

    Error: file '/Users/gmalanga/Library/Caches/helm/repository/flowable-6.5.0.tgz' does not appear to be a gzipped archive; got 'application/octet-stream'

    The same command was working in December 2019, and I did not change any configuration to the YAML file supplied in the command. I am using helm v. 3.1.0 and flowable v. 6.5.0.

    Thanks for your help.

    opened by gmalanga 22
  • POST /runtime/tasks/{taskId}

    POST /runtime/tasks/{taskId}

    Using Flowable's REST API to complete a User task:

    curl -H "Content-Type: application/json" 
         -X POST http://admin:test@localhost:8080/flowable-task/process-api/runtime/tasks/1fae489a-070f-11e9-a85e-0242ac110002
         -d "@data-1.json"
    

    data-1.json:

    {
      "action" : "complete",
      "variables" : [
        {
            "id": "givenName",
            "name": "Given Name",
            "type": "string",
            "value": "Rob"
        },
        {
            "id": "familyName",
            "name": "Family Name",
            "type": "string",
            "value": "Ferguson"
        },
        {
            "id": "employeeNumber",
            "name": "Employee Number",
            "type": "integer",
            "value": 123456
        },
        {
            "id": "fromDate",
            "name": "From Date",
            "type": "date",
            "value": "2018-12-21T00:00:00+00:00"
        },
        {
            "id": "toDate",
            "name": "To Date",
            "type": "date",
            "value": "2019-01-07T00:00:00+00:00"
        }
      ]
    }
    

    Returns:

    Status: 200 OK
    

    Despite returning OK it doesn't appear to save the User task's form data:

    blank-form

    See: https://robferguson.org/blog/2018/12/24/flowable-rest-api-part-1/

    opened by Robinyo 22
  • Rest Activity Feature

    Rest Activity Feature

    Hello team,

    I finished an initial implementation of HTTP Task.

    Features

    1. Http Task in flowable-modeler
    2. Http Task specification and documentation ( feedback and comments would be beneficial for final version)
    3. Http Client configuration in flowable.cfg.xml ( Only few parameters for now)
    4. Implementation based on Apache HTTP client and this can be customized. Not all the settings for the client are implemented.
    5. Test cases for basic exception handling and retry scenarios

    Todo list

    1. Implement and write tests for all http methods
    2. Implement and write tests for all http client configuration parameters
    3. Implement and write tests for custom https certificates configuration
    4. Implement and write tests for authentication
    5. Implement and write tests for response parsing/handling
    6. Performance testing and optimizations, code cleanup/refactor
    7. Any other features/changes based on review and comments

    Submitting pull request to get feedback and reviews.

    Flowable forum discussion Rest Activity Feature

    Thanks, Harsha Teja Kanna

    opened by h7kanna 21
  • Making Admin UI tenant aware.

    Making Admin UI tenant aware.

    My attempt on making the Admin UI tenant aware.

    I added the tenant fields to the IDM UI, so that one can enter and update the tenant ID for a user. This tenant ID is now also passed to the UI.

    The admin UI adds the tenantID filter right before sending the request to the flowable-rest. This way you can not 'disable' it and it should be safe.

    I don't think this fixes everything but it could be a step in the right direction.

    Every comment or remark is welcome.

    opened by mattydebie 19
  • Missing bpmn elements in the web modeler

    Missing bpmn elements in the web modeler

    The web modeler is missing some elements :

    • Compensation Intermediate Throwing Event
    • Transaction container

    Here is the related thread from the forum.

    https://forum.flowable.org/t/compensation-intermediate-throwing-event/465

    Thank you.

    opened by godevbot 19
  • Fix parallel execution of CallActivity

    Fix parallel execution of CallActivity

    Currently there was a problem when some Activity is being used with ParallelMultiInstanceActivityBehavior. The problem was that an FlowableOptimisticLockingException was being thrown and this prevents the execution of the concurrent executions(the retry of the failed job was not efficient because the whole execution is being retried which leads to retry of whole steps, gateways or even ProcessInstances). This PullRequest introduces a way to overcome this situation by using a custom Monitoring operation. The operation is "watching" the concurrent executions progress and based on it is deciding whether the parallel processing has finished.

    opened by enchobelezirev 15
  • Timer job never unlocked after an exception

    Timer job never unlocked after an exception

    I have a simple process, very fast to execute, with this timer start event running each minute:

    <startEvent id="StartEvent_17bxin3" name="Each minute"> <outgoing>SequenceFlow_17asw5l</outgoing> <timerEventDefinition> <timeCycle><![CDATA["0 0/1 * 1/1 * ? *"]]></timeCycle> </timerEventDefinition> </startEvent>

    Then, I run that bpmn, everything goes fine but sometimes I can see that this timer doesn’t work anymore, until I restart the engine (I clean the flowable DBs at startup). It’s not the related to the retries getting to 0, because I use a value very very high.

    To reproduce, I go in AcquireTimerJobsRunnable in the run() method and after I have one value in the acquiredJobs array, I just need to make the code throw an exception before the job is effectively launched, to make the job in the acquiredJobs array to not work anymore. So I breakpoint on the commandExecutor.execute method. At this point I can see in the database, for the collection ACT_RU_TIMER_JOB, that there’s an entry with the field LOCK_EXP_TIME_ that is not null; it’s a date a couple of minutes in the future. LOCK_OWNER_ is also not null and REV_ is 2. Then in Eclipse, I generate an exception by stepping into the code until I see a logger where the code do “config.getTransactionPropagation()” and config is a local variable, so I just need to set its value to null to cause a NullPointerException. After that, if I let that run, the entry in ACT_RU_TIMER_JOB will never disappears and the timer will not start again. Its field values will not change. Nothing appears in ACT_RU_DEADLETTER_JOB nor ACT_RU_JOB for this timer. Other timers continue to work normally.

    Here I simulated an Exception with a NullPointerException, but on production I saw a MySQL Timeout in the logs.

    I’ve found that there’s a flowable-reset-expired-jobs thread, and debugging it I’ve found that it search for expired jobs, correctly I think, but in the ACT_RU_JOB collection, not the ACT_RU_TIMER_JOB collection. I didn’t found a class in the package org.flowable.job.service.impl.asyncexecutor that run a job to watch for expired TIMER_JOB.

    I think something is missing, help would be appreciated. Thank you.

    I'm using Flowable 6.4.1, but I saw the same behavior with Flowable 6.5.0. I use it with MySQL and Spring Boot.

    opened by maxime066 14
  • Flowable 6.5.0 delete deployment with active process instance corrupt the database

    Flowable 6.5.0 delete deployment with active process instance corrupt the database

    Describe the bug In 6.5.0, if one tries to delete a deployment while it has active process instance, the action corrupt the database in a way that one can still see the process definition, but it is no longer associated with a deployment ID. There is no way to delete this process definition anymore.

    Here is how to reproduce it using flowable REST API

    1. Deploy a process definition

    curl --user rest-admin:test -F "[email protected]" http://myserver:8080/demo-flowable/process-api/repository/deployments

    1. Start a process instance:

    { "processDefinitionKey":"myprocess", "variables": [ { "name":"employee", "value": "John Houser" }, { "name":"applicationId", "value": "MyApp" }, { "name":"logonId", "value": "jhouser" }, { "name":"password", "value": "**********" }, { "name":"approverRequired", "value": true }, { "name":"approvers", "value":"" }, { "name":"approverGroups", "value":"approvers" }, { "name":"subject", "value": "Please approve request" }, { "name":"message", "value": "Please approve this request as soon as possible" }]}

    1. Delete the deployment:

    DELETE http://myserver:8080/flowable-rest/service/repository/deployments/9c3bcead-4e8a-11ea-be15-00155d7357f8

    ERROR:

    { "message": "Internal server error", "exception": "\r\n### Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: The DELETE statement conflicted with the REFERENCE constraint "ACT_FK_EXE_PROCDEF". The conflict occurred in database "winchester-flowable", table "dbo.ACT_RU_EXECUTION", column 'PROC_DEF_ID_'.\r\n### The error may exist in org/flowable/db/mapping/entity/ProcessDefinition.xml\r\n### The error may involve org.flowable.engine.impl.persistence.entity.ProcessDefinitionEntityImpl.deleteProcessDefinitionsByDeploymentId-Inline\r\n### The error occurred while setting parameters\r\n### SQL: delete from ACT_RE_PROCDEF where DEPLOYMENT_ID_ = ?\r\n### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: The DELETE statement conflicted with the REFERENCE constraint "ACT_FK_EXE_PROCDEF". The conflict occurred in database "winchester-flowable", table "dbo.ACT_RU_EXECUTION", column 'PROC_DEF_ID_'." }

    1. Get the process-definition: GET http://.../repository/process-definitions

    One can still see the process definition. But click on deploymentUrl link, one gets:

    {"message":"Not found","exception":"Could not find a deployment with id '9c3bcead-4e8a-11ea-be15-00155d7357f8'."}

    1. I thought I could just delete the process instance and then come back to delete the deployment, but that does not work: server throws exception:

    DELETE http://.../runtime/process-instances/a5a41a21-4e8a-11ea-be15-00155d7357f8

    org.apache.ibatis.exceptions.PersistenceException:

    Error updating database. Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Violation of PRIMARY KEY constraint 'PK__ACT_ID_M__C2371B0F4C64F7B2'. Cannot insert duplicate key in object 'dbo.ACT_ID_MEMBERSHIP'. The duplicate key value is (hwinston, specialists).

    The error may exist in org/flowable/idm/db/mapping/entity/Membership.xml

    The error may involve org.flowable.idm.engine.impl.persistence.entity.MembershipEntityImpl.insertMembership-Inline

    The error occurred while setting parameters

    SQL: insert into ACT_ID_MEMBERSHIP (USER_ID_, GROUP_ID_) values ( ?, ? )

    Cause: com.microsoft.sqlserver.jdbc.SQLServerException: Violation of PRIMARY KEY constraint 'PK__ACT_ID_M__C2371B0F4C64F7B2'. Cannot insert duplicate key in object 'dbo.ACT_ID_MEMBERSHIP'. The duplicate key value is (hwinston, specialists).

    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) ~[mybatis-3.5.3.jar:3.5.3]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:199) ~[mybatis-3.5.3.jar:3.5.3]
    at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.3.jar:3.5.3]
    at org.flowable.common.engine.impl.db.DbSqlSession.flushRegularInsert(DbSqlSession.java:509) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.db.DbSqlSession.flushInsertEntities(DbSqlSession.java:490) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.db.DbSqlSession.flushInserts(DbSqlSession.java:473) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.db.DbSqlSession.flush(DbSqlSession.java:358) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:192) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.interceptor.CommandContext.close(CommandContext.java:61) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:81) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:51) ~[flowable-spring-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:51) ~[flowable-engine-common-6.5.0.jar:6.5.0]
    at org.flowable.idm.engine.impl.IdmIdentityServiceImpl.createMembership(IdmIdentityServiceImpl.java:118) ~[flowable-idm-engine-6.5.0.jar:6.5.0]
    at org.flowable.ui.idm.service.GroupServiceImpl.addGroupMember(GroupServiceImpl.java:128) ~[flowable-ui-idm-logic-6.5.0.jar:6.5.0]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:366) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:99) ~[spring-tx-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212) ~[spring-aop-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at com.sun.proxy.$Proxy146.addGroupMember(Unknown Source) ~[?:?]
    at org.flowable.ui.idm.rest.app.IdmGroupsResource.addGroupMember(IdmGroupsResource.java:98) ~[flowable-ui-idm-rest-6.5.0.jar:6.5.0]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]
    at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:?]
    at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]
    at java.lang.reflect.Method.invoke(Method.java:566) ~[?:?]
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:888) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:793) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707) ~[servlet-api-3.1.jar:3.1.0]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) ~[servlet-api-3.1.jar:3.1.0]
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:755) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1617) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter(WebSocketUpgradeFilter.java:226) ~[websocket-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:320) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:126) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:90) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:118) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:150) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:158) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:215) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:178) ~[spring-security-web-5.2.1.RELEASE.jar:5.2.1.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:358) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:271) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:128) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.access$000(ErrorPageFilter.java:66) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter$1.doFilterInternal(ErrorPageFilter.java:103) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.boot.web.servlet.support.ErrorPageFilter.doFilter(ErrorPageFilter.java:121) ~[spring-boot-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:108) ~[spring-boot-actuator-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.2.RELEASE.jar:5.2.2.RELEASE]
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:566) ~[jetty-security-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1607) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1297) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) ~[jetty-servlet-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1577) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1212) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:221) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:146) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.rewrite.handler.RewriteHandler.handle(RewriteHandler.java:322) ~[jetty-rewrite-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.Server.handle(Server.java:500) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) ~[jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:547) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) [jetty-server-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) [jetty-io-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) [jetty-util-9.4.26.v20200117.jar:9.4.26.v20200117]
    at java.lang.Thread.run(Thread.java:834) [?:?]
    

    Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Violation of PRIMARY KEY constraint 'PK__ACT_ID_M__C2371B0F4C64F7B2'. Cannot insert duplicate key in object 'dbo.ACT_ID_MEMBERSHIP'. The duplicate key value is (hwinston, specialists). at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:262) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1624) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:594) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:524) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7194) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:2979) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:248) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:223) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:505) ~[mssql-jdbc-7.4.1.jre8.jar:?] at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-3.4.2.jar:?] at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-3.4.2.jar:?] at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:47) ~[mybatis-3.5.3.jar:3.5.3] at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:74) ~[mybatis-3.5.3.jar:3.5.3] at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.3.jar:3.5.3] at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.3.jar:3.5.3] at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.3.jar:3.5.3] at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.3.jar:3.5.3] ... 135 more

    Because of the above issues, I could no longer remove the process instance nor the process definition to start over. I had to rebuild my DB although someone who is farmiliar with DB schema can manually remove them.

    Expected behavior

    If there is process instance associated with a deployment, deleting a deployment should correctly result in an error, but nothing should have changed in DB. So one can correct it by removing the process instance first before trying to remove process deployment.

    Code If applicable, add the code that you are using when having the issue.

    Additional context Add the version of Flowable that you are using, the database vendor and if you are using Flowable within Spring Boot, the Flowable Task application etc.

    opened by carbon-60 14
  • BPMN20 XML import throws NullPointerException when no process is found

    BPMN20 XML import throws NullPointerException when no process is found

    Describe the bug I have designed a BPMN2.0 process model in Signavio modeller and exported it as BPMN 2.0 XML. When trying to import the XML into Flowable 6.4.2, the importer throws a NPE:

    2019-12-17 15:36:03.256 ERROR 1 --- [nio-8080-exec-8] o.f.u.m.s.FlowableModelQueryService      : Import failed for BigPicture.bpmn
    
    org.flowable.bpmn.exceptions.XMLException: Error processing BPMN document
    	at org.flowable.bpmn.converter.BpmnXMLConverter.convertToBpmnModel(BpmnXMLConverter.java:448) ~[flowable-bpmn-converter-6.4.2.1.jar:6.4.2.1]
    	at org.flowable.ui.modeler.service.FlowableModelQueryService.importProcessModel(FlowableModelQueryService.java:179) ~[flowable-ui-modeler-logic-6.4.2.1.jar:6.4.2.1]
    ...
    Caused by: java.lang.NullPointerException
    	at org.flowable.bpmn.converter.parser.ExtensionElementsParser.parse(ExtensionElementsParser.java:55) ~[flowable-bpmn-converter-6.4.2.1.jar:6.4.2.1]
    	at org.flowable.bpmn.converter.BpmnXMLConverter.convertToBpmnModel(BpmnXMLConverter.java:399) ~[flowable-bpmn-converter-6.4.2.1.jar:6.4.2.1]
    

    Expected behavior The model should be imported and visualised. It works in e.g. https://bpmn.io online demo.

    Code I will try to provide a simple test case for reproducing this bug if needed.

    Additional context Using flowable 6.4.2.1 (also tried 6.5.0-SNAPSHOT as of today). Checked out source and ran the org.flowable.engine.test.bpmn.usertask.ImportExportTest with my file. The problem is that if no process is found in the XML (there is none defined), then in org.flowable.bpmn.converter.parser.ExtensionElementsParser:parse(), the if/else block does not set the parentElement (parentElement = activeProcess will set null), and the subsequent call parentElement.addExtensionElement(extensionElement);will fail, resulting in a NPE.

    opened by grexe 13
  • ProcessDiagramGenerator generate image occur null point Exception

    ProcessDiagramGenerator generate image occur null point Exception

    `protected static DefaultProcessDiagramCanvas initProcessDiagramCanvas(BpmnModel bpmnModel, String imageType, String activityFontName, String labelFontName, String annotationFontName, ClassLoader customClassLoader) { double minX = 1.7976931348623157E308D; double maxX = 0.0D; double minY = 1.7976931348623157E308D; double maxY = 0.0D;

        GraphicInfo graphicInfo;
        for(Iterator var14 = bpmnModel.getPools().iterator(); var14.hasNext(); maxY = graphicInfo.getY() + graphicInfo.getHeight()) {
            Pool pool = (Pool)var14.next();
            graphicInfo = bpmnModel.getGraphicInfo(pool.getId());
            minX = graphicInfo.getX();
            maxX = graphicInfo.getX() + graphicInfo.getWidth();
            minY = graphicInfo.getY();
        }
    
        List<FlowNode> flowNodes = gatherAllFlowNodes(bpmnModel);
        Iterator var24 = flowNodes.iterator();
    
        label155:
        while(var24.hasNext()) {
            FlowNode flowNode = (FlowNode)var24.next();
            GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId());
            if (flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth() > maxX) {
                maxX = flowNodeGraphicInfo.getX() + flowNodeGraphicInfo.getWidth();
            }
    
            if (flowNodeGraphicInfo.getX() < minX) {
                minX = flowNodeGraphicInfo.getX();
            }
    
            if (flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight() > maxY) {
                maxY = flowNodeGraphicInfo.getY() + flowNodeGraphicInfo.getHeight();
            }
    
            if (flowNodeGraphicInfo.getY() < minY) {
                minY = flowNodeGraphicInfo.getY();
            }
    
            Iterator var18 = flowNode.getOutgoingFlows().iterator();
    
            while(true) {
                List graphicInfoList;
                do {
                    if (!var18.hasNext()) {
                        continue label155;
                    }
    
                    SequenceFlow sequenceFlow = (SequenceFlow)var18.next();
                    graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(sequenceFlow.getId());
                } while(graphicInfoList == null);
    
                Iterator var21 = graphicInfoList.iterator();
    
                while(var21.hasNext()) {
                    GraphicInfo graphicInfo = (GraphicInfo)var21.next();
                    if (graphicInfo.getX() > maxX) {
                        maxX = graphicInfo.getX();
                    }
    
                    if (graphicInfo.getX() < minX) {
                        minX = graphicInfo.getX();
                    }
    
                    if (graphicInfo.getY() > maxY) {
                        maxY = graphicInfo.getY();
                    }
    
                    if (graphicInfo.getY() < minY) {
                        minY = graphicInfo.getY();
                    }
                }
            }
        }
    
        List<Artifact> artifacts = gatherAllArtifacts(bpmnModel);
        Iterator var27 = artifacts.iterator();
    
        GraphicInfo graphicInfo;
        while(var27.hasNext()) {
            Artifact artifact = (Artifact)var27.next();
            GraphicInfo artifactGraphicInfo = bpmnModel.getGraphicInfo(artifact.getId());
            if (artifactGraphicInfo != null) {
                if (artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth() > maxX) {
                    maxX = artifactGraphicInfo.getX() + artifactGraphicInfo.getWidth();
                }
    
                if (artifactGraphicInfo.getX() < minX) {
                    minX = artifactGraphicInfo.getX();
                }
    
                if (artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight() > maxY) {
                    maxY = artifactGraphicInfo.getY() + artifactGraphicInfo.getHeight();
                }
    
                if (artifactGraphicInfo.getY() < minY) {
                    minY = artifactGraphicInfo.getY();
                }
            }
    
            List<GraphicInfo> graphicInfoList = bpmnModel.getFlowLocationGraphicInfo(artifact.getId());
            if (graphicInfoList != null) {
                Iterator var35 = graphicInfoList.iterator();
    
                while(var35.hasNext()) {
                    graphicInfo = (GraphicInfo)var35.next();
                    if (graphicInfo.getX() > maxX) {
                        maxX = graphicInfo.getX();
                    }
    
                    if (graphicInfo.getX() < minX) {
                        minX = graphicInfo.getX();
                    }
    
                    if (graphicInfo.getY() > maxY) {
                        maxY = graphicInfo.getY();
                    }
    
                    if (graphicInfo.getY() < minY) {
                        minY = graphicInfo.getY();
                    }
                }
            }
        }
    
        int nrOfLanes = 0;
        Iterator var30 = bpmnModel.getProcesses().iterator();
    
        while(var30.hasNext()) {
            Process process = (Process)var30.next();
            Iterator var34 = process.getLanes().iterator();
    
            while(var34.hasNext()) {
                Lane l = (Lane)var34.next();
                ++nrOfLanes;
                graphicInfo = bpmnModel.getGraphicInfo(l.getId());
                if (graphicInfo.getX() + graphicInfo.getWidth() > maxX) {
                    maxX = graphicInfo.getX() + graphicInfo.getWidth();
                }
    
                if (graphicInfo.getX() < minX) {
                    minX = graphicInfo.getX();
                }
    
                if (graphicInfo.getY() + graphicInfo.getHeight() > maxY) {
                    maxY = graphicInfo.getY() + graphicInfo.getHeight();
                }
    
                if (graphicInfo.getY() < minY) {
                    minY = graphicInfo.getY();
                }
            }
        }
    
        if (flowNodes.isEmpty() && bpmnModel.getPools().isEmpty() && nrOfLanes == 0) {
            minX = 0.0D;
            minY = 0.0D;
        }
    
        return new DefaultProcessDiagramCanvas((int)maxX + 10, (int)maxY + 10, (int)minX, (int)minY, imageType, activityFontName, labelFontName, annotationFontName, customClassLoader);
    }`
    

    this code GraphicInfo flowNodeGraphicInfo = bpmnModel.getGraphicInfo(flowNode.getId()); The BpmnModel variable locationMap seems not put anything.

    opened by DongJigong 13
  • Remove Deprecated Async Listenable Task Executor.

    Remove Deprecated Async Listenable Task Executor.

    Describe the bug From Spring version 6.0 Async Listenable Task Executor has been deprecated.

    Expected behavior Deprecation of ListenableFuture and related types (ListenableFutureCallback, SettableListenableFuture, etc.).

    Additional context Deprecation of AsyncListenableTaskExecutor in favor of default methods in AsyncTaskExecutor (submitCompletable).

    opened by Abhijeetmishr 1
  • Bad behavior using Parallel Gateway with 2 end events

    Bad behavior using Parallel Gateway with 2 end events

    Describe the bug I create a simple workflow with 2 parallel NON EXCLUSIVE AND ASYNC branches (I want to be able to execute both branches really in parallel), each one finishing by its own end event.

    image

    When I start the workflow, everything seems fine according to the log (no exception, all branch messages displayed) image

    and the workflow diagram shows it is finished

    image

    But according to the UI and the DB, it isn't the case: UI - still running image DB - EXECUTION: image DB - RU_ACTINST: ALL activities with an END_TIME image

    Expected behavior I would like to:

    1. see that there's a problem (Optimistic Exception) in the log
    2. see a retry on the branch(es) that failed (if any)
    3. no more see the workflow as running (no more EXECUTION, no more history in ACTINST)

    BTW we can't configure an end event as a gateway (which may be exclusive and async), so no way to handle a possible optimistic exception locally at this end event.

    Code The corresponding APP ZIP file TEST_PARALLEL_END.zip

    Additional context Flowable 6.7.2 in Tomcat 8

    opened by wberges 1
  • multi-tenant Query error:   when i use latest version search in modelQuery, the error occurs.

    multi-tenant Query error: when i use latest version search in modelQuery, the error occurs.

    In my saas platform, i have two tenant here. In tenant A, i defined a process and designed the model with key 'editor',and got its version to 2。then i exported this process definition(procX)。 In tenant B, i imported this process definition(procX)。Its key is still editor, with version 1。 then this error accurs, when i get list of process models with latest versioin,i got nothing。but when i got one model list when i used no latest version。

    I saw the sql printed, like this: select *
    from ACT_RE_MODEL RES WHERE
    RES.VERSION_ = (select max(VERSION_) from ACT_RE_MODEL where KEY_ = RES.KEY_) and RES.TENANT_ID_ = ?

    the problem is: there is no tenant_id in the above subquery。

    Expected behavior The query should be like this: select *
    from ACT_RE_MODEL RES WHERE
    RES.VERSION_ = (select max(VERSION_) from ACT_RE_MODEL where KEY_ = RES.KEY_ and TENANT_ID_= ?) and RES.TENANT_ID_ = ?

    BTW: i use ModelQuery to finish my job and the flowable version is 6.6。 I know navite sql may be a way to solve this problem, but i expect ModelQuery and all other Query APIs can do this well.

    thanks for your good work.

    opened by hawkczj 0
  • Bump jetty-server from 11.0.2 to 11.0.10 in /modules/flowable-rest

    Bump jetty-server from 11.0.2 to 11.0.10 in /modules/flowable-rest

    Bumps jetty-server from 11.0.2 to 11.0.10.

    Release notes

    Sourced from jetty-server's releases.

    11.0.10

    Fixed Security Advisories

    Special Thanks to the following Eclipse Jetty community members

    Changelog

    • #8161 - Improve SSLConnection buffers handling (Resolves CVE-2022-2191)
    • #8134 - Improve cleanup of deflater/inflater pools for PerMessageDeflateExtension
    • #8088 - Add option to configure exitVm on ShutdownMonitor from System properties
    • #8067 - Wall time usage in DoSFilter RateTracker results in false positive alert
    • #8057 - Support Http Response 103 (Early Hints)
    • #8014 - Review HttpRequest URI construction (Resolves CVE-2022-2047)
    • #8008 - Add compliance mode for LEGACY multipart parser in Jetty
    • #7994 - Ability to construct a detached client Request
    • #7991 - fix bom for jetty-cdi
    • #7981 - Add TRANSFER_ENCODING violation for MultiPart RFC7578 parser.
    • #7977 - UpgradeHttpServletRequest.setAttribute & UpgradeHttpServletRequest.removeAttribute can throw NullPointerException
    • #7975 - ForwardedRequestCustomizer setters do not clear existing handlers
    • #7953 - Fix StatisticsHandler in the case a Handler throws exception.
    • #7935 - Review HTTP/2 error handling (Resolves CVE-2022-2048)
    • #7929 - Correct requestlog formatString commented default (@​prenagha)
    • #7924 - Fix a typo in Javadoc (@​jianglai)
    • #7918 - PathMappings.asPathSpec does not allow root ServletPathSpec
    • #7891 - Better Servlet PathMappings for Regex
    • #7880 - DefaultServlet should not overwrite programmatically configured precompressed formats with defaults (@​markslater)
    • #7863 - Default servlet drops first accept-encoding header if there is more than one. (@​markslater)
    • #7858 - GZipHandler does not play nice with other handlers in HandlerCollection
    • #7818 - Modifying of HTTP headers in HttpChannel.Listener#onResponseBegin is no longer possible with Jetty
    • #7803 - unwrap exception until we get the first non ServletException, as this can be wrap of wrap of wrap when using ContextHandlerCollection
    • #7802 - HTTP/3 QPACK - do not expect section ack for zero required insert count
    • #7754 - jetty.sh ignores JAVA_OPTIONS environment variable
    • #7748 - Allow overriding of url-pattern mapping in ServletContextHandler to allow for regex or uri-template matching
    • #7635 - QPACK decoder should fail connection if the encoder blocks more than SETTINGS_QPACK_BLOCKED_STREAMS
    • #4414 - GZipHandler not excluding inflation for specified paths
    • #1771 - Add module for SecuredRedirect support

    Dependencies

    • #8083 - Bump asciidoctorj to 2.5.4
    • #8077 - Bump asciidoctorj-diagram to 2.2.3
    • #7839 - Bump asm.version to 9.3

    ... (truncated)

    Commits
    • d21dded Updating to version 11.0.10
    • a47b0d6 Remove maxConnections references
    • 1a217f4 Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-11.0.x
    • 1b4f941 RegexPathSpec documentation and MatchedPath improvements (#8163)
    • a668810 Merged branch 'jetty-10.0.x' into 'jetty-11.0.x'.
    • 1f902f6 Disable H3 tests by default with a system property to explicitly enable them ...
    • 3fd10e5 Merged branch 'jetty-10.0.x' into 'jetty-11.0.x'.
    • 7cc461b Fixing javadoc build errors (#8173)
    • 309b6a9 Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-11.0.x
    • d63569d Migrate code from jetty-util Logger to slf4j Logger (#8162)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies java 
    opened by dependabot[bot] 0
  • Bump jetty-server from 11.0.2 to 11.0.10 in /modules/flowable-event-registry-rest

    Bump jetty-server from 11.0.2 to 11.0.10 in /modules/flowable-event-registry-rest

    Bumps jetty-server from 11.0.2 to 11.0.10.

    Release notes

    Sourced from jetty-server's releases.

    11.0.10

    Fixed Security Advisories

    Special Thanks to the following Eclipse Jetty community members

    Changelog

    • #8161 - Improve SSLConnection buffers handling (Resolves CVE-2022-2191)
    • #8134 - Improve cleanup of deflater/inflater pools for PerMessageDeflateExtension
    • #8088 - Add option to configure exitVm on ShutdownMonitor from System properties
    • #8067 - Wall time usage in DoSFilter RateTracker results in false positive alert
    • #8057 - Support Http Response 103 (Early Hints)
    • #8014 - Review HttpRequest URI construction (Resolves CVE-2022-2047)
    • #8008 - Add compliance mode for LEGACY multipart parser in Jetty
    • #7994 - Ability to construct a detached client Request
    • #7991 - fix bom for jetty-cdi
    • #7981 - Add TRANSFER_ENCODING violation for MultiPart RFC7578 parser.
    • #7977 - UpgradeHttpServletRequest.setAttribute & UpgradeHttpServletRequest.removeAttribute can throw NullPointerException
    • #7975 - ForwardedRequestCustomizer setters do not clear existing handlers
    • #7953 - Fix StatisticsHandler in the case a Handler throws exception.
    • #7935 - Review HTTP/2 error handling (Resolves CVE-2022-2048)
    • #7929 - Correct requestlog formatString commented default (@​prenagha)
    • #7924 - Fix a typo in Javadoc (@​jianglai)
    • #7918 - PathMappings.asPathSpec does not allow root ServletPathSpec
    • #7891 - Better Servlet PathMappings for Regex
    • #7880 - DefaultServlet should not overwrite programmatically configured precompressed formats with defaults (@​markslater)
    • #7863 - Default servlet drops first accept-encoding header if there is more than one. (@​markslater)
    • #7858 - GZipHandler does not play nice with other handlers in HandlerCollection
    • #7818 - Modifying of HTTP headers in HttpChannel.Listener#onResponseBegin is no longer possible with Jetty
    • #7803 - unwrap exception until we get the first non ServletException, as this can be wrap of wrap of wrap when using ContextHandlerCollection
    • #7802 - HTTP/3 QPACK - do not expect section ack for zero required insert count
    • #7754 - jetty.sh ignores JAVA_OPTIONS environment variable
    • #7748 - Allow overriding of url-pattern mapping in ServletContextHandler to allow for regex or uri-template matching
    • #7635 - QPACK decoder should fail connection if the encoder blocks more than SETTINGS_QPACK_BLOCKED_STREAMS
    • #4414 - GZipHandler not excluding inflation for specified paths
    • #1771 - Add module for SecuredRedirect support

    Dependencies

    • #8083 - Bump asciidoctorj to 2.5.4
    • #8077 - Bump asciidoctorj-diagram to 2.2.3
    • #7839 - Bump asm.version to 9.3

    ... (truncated)

    Commits
    • d21dded Updating to version 11.0.10
    • a47b0d6 Remove maxConnections references
    • 1a217f4 Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-11.0.x
    • 1b4f941 RegexPathSpec documentation and MatchedPath improvements (#8163)
    • a668810 Merged branch 'jetty-10.0.x' into 'jetty-11.0.x'.
    • 1f902f6 Disable H3 tests by default with a system property to explicitly enable them ...
    • 3fd10e5 Merged branch 'jetty-10.0.x' into 'jetty-11.0.x'.
    • 7cc461b Fixing javadoc build errors (#8173)
    • 309b6a9 Merge remote-tracking branch 'origin/jetty-10.0.x' into jetty-11.0.x
    • d63569d Migrate code from jetty-util Logger to slf4j Logger (#8162)
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies java 
    opened by dependabot[bot] 0
Releases(flowable-7.0.0.M1)
  • flowable-7.0.0.M1(Dec 23, 2022)

    • This is the first milestone for version 7 of the Flowable Engines focusing on the Spring Boot 3, Spring 6 and Java 17 upgrade.
    • The plan forward is to keep maintaining the 6.x and 7.x versions for at least the next year, so we will do both 6.x and 7.x releases.
    • The REST application requires a servlet container / application server that supports Jakarta 9.
    • This release focuses on the main Flowable Engines and REST APIs for the BPMN, CMMN, DMN and event registry engines. This means that there are no UI applications, no content and form engines and the modules for Mule and some others are removed.
    Source code(tar.gz)
    Source code(zip)
    flowable-7.0.0.M1.zip(96.09 MB)
  • flowable-6.8.0(Dec 22, 2022)

    • Added support for using scripts in task and execution listeners and HTTP request and response handlers.
    • Added support for new task and instance history levels to provide more options to reduce the amount of historic data stored.
    • Added support to throw BPMN errors in scripts.
    • Added support for headers in an event model that can be used with event registry events in case and process definitions.
    • Improved support for starting case and process instances with the unique feature enabled on event registry start events. The event subscription for the event registry event is locked while starting the case and process instance to prevent any duplicate instances.
    • Added support for async leave in addition to the already long existing async (before) attribute for async tasks in BPMN and CMMN. An async job will be created to execute the leave of a task when the async leave attribute is set to true.
    • Improved support for parallel repeatable event listeners in case definitions.
    • Added interface to provide an implementation for non-matching events that are received in the event registry.
    • Added support to query directly on runtime variable instances both in the Java API and REST API.
    • Improved housekeeping logic to reduce the throughput time.
    • Added support for retries in Kafka channels in the event registry.
    • Expose topic, partitions and offset consumer record for inbound Kafka channel and provide custom partition support for outbound Kafka channel.
    • Added bulk support for deleting case and process instances, terminating case instances and moving deadletter jobs to executable.
    • Added activity instance REST API query support.
    • Fixed issue with event listeners in a repeatable stage in a case definition.
    • Fixed issue with having multiple event registry start events in a process definition.
    • Add dedicated task executor for the task invoker. This is fixing an issue with a potential deadlock when using the "true parallel" HTTP task feature.
    • Improved channel definition caching logic to prevent channels from getting unregistered when they should not.
    • Added support for providing an owner and assignee when starting a case or process instance.
    • Upgrade to Spring Boot 2.7.6.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.8.0.zip(208.54 MB)
  • flowable-6.7.2(Dec 28, 2021)

    • Fixed issue with vulnerable Log4j dependency. The Flowable apps now use the default Spring Boot logging framework, which is Logback.
    • Added support to execute a decision service in the DMN REST API.
    • Added support to query tasks with case instance variables.
    • Fixed issue with migrating a process instance to a new process definition with a call activity and a new boundary event.
    • Upgraded to Spring boot 2.6.2.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.7.2.zip(201.97 MB)
  • flowable-6.7.1(Nov 12, 2021)

    • A case and process instance has support for a business status value, similar to a business key.
    • Added support for deleting historic case and process instances and their related data using batches and batch parts.
    • Fixed issue with the global lock mechanism when running a cluster of Flowable instances.
    • Fixed issue with transient variables made persistent when passing all variables to a sub process instance with a call activity task.
    • Added support for querying tasks, jobs and event subscriptions without the BPMN or CMMN entities. By using withoutProcessInstanceId on the task query for example you can make sure that only CMMN tasks and standalone tasks are returned without the BPMN tasks.
    • Added MariaDB to the Flowable QA databases in Github Actions.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.7.1.zip(199.29 MB)
  • flowable-6.7.0(Aug 30, 2021)

    • Implemented a global locking mechanism to have better support for using the async executor in a setup with multiple Flowable Engines. Together with this the async executor default configuration was changed to be able to handle more jobs per second by default. A 4-part article series describe all the fine details and a performance benchmark of this, https://blog.flowable.org/2021/04/14/handling-asynchronous-operations-with-flowable-part-1-introducing-the-new-async-executor/, https://blog.flowable.org/2021/04/21/handling-asynchronous-operations-with-flowable-part-2-components-configuration/, https://blog.flowable.org/2021/04/28/handling-asynchronous-operations-with-flowable-part-3-performance-benchmarks/, https://blog.flowable.org/2021/05/05/handling-asynchronous-operations-with-flowable-part-4-evolution-of-the-async-executor/.
    • Added support for multi instance variable aggregation, https://blog.flowable.org/2021/02/16/multi-instance-variable-aggregation/. Aggregating values from a multi instance execution has always been tricky, but now with the support for variable aggregation this can be handled in an elegant way.
    • Added support for case reactivation to support reactivating historic and completed case instances to a running case instance. Case definitions can have a case reactivation listener. that can be triggered to reactivate a historic case instance and the variable context etc will be re-created.
    • A variable listener has been added to allow for BPMN and CMMN models to listen to changes for a specific variable and handle this trigger in the model.
    • Add support for repetition signal and generic event listener in the CMMN engine to be triggered in parallel.
    • Added an optimization flag for asynchronous multi-instance usage when the multi-instance is an automatic step or a sequence of automatic steps. If set, the engine will drastically lower resource consumption, and remove the optimistic locking exceptions and typically be more performant.
    • Added support of synchronous handling of event registry events.
    • Added support for DMN 1.3 version models.
    • Added support for method overloading in JUEL / backend expressions.
    • Added localization support for case definitions and runtime and history case instances and plan item instances.
    • Added basic CMMN model validation to the CMMN engine.
    • Added basic CDI support to the CMMN engine.
    • Exceptions thrown from Task listeners are no longer wrapped in FlowableException.
    • Exceptions thrown from Task, case lifecycle and plan item lifecycle listeners are no longer wrapped in FlowableException.
    • Improved paging of runtime and historic process and case instance queries including variables. In earlier versions queries with include variables did paging in memory with a lot of limitations. This is now done on a query level and the limitations are not present anymore.
    • In this release an upgrade to Spring Boot 2.5.4 and Spring 5.3.9 was done.
    • There has been a change in the way a process / case instance is started from an event from the event registry. Instead of starting the process / case asynchronously, it is started synchronously. Using this default value allows correct processing of in-order event coming on the same topic. In case in order processing is not important you can configure that as part of your model by marking the Event Registry Start event as async or marking the Case Model as async. If you want to go back to the previous default you can set the following properties: flowable.process.event-registry-start-process-instance-async and flowable.cmmn.event-registry-start-case-instance-async to true.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.7.0.zip(199.07 MB)
  • flowable-6.6.0(Oct 12, 2020)

    GENERAL

    • External worker tasks have been added to the BPMN and CMMN engine. This is a new paradigm that is available to execute service logic outside of the BPMN and CMMN engine. Until this release this could be done by pushing work to another service, like with using a HTTP task or send an event with the event registry task. The external worker task can be used to pull work from the BPMN and CMMN engine. This means that a service written in any language can pull for open external worker tasks over a dedicated external worker REST API, then execute the work, and finally complete the worker task to move the state of the process or case to the next state.
    • Added support for future Java delegates to enable running service tasks and HTTP tasks actually in parallel. Until this release a parallel gateway with multiple outgoing sequence flows to a service task didn't run the synchronous service tasks really in parallel, they were still executed sequential. When these service tasks are made asynchronous and not exclusive, then they were executed in parallel by the async executor, but also in different transactions. With the new future service task support, it's now possible to run synchronous service tasks within the same transaction in parallel. The service tasks are executed in parallel on a thread pool and the future will wait until all service tasks are completed. More info is available in this https://blog.flowable.org/2020/08/06/true-parallel-service-task-execution-with-flowable/ blog post.
    • Added a category property to jobs to be able to distinguish between different groups of jobs. This can also be used to enable the execution of only specific job categories in the BPMN or CMMN engine. In this way different micro services with an embedded Flowable engine using the same database can be configured to only execute jobs from a defined list of categories, as an example.
    • History jobs are now moved to the deadletter job table when the retries are exhausted. This ensures that the history job is always kept in the database.
    • Removed the get current engine configuration from the CommandContextUtil classes of the Flowable engines because in an application where multiple engines are used it could not be guaranteed that the correct engine configuration was returned.
    • JSON variable changes are now tracked when updated in expressions, scripts, delegate classes or Spring beans. This means that when updating a property like customer.name in a delegate class, the customer JSON variable will now automatically be updated.
    • Extended the entity link support to also record grand parent entity links, which means the parent process of a task in a sub process for example.
    • When deploying via the BPMN, CMMN or DMN repository service the created deployment will have the parent deployment id set from its own deployment id.
    • The FlowableExpressionEnhancer has been removed. We have adapted the Expression parsing, so now functions are enhanced during the expression tree building. This is a lower level api and uses the new FlowableAstFunctionCreator.

    BPMN

    • In and out parameters can be defined for signal events, similar to the existing in and out parameter support for call activities. By defining in parameters for a signal boundary event for example, variables can be set on the process instance scope from the signal payload data.
    • Added support for triggerable service tasks with expressions.
    • Added support for event registry backed receive task and intermediate catch event.
    • Added support for JSON variables in web service tasks.
    • For ordering activity instances that are part of the same Flowable transaction, a transaction order value has been added, which is a basic numeric value starting with 1 and incremented with 1 for every new activity instance.

    CMMN

    • Added support for case instance migration with defining for which plan item definitions the state needs to be changed. This also includes moving new plan item definitions to available state if needed.
    • The Case task now supports in and out parameter mapping.

    DMN

    • Support for Decision services and DRD (Decision Requirement Diagram) has been added to the DMN engine. This enables the usage of a hierarchy of decision tables to calculate the output of a decision service in multiple decision tables.

    APPS

    • The UI Apps have been consolidated in one single Flowable UI App instead of 4 different applications. This makes the authentication and authorization logic less complex, makes the demo experience and installation experience easier and doesn't require you to switch between multiple browser tabs all the time. This means that now only 2 WAR files are provided in the Flowable Download, the Flowable UI app, that includes the Modeler, IDM, Admin and Task application together with the Flowable REST API and the second WAR file is the REST application that only includes the Flowable REST API. For more information you can read this https://blog.flowable.org/2020/10/07/flowable-6-instant-gratification/ blog post.
    • Support for OAuth2 authentication is added to the Flowable UI App, with Keycloak as an example implementation, see also this https://blog.flowable.org/2020/10/12/whats-new-with-the-flowable-ui-apps/ blog post.
    • Updated Docker images and Kubernetes Helm charts for the new Flowable UI app and with more configuration options. On the docker images the Spring boot applications are now started with a flowable user and not with the root user as before.

    ADDITIONAL

    • In this release an upgrade to Spring Boot 2.3.4 and Spring 5.2.9 was done.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.6.0.zip(185.98 MB)
  • flowable-6.5.0(Jan 22, 2020)

    GENERAL

    • Added a new Event Registry engine which provides functionality to use Flowable in event driven architectures and has out-of-the-box support for JMS, Apache Kafka and RabbitMQ. Events can be received by BPMN start events, boundary events and triggerable send event tasks. In CMMN receiving events is supported by event listeners and for starting new case instances. Both engines also provide a send event task to send out an event to the event adapter implementation.
    • To improve the support for running Flowable on multiple servers / nodes a new option was added to use a lock for creating the database schema and for executing the auto deployments at bootup. This ensures that when starting multiple servers / nodes at the same time, creating the database schema and doing the auto deployment of CMMN XML and BPMN XML files etc only happens on one server / node at the same time.
    • A new Batch service was added to support executing multiple jobs in one batch, where each job is a batch part. The first usage of the Batch service is the support for batch process instance migration, but the Batch service is designed to support many use cases.
    • A first version of the Logging Session support has been added, which provides a full insight in the execution of case and process instances with all its child entities like tasks, variables, event subscriptions etc. This can be useful for debugging purpose, problem detection in production environments or for audit purposes.
    • The variable service has been enriched to support java.time.Instant, java.time.LocalDate and java.time.LocalDateTime as additional variable types. When using these Object types as a variable they will not be stored as serializable anymore, but with a timestamp value and when used transformed into the correct Object type.
    • Various small bugfixes and improvements all around.

    BPMN

    • Added support for Event Registry start events to trigger starting a process instance with an incoming event.
    • An Event Registry boundary event has been added to support triggering a running process instance with an incoming event, with correlation and tenant detection support.
    • Added an Event Registry send event task to support sending events from a process instance and optionally listening for a response event using the triggerable task support.
    • The process instance migration support has been enhanced with supporting batch migration. Migrating a process definition with all its running instances to a new process definition is now possible with one batch, where each instance migration will be a batch part of a parent batch.
    • Support has been added for Kubernetes and HELM charts in specific. For more details see the Github documentation about this https://github.com/flowable/flowable-engine/tree/master/k8s
    • With historic information growing bigger over time, a way to cleaning this historic information was necessary. For this purpose a history cleaning job was added that can be configured to clean historic information older than a configured time period.
    • To support the history clean job, delete methods have been added to the history query interfaces to also allow to delete historic data with other criteria than just time period based parameters.
    • The mail task has been enhanced with support for sending content items as attachments.

    CMMN

    • Added support on a Case definition root level to listen for incoming events to start a new case instance.
    • An Event Registry event listener has been added to support triggering a running case instance with an incoming event, with correlation and tenant detection support.
    • Added an Event Registry send event task to support sending events from a case instance.
    • Added support to inject a Stage or a specific Task in a Stage instance of a running case instance. In this way a CMMN model can be enriched with new Stage or Task logic for a specific case instance.
    • Java Collection support has been added to repetition rules for plan items. This is similar to the Java Collection support for BPMN multi-instance constructs. A Java Collection variable or an expression can be used to define a repetition rule.
    • Enriched the support for evaluating if a Stage can be completed. On a plan item a parent completion rule can be defined with a type that matches the desired evaluation logic.
    • The support for expressions in a case instance has been extended. It's now possible to get a count value for all active plan item instances of a specific definition for example with the following expression: ${planItemInstances.definitionId('a').active().count()}. The CMMN documentation has been updated with all options possible.
    • A mail task has been added to the CMMN engine (similar as the one in the BPMN engine) with support for sending content items as attachments.

    EVENT REGISTRY

    • A new engine was added with the regular deployment and deployment resources support to follow the pattern of the other engines.
    • Support for Event definitions which define the event payload, the channel definition to use, and the optional correlation parameters of an incoming or outgoing event. The BPMN start event, boundary event or send task or the CMMN Case element or event listener are linked to an Event definition based on a logical key, like it's also the case for, for example, BPMN call activities and CMMN case tasks.
    • Support for Channel definitions which define the source or target destination, with a specific adapter type (JMS, Kafka or RabbitMQ by default). Also an event key detection and an optional tenant id detection configuration can be provided. An Event definition links to a Channel definition based on the Channel logical key.
    • When using the Event Registry Spring module, there are 3 out-of-the-box adapters supported, JMS, Kafka and RabbitMQ.

    DMN

    • Added support for DMN 1.2, which is the revision of the DMN 1.1 specification. The Collect hit policy logic was changed to not only consider unique outcome values but every outcome value for which the rule was hit. This was changed in the DMN 1.2 specification version.

    ADDITIONAL

    • In this release an upgrade to Spring Boot 2.2.2 and Spring 5.2.2 was done. This is the last release where we have official support for Spring Boot 1.5.x and Spring 4.x. Starting from the next release this will not be officially supported anymore.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.5.0.zip(260.69 MB)
  • flowable-6.4.2(Jul 11, 2019)

    Highlights

    GENERAL

    • Support has been added for CockroachDB (https://github.com/cockroachdb/cockroach) as an alternative DB option. A blog post with more details and getting started can be found here http://blog.flowable.org/2019/07/10/getting-started-with-flowable-and-cockroachdb. The full list of changes can be found here https://github.com/flowable/flowable-engine/pull/1716
    • Extracted the event subscription logic from the BPMN engine into a service (similar to the variable and job service for example), so that event subscriptions can also be used from the CMMN engine and possibly other engines in the future.
    • The manual sql scripts that can be found in the distro download are updated to include convenient scripts that will update and create the engines in one sql script.
    • Various small bugfixes and improvements all around.

    BPMN

    • Added support for BPMN escalation events.

    CMMN

    • Added support to listen to signal events in a CMMN case model. This enables more options to interact from a BPMN process instance with a CMMN case instance.
    • Added 'available condition' to CMMN event listeners (e.g. user or timer event listener) to guard precisely when an event listener becomes available. See the documentation for examples.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.4.2.zip(253.88 MB)
  • flowable-6.4.1(Jan 14, 2019)

    Highlights

    GENERAL

    • A new table has been added to keep track of all changes that happen with a user / human task. A HistoricTaskLogEntry is created when the assignee of a task changes, or the owner, or for example the due date. By default the user / human task logging is disabled, with the enableHistoricTaskLogging property in the process or cmmn engine configuration, the user / human task logging can be enabled.
    • A new runtime and historic entity link table has been added to store the relationship between parent entities and all children. This means for example that when a parent process instance has a sub process, and the sub process has a user task, that for the user task two entity links are created, one between the parent process instance and the user task, and another with the sub process instance and the user task. The same is true when a case instance starts a process instance via the CMMN Process Task for example. This makes it possible to get all child tasks for a parent process instance for example. By default, storing entity links is not enabled in the Flowable engines, but using the enableEntityLinks property in the process engine configuration and/or CMMN engine configuration this can be enabled.
    • Support for DMN 1.2 (https://www.omg.org/spec/DMN, still in beta). This is foremost a XSD and parse support.
    • Various small bugfixes and improvements all around.

    BPMN

    • A runtime activity instance table has been added to allow you to query for the activity instances that have been executed for a running process instance without needing to go to the history tables. This includes active and completed activity instances. When a process instance is completed or terminated, the runtime activity instance will be deleted and only available in the historic activity instance table.
    • The sequence flows that are taken are now also stored as part of the runtime and historic activity instance data. This provides a more complete audit history of the process instance execution.
    • The process instance migration feature has been extended with logic to allow migrating process instances with call activities and support moving the current active state from a parent process instance to a sub process instance and vice versa.
    • The admin app now contains a migrate process instance button in the process instance view, that allows for simple migration cases to define the activity mappings and execute the migration.
    • Multi tenancy improvements to support lookups for process, case, form, and decision table definitions within the tenant, but also allow for a fallback lookup in a default tenant of choice. This makes it possible to share common definitions in a default tenant, and only use tenant specific definitions when necessary.
    • REST services have been added to make it easier to fetch a form definition associated with a user task or a start event. Also, completing a form for a user task or starting a process instance with a form is now a lot easier via REST. Getting a BPMN user task form can be done via GET process-api/runtime/tasks/{taskId}/form for example, and completing a user task can be done via POST process-api/runtime/tasks/{taskId} as it was possible already before. But now the payload can contain a form definition id and outcome value to complete the user task with a form.
    • Using transient variables in the BPMN web service task instead of using process variables for values that should not be persisted in the variables table.

    CMMN

    • Plan item instances are now stored in the runtime tables until the case instance is finished. This allows to query the state of a case instance without having to use the historical api's or data.
    • The engine will automatically detect when event listeners (user, generic or timer) are not useful anymore and remove the event listener instances.
    • Addition of a new 'trigger mode' called "on event" for event resolving in sentries that allows to scope the event evaluation to that evaluation cycle only (versus with memory as is the default). This enables advanced models where events (and consequentially the related sentries) only should be evaluated at the moment they happen.
    • Addition of the task and plan item lifecycle listener, similar to task and execution listeners in BPMN.
    • To support modeling arbitrary user or automated actions in CMMN, it is now possible to use a 'generic event listeners'. This event listener behaves like a user event listener, but can be triggered programmatically through an API (see the CmmnRuntimeService).
    • It is now possible to make a user or generic event listeners repeatable, which allows a more natural way of modeling cases where a certain event happens multiple times.
    • Greatly improved cross border resolving of sentry dependencies (across multiple and potentially nested stages).
    • A first version of case instance change state has been added to the Flowable CMMN Engine. In the CmmnRuntimeService you can now use the createChangePlanItemStateBuilder to define and execute the case instance change state logic. This first version supports changing state focused on human tasks. In the next version more support will be added for more complex cases.
    • REST services have been added to make it easier to fetch a form definition associated with a human task or a plan model. Also, completing a form for a human task or starting a case instance with a form is now a lot easier via REST. Getting a CMMN human task form can be done via GET cmmn-api/cmmn-runtime/tasks/{taskId}/form for example, and completing a human task can be done via POST cmmn-api/runtime/tasks/{taskId} as it was possible already before. But now the payload can contain a form definition id and outcome value to complete the user task with a form.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.4.1.zip(246.31 MB)
  • flowable-6.4.0(Oct 2, 2018)

    FlowFest 2018 Developer Conference Join us for the first Flowable Open Source Developer Conference in Barcelona. You can register here: https://flowable.com/flowfest2018. If you want to present a session about Flowable please get in contact with us, for example via the Flowable Forums

    Highlights

    • A first version of process instance migration has been added to the Flowable BPMN Engine. In the RuntimeService you can now use the createProcessInstanceMigrationBuilder to define and execute the process instance migration. This first version supports migrating process instances with wait states, embedded (event) sub processes and boundary events. In the next version more support will be added for more complex cases like parallel and inclusive gateways, multi-instance activities and call activities.
    • Expression support have been added for the BPMN and CMMN engines to make it easier to work with variables and in specific variables that may not have been initialized yet. When you reference a variable in an expression like ${customerNumber > 40} and there is no customerNumber variable yet, an exception would be thrown. With the variable expression support this can be handled without an exception with ${variables:getOrDefault(customerNumber, 0) > 0}. A similar expression is possible for strings with ${variables:get(customerName) == "test"}. The user guide describes the full set of available variable expressions.
    • A first version with support for MongoDB persistence has been added. The MongoDB module is available from a separate Git repository at https://github.com/flowable/flowable-mongodb. The MongoDB module is made available in a separate repository, so that it can be released in a different pace than the full Flowable Engine releases. The support of MongoDB already includes most BPMN constructs, but in the coming releases it will be extended to be on par with the relational database support.
    • Upgrade to Spring 5.x for all the integration modules using Spring.
    • Added plan item lifecycle listener to the CMMN engine, to allow for listening to plan item instance state changes.
    • In the Task app support for activating manual plan items and triggering user event listeners has been added.
    • Added support for JUnit 5.
    • Support for using java.time.Duration variables and expressions for Timer durations.
    • Chinese translation has been added for the UI apps.
    • Various small bugfixes and improvements all around.

    Upgrade notes

    Idm Engine SpringEncoder

    The deprecated constructor from SpringEncoder that accepted org.springframework.security.authentication.encoding.PasswordEncoder has been removed

    Custom IdGenerator using a Bean in Spring Boot

    It is now possible to define the custom IdGenerator for the Flowable Process engine, by creating a bean of type IdGenerator. If no bean is provided the StrongUuidGenerator will be used. If there is a bean qualified with @Processthen this one would be used, otherwise a unique global one would be used. If there are more global beans then the default StrongUuidGenerator will be used.

    FlowableFunctionDelegate changes

    The method functionClass has been removed from the org.flowable.common.engine.api.delegate.FlowableFunctionDelegateinterface. This doesn't change anything with regards to adding custom functions to expressions: returning the right Method in functionMethod() is enough.

    The tomcat-flowable zip download is only intended for quick demos as it uses the H2 database.

    Source code(tar.gz)
    Source code(zip)
    flowable-6.4.0.zip(245.19 MB)
    tomcat-flowable-6.4.0.zip(155.31 MB)
  • flowable-6.3.1(May 22, 2018)

    Highlights

    • Introduction of an app engine, so apps are now a first class citizen and the process engine is not misused any more to handle app deployments. When starting the Flowable Task application all app deployments are automatically migrated to the new app engine.
    • Added async history support to the CMMN engine.
    • Added more history information to the CMMN engine with historic plan items.
    • Improved the Spring Boot support and upgraded to Spring Boot 2.0.2.
    • Enhanced debugger in the Flowable Task application to evaluate expressions and scripts.
    • Made the job service more generic with the scope type property to improve the possibility to run different job handlers for different job types.
    • Various small bugfixes all around.

    Community contributors

    • Pascal Schumacher (PascalSchumacher)
    • Amina Zoheir (AminaZoheir)
    • Toni (ttonl)
    • David Malkovsky (dbmalkovsky)
    • Michael Lippens (mlippens)

    Upgrade notes

    Package renaming

    To make the Flowable modules compatible with OSGi and Java 9 modules some package renaming was needed to prevent clashes. The renaming has been done according to this pattern org.flowable.engine.common -> org.flowable.common.engine

    StrongUuidGenerator usage with Spring Boot

    The Spring Boot process auto configuration now uses the StrongUuidGenerator. In case you were overwriting the default one you can remove that. In case you want to keep using the DbIdGenerator, then just add the following bean to your configuration:

    
        @Bean
        public EngineConfigurationConfigurer<SpringProcessEngineConfiguration> processEngineDbIdGeneratorConfigurer() {
            return engineConfiguration -> engineConfiguration.setIdGenerator(new DbIdGenerator());
        }
    

    The default values of the DbIdGenerator would be filled in during the creation of the Process Engine.

    IdmEngineConfigurator

    The default IdmEngineConfigurator and SpringIdmEngineConfigurator have been moved from org.flowable.app.engine.impl.cfgand org.flowable.spring.configurator to org.flowable.idm.engine.configurator and org.flowable.idm.spring.configurator respectively. In case you have used them please replace your imports.

    Async history classes package change

    The async history classes have been moved from the process engine module to the job service, to make them available for other components. Generally, the packages now have job.service added to make this clear.

    • Classes with regards to async history collection and execution (AbstractAsyncHistoryJobHandler, AsyncHistoryJobHandler, AsyncHistoryListener, AsyncHistorySessionFactory, AsyncHistorySession, DefaultAsyncHistoryJobProducer, HistoryJsonTransformer) in the org.flowable.engine.impl.history.async have been moved to the org.flowable.job.service.impl.history.async package.
    • Classes related to executing async jobs using a message queue (most notably AsyncHistoryJobMessageHandler and AsyncHistoryJobMessageReceiver) have been moved from the org.flowable.engine.impl.asyncexecutor.message to the org.flowable.job.service.impl.asyncexecutor.message package.
    • Similarly, for executing async history jobs using a message queue: the classes in the package org.flowable.engine.impl.history.async.message are now found in the org.flowable.job.service.impl.history.async.message package.

    Updating the imports is sufficient when upgrading.

    Source code(tar.gz)
    Source code(zip)
    flowable-6.3.1.zip(247.43 MB)
  • flowable-6.3.0(Apr 4, 2018)

    Release Notes - Flowable - 6.3.0

    Flowable 6.3.0 has turned out to be a big release with many new features (and even more fixes). Many thanks to all the community contributers that participated in the release and a special shout-out to Pascal Schumacher, Zach Visagie, Robert Hafner, Christophe Deneux and Seif El Deen Khaled

    Highlights

    Note: Flowable now requires JDK 8 as a minimum version!

    GENERAL

    The Spring Boot starters have all been updated to version 2.0. There are now starters available for each engine (BPMN, CMMN and DMN). Check the completely revised documentation for more details!

    • Support and fixes for running various modules on JDK 9 (the engines themselves already ran on JDK 9)
    • Updated all 3rd-party libraries to latest versions
    • The REST app can now be configured to use privileges, instead of all users being able to make REST calls.

    BPMN

    • Performance enhancements with great results. Read all about it here: https://blog.flowable.org/2018/03/05/flowable-6-3-0-performance-benchmark/
    • Dynamic task and subprocess injection into running process instances is now fully supported and out of experimental state
    • Allow the configuration of history on individual process definitions, overriding the engine default setting
    • Introduce the 'triggerable' service task: a service task that provides configurable service calls that are executed externally and call the engine when done. The implementation is guaranteed to be correct with regards to the transactional behavior of the engine.
    • Support for a transaction-lifecycle based event listener
    • Support for 'sameDeployment' when looking up the called process definition for a call activity
    • HTTP task: support for storing response variables transiently
    • Multi instance: support for Iterable when resolving a collection (e.g. ArrayNode)

    CMMN

    • REST API support for all CMMN services and operations
    • Support for asynchronous service tasks
    • Support for manual activation rules and enabling/manually starting plan items through the runtime service
    • Support for required rule
    • Support for autocomplete
    • Support for completion neutral
    • A Script task type has been added
    • Support for User event listeners
    • Support for viewing and managing CMMN date in the Admin app

    DMN

    • Support for collection expressions, such as IN and NOT IN
    • Improved decision table editor user experience to make it easier to add JUEL expressions in specific rules
    • Support for viewing and managing decision executions in the Admin app

    APPS

    • All apps have been rewritten to use Spring Boot 2.0. All apps now use one property file for configuration. Please check the documentation, as many new configuration options are available (with backwards compatibility for old properties).
    • Support for expressions in the options fields, including dropdown, radio and hyperlink fields
    • Support for a password fields in the form editor and runtime
    • Multi-tenancy support in the Modeler by defining the active tenant in the Modeler property file

    Upgrade notes

    To remove duplicate code, some more logic has been added to the common modules, such as flowable-engine-common and flowable-common-rest. For example, the scripting engine has been moved to the flowable-engine-common module so it can be used by both the BPMN and the CMMN engine. If you are using Flowable internal classes then it is possible that some package changes to the common modules are required. Most of this should be automatically handled by your IDE.

    All Flowable apps (IDM, Modeler, Task, Admin and REST) now read their configuration from the flowable-app.properties file, which is included in each WAR file in the META-INF/flowable-app folder. Consequently, a single, shared flowable-app.properties can be placed on the classpath for all apps. All property files (e.g. db.properties for the REST app) are still read and work in a backwards-compatible way.

    The default way user credentials are authenticated and verified when calling the Flowable REST API has changed. A user now needs to have the access-rest-api privilege (before, any valid credentials could be used). An admin user can be given this privilege by setting the flowable.rest.app.admin.user-id and flowable.rest.app.admin.password properties in the flowable-app.properties file. On start-up, the admin user will be created if it doesn't exist, or it will be given the access-rest-api privilege. This admin user can then give other users this privilige using the Flowable IDM app or through a REST call (doing an HTTP post to privileges/{privilegeId}/users with the userId in the body).

    By default, all Flowable apps (IDM, Modeler, Task, Admin and REST) are configured to use an in-memory H2 database that is persisted in the user home folder, which is shared between all apps by default. Previously, each app had its own in-memory H2 database.

    Due to upgrading to the latest Spring Security dependencies for handling the authentication for all the Flowable apps, users can get a "cookie theft exception" when accessing the apps with a cookie from a previous version that is still present in the browser. The reason for this is that Spring Security has changed the way cookie tokens are hashed. A hard refresh or relogin fixes this by generating a new cookie. If you don't want to force your users to do this, you can delete all rows from the ACT_ID_TOKEN database table. This will invalidate all old cookies and all users will have to login again.

    Source code(tar.gz)
    Source code(zip)
    flowable-6.3.0.zip(246.39 MB)
  • flowable-6.2.1(Dec 11, 2017)

    Highlights

    • Lots of additions to the CMMN 1.1 Engine, including timer support, repetition support, DMN and HTTP task support and variable query support.
    • Rest documentation is now also generated based on the Swagger definitions to ensure it's always in sync with the REST controller code.
    • Improved support of ChangeActivityStateBuilder to move an execution in a process instance to another activity that's part of the process definition.
    • Enhanced the CMMN Modeler palette with timer event listeners, DMN and HTTP tasks and additional properties like timer expressions and repetition expressions.
    • Improved support of CMMN in the Flowable Task app.
    • Various small bugfixes all around.

    Community contributors

    • Pascal Schumacher (PascalSchumacher)
    • Stijn de Pestel (stijndepestel)
    • Robert Hafner (roberthafner)
    • Xin Wang (dram)
    • David Malkovsky (dbmalkovsky)
    • Michael Lippens (mlippens)
    • Marco van Zwetselaar (zwets)
    • Yanming Zhou (quaff)
    • Christophe Deneux (cdeneux)

    Upgrade notes

    To harmonize the deployers between the BPMN and CMMN engine the ProcessEngineConfigurator interface has been renamed to EngineConfigurator and moved to the flowable-engine-common module. In addition a new flowable-spring-common module has been added to shared common Spring classes between the BPMN and CMMN spring modules.

    Source code(tar.gz)
    Source code(zip)
    flowable-6.2.1.zip(201.74 MB)
  • flowable-6.2.0(Oct 13, 2017)

    Highlights

    • Introduction of a new CMMN 1.1 Engine. This provides an implementation of the CMMN 1.1 OMG standard (http://www.omg.org/spec/CMMN/1.1/). A lot of effort has been put in this new Engine, and it uses a new set of database tables optimized for CMMN execution. We've added a new CMMN user guide to help you getting started. Note that since this is a first release, the CMMN Engine is marked as an experimental feature and missing features like timers and HTTP and Decision tasks will be added in next releases.
    • Added a CMMN editor to the Flowable Modeler app.
    • Added support for CMMN cases in the Flowable Task app.
    • The BPMN and CMMN engine share a number of common services like Tasks, Variables, Identity links and Jobs. Therefore these services are extracted from the core BPMN engine module and new modules have been created for each one of these services. The BPMN and CMMN engines make use of these services to provide for example Task and Variable support. With this approach Flowable is very flexible in the deployment model. You can run only the BPMN Engine, only the CMMN Engine or run them both together without any issues.
    • Various small bugfixes all around.

    Community contributors

    David Malkovsky (dbmalkovsky) Filip Hrisafov (filiphr) Robert Hafner (roberthafner) Marco van Zwetselaar (zwets) Lori Small (lsmall) Michael Lippens (mlippens)

    Upgrade notes

    Because of the extraction of the Task, Variable, Identity Link and Job services, we had to change the package names of the classes used in these modules. This means that for example TaskQuery and Job Query have been moved to a new package. This was done to adhere to OSGi standards and to be ready for the new Java 9 version. This however does mean that you run into some compilation issues while migrating to version 6.2.0. We always try to prevent this as much as we can, but due to the new modules this wasn't possible in this release. The common naming pattern of these new service is org.flowable.{servicename}.api for the API module and org.flowable.{servicename}.service for the service implementation module. So org.flowable.task.api and org.flowable.task.service for example.

    Source code(tar.gz)
    Source code(zip)
    flowable-6.2.0.zip(200.67 MB)
  • flowable-6.1.2(Jul 25, 2017)

    Bug fix release:

    Thanks to whee we found out that there's an issue with the release 6.1.1 when running it without an Internet connection https://forum.flowable.org/t/upgrading-6-1-0-to-6-1-1-could-not-read-idm-mybatis-configuration-file/753. This was fixed with the following commit https://github.com/flowable/flowable-engine/commit/7338015dc8aadc984ff9dd4ad3385b6a7b4ace6f. Although an Internet connection is often available, we decided to do a bug fix release to prevent people from running into this issue.

    Source code(tar.gz)
    Source code(zip)
    flowable-6.1.2.zip(194.40 MB)
  • flowable-6.1.1(Jul 21, 2017)

    • Introduction of audit history in the DMN Engine. When history is enabled in the DMN Engine, an audit log of each decision execution is stored in the DMN database. By default the history is disabled.
    • Replaced the MVEL expression language in the DMN Engine with the same JUEL expression language as used in the BPMN and Form Engine.
    • Refactored DmnRuleService with new ExecuteDecisionBuilder and deprecated old execute decision methods.
    • Call activity - allow to set output parameters a local variables for multi instance executions.
    • Easier usage of async history in combination with a message queue (see https://github.com/flowable/flowable-examples/tree/master/async-history
    • Performance improvement: introduce grouping and compression for async history data
    • Various small bugfixes all around.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.1.1.zip(194.39 MB)
  • flowable-6.1.0(Jun 27, 2017)

    • Introduction of async history. By enabling the asyncHistoryEnabled property on the process engine configuration (default is false), the history tables are not filled in the same transaction as the runtime tables. Instead an async history job is created and the history information will be written to the history tables in a separate, asynchronous transaction. This also opens up the option to not use the relational history tables at all, and move the historic information to a NoSQL database directly. Pluggability points are available to implement the persistence logic to a NoSQL database.
    • New REST task feature thanks to Harsha. With the new REST task it becomes trivial to do REST calls from a Flowable process instance. There's also support in the Flowable Modeler for REST tasks.
    • Introduction of a new DMN decision table editor. To improve the usability of the DMN decision table editor we are now using the Handsontable framework.
    • The Engine SQL update logic has been improved to only update changed columns.
    • The Odysseus JUEL code is now included directly in the flowable-engine-common module to prevent classloading issues due to conflicting JUEL libraries or even different versions of JUEL libraries.
    • Added option to use a password encoder for the Flowable IDM engine (instead of the default plain text password persistence), thanks to Faizal!
    • Support for static Groovy scripts compilation with the new flowable-groovy-script-static-engine module by using the groovy-static scriptFormat value, thanks to Filip (fgroch)!
    • Several additions to the Form builder and renderer (min/max length, improved expression field and more).
    • Various small bugfixes all around.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.1.0.zip(195.15 MB)
  • flowable-6.0.1(Apr 28, 2017)

    • First bug fix release for Flowable 6!
    • Improved LDAP support for the UI apps
    • The i18n in the UI apps is now pluggable and there are some first additional languages included
    • Improved event sub process support with nested event sub process support for non interrupting ones
    • More hit policy support in the DMN Engine. The Decision Table editor will be updated in the Flowable 6.1.0 release. The DMN Engine API has been refactored to take into account single and multiple output result objects.
    • Various small bugfixes all around.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.0.1.zip(189.40 MB)
  • flowable-5.23.0(Mar 27, 2017)

    • Great community contribution for collapsed sub processes by David Pardo. You now can model processes in a hierarchical way without needing to use call activities, which result in different process definitions in the Flowable Engine. When using collapsed sub processes, the modeling part is hierarchical and using different model diagrams for the main process and the sub process models. But when deploying on the Flowable Engine, there's still one process definition using embedded sub processes. So this feature it targeted at the modeling level.
    • Bug fix for service tasks with class attributes using skip expressions.
    • Added support for using the Flowable namespace in addition to the Activiti namespace in BPMN XML.
    • Several bug fixes and smaller enhancements.
    Source code(tar.gz)
    Source code(zip)
    flowable-5.23.0.zip(93.85 MB)
  • flowable-6.0.0(Feb 15, 2017)

    Highlights

    • First official release of Flowable 6!
    • Documentation has been updated to Flowable 6 and a DMN and Form Engine user guide have been added.
    • Various small bugfixes all around.

    Release remarks

    • We consider the Flowable 6 Engine stable and ready for use
    • We plan to release a 6.0.1 within a few weeks, so we hope to get a lot of feedback on the 6.0.0 release that we can include in a 6.0.1 release
    • The documentation has been extended with a DMN and Form Engine focused user guide, however the main user guide is still the BPMN user guide. We expect to do more documentation updates in the next few weeks.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.0.0.zip(185.92 MB)
  • flowable-6.0.0.RC1(Dec 15, 2016)

    Highlights

    • Package renaming to org.flowable, and renaming of config files to flowable.cfg.xml and flowable-context.xml. It was not an easy decision to go this route, but for the clear distinction and separation of the Flowable project this is the best way forward. The discussion for this choice can be found in this forum post http://forum.flowable.org/t/opinions-on-package-renaming-for-flowable-6-to-org-flowable/118/13
    • Class name renaming to use Flowable instead of Activiti where needed.
    • The identity functionality is separated in the IDM engine, and the identity database tables are managed by this engine. By default the IDM engine is enabled when starting the Flowable engine, but it can be disabled with the disableIdmEngine property.
    • Introduction of a content engine, which provides a simple file store for attaching files/documents to a task or process instance.
    • Support for non interrupting event sub processes. Until this version only interrupting event sub processes were supported, but now it's possible to handle events and let the main process execution continue as well.
    • The task app has been refactored into 3 separate web applications. There's a Flowable Modeler app that contains the modeling repository functionality + the BPMN, form and DMN editor. The second app is the Flowable IDM app that manages the users and groups and handles authentication for each app. For example the Flowable Modeler will redirect to the Flowable IDM app when no valid cookie is found. After logging in to the Flowable IDM app, a redirect to the Flowable Modeler is executed and you can access the Modeler repository. This is done to allow for single sign-on between the different apps. The third app is the Flowable task app, that allows you to start process instances and work with tasks and fill-in forms.
    • Introduction of the Flowable Admin application that allows for querying the BPM, DMN, Form and Content engines.
    • Introduction of Docker images to make it easy to start all apps in a convenient way. In the docker folder several docker start scripts can be found that use a Docker compose file. In an upcoming blog post we will share more information on how this can be used.
    • Persistency logic that was written in Hibernate has all been rewritten to MyBatis to have a common framework for all persistency logic.
    • Various and many small bugfixes all around.

    Release remarks

    • This a major milestone to get to the final Flowable 6.0.0 release. All parts of the release are now considered feature complete, so the remaining work will be bug fixing and smaller features.
    • We will continue to improve the docs for the 6.0.0 release.
    • At this point all community testing is extremely important for the quality of the 6.0.0 release. So every contribution is this area is very welcome.
    Source code(tar.gz)
    Source code(zip)
    flowable-6.0.0.RC1.zip(178.66 MB)
  • flowable-5.22.0(Oct 13, 2016)

    • First Flowable release. Except from the different Maven group (org.flowable) and artefact id (flowable-engine etc), there are no differences when compared to a new Activiti version. No changes have been made to package names or config file names.
    • Introduction of transient variables. Transient variables won't be persisted in the Activiti variable tables, but are still available on the execution for the duration of a single transaction. Transient variables can for example be used to store a REST response that is only needed to create a request to another REST service, or to use a Java service task result in the next Java service task without it getting persisted. You can read more about it here
    • Several bug fixes and smaller enhancements
    Source code(tar.gz)
    Source code(zip)
    flowable-5.22.0.zip(92.08 MB)
Squadio-App is a Users-Accounts financial system. exposes Rest APIs with JWT authentication/Authorization process .

squadio-app Description Squadio-App is a Users-Accounts financial system. exposes Rest APIs with JWT authentication/Authorization process . How to Run

Bashar Othman 1 Jan 29, 2022
Cadence is a distributed, scalable, durable, and highly available orchestration engine to execute asynchronous long-running business logic in a scalable and resilient way.

Cadence This repo contains the source code of the Cadence server and other tooling including CLI, schema tools, bench and canary. You can implement yo

Uber Open Source 6.5k Jan 4, 2023
Highly customized business metrics monitoring with TDengine & Spring Boot

Horus —— Highly customized business metrics monitoring with TDengine & Spring Boot 给予业务指标监控的高度定制自由 设计文档:https://akhnhwmr9k.feishu.cn/wiki/wikcnJJFmDHj

ArchLiu 6 Jun 17, 2022
OpenL Tablets Business Rules Management System

Easy Business Rules OpenL Tablets targets the infamous gap between business requirements (rules and policies) and software implementation. Designed to

OpenL Tablets 114 Dec 17, 2022
Lattice is a powerful, lightweight business extension invoke framework. By using the Lattice framework, complex business customization can be efficiently organized and managed.

Lattice Framework Introduction Lattice is a powerful, lightweight business extension invoke framework. By using the Lattice framework, complex busines

null 41 Dec 30, 2022
Kyrestia, named after Kyrestia the Firstborne, is a process engine supporting mainstream process definition standards.

Kyrestia Kyrestia, named after Kyrestia the Firstborne, is a process engine supporting mainstream process definition standards. It is not only lightwe

Weiran Wu 32 Feb 22, 2022
A simple Plugin to allow server admins and user with Permissions to change fast and easy thier own Gamemode

A simple Plugin to allow server admins and user with Permissions to change fast and easy thier own Gamemode

Qubik Studios 1 Jan 17, 2022
Expo application with detox to run e2e using Github Workflow

Expo e2e Demo Application template to demonstrate how to run e2e in an Expo Managed application using Detox Tested using: MacOS 12.1 Monterrey, M1 Pro

Carlos Thurber 38 Oct 24, 2022
Apollo is a reliable configuration management system suitable for microservice configuration management scenarios.

English | 中文 Apollo - A reliable configuration management system Apollo is a reliable configuration management system. It can centrally manage the con

Apollo 27.6k Jan 5, 2023
A Fully Code Integrated Dynamic DataBase Management System for the Java Platform

dynamic-database A fully code integrated minimal database management system for Java, Scala, Kotlin or Groovy projects. It is written in Java and can

omega ui 2 Jun 8, 2022
Discourse-java is a platform where users can freely discuss on topics they want to, and like-minded people can join in and contribute

Discourse is the 100% open source discussion platform built for the next decade of the Internet. Use it as a: mailing list discussion forum long-form

Infosys Ltd 16 Oct 19, 2022
An advanced and highly optimized Java library to build framework

An advanced and highly optimized Java library to build frameworks: it's useful for scanning class paths, generating classes at runtime, facilitating the use of reflection, scanning the filesystem, executing stringified source code and much more...

Burningwave 119 Dec 21, 2022
Joyce is a highly scalable event-driven Cloud Native Data Hub.

Joyce Component docker latest version Build Import Gateway sourcesense/joyce-import-gateway Joyce Kafka Connect sourcesense/joyce-kafka-connect Mongod

Sourcesense 37 Oct 6, 2022
A joint research effort for building highly optimized Reactive-Streams compliant operators.

reactive-streams-commons A joint research effort for building highly optimized Reactive-Streams compliant operators. Current implementors include RxJa

Reactor 350 Dec 23, 2022
UMS is a CRUD based management system which uses File Handling to manipulate data and perform the CRUD operations

UMS is a CRUD (Create, Read, Update, Delete) based management system which uses File Handling to manipulate data and perform the CRUD operations. It is a group project made using Java procedural programming having both User and Admin sides.

Daoud-Hussain 9 Dec 20, 2022
Web-based restaurant management system with spring boot and rest API for school final-year project.

Restaurant Management System Developing this for my school as first final year project. It shall be able to handle most of the challanges that encount

Taha Dönük 4 Mar 10, 2022
Human Resource Management System (Java & React)

?? HumanResourceManagementSystem ?? Steps İş Arayanlar sisteme kayıt olabilmelidir. ✔️ İş verenler sisteme kayıt olabilmelidir. ✔️ ️ Sisteme genel iş

Furkan Paşaoğlu 5 Sep 12, 2022
Human Resources Management System

Human Resource Management System ( HRMS ) The following tools / languages will be used in this project; Java (Spring Boot based) - on the Backend side

Fatih Deniz 17 Dec 1, 2022
Human Resource Management System - Backend

Human Resource Management System - Backend File Structure ??️ Layered Architecture Entities - The package in which the assets are kept DataAcces - Pac

Tarık Kaan Koç 30 Jan 1, 2023