From 41d8d22d2ef4423a851d8ecb8534428f7c1c45de Mon Sep 17 00:00:00 2001 From: Joram Barrez Date: Wed, 30 Jan 2013 11:34:34 +0100 Subject: [PATCH] ACT-1553: allow to override the default bpmn parser with a custom one --- .../CdiEventSupportBpmnParseHandler.java | 2 + .../handler/EventSubProcessParseHandler.java | 28 +++++++++++++ .../handler/SubProcessParseHandler.java | 14 +------ .../cfg/ProcessEngineConfigurationImpl.java | 42 ++++++++++++++++++- .../parse/FlowNodeHistoryParseHandler.java | 2 + ...nerTest.java => BPMNParseHandlerTest.java} | 4 +- .../CustomDefaultBpmnParseHandlerTest.java | 41 ++++++++++++++++++ .../CustomUserTaskBpmnParseHandler.java | 36 ++++++++++++++++ ...estCustomDefaultUserTaskParsing.bpmn20.xml | 14 +++++++ ...tom.default.parse.handler.activiti.cfg.xml | 24 +++++++++++ 10 files changed, 192 insertions(+), 15 deletions(-) create mode 100644 modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/EventSubProcessParseHandler.java rename modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/{BPMNParseListenerTest.java => BPMNParseHandlerTest.java} (92%) create mode 100644 modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.java create mode 100644 modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomUserTaskBpmnParseHandler.java create mode 100644 modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.testCustomDefaultUserTaskParsing.bpmn20.xml create mode 100644 modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/custom.default.parse.handler.activiti.cfg.xml diff --git a/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java b/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java index 7c934e7b84..530f143a0c 100644 --- a/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java +++ b/modules/activiti-cdi/src/main/java/org/activiti/cdi/impl/event/CdiEventSupportBpmnParseHandler.java @@ -21,6 +21,7 @@ import org.activiti.bpmn.model.CallActivity; import org.activiti.bpmn.model.EndEvent; import org.activiti.bpmn.model.ErrorEventDefinition; import org.activiti.bpmn.model.EventGateway; +import org.activiti.bpmn.model.EventSubProcess; import org.activiti.bpmn.model.ExclusiveGateway; import org.activiti.bpmn.model.InclusiveGateway; import org.activiti.bpmn.model.ManualTask; @@ -70,6 +71,7 @@ public class CdiEventSupportBpmnParseHandler implements BpmnParseHandler { supportedTypes.add(UserTask.class); supportedTypes.add(EndEvent.class); supportedTypes.add(SubProcess.class); + supportedTypes.add(EventSubProcess.class); supportedTypes.add(CallActivity.class); supportedTypes.add(SendTask.class); supportedTypes.add(ReceiveTask.class); diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/EventSubProcessParseHandler.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/EventSubProcessParseHandler.java new file mode 100644 index 0000000000..918ed7d770 --- /dev/null +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/EventSubProcessParseHandler.java @@ -0,0 +1,28 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.engine.impl.bpmn.parser.handler; + +import org.activiti.bpmn.model.BaseElement; +import org.activiti.bpmn.model.EventSubProcess; + + +/** + * @author Joram Barrez + */ +public class EventSubProcessParseHandler extends SubProcessParseHandler { + + protected Class< ? extends BaseElement> getHandledType() { + return EventSubProcess.class; + } + +} diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SubProcessParseHandler.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SubProcessParseHandler.java index 3c97928834..6512e89017 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SubProcessParseHandler.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/bpmn/parser/handler/SubProcessParseHandler.java @@ -12,9 +12,6 @@ */ package org.activiti.engine.impl.bpmn.parser.handler; -import java.util.HashSet; -import java.util.Set; - import org.activiti.bpmn.constants.BpmnXMLConstants; import org.activiti.bpmn.model.BaseElement; import org.activiti.bpmn.model.EventSubProcess; @@ -29,15 +26,8 @@ import org.activiti.engine.impl.pvm.process.ActivityImpl; */ public class SubProcessParseHandler extends AbstractActivityBpmnParseHandler { - protected static Set> supportedTypes = new HashSet>(); - - static { - supportedTypes.add(SubProcess.class); - supportedTypes.add(EventSubProcess.class); - } - - public Set> getHandledTypes() { - return supportedTypes; + protected Class< ? extends BaseElement> getHandledType() { + return SubProcess.class; } protected void executeParse(BpmnParse bpmnParse, SubProcess subProcess) { diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cfg/ProcessEngineConfigurationImpl.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cfg/ProcessEngineConfigurationImpl.java index a5cf3efea5..0637b7544e 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cfg/ProcessEngineConfigurationImpl.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/cfg/ProcessEngineConfigurationImpl.java @@ -287,6 +287,7 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig // Bpmn parser protected List preBpmnParseHandlers; protected List postBpmnParseHandlers; + protected List customDefaultBpmnParseHandlers; protected ActivityBehaviorFactory activityBehaviorFactory; protected ListenerFactory listenerFactory; protected BpmnParseFactory bpmnParseFactory; @@ -785,6 +786,7 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig } protected List getDefaultBpmnParseHandlers() { + // Alpabetic list of default parse handler classes List bpmnParserHandlers = new ArrayList(); bpmnParserHandlers.add(new BoundaryEventParseHandler()); @@ -816,6 +818,37 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig bpmnParserHandlers.add(new TransactionParseHandler()); bpmnParserHandlers.add(new UserTaskParseHandler()); + // Replace any default handler if the user wants to replace them + if (customDefaultBpmnParseHandlers != null) { + + Map, BpmnParseHandler> customParseHandlerMap = new HashMap, BpmnParseHandler>(); + for (BpmnParseHandler bpmnParseHandler : customDefaultBpmnParseHandlers) { + for (Class handledType : bpmnParseHandler.getHandledTypes()) { + customParseHandlerMap.put(handledType, bpmnParseHandler); + } + } + + for (int i=0; i type : defaultBpmnParseHandler.getHandledTypes()) { + supportedTypes.append(" " + type.getCanonicalName() + " "); + } + throw new ActivitiException("The default BPMN parse handlers should only support one type, but " + defaultBpmnParseHandler.getClass() + + " supports " + supportedTypes.toString() + ". This is likely a programmatic error"); + } else { + Class handledType = defaultBpmnParseHandler.getHandledTypes().iterator().next(); + if (customParseHandlerMap.containsKey(handledType)) { + BpmnParseHandler newBpmnParseHandler = customParseHandlerMap.get(handledType); + log.info("Replacing default BpmnParseHandler " + defaultBpmnParseHandler.getClass().getName() + " with " + newBpmnParseHandler.getClass().getName()); + bpmnParserHandlers.set(i, newBpmnParseHandler); + } + } + } + } + // History for (BpmnParseHandler handler : getDefaultHistoryParseHandlers()) { bpmnParserHandlers.add(handler); @@ -1481,6 +1514,14 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig public void setPreBpmnParseHandlers(List preBpmnParseHandlers) { this.preBpmnParseHandlers = preBpmnParseHandlers; } + + public List getCustomDefaultBpmnParseHandlers() { + return customDefaultBpmnParseHandlers; + } + + public void setCustomDefaultBpmnParseHandlers(List customDefaultBpmnParseHandlers) { + this.customDefaultBpmnParseHandlers = customDefaultBpmnParseHandlers; + } public List getPostBpmnParseHandlers() { return postBpmnParseHandlers; @@ -1871,7 +1912,6 @@ public abstract class ProcessEngineConfigurationImpl extends ProcessEngineConfig public void setKnowledgeBaseCacheLimit(int knowledgeBaseCacheLimit) { this.knowledgeBaseCacheLimit = knowledgeBaseCacheLimit; } - public DeploymentCache getKnowledgeBaseCache() { return knowledgeBaseCache; diff --git a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/parse/FlowNodeHistoryParseHandler.java b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/parse/FlowNodeHistoryParseHandler.java index cf9613cda5..6835965dc7 100644 --- a/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/parse/FlowNodeHistoryParseHandler.java +++ b/modules/activiti-engine/src/main/java/org/activiti/engine/impl/history/parse/FlowNodeHistoryParseHandler.java @@ -20,6 +20,7 @@ import org.activiti.bpmn.model.BusinessRuleTask; import org.activiti.bpmn.model.CallActivity; import org.activiti.bpmn.model.EndEvent; import org.activiti.bpmn.model.EventGateway; +import org.activiti.bpmn.model.EventSubProcess; import org.activiti.bpmn.model.ExclusiveGateway; import org.activiti.bpmn.model.InclusiveGateway; import org.activiti.bpmn.model.IntermediateCatchEvent; @@ -71,6 +72,7 @@ public class FlowNodeHistoryParseHandler implements BpmnParseHandler { supportedElementClasses.add(CallActivity.class); supportedElementClasses.add(SubProcess.class); + supportedElementClasses.add(EventSubProcess.class); } public Set> getHandledTypes() { diff --git a/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/BPMNParseListenerTest.java b/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/BPMNParseHandlerTest.java similarity index 92% rename from modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/BPMNParseListenerTest.java rename to modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/BPMNParseHandlerTest.java index c252a604e1..752d053795 100644 --- a/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/BPMNParseListenerTest.java +++ b/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/BPMNParseHandlerTest.java @@ -20,9 +20,9 @@ import org.activiti.engine.test.Deployment; * @author Frederik Heremans * @author Joram Barrez */ -public class BPMNParseListenerTest extends ResourceActivitiTestCase { +public class BPMNParseHandlerTest extends ResourceActivitiTestCase { - public BPMNParseListenerTest() { + public BPMNParseHandlerTest() { super("org/activiti/standalone/parsing/bpmn.parse.listener.activiti.cfg.xml"); } diff --git a/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.java b/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.java new file mode 100644 index 0000000000..3e5ddc313a --- /dev/null +++ b/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.java @@ -0,0 +1,41 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.standalone.parsing; + +import org.activiti.engine.impl.test.ResourceActivitiTestCase; +import org.activiti.engine.test.Deployment; + + +/** + * @author Frederik Heremans + * @author Joram Barrez + */ +public class CustomDefaultBpmnParseHandlerTest extends ResourceActivitiTestCase { + + public CustomDefaultBpmnParseHandlerTest() { + super("org/activiti/standalone/parsing/custom.default.parse.handler.activiti.cfg.xml"); + } + + @Deployment + public void testCustomDefaultUserTaskParsing() throws Exception { + // The task which is created after process instance start should be async + runtimeService.startProcessInstanceByKey("customDefaultBpmnParseHandler"); + + assertEquals(0, taskService.createTaskQuery().count()); + assertEquals(1, managementService.createJobQuery().count()); + + managementService.executeJob(managementService.createJobQuery().singleResult().getId()); + assertEquals(1, taskService.createTaskQuery().count()); + } + +} diff --git a/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomUserTaskBpmnParseHandler.java b/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomUserTaskBpmnParseHandler.java new file mode 100644 index 0000000000..699ffdcea5 --- /dev/null +++ b/modules/activiti-engine/src/test/java/org/activiti/standalone/parsing/CustomUserTaskBpmnParseHandler.java @@ -0,0 +1,36 @@ +/* Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.activiti.standalone.parsing; + +import org.activiti.bpmn.model.UserTask; +import org.activiti.engine.impl.bpmn.parser.BpmnParse; +import org.activiti.engine.impl.bpmn.parser.handler.UserTaskParseHandler; +import org.activiti.engine.impl.pvm.process.ActivityImpl; + + +/** + * @author Joram Barrez + */ +public class CustomUserTaskBpmnParseHandler extends UserTaskParseHandler { + + protected void executeParse(BpmnParse bpmnParse, UserTask userTask) { + + // Do the regular stuff + super.executeParse(bpmnParse, userTask); + + // Make user tasks always async + ActivityImpl activity = findActivity(bpmnParse, userTask.getId()); + activity.setAsync(true); + } + +} diff --git a/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.testCustomDefaultUserTaskParsing.bpmn20.xml b/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.testCustomDefaultUserTaskParsing.bpmn20.xml new file mode 100644 index 0000000000..9666181332 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/CustomDefaultBpmnParseHandlerTest.testCustomDefaultUserTaskParsing.bpmn20.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/custom.default.parse.handler.activiti.cfg.xml b/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/custom.default.parse.handler.activiti.cfg.xml new file mode 100644 index 0000000000..4e75d7f1f2 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/custom.default.parse.handler.activiti.cfg.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + -- GitLab