Skip to content

Commit b3f408a

Browse files
committed
Merge branch 'main' into flowable-release-8.1.0
2 parents 8b3950f + 3ebb1a7 commit b3f408a

130 files changed

Lines changed: 4111 additions & 1420 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/BaseBpmnXMLConverter.java

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import org.flowable.bpmn.model.CancelEventDefinition;
3636
import org.flowable.bpmn.model.CompensateEventDefinition;
3737
import org.flowable.bpmn.model.ConditionalEventDefinition;
38+
import org.flowable.bpmn.model.CustomBpmnEventDefinition;
3839
import org.flowable.bpmn.model.DataAssociation;
3940
import org.flowable.bpmn.model.DataObject;
4041
import org.flowable.bpmn.model.ErrorEventDefinition;
@@ -60,7 +61,6 @@
6061
import org.flowable.bpmn.model.TimerEventDefinition;
6162
import org.flowable.bpmn.model.UserTask;
6263
import org.flowable.bpmn.model.ValuedDataObject;
63-
import org.flowable.bpmn.model.VariableListenerEventDefinition;
6464
import org.slf4j.Logger;
6565
import org.slf4j.LoggerFactory;
6666

@@ -438,7 +438,13 @@ protected boolean writeListeners(BaseElement element, boolean didWriteExtensionS
438438
}
439439

440440
protected void writeEventDefinitions(Event parentEvent, List<EventDefinition> eventDefinitions, BpmnModel model, XMLStreamWriter xtw) throws Exception {
441+
// Custom (non-BPMN-spec) event definitions are emitted in writeExtensionChildElements via
442+
// BpmnXMLUtil.writeCustomEventDefinitionExtensionElements. Only the BPMN-spec types are written here
443+
// as direct children of the event element.
441444
for (EventDefinition eventDefinition : eventDefinitions) {
445+
if (eventDefinition instanceof CustomBpmnEventDefinition) {
446+
continue;
447+
}
442448
if (eventDefinition instanceof TimerEventDefinition) {
443449
writeTimerDefinition(parentEvent, (TimerEventDefinition) eventDefinition, model, xtw);
444450

@@ -653,32 +659,6 @@ protected void writeTerminateDefinition(Event parentEvent, TerminateEventDefinit
653659
xtw.writeEndElement();
654660
}
655661

656-
protected boolean writeVariableListenerDefinition(Event parentEvent, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
657-
if (parentEvent.getEventDefinitions().size() == 1) {
658-
EventDefinition eventDefinition = parentEvent.getEventDefinitions().iterator().next();
659-
if (eventDefinition instanceof VariableListenerEventDefinition variableListenerEventDefinition) {
660-
if (!didWriteExtensionStartElement) {
661-
xtw.writeStartElement(ELEMENT_EXTENSIONS);
662-
didWriteExtensionStartElement = true;
663-
}
664-
665-
xtw.writeStartElement(FLOWABLE_EXTENSIONS_PREFIX, ELEMENT_EVENT_VARIABLELISTENERDEFINITION, FLOWABLE_EXTENSIONS_NAMESPACE);
666-
667-
if (StringUtils.isNotEmpty(variableListenerEventDefinition.getVariableName())) {
668-
writeDefaultAttribute(ATTRIBUTE_VARIABLE_NAME, variableListenerEventDefinition.getVariableName(), xtw);
669-
}
670-
671-
if (StringUtils.isNotEmpty(variableListenerEventDefinition.getVariableChangeType())) {
672-
writeDefaultAttribute(ATTRIBUTE_VARIABLE_CHANGE_TYPE, variableListenerEventDefinition.getVariableChangeType(), xtw);
673-
}
674-
675-
xtw.writeEndElement();
676-
}
677-
}
678-
679-
return didWriteExtensionStartElement;
680-
}
681-
682662
protected void writeDefaultAttribute(String attributeName, String value, XMLStreamWriter xtw) throws Exception {
683663
BpmnXMLUtil.writeDefaultAttribute(attributeName, value, xtw);
684664
}

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/BoundaryEventXMLConverter.java

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import javax.xml.stream.XMLStreamWriter;
2222

2323
import org.apache.commons.lang3.StringUtils;
24-
import org.flowable.bpmn.constants.BpmnXMLConstants;
2524
import org.flowable.bpmn.converter.child.BaseChildElementParser;
2625
import org.flowable.bpmn.converter.child.InParameterParser;
2726
import org.flowable.bpmn.converter.child.VariableListenerEventDefinitionParser;
@@ -32,7 +31,6 @@
3231
import org.flowable.bpmn.model.ErrorEventDefinition;
3332
import org.flowable.bpmn.model.EventDefinition;
3433
import org.flowable.bpmn.model.ExtensionAttribute;
35-
import org.flowable.bpmn.model.ExtensionElement;
3634

3735
/**
3836
* @author Tijs Rademakers
@@ -108,23 +106,14 @@ protected void writeAdditionalAttributes(BaseElement element, BpmnModel model, X
108106
if (!(eventDef instanceof ErrorEventDefinition)) {
109107
writeDefaultAttribute(ATTRIBUTE_BOUNDARY_CANCELACTIVITY, String.valueOf(boundaryEvent.isCancelActivity()).toLowerCase(), xtw);
110108
}
111-
112-
} else if (!boundaryEvent.getExtensionElements().isEmpty()) {
113-
List<ExtensionElement> eventTypeExtensionElements = boundaryEvent.getExtensionElements().get(BpmnXMLConstants.ELEMENT_EVENT_TYPE);
114-
if (eventTypeExtensionElements != null && !eventTypeExtensionElements.isEmpty()) {
115-
String eventTypeValue = eventTypeExtensionElements.get(0).getElementText();
116-
if (StringUtils.isNotEmpty(eventTypeValue)) {
117-
writeDefaultAttribute(ATTRIBUTE_BOUNDARY_CANCELACTIVITY, String.valueOf(boundaryEvent.isCancelActivity()).toLowerCase(), xtw);
118-
}
119-
}
120109
}
121110
}
122111

123112
@Override
124113
protected boolean writeExtensionChildElements(BaseElement element, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
125114
BoundaryEvent boundaryEvent = (BoundaryEvent) element;
126115
didWriteExtensionStartElement = BpmnXMLUtil.writeIOParameters(ELEMENT_IN_PARAMETERS, boundaryEvent.getInParameters(), didWriteExtensionStartElement, xtw);
127-
didWriteExtensionStartElement = writeVariableListenerDefinition(boundaryEvent, didWriteExtensionStartElement, xtw);
116+
didWriteExtensionStartElement = BpmnXMLUtil.writeCustomEventDefinitionExtensionElements(boundaryEvent, didWriteExtensionStartElement, xtw);
128117
return didWriteExtensionStartElement;
129118
}
130119

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/BpmnXMLConverter.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,20 @@
8080
import org.flowable.bpmn.model.BpmnModel;
8181
import org.flowable.bpmn.model.DateDataObject;
8282
import org.flowable.bpmn.model.DoubleDataObject;
83+
import org.flowable.bpmn.model.Event;
84+
import org.flowable.bpmn.model.EventRegistryEventDefinition;
8385
import org.flowable.bpmn.model.EventSubProcess;
86+
import org.flowable.bpmn.model.ExtensionElement;
8487
import org.flowable.bpmn.model.FlowElement;
8588
import org.flowable.bpmn.model.FlowNode;
8689
import org.flowable.bpmn.model.IntegerDataObject;
90+
import org.flowable.bpmn.model.IntermediateCatchEvent;
8791
import org.flowable.bpmn.model.JsonDataObject;
8892
import org.flowable.bpmn.model.LongDataObject;
8993
import org.flowable.bpmn.model.Pool;
9094
import org.flowable.bpmn.model.Process;
9195
import org.flowable.bpmn.model.SequenceFlow;
96+
import org.flowable.bpmn.model.StartEvent;
9297
import org.flowable.bpmn.model.StringDataObject;
9398
import org.flowable.bpmn.model.SubProcess;
9499
import org.flowable.bpmn.model.TextAnnotation;
@@ -479,6 +484,7 @@ public BpmnModel convertToBpmnModel(XMLStreamReader xtr) {
479484

480485
protected void processFlowElements(Collection<FlowElement> flowElementList, BaseElement parentScope) {
481486
for (FlowElement flowElement : flowElementList) {
487+
482488
if (flowElement instanceof SequenceFlow sequenceFlow) {
483489
FlowNode sourceNode = getFlowNodeFromScope(sequenceFlow.getSourceRef(), parentScope);
484490
if (sourceNode != null) {
@@ -498,14 +504,40 @@ protected void processFlowElements(Collection<FlowElement> flowElementList, Base
498504
boundaryEvent.setAttachedToRef(attachedActivity);
499505
attachedActivity.getBoundaryEvents().add(boundaryEvent);
500506
}
507+
promoteEventTypeExtensionToEventRegistryEventDefinition(boundaryEvent);
501508

502509
} else if (flowElement instanceof SubProcess subProcess) {
503510
Collection<FlowElement> childFlowElements = subProcess.getFlowElements();
504511
processFlowElements(childFlowElements, subProcess);
512+
} else if (flowElement instanceof Event event) {
513+
promoteEventTypeExtensionToEventRegistryEventDefinition(event);
514+
505515
}
506516
}
507517
}
508518

519+
/**
520+
* Adds a typed {@link EventRegistryEventDefinition} on event hosts that carry a legacy
521+
* {@code <flowable:eventType>X</flowable:eventType>} extension element. The extension element is left
522+
* in place so external code that reads it via {@code event.getExtensionElements()} continues to work;
523+
* the typed definition gives the engine and validators a class to dispatch on. Programmatic models that
524+
* already attach the typed definition (or carry no extension element) are skipped.
525+
*/
526+
protected void promoteEventTypeExtensionToEventRegistryEventDefinition(Event event) {
527+
if (event.getEventDefinitions().stream().anyMatch(EventRegistryEventDefinition.class::isInstance)) {
528+
return;
529+
}
530+
List<ExtensionElement> eventTypeElements = event.getExtensionElements().get(BpmnXMLConstants.ELEMENT_EVENT_TYPE);
531+
if (eventTypeElements == null || eventTypeElements.isEmpty()) {
532+
return;
533+
}
534+
String value = eventTypeElements.get(0).getElementText();
535+
if (StringUtils.isEmpty(value)) {
536+
return;
537+
}
538+
event.addEventDefinition(new EventRegistryEventDefinition(value));
539+
}
540+
509541
protected FlowNode getFlowNodeFromScope(String elementId, BaseElement scope) {
510542
FlowNode flowNode = null;
511543
if (StringUtils.isNotEmpty(elementId)) {

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/CatchEventXMLConverter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,7 @@ protected void writeAdditionalAttributes(BaseElement element, BpmnModel model, X
7272
@Override
7373
protected boolean writeExtensionChildElements(BaseElement element, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
7474
IntermediateCatchEvent catchEvent = (IntermediateCatchEvent) element;
75-
didWriteExtensionStartElement = writeVariableListenerDefinition(catchEvent, didWriteExtensionStartElement, xtw);
76-
return didWriteExtensionStartElement;
75+
return BpmnXMLUtil.writeCustomEventDefinitionExtensionElements(catchEvent, didWriteExtensionStartElement, xtw);
7776
}
7877

7978
@Override
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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.bpmn.converter;
14+
15+
import javax.xml.stream.XMLStreamWriter;
16+
17+
import org.flowable.bpmn.model.Event;
18+
import org.flowable.bpmn.model.EventDefinition;
19+
20+
/**
21+
* Hook for serializing a {@link org.flowable.bpmn.model.CustomBpmnEventDefinition} back to XML — the
22+
* write-side counterpart to {@link org.flowable.bpmn.converter.child.BaseChildElementParser} on the read
23+
* side. A custom {@link EventDefinition} requires one parser (read) and one writer (write) to round-trip
24+
* through {@code BpmnXMLConverter}. The writer is invoked inside an already-opened
25+
* {@code <extensionElements>} wrapper.
26+
*/
27+
@FunctionalInterface
28+
public interface CustomEventDefinitionXmlWriter {
29+
30+
void write(Event parentEvent, EventDefinition eventDefinition, XMLStreamWriter xtw) throws Exception;
31+
}

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/StartEventXMLConverter.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -117,8 +117,7 @@ protected void writeAdditionalAttributes(BaseElement element, BpmnModel model, X
117117
writeQualifiedAttribute(ATTRIBUTE_SAME_DEPLOYMENT, "false", xtw);
118118
}
119119

120-
if ((startEvent.getEventDefinitions() != null && startEvent.getEventDefinitions().size() > 0) ||
121-
(startEvent.getExtensionElements() != null && startEvent.getExtensionElements().containsKey(ELEMENT_EVENT_TYPE))) {
120+
if (startEvent.getEventDefinitions() != null && !startEvent.getEventDefinitions().isEmpty()) {
122121
writeDefaultAttribute(ATTRIBUTE_EVENT_START_INTERRUPTING, String.valueOf(startEvent.isInterrupting()), xtw);
123122
}
124123
}
@@ -127,7 +126,7 @@ protected void writeAdditionalAttributes(BaseElement element, BpmnModel model, X
127126
protected boolean writeExtensionChildElements(BaseElement element, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
128127
StartEvent startEvent = (StartEvent) element;
129128
didWriteExtensionStartElement = BpmnXMLUtil.writeIOParameters(ELEMENT_IN_PARAMETERS, startEvent.getInParameters(), didWriteExtensionStartElement, xtw);
130-
didWriteExtensionStartElement = writeVariableListenerDefinition(startEvent, didWriteExtensionStartElement, xtw);
129+
didWriteExtensionStartElement = BpmnXMLUtil.writeCustomEventDefinitionExtensionElements(startEvent, didWriteExtensionStartElement, xtw);
131130
didWriteExtensionStartElement = writeFormProperties(startEvent, didWriteExtensionStartElement, xtw);
132131
return didWriteExtensionStartElement;
133132
}

0 commit comments

Comments
 (0)