Skip to content

Commit 5241d77

Browse files
committed
Delegate EndEvent dispatch to EventDefinition parse handlers
Replace EndEventParseHandler's instanceof cascade for Error / Escalation / Terminate / Cancel with a parseElement(eventDefinition) delegation. The per-EventDefinition handlers gain EndEvent branches and a new TerminateEventDefinitionParseHandler covers Terminate's only valid placement. None-end stays inline.
1 parent 229f5d2 commit 5241d77

6 files changed

Lines changed: 85 additions & 43 deletions

File tree

modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/parser/handler/CancelEventDefinitionParseHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import org.flowable.bpmn.model.BaseElement;
1616
import org.flowable.bpmn.model.BoundaryEvent;
1717
import org.flowable.bpmn.model.CancelEventDefinition;
18+
import org.flowable.bpmn.model.EndEvent;
1819
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
1920

2021
/**
@@ -32,7 +33,9 @@ public Class<? extends BaseElement> getHandledType() {
3233
protected void executeParse(BpmnParse bpmnParse, CancelEventDefinition cancelEventDefinition) {
3334
if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
3435
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryCancelEventActivityBehavior(cancelEventDefinition));
35-
}
3636

37+
} else if (bpmnParse.getCurrentFlowElement() instanceof EndEvent endEvent) {
38+
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createCancelEndEventActivityBehavior(endEvent));
39+
}
3740
}
3841
}
Lines changed: 14 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
/* Licensed under the Apache License, Version 2.0 (the "License");
22
* you may not use this file except in compliance with the License.
33
* You may obtain a copy of the License at
4-
*
4+
*
55
* http://www.apache.org/licenses/LICENSE-2.0
6-
*
6+
*
77
* Unless required by applicable law or agreed to in writing, software
88
* distributed under the License is distributed on an "AS IS" BASIS,
99
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -12,15 +12,10 @@
1212
*/
1313
package org.flowable.engine.impl.bpmn.parser.handler;
1414

15-
import org.apache.commons.lang3.StringUtils;
1615
import org.flowable.bpmn.model.BaseElement;
17-
import org.flowable.bpmn.model.CancelEventDefinition;
1816
import org.flowable.bpmn.model.EndEvent;
19-
import org.flowable.bpmn.model.ErrorEventDefinition;
20-
import org.flowable.bpmn.model.Escalation;
21-
import org.flowable.bpmn.model.EscalationEventDefinition;
2217
import org.flowable.bpmn.model.EventDefinition;
23-
import org.flowable.bpmn.model.TerminateEventDefinition;
18+
import org.flowable.bpmn.model.EventDefinitionLocation;
2419
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
2520
import org.slf4j.Logger;
2621
import org.slf4j.LoggerFactory;
@@ -40,42 +35,19 @@ public Class<? extends BaseElement> getHandledType() {
4035

4136
@Override
4237
protected void executeParse(BpmnParse bpmnParse, EndEvent endEvent) {
38+
if (endEvent.getEventDefinitions().isEmpty()) {
39+
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneEndEventActivityBehavior(endEvent));
40+
return;
41+
}
4342

44-
EventDefinition eventDefinition = null;
45-
if (endEvent.getEventDefinitions().size() > 0) {
46-
eventDefinition = endEvent.getEventDefinitions().get(0);
47-
48-
if (eventDefinition instanceof ErrorEventDefinition errorDefinition) {
49-
if (bpmnParse.getBpmnModel().containsErrorRef(errorDefinition.getErrorCode())) {
50-
String errorCode = bpmnParse.getBpmnModel().getErrors().get(errorDefinition.getErrorCode());
51-
if (StringUtils.isEmpty(errorCode)) {
52-
LOGGER.warn("errorCode is required for an error event {}", endEvent.getId());
53-
}
54-
}
55-
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createErrorEndEventActivityBehavior(endEvent, errorDefinition));
56-
57-
} else if (eventDefinition instanceof EscalationEventDefinition escalationDefinition) {
58-
Escalation escalation = null;
59-
if (bpmnParse.getBpmnModel().containsEscalationRef(escalationDefinition.getEscalationCode())) {
60-
escalation = bpmnParse.getBpmnModel().getEscalation(escalationDefinition.getEscalationCode());
61-
String escalationCode = escalation.getEscalationCode();
62-
if (StringUtils.isEmpty(escalationCode)) {
63-
LOGGER.warn("escalationCode is required for an escalation event {}", endEvent.getId());
64-
}
65-
}
66-
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createEscalationEndEventActivityBehavior(endEvent, escalationDefinition, escalation));
67-
68-
} else if (eventDefinition instanceof TerminateEventDefinition) {
69-
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createTerminateEndEventActivityBehavior(endEvent));
70-
} else if (eventDefinition instanceof CancelEventDefinition) {
71-
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createCancelEndEventActivityBehavior(endEvent));
72-
} else {
73-
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneEndEventActivityBehavior(endEvent));
74-
}
75-
76-
} else {
43+
EventDefinition eventDefinition = endEvent.getEventDefinitions().get(0);
44+
if (!eventDefinition.getSupportedLocations().contains(EventDefinitionLocation.END_EVENT)) {
45+
LOGGER.warn("EventDefinition {} is not supported on end event {}; falling back to none-end behavior",
46+
eventDefinition.getClass().getSimpleName(), endEvent.getId());
7747
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createNoneEndEventActivityBehavior(endEvent));
48+
return;
7849
}
79-
}
8050

51+
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
52+
}
8153
}

modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/parser/handler/ErrorEventDefinitionParseHandler.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,19 +12,25 @@
1212
*/
1313
package org.flowable.engine.impl.bpmn.parser.handler;
1414

15+
import org.apache.commons.lang3.StringUtils;
1516
import org.flowable.bpmn.model.BaseElement;
1617
import org.flowable.bpmn.model.BoundaryEvent;
18+
import org.flowable.bpmn.model.EndEvent;
1719
import org.flowable.bpmn.model.ErrorEventDefinition;
1820
import org.flowable.bpmn.model.EventSubProcess;
1921
import org.flowable.bpmn.model.StartEvent;
2022
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
23+
import org.slf4j.Logger;
24+
import org.slf4j.LoggerFactory;
2125

2226
/**
2327
* @author Joram Barrez
2428
* @author Tijs Rademakers
2529
*/
2630
public class ErrorEventDefinitionParseHandler extends AbstractBpmnParseHandler<ErrorEventDefinition> {
2731

32+
private static final Logger LOGGER = LoggerFactory.getLogger(ErrorEventDefinitionParseHandler.class);
33+
2834
@Override
2935
public Class<? extends BaseElement> getHandledType() {
3036
return ErrorEventDefinition.class;
@@ -35,6 +41,15 @@ protected void executeParse(BpmnParse bpmnParse, ErrorEventDefinition eventDefin
3541
if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
3642
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryEventActivityBehavior(boundaryEvent, true));
3743

44+
} else if (bpmnParse.getCurrentFlowElement() instanceof EndEvent endEvent) {
45+
if (bpmnParse.getBpmnModel().containsErrorRef(eventDefinition.getErrorCode())) {
46+
String errorCode = bpmnParse.getBpmnModel().getErrors().get(eventDefinition.getErrorCode());
47+
if (StringUtils.isEmpty(errorCode)) {
48+
LOGGER.warn("errorCode is required for an error event {}", endEvent.getId());
49+
}
50+
}
51+
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createErrorEndEventActivityBehavior(endEvent, eventDefinition));
52+
3853
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
3954
&& startEvent.getSubProcess() instanceof EventSubProcess) {
4055
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()

modules/flowable-engine/src/main/java/org/flowable/engine/impl/bpmn/parser/handler/EscalationEventDefinitionParseHandler.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,26 @@
1212
*/
1313
package org.flowable.engine.impl.bpmn.parser.handler;
1414

15+
import org.apache.commons.lang3.StringUtils;
1516
import org.flowable.bpmn.model.BaseElement;
1617
import org.flowable.bpmn.model.BoundaryEvent;
18+
import org.flowable.bpmn.model.EndEvent;
1719
import org.flowable.bpmn.model.Escalation;
1820
import org.flowable.bpmn.model.EscalationEventDefinition;
1921
import org.flowable.bpmn.model.EventSubProcess;
2022
import org.flowable.bpmn.model.StartEvent;
2123
import org.flowable.bpmn.model.ThrowEvent;
2224
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
25+
import org.slf4j.Logger;
26+
import org.slf4j.LoggerFactory;
2327

2428
/**
2529
* @author Tijs Rademakers
2630
*/
2731
public class EscalationEventDefinitionParseHandler extends AbstractBpmnParseHandler<EscalationEventDefinition> {
2832

33+
private static final Logger LOGGER = LoggerFactory.getLogger(EscalationEventDefinitionParseHandler.class);
34+
2935
@Override
3036
public Class<? extends BaseElement> getHandledType() {
3137
return EscalationEventDefinition.class;
@@ -48,6 +54,17 @@ protected void executeParse(BpmnParse bpmnParse, EscalationEventDefinition event
4854
throwEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
4955
.createIntermediateThrowEscalationEventActivityBehavior(throwEvent, eventDefinition, escalation));
5056

57+
} else if (bpmnParse.getCurrentFlowElement() instanceof EndEvent endEvent) {
58+
Escalation escalation = null;
59+
if (bpmnParse.getBpmnModel().containsEscalationRef(eventDefinition.getEscalationCode())) {
60+
escalation = bpmnParse.getBpmnModel().getEscalation(eventDefinition.getEscalationCode());
61+
if (StringUtils.isEmpty(escalation.getEscalationCode())) {
62+
LOGGER.warn("escalationCode is required for an escalation event {}", endEvent.getId());
63+
}
64+
}
65+
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
66+
.createEscalationEndEventActivityBehavior(endEvent, eventDefinition, escalation));
67+
5168
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
5269
&& startEvent.getSubProcess() instanceof EventSubProcess) {
5370
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/* Licensed under the Apache License, Version 2.0 (the "License");
2+
* you may not use this file except in compliance with the License.
3+
* You may obtain a copy of the License at
4+
*
5+
* http://www.apache.org/licenses/LICENSE-2.0
6+
*
7+
* Unless required by applicable law or agreed to in writing, software
8+
* distributed under the License is distributed on an "AS IS" BASIS,
9+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10+
* See the License for the specific language governing permissions and
11+
* limitations under the License.
12+
*/
13+
package org.flowable.engine.impl.bpmn.parser.handler;
14+
15+
import org.flowable.bpmn.model.BaseElement;
16+
import org.flowable.bpmn.model.EndEvent;
17+
import org.flowable.bpmn.model.TerminateEventDefinition;
18+
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
19+
20+
public class TerminateEventDefinitionParseHandler extends AbstractBpmnParseHandler<TerminateEventDefinition> {
21+
22+
@Override
23+
public Class<? extends BaseElement> getHandledType() {
24+
return TerminateEventDefinition.class;
25+
}
26+
27+
@Override
28+
protected void executeParse(BpmnParse bpmnParse, TerminateEventDefinition eventDefinition) {
29+
if (bpmnParse.getCurrentFlowElement() instanceof EndEvent endEvent) {
30+
endEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createTerminateEndEventActivityBehavior(endEvent));
31+
}
32+
}
33+
}

modules/flowable-engine/src/main/java/org/flowable/engine/impl/cfg/ProcessEngineConfigurationImpl.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,7 @@
209209
import org.flowable.engine.impl.bpmn.parser.handler.ReceiveTaskParseHandler;
210210
import org.flowable.engine.impl.bpmn.parser.handler.ScriptTaskParseHandler;
211211
import org.flowable.engine.impl.bpmn.parser.handler.SendEventServiceTaskParseHandler;
212+
import org.flowable.engine.impl.bpmn.parser.handler.TerminateEventDefinitionParseHandler;
212213
import org.flowable.engine.impl.bpmn.parser.handler.SendTaskParseHandler;
213214
import org.flowable.engine.impl.bpmn.parser.handler.SequenceFlowParseHandler;
214215
import org.flowable.engine.impl.bpmn.parser.handler.ServiceTaskParseHandler;
@@ -1872,6 +1873,7 @@ public List<BpmnParseHandler> getDefaultBpmnParseHandlers() {
18721873
bpmnParserHandlers.add(new ReceiveTaskParseHandler());
18731874
bpmnParserHandlers.add(new ScriptTaskParseHandler());
18741875
bpmnParserHandlers.add(new SendEventServiceTaskParseHandler());
1876+
bpmnParserHandlers.add(new TerminateEventDefinitionParseHandler());
18751877
bpmnParserHandlers.add(new ExternalWorkerServiceTaskParseHandler());
18761878
bpmnParserHandlers.add(new SendTaskParseHandler());
18771879
bpmnParserHandlers.add(new SequenceFlowParseHandler());

0 commit comments

Comments
 (0)