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 7c934e7b845857e70377e506c3853b487e7a376b..530f143a0c795a970e0d7f0d00c59cdea657b082 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 0000000000000000000000000000000000000000..918ed7d77033f18ded4e1c0659f83fdfe3dea89c --- /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 3c97928834606cac424029ac37cc7996f03a5137..6512e890178cc56814523c714601d114a6b66fca 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 a5cf3efea55dc039b3ed5ab94e996de8b4728e9a..0637b7544e95faa6ed30b4b077576270312ce2d5 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 cf9613cda56e9de96937458f216e511b8d93351b..6835965dc7794aed3e346e59e9292b69f85fd8ab 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 c252a604e168b44e30416d39d22b8315ac88990c..752d053795bf5179c2e4257b224d45c471586dac 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 0000000000000000000000000000000000000000..3e5ddc313a97c4cd9deff0ada83eb0151fe1ab79 --- /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 0000000000000000000000000000000000000000..699ffdcea5f6cca03af5ac6a8fe632cd3f39a6ab --- /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 0000000000000000000000000000000000000000..9666181332e5d73df490a55607337c2a7066095b --- /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 0000000000000000000000000000000000000000..4e75d7f1f2b5a22dc98c1c9a16a160cf5ad97579 --- /dev/null +++ b/modules/activiti-engine/src/test/resources/org/activiti/standalone/parsing/custom.default.parse.handler.activiti.cfg.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + +