Skip to content

Commit 234f9d2

Browse files
authored
Save element name in extension element if it has any new lines (#3946)
1 parent 518ec3d commit 234f9d2

File tree

18 files changed

+958
-6
lines changed

18 files changed

+958
-6
lines changed

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/constants/BpmnXMLConstants.java

+1
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ public interface BpmnXMLConstants {
4141

4242
public static final String ATTRIBUTE_ID = "id";
4343
public static final String ATTRIBUTE_NAME = "name";
44+
public static final String ATTRIBUTE_ELEMENT_NAME = "element-name";
4445
public static final String ATTRIBUTE_TYPE = "type";
4546
public static final String ATTRIBUTE_EXPORTER = "exporter";
4647
public static final String ATTRIBUTE_EXPORTER_VERSION = "exporterVersion";

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

+9-2
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,9 @@ public void convertToBpmnModel(XMLStreamReader xtr, BpmnModel model, Process act
111111

112112
FlowElement currentFlowElement = (FlowElement) parsedElement;
113113
currentFlowElement.setId(elementId);
114-
currentFlowElement.setName(elementName);
114+
if (currentFlowElement.getName() == null) {
115+
currentFlowElement.setName(elementName);
116+
}
115117

116118
if (currentFlowElement instanceof FlowNode) {
117119
FlowNode flowNode = (FlowNode) currentFlowElement;
@@ -167,7 +169,10 @@ public void convertToXML(XMLStreamWriter xtw, BaseElement baseElement, BpmnModel
167169
boolean didWriteExtensionStartElement = false;
168170
writeDefaultAttribute(ATTRIBUTE_ID, baseElement.getId(), xtw);
169171
if (baseElement instanceof FlowElement) {
170-
writeDefaultAttribute(ATTRIBUTE_NAME, ((FlowElement) baseElement).getName(), xtw);
172+
String name = ((FlowElement) baseElement).getName();
173+
if (!BpmnXMLUtil.containsNewLine(name)) {
174+
writeDefaultAttribute(ATTRIBUTE_NAME, name, xtw);
175+
}
171176
}
172177

173178
if (baseElement instanceof FlowNode) {
@@ -220,6 +225,8 @@ public void convertToXML(XMLStreamWriter xtw, BaseElement baseElement, BpmnModel
220225
xtw.writeCharacters(flowElement.getDocumentation());
221226
xtw.writeEndElement();
222227
}
228+
229+
didWriteExtensionStartElement = BpmnXMLUtil.writeElementNameExtensionElement(flowElement, didWriteExtensionStartElement, xtw);
223230
}
224231

225232
didWriteExtensionStartElement = writeExtensionChildElements(baseElement, didWriteExtensionStartElement, xtw);

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

+2
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,8 @@ protected void createXML(FlowElement flowElement, BpmnModel model, XMLStreamWrit
619619

620620
boolean didWriteExtensionStartElement = FlowableListenerExport.writeListeners(subProcess, false, xtw);
621621

622+
didWriteExtensionStartElement = BpmnXMLUtil.writeElementNameExtensionElement(subProcess, didWriteExtensionStartElement, xtw);
623+
622624
didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(subProcess, didWriteExtensionStartElement, model.getNamespaces(), xtw);
623625
if (didWriteExtensionStartElement) {
624626
// closing extensions element

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

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ protected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model)
4242
BpmnXMLUtil.addXMLLocation(sequenceFlow, xtr);
4343
sequenceFlow.setSourceRef(xtr.getAttributeValue(null, ATTRIBUTE_FLOW_SOURCE_REF));
4444
sequenceFlow.setTargetRef(xtr.getAttributeValue(null, ATTRIBUTE_FLOW_TARGET_REF));
45-
sequenceFlow.setName(xtr.getAttributeValue(null, ATTRIBUTE_NAME));
4645
sequenceFlow.setSkipExpression(xtr.getAttributeValue(null, ATTRIBUTE_FLOW_SKIP_EXPRESSION));
4746

4847
parseChildElements(getXMLElementName(), sequenceFlow, model, xtr);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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.child;
14+
15+
import javax.xml.stream.XMLStreamReader;
16+
17+
import org.apache.commons.lang3.StringUtils;
18+
import org.flowable.bpmn.model.BaseElement;
19+
import org.flowable.bpmn.model.BpmnModel;
20+
import org.flowable.bpmn.model.FlowElement;
21+
22+
public class ElementNameParser extends BaseChildElementParser {
23+
24+
@Override
25+
public String getElementName() {
26+
return ATTRIBUTE_ELEMENT_NAME;
27+
}
28+
29+
@Override
30+
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
31+
String elementName = xtr.getElementText();
32+
if (StringUtils.isNotEmpty(elementName)) {
33+
if (parentElement instanceof FlowElement) {
34+
((FlowElement) parentElement).setName(elementName.trim());
35+
}
36+
}
37+
}
38+
}

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/parser/ExtensionElementsParser.java

+3
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import javax.xml.stream.XMLStreamReader;
1818

1919
import org.flowable.bpmn.constants.BpmnXMLConstants;
20+
import org.flowable.bpmn.converter.child.ElementNameParser;
2021
import org.flowable.bpmn.converter.child.ExecutionListenerParser;
2122
import org.flowable.bpmn.converter.child.FlowableEventListenerParser;
2223
import org.flowable.bpmn.converter.util.BpmnXMLUtil;
@@ -50,6 +51,8 @@ public void parse(XMLStreamReader xtr, List<SubProcess> activeSubProcessList, Pr
5051
new FlowableEventListenerParser().parseChildElement(xtr, parentElement, model);
5152
} else if (ELEMENT_POTENTIAL_STARTER.equals(xtr.getLocalName())) {
5253
new PotentialStarterParser().parse(xtr, activeProcess);
54+
} else if (ATTRIBUTE_ELEMENT_NAME.equals(xtr.getLocalName())) {
55+
new ElementNameParser().parseChildElement(xtr, parentElement, model);
5356
} else {
5457
ExtensionElement extensionElement = BpmnXMLUtil.parseExtensionElement(xtr);
5558
parentElement.addExtensionElement(extensionElement);

modules/flowable-bpmn-converter/src/main/java/org/flowable/bpmn/converter/util/BpmnXMLUtil.java

+23
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.flowable.bpmn.converter.child.DataOutputAssociationParser;
3838
import org.flowable.bpmn.converter.child.DataStateParser;
3939
import org.flowable.bpmn.converter.child.DocumentationParser;
40+
import org.flowable.bpmn.converter.child.ElementNameParser;
4041
import org.flowable.bpmn.converter.child.ErrorEventDefinitionParser;
4142
import org.flowable.bpmn.converter.child.EscalationEventDefinitionParser;
4243
import org.flowable.bpmn.converter.child.ExecutionListenerParser;
@@ -65,6 +66,7 @@
6566
import org.flowable.bpmn.model.BpmnModel;
6667
import org.flowable.bpmn.model.ExtensionAttribute;
6768
import org.flowable.bpmn.model.ExtensionElement;
69+
import org.flowable.bpmn.model.FlowElement;
6870
import org.flowable.bpmn.model.GraphicInfo;
6971
import org.flowable.bpmn.model.IOParameter;
7072

@@ -104,6 +106,7 @@ public class BpmnXMLUtil implements BpmnXMLConstants {
104106
addGenericParser(new FlowNodeRefParser());
105107
addGenericParser(new FlowableFailedjobRetryParser());
106108
addGenericParser(new FlowableMapExceptionParser());
109+
addGenericParser(new ElementNameParser());
107110
}
108111

109112
private static void addGenericParser(BaseChildElementParser parser) {
@@ -408,6 +411,22 @@ protected static void writeExtensionElement(ExtensionElement extensionElement, M
408411
xtw.writeEndElement();
409412
}
410413
}
414+
415+
public static boolean writeElementNameExtensionElement(FlowElement element, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
416+
String name = element.getName();
417+
if (BpmnXMLUtil.containsNewLine(name)) {
418+
if (!didWriteExtensionStartElement) {
419+
xtw.writeStartElement(ELEMENT_EXTENSIONS);
420+
didWriteExtensionStartElement = true;
421+
}
422+
423+
xtw.writeStartElement(FLOWABLE_EXTENSIONS_PREFIX, ATTRIBUTE_ELEMENT_NAME, FLOWABLE_EXTENSIONS_NAMESPACE);
424+
xtw.writeCharacters(element.getName());
425+
xtw.writeEndElement();
426+
}
427+
428+
return didWriteExtensionStartElement;
429+
}
411430

412431
public static boolean writeIOParameters(String elementName, List<IOParameter> parameterList, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
413432

@@ -614,4 +633,8 @@ public static void parseLabelElement(XMLStreamReader xtr, BpmnModel model, Strin
614633
}
615634
}
616635
}
636+
637+
public static boolean containsNewLine(String str) {
638+
return str != null && str.contains("\n");
639+
}
617640
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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.editor.language.xml;
14+
15+
import static org.assertj.core.api.Assertions.assertThat;
16+
import static org.flowable.bpmn.constants.BpmnXMLConstants.ATTRIBUTE_ELEMENT_NAME;
17+
18+
import org.flowable.bpmn.model.BpmnModel;
19+
import org.flowable.bpmn.model.ExtensionElement;
20+
import org.flowable.bpmn.model.FlowElement;
21+
import org.flowable.bpmn.model.SubProcess;
22+
import org.flowable.editor.language.xml.util.BpmnXmlConverterTest;
23+
24+
class NameWithNewLineTest {
25+
26+
@BpmnXmlConverterTest("nameWithNewLineTestProcess.bpmn")
27+
void validateModel(BpmnModel model) {
28+
FlowElement flowElement = model.getMainProcess().getFlowElement("startnoneevent1");
29+
assertThat(flowElement.getName()).isEqualTo("start\nevent");
30+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
31+
32+
flowElement = model.getMainProcess().getFlowElement("bpmnCatchEvent_12");
33+
assertThat(flowElement.getName()).isEqualTo("intermediate\nevent");
34+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
35+
36+
flowElement = model.getMainProcess().getFlowElement("bpmnGateway_14");
37+
assertThat(flowElement.getName()).isEqualTo("gate\nway");
38+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
39+
40+
flowElement = model.getMainProcess().getFlowElement("bpmnEndEvent_3");
41+
assertThat(flowElement.getName()).isEqualTo("end\nevent");
42+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
43+
44+
SubProcess subProcess = (SubProcess) model.getMainProcess().getFlowElement("bpmnStructure_1");
45+
assertThat(subProcess.getName()).isEqualTo("sub\nprocess");
46+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
47+
48+
flowElement = subProcess.getFlowElement("bpmnTask_5");
49+
assertThat(flowElement.getName()).isEqualTo("user\ntask");
50+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
51+
52+
flowElement = subProcess.getFlowElement("bpmnBoundaryEvent_10");
53+
assertThat(flowElement.getName()).isEqualTo("boundary\nevent");
54+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
55+
}
56+
57+
@BpmnXmlConverterTest("nameWithoutNewLineTestProcess.bpmn")
58+
void validateModelWithoutNewLines(BpmnModel model) {
59+
FlowElement flowElement = model.getMainProcess().getFlowElement("startnoneevent1");
60+
assertThat(flowElement.getName()).isEqualTo("startevent");
61+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
62+
63+
flowElement = model.getMainProcess().getFlowElement("bpmnCatchEvent_12");
64+
assertThat(flowElement.getName()).isEqualTo("intermediateevent");
65+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
66+
67+
flowElement = model.getMainProcess().getFlowElement("bpmnGateway_14");
68+
assertThat(flowElement.getName()).isEqualTo("gateway");
69+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
70+
71+
flowElement = model.getMainProcess().getFlowElement("bpmnEndEvent_3");
72+
assertThat(flowElement.getName()).isEqualTo("endevent");
73+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
74+
75+
SubProcess subProcess = (SubProcess) model.getMainProcess().getFlowElement("bpmnStructure_1");
76+
assertThat(subProcess.getName()).isEqualTo("subprocess");
77+
assertThat(subProcess.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
78+
79+
flowElement = subProcess.getFlowElement("bpmnTask_5");
80+
assertThat(flowElement.getName()).isEqualTo("usertask");
81+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
82+
83+
flowElement = subProcess.getFlowElement("bpmnBoundaryEvent_10");
84+
assertThat(flowElement.getName()).isEqualTo("boundaryevent");
85+
assertThat(flowElement.getExtensionElements().get(ATTRIBUTE_ELEMENT_NAME)).isNull();
86+
}
87+
}

0 commit comments

Comments
 (0)