Handling removed event types when updating to Flowable-6.3.1

Hi,

I am upgrading an app based on Flowable-6.1.2 to Flowable-6.3.1.
In Flowable-6.1.2 there were some events in https://github.com/flowable/flowable-engine/blob/flowable-6.1.2/modules/flowable-engine/src/main/java/org/flowable/engine/delegate/event/FlowableEngineEventType.java that have since been removed in Flowable-6.3.1 in this commit. https://github.com/flowable/flowable-engine/commit/a34be6352750dfe71a89bd23da7a22457490a722#diff-52aa8bce1109d775c92f3736045e2f06

In our processes there are eventlisteners used for auditing purposes, and these were definied to listen to all event types defined in the class FlowableEngineEventType. This is by explicitly listing all event types by name, and not using a catch-all expression like ‘*’. This included events such as MEMBERSHIP_CREATED, UNCAUGHT_BPMN_ERROR, etc
These eventlisteners were defined in the BPMN, not via the runtime API.

Now when we run Flowable-6.3.1 we get an exception when we try to retreive the BPMN model.

2230559 2018-10-17T10:07:51,299 ERROR pl.bpmn.deployer.ParsedDeploymentBuilder [] - Could not parse resource my-process.bpmn
org.flowable.common.engine.api.FlowableIllegalArgumentException: Invalid event-type: MEMBERSHIP_CREATED
        at org.flowable.common.engine.api.delegate.event.FlowableEngineEventType.getTypesFromString(FlowableEngineEventType.java:311) ~[flowable-engine-common-api-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.handler.ProcessParseHandler.createEventListeners(ProcessParseHandler.java:87) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.handler.ProcessParseHandler.transformProcess(ProcessParseHandler.java:70) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.handler.ProcessParseHandler.executeParse(ProcessParseHandler.java:49) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.handler.ProcessParseHandler.executeParse(ProcessParseHandler.java:33) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.handler.AbstractBpmnParseHandler.parse(AbstractBpmnParseHandler.java:61) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.BpmnParseHandlers.parseElement(BpmnParseHandlers.java:79) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.BpmnParse.applyParseHandlers(BpmnParse.java:282) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.parser.BpmnParse.execute(BpmnParse.java:195) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.deployer.ParsedDeploymentBuilder.createBpmnParseFromResource(ParsedDeploymentBuilder.java:97) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.deployer.ParsedDeploymentBuilder.build(ParsedDeploymentBuilder.java:55) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.bpmn.deployer.BpmnDeployer.deploy(BpmnDeployer.java:76) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.persistence.deploy.DeploymentManager.deploy(DeploymentManager.java:62) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.persistence.deploy.DeploymentManager.resolveProcessDefinition(DeploymentManager.java:130) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.persistence.deploy.DeploymentManager.findDeployedProcessDefinitionById(DeploymentManager.java:80) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.util.ProcessDefinitionUtil.getBpmnModel(ProcessDefinitionUtil.java:78) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.cmd.GetBpmnModelCmd.execute(GetBpmnModelCmd.java:42) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.cmd.GetBpmnModelCmd.execute(GetBpmnModelCmd.java:26) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.interceptor.CommandInvoker$1.run(CommandInvoker.java:51) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperation(CommandInvoker.java:93) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.interceptor.CommandInvoker.executeOperations(CommandInvoker.java:72) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.interceptor.CommandInvoker.execute(CommandInvoker.java:56) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.interceptor.BpmnOverrideContextInterceptor.execute(BpmnOverrideContextInterceptor.java:25) ~[flowable-engine-6.3.1.jar:6.3.1]
        at org.flowable.common.engine.impl.interceptor.TransactionContextInterceptor.execute(TransactionContextInterceptor.java:53) ~[flowable-engine-common-6.3.1.jar:6.3.1]
        at org.flowable.common.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:71) ~[flowable-engine-common-6.3.1.jar:6.3.1]
        at org.flowable.idm.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:49) ~[flowable-idm-spring-6.3.1.jar:6.3.1]
        at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:140) ~[spring-tx-5.0.6.RELEASE.jar:5.0.6.RELEASE]
        at org.flowable.idm.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:46) ~[flowable-idm-spring-6.3.1.jar:6.3.1]
        at org.flowable.common.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30) ~[flowable-engine-common-6.3.1.jar:6.3.1]
        at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:56) ~[flowable-engine-common-6.3.1.jar:6.3.1]
        at org.flowable.common.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:51) ~[flowable-engine-common-6.3.1.jar:6.3.1]
        at org.flowable.engine.impl.RepositoryServiceImpl.getBpmnModel(RepositoryServiceImpl.java:177) ~[flowable-engine-6.3.1.jar:6.3.1]

We have now removed the non-existing event types from the BPMN, but unfortunately existing processes (both running and finished) still suffer the above problem.

I had a look in the source code and a fix for us would be to remove the exception at this line https://github.com/flowable/flowable-engine/blob/e436cfd9be95805dfc945cc519a4f556936c1638/modules/flowable-engine-common-api/src/main/java/org/flowable/common/engine/api/delegate/event/FlowableEngineEventType.java#L311 and replace it with a log warning, and simply ignoring the non-existing event types.

Would this seem like a reasonable change? Or is there some other solution or workaround to this problem?

Thanks,
Paul

FYI: between those version, the idm engine has been extracted. The events are now here: https://github.com/flowable/flowable-engine/blob/f0e2614883833963a4e970ede18b0ebb4f31cb65/modules/flowable-idm-api/src/main/java/org/flowable/idm/api/event/FlowableIdmEventType.java

Your suggestion to improve the handling it is definitely good. Would you like to add the PR yourself (as you already did the hard work of figuring it out :-))? Otherwise, I can do it.

I’ll have a try at a fix and submit a PR soon.

I have only one small reservation about completely ignoring the exception. It could be possible that people do a mistake and then they might not notice the warning. The same method is also used as part of the configuration creation.

Cheers,
Filip