Skip to content

Commit d3b8fe3

Browse files
committed
Delegate event-sub-process StartEvent dispatch to EventDefinition parse handlers
Replace the inline instanceof cascade in StartEventParseHandler with a single parseElement(eventDefinition) delegation, matching the pattern in BoundaryEventParseHandler and IntermediateCatchEventParseHandler. Each per-EventDefinition handler now installs the event-sub-process behavior alongside its IntermediateCatch / Boundary cases, so custom EventDefinitions go through the same path as the built-ins.
1 parent 665f7ff commit d3b8fe3

8 files changed

Lines changed: 49 additions & 66 deletions

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import org.flowable.bpmn.model.BaseElement;
1616
import org.flowable.bpmn.model.BoundaryEvent;
1717
import org.flowable.bpmn.model.ErrorEventDefinition;
18+
import org.flowable.bpmn.model.EventSubProcess;
19+
import org.flowable.bpmn.model.StartEvent;
1820
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
1921

2022
/**
@@ -32,6 +34,11 @@ public Class<? extends BaseElement> getHandledType() {
3234
protected void executeParse(BpmnParse bpmnParse, ErrorEventDefinition eventDefinition) {
3335
if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
3436
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryEventActivityBehavior(boundaryEvent, true));
37+
38+
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
39+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
40+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
41+
.createEventSubProcessErrorStartEventActivityBehavior(startEvent));
3542
}
3643
}
3744
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
import org.flowable.bpmn.model.BoundaryEvent;
1717
import org.flowable.bpmn.model.Escalation;
1818
import org.flowable.bpmn.model.EscalationEventDefinition;
19+
import org.flowable.bpmn.model.EventSubProcess;
20+
import org.flowable.bpmn.model.StartEvent;
1921
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
2022

2123
/**
@@ -39,6 +41,11 @@ protected void executeParse(BpmnParse bpmnParse, EscalationEventDefinition event
3941

4042
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryEscalationEventActivityBehavior(boundaryEvent,
4143
eventDefinition, escalation, boundaryEvent.isCancelActivity()));
44+
45+
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
46+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
47+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
48+
.createEventSubProcessEscalationStartEventActivityBehavior(startEvent));
4249
}
4350
}
4451
}

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

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,15 @@
1616
import org.flowable.bpmn.model.BaseElement;
1717
import org.flowable.bpmn.model.BoundaryEvent;
1818
import org.flowable.bpmn.model.EventRegistryEventDefinition;
19+
import org.flowable.bpmn.model.EventSubProcess;
1920
import org.flowable.bpmn.model.FlowElement;
2021
import org.flowable.bpmn.model.IntermediateCatchEvent;
2122
import org.flowable.bpmn.model.StartEvent;
2223
import org.flowable.common.engine.api.FlowableIllegalArgumentException;
2324
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
24-
import org.slf4j.Logger;
25-
import org.slf4j.LoggerFactory;
2625

2726
public class EventRegistryEventDefinitionParseHandler extends AbstractBpmnParseHandler<EventRegistryEventDefinition> {
2827

29-
private static final Logger LOGGER = LoggerFactory.getLogger(EventRegistryEventDefinitionParseHandler.class);
30-
3128
@Override
3229
public Class<? extends BaseElement> getHandledType() {
3330
return EventRegistryEventDefinition.class;
@@ -46,19 +43,11 @@ protected void executeParse(BpmnParse bpmnParse, EventRegistryEventDefinition ev
4643
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
4744
.createBoundaryEventRegistryEventActivityBehavior(boundaryEvent, key, boundaryEvent.isCancelActivity()));
4845

49-
} else if (currentFlowElement instanceof StartEvent startEvent) {
50-
// StartEventParseHandler dispatches EventRegistryEventDefinition inline (event-sub-process branch
51-
// creates the typed behavior; process-level branch is driven by the engine's process-start path
52-
// via subscription, not by behavior.execute()). Reaching this handler for a StartEvent only
53-
// happens if a custom dispatch path explicitly delegates here — warn so the misconfiguration
54-
// surfaces.
55-
LOGGER.warn("EventRegistryEventDefinition on StartEvent '{}' is dispatched by StartEventParseHandler; reaching this handler is unexpected. Ignoring.",
56-
startEvent.getId());
57-
} else {
58-
LOGGER.warn("EventRegistryEventDefinition is only supported on IntermediateCatchEvent, BoundaryEvent, and event-sub-process StartEvent. " +
59-
"Found on '{}' (type {}); ignoring",
60-
currentFlowElement != null ? currentFlowElement.getId() : "unknown",
61-
currentFlowElement != null ? currentFlowElement.getClass().getSimpleName() : "null");
46+
} else if (currentFlowElement instanceof StartEvent startEvent
47+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
48+
String key = requireEventDefinitionKey(eventDefinition, startEvent.getId());
49+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
50+
.createEventSubProcessEventRegistryStartEventActivityBehavior(startEvent, key));
6251
}
6352
}
6453

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
import org.flowable.bpmn.model.BaseElement;
1818
import org.flowable.bpmn.model.BoundaryEvent;
1919
import org.flowable.bpmn.model.BpmnModel;
20+
import org.flowable.bpmn.model.EventSubProcess;
2021
import org.flowable.bpmn.model.ExtensionElement;
2122
import org.flowable.bpmn.model.IntermediateCatchEvent;
2223
import org.flowable.bpmn.model.Message;
2324
import org.flowable.bpmn.model.MessageEventDefinition;
25+
import org.flowable.bpmn.model.StartEvent;
2426
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
2527

2628
/**
@@ -54,12 +56,12 @@ protected void executeParse(BpmnParse bpmnParse, MessageEventDefinition messageD
5456

5557
} else if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
5658
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryMessageEventActivityBehavior(boundaryEvent, messageDefinition, boundaryEvent.isCancelActivity()));
57-
}
5859

59-
else {
60-
// What to do here?
60+
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
61+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
62+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
63+
.createEventSubProcessMessageStartEventActivityBehavior(startEvent, messageDefinition));
6164
}
62-
6365
}
6466

6567
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414

1515
import org.flowable.bpmn.model.BaseElement;
1616
import org.flowable.bpmn.model.BoundaryEvent;
17+
import org.flowable.bpmn.model.EventSubProcess;
1718
import org.flowable.bpmn.model.IntermediateCatchEvent;
1819
import org.flowable.bpmn.model.Signal;
1920
import org.flowable.bpmn.model.SignalEventDefinition;
21+
import org.flowable.bpmn.model.StartEvent;
2022
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
2123

2224
/**
@@ -40,6 +42,11 @@ protected void executeParse(BpmnParse bpmnParse, SignalEventDefinition signalDef
4042

4143
} else if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
4244
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundarySignalEventActivityBehavior(boundaryEvent, signalDefinition, signal, boundaryEvent.isCancelActivity()));
45+
46+
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
47+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
48+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
49+
.createEventSubProcessSignalStartEventActivityBehavior(startEvent, signalDefinition, signal));
4350
}
4451
}
4552
}

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

Lines changed: 1 addition & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,14 @@
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;
1716
import org.flowable.bpmn.model.BpmnModel;
18-
import org.flowable.bpmn.model.ErrorEventDefinition;
19-
import org.flowable.bpmn.model.EscalationEventDefinition;
2017
import org.flowable.bpmn.model.EventDefinition;
2118
import org.flowable.bpmn.model.EventDefinitionLocation;
22-
import org.flowable.bpmn.model.EventRegistryEventDefinition;
2319
import org.flowable.bpmn.model.EventSubProcess;
2420
import org.flowable.bpmn.model.Message;
2521
import org.flowable.bpmn.model.MessageEventDefinition;
26-
import org.flowable.bpmn.model.Signal;
27-
import org.flowable.bpmn.model.SignalEventDefinition;
2822
import org.flowable.bpmn.model.StartEvent;
29-
import org.flowable.bpmn.model.TimerEventDefinition;
30-
import org.flowable.bpmn.model.VariableListenerEventDefinition;
31-
import org.flowable.common.engine.api.FlowableIllegalArgumentException;
3223
import org.flowable.common.engine.impl.util.CollectionUtil;
3324
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
3425
import org.slf4j.Logger;
@@ -57,42 +48,7 @@ protected void executeParse(BpmnParse bpmnParse, StartEvent element) {
5748
eventDefinition.getClass().getSimpleName(), element.getId());
5849
return;
5950
}
60-
if (eventDefinition instanceof MessageEventDefinition) {
61-
MessageEventDefinition messageDefinition = fillMessageRef(bpmnParse, eventDefinition);
62-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessMessageStartEventActivityBehavior(element, messageDefinition));
63-
64-
} else if (eventDefinition instanceof SignalEventDefinition signalDefinition) {
65-
Signal signal = bpmnParse.getBpmnModel().getSignal(signalDefinition.getSignalRef());
66-
67-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessSignalStartEventActivityBehavior(
68-
element, signalDefinition, signal));
69-
70-
} else if (eventDefinition instanceof TimerEventDefinition timerEventDefinition) {
71-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessTimerStartEventActivityBehavior(
72-
element, timerEventDefinition));
73-
74-
} else if (eventDefinition instanceof ErrorEventDefinition) {
75-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessErrorStartEventActivityBehavior(element));
76-
77-
} else if (eventDefinition instanceof EscalationEventDefinition) {
78-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessEscalationStartEventActivityBehavior(element));
79-
80-
} else if (eventDefinition instanceof VariableListenerEventDefinition variableListenerEventDefinition) {
81-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessVariableListenerlStartEventActivityBehavior(element, variableListenerEventDefinition));
82-
} else if (eventDefinition instanceof EventRegistryEventDefinition eventRegistry) {
83-
String key = eventRegistry.getEventDefinitionKey();
84-
if (StringUtils.isEmpty(key)) {
85-
throw new FlowableIllegalArgumentException("EventRegistryEventDefinition on '" + element.getId()
86-
+ "' has an empty eventDefinitionKey; the engine cannot register an event-registry subscription without a key.");
87-
}
88-
element.setBehavior(bpmnParse.getActivityBehaviorFactory().createEventSubProcessEventRegistryStartEventActivityBehavior(element, key));
89-
90-
} else {
91-
// Custom EventDefinition: delegate to the per-EventDefinition parse-handler chain so a
92-
// post-registered handler can install a behavior. Mirrors the dispatch pattern used by
93-
// IntermediateCatchEventParseHandler and BoundaryEventParseHandler.
94-
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
95-
}
51+
bpmnParse.getBpmnParserHandlers().parseElement(bpmnParse, eventDefinition);
9652
}
9753

9854
} else if (CollectionUtil.isEmpty(element.getEventDefinitions())) {

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
import org.flowable.bpmn.model.BaseElement;
1616
import org.flowable.bpmn.model.BoundaryEvent;
17+
import org.flowable.bpmn.model.EventSubProcess;
1718
import org.flowable.bpmn.model.IntermediateCatchEvent;
19+
import org.flowable.bpmn.model.StartEvent;
1820
import org.flowable.bpmn.model.TimerEventDefinition;
1921
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
2022

@@ -38,6 +40,12 @@ protected void executeParse(BpmnParse bpmnParse, TimerEventDefinition timerEvent
3840
} else if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
3941

4042
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryTimerEventActivityBehavior(boundaryEvent, timerEventDefinition, boundaryEvent.isCancelActivity()));
43+
44+
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
45+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
46+
47+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
48+
.createEventSubProcessTimerStartEventActivityBehavior(startEvent, timerEventDefinition));
4149
}
4250
}
4351
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
import org.flowable.bpmn.model.BaseElement;
1616
import org.flowable.bpmn.model.BoundaryEvent;
17+
import org.flowable.bpmn.model.EventSubProcess;
1718
import org.flowable.bpmn.model.IntermediateCatchEvent;
19+
import org.flowable.bpmn.model.StartEvent;
1820
import org.flowable.bpmn.model.VariableListenerEventDefinition;
1921
import org.flowable.engine.impl.bpmn.parser.BpmnParse;
2022

@@ -37,6 +39,11 @@ protected void executeParse(BpmnParse bpmnParse, VariableListenerEventDefinition
3739

3840
} else if (bpmnParse.getCurrentFlowElement() instanceof BoundaryEvent boundaryEvent) {
3941
boundaryEvent.setBehavior(bpmnParse.getActivityBehaviorFactory().createBoundaryVariableListenerEventActivityBehavior(boundaryEvent, variableListenerEventDefinition, boundaryEvent.isCancelActivity()));
42+
43+
} else if (bpmnParse.getCurrentFlowElement() instanceof StartEvent startEvent
44+
&& startEvent.getSubProcess() instanceof EventSubProcess) {
45+
startEvent.setBehavior(bpmnParse.getActivityBehaviorFactory()
46+
.createEventSubProcessVariableListenerlStartEventActivityBehavior(startEvent, variableListenerEventDefinition));
4047
}
4148
}
4249
}

0 commit comments

Comments
 (0)