提交 ee2f460c 编写于 作者: T tijsrademakers

Fix for extension elements for process, sub process, lanes, pools etc

上级 1a89621e
...@@ -21,23 +21,6 @@ import javax.xml.stream.XMLStreamWriter; ...@@ -21,23 +21,6 @@ import javax.xml.stream.XMLStreamWriter;
import org.activiti.bpmn.constants.BpmnXMLConstants; import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.converter.child.BaseChildElementParser; import org.activiti.bpmn.converter.child.BaseChildElementParser;
import org.activiti.bpmn.converter.child.CancelEventDefinitionParser;
import org.activiti.bpmn.converter.child.CompensateEventDefinitionParser;
import org.activiti.bpmn.converter.child.ConditionExpressionParser;
import org.activiti.bpmn.converter.child.DataInputAssociationParser;
import org.activiti.bpmn.converter.child.DataOutputAssociationParser;
import org.activiti.bpmn.converter.child.DocumentationParser;
import org.activiti.bpmn.converter.child.ErrorEventDefinitionParser;
import org.activiti.bpmn.converter.child.ExecutionListenerParser;
import org.activiti.bpmn.converter.child.FieldExtensionParser;
import org.activiti.bpmn.converter.child.FormPropertyParser;
import org.activiti.bpmn.converter.child.IOSpecificationParser;
import org.activiti.bpmn.converter.child.MessageEventDefinitionParser;
import org.activiti.bpmn.converter.child.MultiInstanceParser;
import org.activiti.bpmn.converter.child.SignalEventDefinitionParser;
import org.activiti.bpmn.converter.child.TaskListenerParser;
import org.activiti.bpmn.converter.child.TerminateEventDefinitionParser;
import org.activiti.bpmn.converter.child.TimerEventDefinitionParser;
import org.activiti.bpmn.converter.export.ActivitiListenerExport; import org.activiti.bpmn.converter.export.ActivitiListenerExport;
import org.activiti.bpmn.converter.export.MultiInstanceExport; import org.activiti.bpmn.converter.export.MultiInstanceExport;
import org.activiti.bpmn.converter.util.BpmnXMLUtil; import org.activiti.bpmn.converter.util.BpmnXMLUtil;
...@@ -47,8 +30,6 @@ import org.activiti.bpmn.model.BaseElement; ...@@ -47,8 +30,6 @@ import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ErrorEventDefinition; import org.activiti.bpmn.model.ErrorEventDefinition;
import org.activiti.bpmn.model.EventDefinition; import org.activiti.bpmn.model.EventDefinition;
import org.activiti.bpmn.model.ExtensionAttribute;
import org.activiti.bpmn.model.ExtensionElement;
import org.activiti.bpmn.model.FlowElement; import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.FormProperty; import org.activiti.bpmn.model.FormProperty;
import org.activiti.bpmn.model.FormValue; import org.activiti.bpmn.model.FormValue;
...@@ -75,34 +56,9 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -75,34 +56,9 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
protected BpmnModel model; protected BpmnModel model;
protected Process activeProcess; protected Process activeProcess;
protected Map<String, BaseChildElementParser> childElementParsers = new HashMap<String, BaseChildElementParser>(); protected Map<String, BaseChildElementParser> childElementParsers = new HashMap<String, BaseChildElementParser>();
private static Map<String, BaseChildElementParser> genericChildParserMap = new HashMap<String, BaseChildElementParser>();
protected boolean didWriteExtensionStartElement = false; protected boolean didWriteExtensionStartElement = false;
static {
addGenericParser(new CancelEventDefinitionParser());
addGenericParser(new CompensateEventDefinitionParser());
addGenericParser(new ConditionExpressionParser());
addGenericParser(new DataInputAssociationParser());
addGenericParser(new DataOutputAssociationParser());
addGenericParser(new DocumentationParser());
addGenericParser(new ErrorEventDefinitionParser());
addGenericParser(new ExecutionListenerParser());
addGenericParser(new FieldExtensionParser());
addGenericParser(new FormPropertyParser());
addGenericParser(new IOSpecificationParser());
addGenericParser(new MessageEventDefinitionParser());
addGenericParser(new MultiInstanceParser());
addGenericParser(new SignalEventDefinitionParser());
addGenericParser(new TaskListenerParser());
addGenericParser(new TerminateEventDefinitionParser());
addGenericParser(new TimerEventDefinitionParser());
}
private static void addGenericParser(BaseChildElementParser parser) {
genericChildParserMap.put(parser.getElementName(), parser);
}
public void convertToBpmnModel(XMLStreamReader xtr, BpmnModel model, Process activeProcess, public void convertToBpmnModel(XMLStreamReader xtr, BpmnModel model, Process activeProcess,
List<SubProcess> activeSubProcessList) throws Exception { List<SubProcess> activeSubProcessList) throws Exception {
...@@ -203,19 +159,7 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -203,19 +159,7 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
writeExtensionChildElements(baseElement, xtw); writeExtensionChildElements(baseElement, xtw);
didWriteExtensionStartElement = writeListeners(baseElement, xtw); didWriteExtensionStartElement = writeListeners(baseElement, xtw);
didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(baseElement, didWriteExtensionStartElement, xtw);
if (baseElement.getExtensionElements().size() > 0) {
if (didWriteExtensionStartElement == false) {
xtw.writeStartElement(ELEMENT_EXTENSIONS);
didWriteExtensionStartElement = true;
}
Map<String, String> namespaceMap = new HashMap<String, String>();
for (List<ExtensionElement> extensionElements : baseElement.getExtensionElements().values()) {
for (ExtensionElement extensionElement : extensionElements) {
writeExtensionElement(extensionElement, namespaceMap, xtw);
}
}
}
if (didWriteExtensionStartElement) { if (didWriteExtensionStartElement) {
xtw.writeEndElement(); xtw.writeEndElement();
...@@ -245,71 +189,10 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -245,71 +189,10 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
protected void parseChildElements(String elementName, BaseElement parentElement, XMLStreamReader xtr) throws Exception { protected void parseChildElements(String elementName, BaseElement parentElement, XMLStreamReader xtr) throws Exception {
Map<String, BaseChildElementParser> childParsers = new HashMap<String, BaseChildElementParser>(); Map<String, BaseChildElementParser> childParsers = new HashMap<String, BaseChildElementParser>();
childParsers.putAll(genericChildParserMap);
if (childElementParsers != null) { if (childElementParsers != null) {
childParsers.putAll(childElementParsers); childParsers.putAll(childElementParsers);
} }
BpmnXMLUtil.parseChildElements(elementName, parentElement, xtr, childParsers, model);
boolean inExtensionElements = false;
boolean readyWithChildElements = false;
while (readyWithChildElements == false && xtr.hasNext()) {
xtr.next();
if (xtr.isStartElement()) {
if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {
inExtensionElements = true;
} else if (childParsers.containsKey(xtr.getLocalName())) {
childParsers.get(xtr.getLocalName()).parseChildElement(xtr, parentElement, model);
} else if (inExtensionElements) {
ExtensionElement extensionElement = parseExtensionElement(xtr);
parentElement.addExtensionElement(extensionElement);
}
} else if (xtr.isEndElement()) {
if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {
inExtensionElements = false;
} else if (elementName.equalsIgnoreCase(xtr.getLocalName())) {
readyWithChildElements = true;
}
}
}
}
protected ExtensionElement parseExtensionElement(XMLStreamReader xtr) throws Exception {
ExtensionElement extensionElement = new ExtensionElement();
extensionElement.setName(xtr.getLocalName());
if (StringUtils.isNotEmpty(xtr.getNamespaceURI())) {
extensionElement.setNamespace(xtr.getNamespaceURI());
}
if (StringUtils.isNotEmpty(xtr.getPrefix())) {
extensionElement.setNamespacePrefix(xtr.getPrefix());
}
for (int i = 0; i < xtr.getAttributeCount(); i++) {
ExtensionAttribute extensionAttribute = new ExtensionAttribute();
extensionAttribute.setName(xtr.getAttributeLocalName(i));
extensionAttribute.setValue(xtr.getAttributeValue(i));
extensionAttribute.setNamespace(xtr.getAttributeNamespace(i));
if (StringUtils.isNotEmpty(xtr.getAttributePrefix(i))) {
extensionAttribute.setNamespacePrefix(xtr.getAttributePrefix(i));
}
extensionElement.addAttribute(extensionAttribute);
}
boolean readyWithExtensionElement = false;
while (readyWithExtensionElement == false && xtr.hasNext()) {
xtr.next();
if (xtr.isCharacters()) {
if (StringUtils.isNotEmpty(xtr.getText().trim())) {
extensionElement.setElementText(xtr.getText().trim());
}
} else if (xtr.isStartElement()) {
ExtensionElement childExtensionElement = parseExtensionElement(xtr);
extensionElement.addChildElement(childExtensionElement);
} else if (xtr.isEndElement() && extensionElement.getName().equalsIgnoreCase(xtr.getLocalName())) {
readyWithExtensionElement = true;
}
}
return extensionElement;
} }
protected boolean parseAsync(XMLStreamReader xtr) { protected boolean parseAsync(XMLStreamReader xtr) {
...@@ -353,69 +236,6 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -353,69 +236,6 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
// To XML converter convenience methods // To XML converter convenience methods
protected void writeExtensionElement(ExtensionElement extensionElement, Map<String, String> namespaceMap, XMLStreamWriter xtw) throws Exception {
if (StringUtils.isNotEmpty(extensionElement.getName())) {
Map<String, String> localNamespaceMap = new HashMap<String, String>();
if (StringUtils.isNotEmpty(extensionElement.getNamespace())) {
if (StringUtils.isNotEmpty(extensionElement.getNamespacePrefix())) {
xtw.writeStartElement(extensionElement.getNamespacePrefix(), extensionElement.getName(), extensionElement.getNamespace());
if (namespaceMap.containsKey(extensionElement.getNamespacePrefix()) == false ||
namespaceMap.get(extensionElement.getNamespacePrefix()).equals(extensionElement.getNamespace()) == false) {
xtw.writeNamespace(extensionElement.getNamespacePrefix(), extensionElement.getNamespace());
namespaceMap.put(extensionElement.getNamespacePrefix(), extensionElement.getNamespace());
localNamespaceMap.put(extensionElement.getNamespacePrefix(), extensionElement.getNamespace());
}
} else {
xtw.writeStartElement(extensionElement.getNamespace(), extensionElement.getName());
}
} else {
xtw.writeStartElement(extensionElement.getName());
}
for (List<ExtensionAttribute> attributes : extensionElement.getAttributes().values()) {
for (ExtensionAttribute attribute : attributes) {
if (StringUtils.isNotEmpty(attribute.getName()) && attribute.getValue() != null) {
if (StringUtils.isNotEmpty(attribute.getNamespace())) {
if (StringUtils.isNotEmpty(attribute.getNamespacePrefix())) {
if (namespaceMap.containsKey(attribute.getNamespacePrefix()) == false ||
namespaceMap.get(attribute.getNamespacePrefix()).equals(attribute.getNamespace()) == false) {
xtw.writeNamespace(attribute.getNamespacePrefix(), attribute.getNamespace());
namespaceMap.put(attribute.getNamespacePrefix(), attribute.getNamespace());
}
xtw.writeAttribute(attribute.getNamespacePrefix(), attribute.getNamespace(), attribute.getName(), attribute.getValue());
} else {
xtw.writeAttribute(attribute.getNamespace(), attribute.getName(), attribute.getValue());
}
} else {
xtw.writeAttribute(attribute.getName(), attribute.getValue());
}
}
}
}
if (extensionElement.getElementText() != null) {
xtw.writeCharacters(extensionElement.getElementText());
} else {
for (List<ExtensionElement> childElements : extensionElement.getChildElements().values()) {
for (ExtensionElement childElement : childElements) {
writeExtensionElement(childElement, namespaceMap, xtw);
}
}
}
for (String prefix : localNamespaceMap.keySet()) {
namespaceMap.remove(prefix);
}
xtw.writeEndElement();
}
}
protected String convertToDelimitedString(List<String> stringList) { protected String convertToDelimitedString(List<String> stringList) {
return BpmnXMLUtil.convertToDelimitedString(stringList); return BpmnXMLUtil.convertToDelimitedString(stringList);
} }
...@@ -496,7 +316,10 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -496,7 +316,10 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
protected void writeTimerDefinition(TimerEventDefinition timerDefinition, XMLStreamWriter xtw) throws Exception { protected void writeTimerDefinition(TimerEventDefinition timerDefinition, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ELEMENT_EVENT_TIMERDEFINITION); xtw.writeStartElement(ELEMENT_EVENT_TIMERDEFINITION);
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(timerDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
if (StringUtils.isNotEmpty(timerDefinition.getTimeDate())) { if (StringUtils.isNotEmpty(timerDefinition.getTimeDate())) {
xtw.writeStartElement(ATTRIBUTE_TIMER_DATE); xtw.writeStartElement(ATTRIBUTE_TIMER_DATE);
xtw.writeCharacters(timerDefinition.getTimeDate()); xtw.writeCharacters(timerDefinition.getTimeDate());
...@@ -518,7 +341,11 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -518,7 +341,11 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
protected void writeSignalDefinition(SignalEventDefinition signalDefinition, XMLStreamWriter xtw) throws Exception { protected void writeSignalDefinition(SignalEventDefinition signalDefinition, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ELEMENT_EVENT_SIGNALDEFINITION); xtw.writeStartElement(ELEMENT_EVENT_SIGNALDEFINITION);
writeDefaultAttribute(ATTRIBUTE_SIGNAL_REF, signalDefinition.getSignalRef(), xtw); writeDefaultAttribute(ATTRIBUTE_SIGNAL_REF, signalDefinition.getSignalRef(), xtw);
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(signalDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
xtw.writeEndElement(); xtw.writeEndElement();
} }
...@@ -541,18 +368,30 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants { ...@@ -541,18 +368,30 @@ public abstract class BaseBpmnXMLConverter implements BpmnXMLConstants {
} }
} }
} }
writeDefaultAttribute(ATTRIBUTE_MESSAGE_REF, messageRef, xtw); writeDefaultAttribute(ATTRIBUTE_MESSAGE_REF, messageRef, xtw);
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(messageDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
xtw.writeEndElement(); xtw.writeEndElement();
} }
protected void writeErrorDefinition(ErrorEventDefinition errorDefinition, XMLStreamWriter xtw) throws Exception { protected void writeErrorDefinition(ErrorEventDefinition errorDefinition, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ELEMENT_EVENT_ERRORDEFINITION); xtw.writeStartElement(ELEMENT_EVENT_ERRORDEFINITION);
writeDefaultAttribute(ATTRIBUTE_ERROR_REF, errorDefinition.getErrorCode(), xtw); writeDefaultAttribute(ATTRIBUTE_ERROR_REF, errorDefinition.getErrorCode(), xtw);
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(errorDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
xtw.writeEndElement(); xtw.writeEndElement();
} }
protected void writeTerminateDefinition(TerminateEventDefinition terminateDefinition, XMLStreamWriter xtw) throws Exception { protected void writeTerminateDefinition(TerminateEventDefinition terminateDefinition, XMLStreamWriter xtw) throws Exception {
xtw.writeStartElement(ELEMENT_EVENT_TERMINATEDEFINITION); xtw.writeStartElement(ELEMENT_EVENT_TERMINATEDEFINITION);
boolean didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(terminateDefinition, false, xtw);
if (didWriteExtensionStartElement) {
xtw.writeEndElement();
}
xtw.writeEndElement(); xtw.writeEndElement();
} }
......
...@@ -39,7 +39,6 @@ import org.activiti.bpmn.constants.BpmnXMLConstants; ...@@ -39,7 +39,6 @@ import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.converter.alfresco.AlfrescoStartEventXMLConverter; import org.activiti.bpmn.converter.alfresco.AlfrescoStartEventXMLConverter;
import org.activiti.bpmn.converter.alfresco.AlfrescoUserTaskXMLConverter; import org.activiti.bpmn.converter.alfresco.AlfrescoUserTaskXMLConverter;
import org.activiti.bpmn.converter.child.DocumentationParser; import org.activiti.bpmn.converter.child.DocumentationParser;
import org.activiti.bpmn.converter.child.ExecutionListenerParser;
import org.activiti.bpmn.converter.child.IOSpecificationParser; import org.activiti.bpmn.converter.child.IOSpecificationParser;
import org.activiti.bpmn.converter.child.MultiInstanceParser; import org.activiti.bpmn.converter.child.MultiInstanceParser;
import org.activiti.bpmn.converter.export.ActivitiListenerExport; import org.activiti.bpmn.converter.export.ActivitiListenerExport;
...@@ -51,6 +50,7 @@ import org.activiti.bpmn.converter.export.ProcessExport; ...@@ -51,6 +50,7 @@ import org.activiti.bpmn.converter.export.ProcessExport;
import org.activiti.bpmn.converter.export.SignalAndMessageDefinitionExport; import org.activiti.bpmn.converter.export.SignalAndMessageDefinitionExport;
import org.activiti.bpmn.converter.parser.BpmnEdgeParser; import org.activiti.bpmn.converter.parser.BpmnEdgeParser;
import org.activiti.bpmn.converter.parser.BpmnShapeParser; import org.activiti.bpmn.converter.parser.BpmnShapeParser;
import org.activiti.bpmn.converter.parser.ExtensionElementsParser;
import org.activiti.bpmn.converter.parser.ImportParser; import org.activiti.bpmn.converter.parser.ImportParser;
import org.activiti.bpmn.converter.parser.InterfaceParser; import org.activiti.bpmn.converter.parser.InterfaceParser;
import org.activiti.bpmn.converter.parser.ItemDefinitionParser; import org.activiti.bpmn.converter.parser.ItemDefinitionParser;
...@@ -60,6 +60,7 @@ import org.activiti.bpmn.converter.parser.PotentialStarterParser; ...@@ -60,6 +60,7 @@ import org.activiti.bpmn.converter.parser.PotentialStarterParser;
import org.activiti.bpmn.converter.parser.ProcessParser; import org.activiti.bpmn.converter.parser.ProcessParser;
import org.activiti.bpmn.converter.parser.SignalParser; import org.activiti.bpmn.converter.parser.SignalParser;
import org.activiti.bpmn.converter.parser.SubProcessParser; import org.activiti.bpmn.converter.parser.SubProcessParser;
import org.activiti.bpmn.converter.util.BpmnXMLUtil;
import org.activiti.bpmn.converter.util.InputStreamProvider; import org.activiti.bpmn.converter.util.InputStreamProvider;
import org.activiti.bpmn.exceptions.XMLException; import org.activiti.bpmn.exceptions.XMLException;
import org.activiti.bpmn.model.Activity; import org.activiti.bpmn.model.Activity;
...@@ -313,6 +314,7 @@ public class BpmnXMLConverter implements BpmnXMLConstants { ...@@ -313,6 +314,7 @@ public class BpmnXMLConverter implements BpmnXMLConstants {
pool.setId(xtr.getAttributeValue(null, ATTRIBUTE_ID)); pool.setId(xtr.getAttributeValue(null, ATTRIBUTE_ID));
pool.setName(xtr.getAttributeValue(null, ATTRIBUTE_NAME)); pool.setName(xtr.getAttributeValue(null, ATTRIBUTE_NAME));
pool.setProcessRef(xtr.getAttributeValue(null, ATTRIBUTE_PROCESS_REF)); pool.setProcessRef(xtr.getAttributeValue(null, ATTRIBUTE_PROCESS_REF));
BpmnXMLUtil.parseChildElements(ELEMENT_PARTICIPANT, pool, xtr, model);
model.getPools().add(pool); model.getPools().add(pool);
} }
...@@ -327,7 +329,7 @@ public class BpmnXMLConverter implements BpmnXMLConstants { ...@@ -327,7 +329,7 @@ public class BpmnXMLConverter implements BpmnXMLConstants {
new PotentialStarterParser().parse(xtr, activeProcess); new PotentialStarterParser().parse(xtr, activeProcess);
} else if (ELEMENT_LANE.equals(xtr.getLocalName())) { } else if (ELEMENT_LANE.equals(xtr.getLocalName())) {
new LaneParser().parse(xtr, activeProcess); new LaneParser().parse(xtr, activeProcess, model);
} else if (ELEMENT_DOCUMENTATION.equals(xtr.getLocalName())) { } else if (ELEMENT_DOCUMENTATION.equals(xtr.getLocalName())) {
...@@ -339,32 +341,24 @@ public class BpmnXMLConverter implements BpmnXMLConstants { ...@@ -339,32 +341,24 @@ public class BpmnXMLConverter implements BpmnXMLConstants {
} }
new DocumentationParser().parseChildElement(xtr, parentElement, model); new DocumentationParser().parseChildElement(xtr, parentElement, model);
} else if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {
new ExtensionElementsParser().parse(xtr, activeSubProcessList, activeProcess, model);
} else if (ELEMENT_SUBPROCESS.equals(xtr.getLocalName())) { } else if (ELEMENT_SUBPROCESS.equals(xtr.getLocalName())) {
new SubProcessParser().parse(xtr, activeSubProcessList, activeProcess); new SubProcessParser().parse(xtr, activeSubProcessList, activeProcess);
} else if (ELEMENT_TRANSACTION.equals(xtr.getLocalName())) { } else if (ELEMENT_TRANSACTION.equals(xtr.getLocalName())) {
new SubProcessParser().parse(xtr, activeSubProcessList, activeProcess); new SubProcessParser().parse(xtr, activeSubProcessList, activeProcess);
} else if (ELEMENT_DI_SHAPE.equals(xtr.getLocalName())) { } else if (ELEMENT_DI_SHAPE.equals(xtr.getLocalName())) {
new BpmnShapeParser().parse(xtr, model); new BpmnShapeParser().parse(xtr, model);
} else if (ELEMENT_DI_EDGE.equals(xtr.getLocalName())) { } else if (ELEMENT_DI_EDGE.equals(xtr.getLocalName())) {
new BpmnEdgeParser().parse(xtr, model); new BpmnEdgeParser().parse(xtr, model);
} else if (activeSubProcessList.size() == 0 && ELEMENT_EXECUTION_LISTENER.equals(xtr.getLocalName())) {
new ExecutionListenerParser().parseChildElement(xtr, activeProcess, model);
} else { } else {
if (activeSubProcessList.size() > 0 && ELEMENT_EXECUTION_LISTENER.equalsIgnoreCase(xtr.getLocalName())) { if (activeSubProcessList.size() > 0 && ELEMENT_MULTIINSTANCE.equalsIgnoreCase(xtr.getLocalName())) {
new ExecutionListenerParser().parseChildElement(xtr, activeSubProcessList.get(activeSubProcessList.size() - 1), model);
} else if (activeSubProcessList.size() > 0 && ELEMENT_MULTIINSTANCE.equalsIgnoreCase(xtr.getLocalName())) {
new MultiInstanceParser().parseChildElement(xtr, activeSubProcessList.get(activeSubProcessList.size() - 1), model); new MultiInstanceParser().parseChildElement(xtr, activeSubProcessList.get(activeSubProcessList.size() - 1), model);
......
...@@ -40,6 +40,8 @@ public class CompensateEventDefinitionParser extends BaseChildElementParser { ...@@ -40,6 +40,8 @@ public class CompensateEventDefinitionParser extends BaseChildElementParser {
eventDefinition.setWaitForCompletion(Boolean.parseBoolean(xtr.getAttributeValue(null, ATTRIBUTE_COMPENSATE_WAITFORCOMPLETION))); eventDefinition.setWaitForCompletion(Boolean.parseBoolean(xtr.getAttributeValue(null, ATTRIBUTE_COMPENSATE_WAITFORCOMPLETION)));
} }
BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_COMPENSATEDEFINITION, eventDefinition, xtr, model);
((Event) parentElement).getEventDefinitions().add(eventDefinition); ((Event) parentElement).getEventDefinitions().add(eventDefinition);
} }
} }
...@@ -41,6 +41,8 @@ public class ErrorEventDefinitionParser extends BaseChildElementParser { ...@@ -41,6 +41,8 @@ public class ErrorEventDefinitionParser extends BaseChildElementParser {
model.addProblem("errorRef is required for an error event", xtr); model.addProblem("errorRef is required for an error event", xtr);
} }
BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_ERRORDEFINITION, eventDefinition, xtr, model);
((Event) parentElement).getEventDefinitions().add(eventDefinition); ((Event) parentElement).getEventDefinitions().add(eventDefinition);
} }
} }
/* 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.bpmn.converter.child;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Lane;
/**
* @author Tijs Rademakers
*/
public class FlowNodeRefParser extends BaseChildElementParser {
public String getElementName() {
return ATTRIBUTE_FLOWNODE_REF;
}
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
if (parentElement instanceof Lane == false) return;
Lane lane = (Lane) parentElement;
lane.getFlowReferences().add(xtr.getElementText());
}
}
...@@ -54,6 +54,9 @@ public class MessageEventDefinitionParser extends BaseChildElementParser { ...@@ -54,6 +54,9 @@ public class MessageEventDefinitionParser extends BaseChildElementParser {
model.addProblem("Invalid 'messageRef': no message with id '" + eventDefinition.getMessageRef() + "' found.", xtr); model.addProblem("Invalid 'messageRef': no message with id '" + eventDefinition.getMessageRef() + "' found.", xtr);
} }
} }
BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_MESSAGEDEFINITION, eventDefinition, xtr, model);
((Event) parentElement).getEventDefinitions().add(eventDefinition); ((Event) parentElement).getEventDefinitions().add(eventDefinition);
} }
} }
...@@ -44,6 +44,8 @@ public class SignalEventDefinitionParser extends BaseChildElementParser { ...@@ -44,6 +44,8 @@ public class SignalEventDefinitionParser extends BaseChildElementParser {
model.addProblem("signalEventDefinition does not have required property 'signalRef'", xtr); model.addProblem("signalEventDefinition does not have required property 'signalRef'", xtr);
} }
BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_SIGNALDEFINITION, eventDefinition, xtr, model);
((Event) parentElement).getEventDefinitions().add(eventDefinition); ((Event) parentElement).getEventDefinitions().add(eventDefinition);
} }
} }
...@@ -35,6 +35,9 @@ public class TerminateEventDefinitionParser extends BaseChildElementParser { ...@@ -35,6 +35,9 @@ public class TerminateEventDefinitionParser extends BaseChildElementParser {
TerminateEventDefinition eventDefinition = new TerminateEventDefinition(); TerminateEventDefinition eventDefinition = new TerminateEventDefinition();
BpmnXMLUtil.addXMLLocation(eventDefinition, xtr); BpmnXMLUtil.addXMLLocation(eventDefinition, xtr);
BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_TERMINATEDEFINITION, eventDefinition, xtr, model);
((Event) parentElement).getEventDefinitions().add(eventDefinition); ((Event) parentElement).getEventDefinitions().add(eventDefinition);
} }
} }
/* 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.bpmn.converter.child;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.TimerEventDefinition;
/**
* @author Tijs Rademakers
*/
public class TimeCycleParser extends BaseChildElementParser {
public String getElementName() {
return ATTRIBUTE_TIMER_CYCLE;
}
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
if (parentElement instanceof TimerEventDefinition == false) return;
TimerEventDefinition eventDefinition = (TimerEventDefinition) parentElement;
eventDefinition.setTimeCycle(xtr.getElementText());
}
}
/* 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.bpmn.converter.child;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.TimerEventDefinition;
/**
* @author Tijs Rademakers
*/
public class TimeDateParser extends BaseChildElementParser {
public String getElementName() {
return ATTRIBUTE_TIMER_DATE;
}
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
if (parentElement instanceof TimerEventDefinition == false) return;
TimerEventDefinition eventDefinition = (TimerEventDefinition) parentElement;
eventDefinition.setTimeDate(xtr.getElementText());
}
}
/* 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.bpmn.converter.child;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.TimerEventDefinition;
/**
* @author Tijs Rademakers
*/
public class TimeDurationParser extends BaseChildElementParser {
public String getElementName() {
return ATTRIBUTE_TIMER_DURATION;
}
public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {
if (parentElement instanceof TimerEventDefinition == false) return;
TimerEventDefinition eventDefinition = (TimerEventDefinition) parentElement;
eventDefinition.setTimeDuration(xtr.getElementText());
}
}
...@@ -34,28 +34,7 @@ public class TimerEventDefinitionParser extends BaseChildElementParser { ...@@ -34,28 +34,7 @@ public class TimerEventDefinitionParser extends BaseChildElementParser {
TimerEventDefinition eventDefinition = new TimerEventDefinition(); TimerEventDefinition eventDefinition = new TimerEventDefinition();
BpmnXMLUtil.addXMLLocation(eventDefinition, xtr); BpmnXMLUtil.addXMLLocation(eventDefinition, xtr);
try { BpmnXMLUtil.parseChildElements(ELEMENT_EVENT_TIMERDEFINITION, eventDefinition, xtr, model);
while (xtr.hasNext()) {
xtr.next();
if (xtr.isStartElement() && ATTRIBUTE_TIMER_DURATION.equalsIgnoreCase(xtr.getLocalName())) {
eventDefinition.setTimeDuration(xtr.getElementText());
break;
} else if (xtr.isStartElement() && ATTRIBUTE_TIMER_DATE.equalsIgnoreCase(xtr.getLocalName())) {
eventDefinition.setTimeDate(xtr.getElementText());
break;
} else if (xtr.isStartElement() && ATTRIBUTE_TIMER_CYCLE.equalsIgnoreCase(xtr.getLocalName())) {
eventDefinition.setTimeCycle(xtr.getElementText());
break;
} else if (xtr.isEndElement() && ELEMENT_EVENT_TIMERDEFINITION.equalsIgnoreCase(xtr.getLocalName())) {
break;
}
}
} catch (Exception e) {
LOGGER.warn("Error parsing timer event definition", e);
}
((Event) parentElement).getEventDefinitions().add(eventDefinition); ((Event) parentElement).getEventDefinitions().add(eventDefinition);
} }
......
...@@ -49,8 +49,10 @@ public class ProcessExport implements BpmnXMLConstants { ...@@ -49,8 +49,10 @@ public class ProcessExport implements BpmnXMLConstants {
xtw.writeEndElement(); xtw.writeEndElement();
} }
boolean wroteListener = ActivitiListenerExport.writeListeners(process, false, xtw); boolean didWriteExtensionStartElement = ActivitiListenerExport.writeListeners(process, false, xtw);
if (wroteListener) { didWriteExtensionStartElement = BpmnXMLUtil.writeExtensionElements(process, didWriteExtensionStartElement, xtw);
if (didWriteExtensionStartElement) {
// closing extensions element // closing extensions element
xtw.writeEndElement(); xtw.writeEndElement();
} }
......
/* 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.bpmn.converter.parser;
import java.util.List;
import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.converter.child.ExecutionListenerParser;
import org.activiti.bpmn.converter.util.BpmnXMLUtil;
import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ExtensionElement;
import org.activiti.bpmn.model.Process;
import org.activiti.bpmn.model.SubProcess;
/**
* @author Tijs Rademakers
*/
public class ExtensionElementsParser implements BpmnXMLConstants {
public void parse(XMLStreamReader xtr, List<SubProcess> activeSubProcessList, Process activeProcess, BpmnModel model) throws Exception {
BaseElement parentElement = null;
if (activeSubProcessList.size() > 0) {
parentElement = activeSubProcessList.get(activeSubProcessList.size() - 1);
} else {
parentElement = activeProcess;
}
boolean readyWithChildElements = false;
while (readyWithChildElements == false && xtr.hasNext()) {
xtr.next();
if (xtr.isStartElement()) {
if (ELEMENT_EXECUTION_LISTENER.equals(xtr.getLocalName())) {
new ExecutionListenerParser().parseChildElement(xtr, activeProcess, model);
} else {
ExtensionElement extensionElement = BpmnXMLUtil.parseExtensionElement(xtr);
parentElement.addExtensionElement(extensionElement);
}
} else if (xtr.isEndElement()) {
if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {
readyWithChildElements = true;
}
}
}
}
}
...@@ -45,6 +45,7 @@ public class ItemDefinitionParser implements BpmnXMLConstants { ...@@ -45,6 +45,7 @@ public class ItemDefinitionParser implements BpmnXMLConstants {
item.setStructureRef(structureRef); item.setStructureRef(structureRef);
item.setItemKind(xtr.getAttributeValue(null, ATTRIBUTE_ITEM_KIND)); item.setItemKind(xtr.getAttributeValue(null, ATTRIBUTE_ITEM_KIND));
BpmnXMLUtil.parseChildElements(ELEMENT_ITEM_DEFINITION, item, xtr, model);
model.addItemDefinition(itemDefinitionId, item); model.addItemDefinition(itemDefinitionId, item);
} }
} }
......
...@@ -16,6 +16,7 @@ import javax.xml.stream.XMLStreamReader; ...@@ -16,6 +16,7 @@ import javax.xml.stream.XMLStreamReader;
import org.activiti.bpmn.constants.BpmnXMLConstants; import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.converter.util.BpmnXMLUtil; import org.activiti.bpmn.converter.util.BpmnXMLUtil;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.Lane; import org.activiti.bpmn.model.Lane;
import org.activiti.bpmn.model.Process; import org.activiti.bpmn.model.Process;
...@@ -24,21 +25,13 @@ import org.activiti.bpmn.model.Process; ...@@ -24,21 +25,13 @@ import org.activiti.bpmn.model.Process;
*/ */
public class LaneParser implements BpmnXMLConstants { public class LaneParser implements BpmnXMLConstants {
public void parse(XMLStreamReader xtr, Process activeProcess) throws Exception { public void parse(XMLStreamReader xtr, Process activeProcess, BpmnModel model) throws Exception {
Lane lane = new Lane(); Lane lane = new Lane();
BpmnXMLUtil.addXMLLocation(lane, xtr); BpmnXMLUtil.addXMLLocation(lane, xtr);
lane.setId(xtr.getAttributeValue(null, ATTRIBUTE_ID)); lane.setId(xtr.getAttributeValue(null, ATTRIBUTE_ID));
lane.setName(xtr.getAttributeValue(null, ATTRIBUTE_NAME)); lane.setName(xtr.getAttributeValue(null, ATTRIBUTE_NAME));
lane.setParentProcess(activeProcess); lane.setParentProcess(activeProcess);
activeProcess.getLanes().add(lane); activeProcess.getLanes().add(lane);
BpmnXMLUtil.parseChildElements(ELEMENT_LANE, lane, xtr, model);
while (xtr.hasNext()) {
xtr.next();
if (xtr.isStartElement() && ATTRIBUTE_FLOWNODE_REF.equalsIgnoreCase(xtr.getLocalName())) {
lane.getFlowReferences().add(xtr.getElementText());
} else if(xtr.isEndElement() && ELEMENT_LANE.equalsIgnoreCase(xtr.getLocalName())) {
break;
}
}
} }
} }
...@@ -32,6 +32,7 @@ public class MessageParser implements BpmnXMLConstants { ...@@ -32,6 +32,7 @@ public class MessageParser implements BpmnXMLConstants {
String itemRef = parseItemRef(xtr.getAttributeValue(null, ATTRIBUTE_ITEM_REF), model); String itemRef = parseItemRef(xtr.getAttributeValue(null, ATTRIBUTE_ITEM_REF), model);
Message message = new Message(messageId, messageName, itemRef); Message message = new Message(messageId, messageName, itemRef);
BpmnXMLUtil.addXMLLocation(message, xtr); BpmnXMLUtil.addXMLLocation(message, xtr);
BpmnXMLUtil.parseChildElements(ELEMENT_MESSAGE, message, xtr, model);
model.addMessage(message); model.addMessage(message);
} }
} }
......
...@@ -52,6 +52,7 @@ public class SignalParser implements BpmnXMLConstants { ...@@ -52,6 +52,7 @@ public class SignalParser implements BpmnXMLConstants {
} }
BpmnXMLUtil.addXMLLocation(signal, xtr); BpmnXMLUtil.addXMLLocation(signal, xtr);
BpmnXMLUtil.parseChildElements(ELEMENT_SIGNAL, signal, xtr, model);
model.addSignal(signal); model.addSignal(signal);
} }
} }
......
...@@ -2,18 +2,75 @@ package org.activiti.bpmn.converter.util; ...@@ -2,18 +2,75 @@ package org.activiti.bpmn.converter.util;
import java.text.StringCharacterIterator; import java.text.StringCharacterIterator;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.xml.stream.Location; import javax.xml.stream.Location;
import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter; import javax.xml.stream.XMLStreamWriter;
import org.activiti.bpmn.constants.BpmnXMLConstants; import org.activiti.bpmn.constants.BpmnXMLConstants;
import org.activiti.bpmn.converter.child.BaseChildElementParser;
import org.activiti.bpmn.converter.child.CancelEventDefinitionParser;
import org.activiti.bpmn.converter.child.CompensateEventDefinitionParser;
import org.activiti.bpmn.converter.child.ConditionExpressionParser;
import org.activiti.bpmn.converter.child.DataInputAssociationParser;
import org.activiti.bpmn.converter.child.DataOutputAssociationParser;
import org.activiti.bpmn.converter.child.DocumentationParser;
import org.activiti.bpmn.converter.child.ErrorEventDefinitionParser;
import org.activiti.bpmn.converter.child.ExecutionListenerParser;
import org.activiti.bpmn.converter.child.FieldExtensionParser;
import org.activiti.bpmn.converter.child.FlowNodeRefParser;
import org.activiti.bpmn.converter.child.FormPropertyParser;
import org.activiti.bpmn.converter.child.IOSpecificationParser;
import org.activiti.bpmn.converter.child.MessageEventDefinitionParser;
import org.activiti.bpmn.converter.child.MultiInstanceParser;
import org.activiti.bpmn.converter.child.SignalEventDefinitionParser;
import org.activiti.bpmn.converter.child.TaskListenerParser;
import org.activiti.bpmn.converter.child.TerminateEventDefinitionParser;
import org.activiti.bpmn.converter.child.TimeCycleParser;
import org.activiti.bpmn.converter.child.TimeDateParser;
import org.activiti.bpmn.converter.child.TimeDurationParser;
import org.activiti.bpmn.converter.child.TimerEventDefinitionParser;
import org.activiti.bpmn.model.BaseElement; import org.activiti.bpmn.model.BaseElement;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ExtensionAttribute;
import org.activiti.bpmn.model.ExtensionElement;
import org.activiti.bpmn.model.GraphicInfo; import org.activiti.bpmn.model.GraphicInfo;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
public class BpmnXMLUtil implements BpmnXMLConstants { public class BpmnXMLUtil implements BpmnXMLConstants {
private static Map<String, BaseChildElementParser> genericChildParserMap = new HashMap<String, BaseChildElementParser>();
static {
addGenericParser(new CancelEventDefinitionParser());
addGenericParser(new CompensateEventDefinitionParser());
addGenericParser(new ConditionExpressionParser());
addGenericParser(new DataInputAssociationParser());
addGenericParser(new DataOutputAssociationParser());
addGenericParser(new DocumentationParser());
addGenericParser(new ErrorEventDefinitionParser());
addGenericParser(new ExecutionListenerParser());
addGenericParser(new FieldExtensionParser());
addGenericParser(new FormPropertyParser());
addGenericParser(new IOSpecificationParser());
addGenericParser(new MessageEventDefinitionParser());
addGenericParser(new MultiInstanceParser());
addGenericParser(new SignalEventDefinitionParser());
addGenericParser(new TaskListenerParser());
addGenericParser(new TerminateEventDefinitionParser());
addGenericParser(new TimerEventDefinitionParser());
addGenericParser(new TimeDateParser());
addGenericParser(new TimeCycleParser());
addGenericParser(new TimeDurationParser());
addGenericParser(new FlowNodeRefParser());
}
private static void addGenericParser(BaseChildElementParser parser) {
genericChildParserMap.put(parser.getElementName(), parser);
}
public static void addXMLLocation(BaseElement element, XMLStreamReader xtr) { public static void addXMLLocation(BaseElement element, XMLStreamReader xtr) {
Location location = xtr.getLocation(); Location location = xtr.getLocation();
...@@ -27,6 +84,80 @@ public class BpmnXMLUtil implements BpmnXMLConstants { ...@@ -27,6 +84,80 @@ public class BpmnXMLUtil implements BpmnXMLConstants {
graphicInfo.setXmlColumnNumber(location.getColumnNumber()); graphicInfo.setXmlColumnNumber(location.getColumnNumber());
} }
public static void parseChildElements(String elementName, BaseElement parentElement, XMLStreamReader xtr, BpmnModel model) throws Exception {
parseChildElements(elementName, parentElement, xtr, null, model);
}
public static void parseChildElements(String elementName, BaseElement parentElement, XMLStreamReader xtr,
Map<String, BaseChildElementParser> childParsers, BpmnModel model) throws Exception {
if (childParsers == null) {
childParsers = new HashMap<String, BaseChildElementParser>();
}
childParsers.putAll(genericChildParserMap);
boolean inExtensionElements = false;
boolean readyWithChildElements = false;
while (readyWithChildElements == false && xtr.hasNext()) {
xtr.next();
if (xtr.isStartElement()) {
if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {
inExtensionElements = true;
} else if (childParsers.containsKey(xtr.getLocalName())) {
childParsers.get(xtr.getLocalName()).parseChildElement(xtr, parentElement, model);
} else if (inExtensionElements) {
ExtensionElement extensionElement = BpmnXMLUtil.parseExtensionElement(xtr);
parentElement.addExtensionElement(extensionElement);
}
} else if (xtr.isEndElement()) {
if (ELEMENT_EXTENSIONS.equals(xtr.getLocalName())) {
inExtensionElements = false;
} else if (elementName.equalsIgnoreCase(xtr.getLocalName())) {
readyWithChildElements = true;
}
}
}
}
public static ExtensionElement parseExtensionElement(XMLStreamReader xtr) throws Exception {
ExtensionElement extensionElement = new ExtensionElement();
extensionElement.setName(xtr.getLocalName());
if (StringUtils.isNotEmpty(xtr.getNamespaceURI())) {
extensionElement.setNamespace(xtr.getNamespaceURI());
}
if (StringUtils.isNotEmpty(xtr.getPrefix())) {
extensionElement.setNamespacePrefix(xtr.getPrefix());
}
for (int i = 0; i < xtr.getAttributeCount(); i++) {
ExtensionAttribute extensionAttribute = new ExtensionAttribute();
extensionAttribute.setName(xtr.getAttributeLocalName(i));
extensionAttribute.setValue(xtr.getAttributeValue(i));
extensionAttribute.setNamespace(xtr.getAttributeNamespace(i));
if (StringUtils.isNotEmpty(xtr.getAttributePrefix(i))) {
extensionAttribute.setNamespacePrefix(xtr.getAttributePrefix(i));
}
extensionElement.addAttribute(extensionAttribute);
}
boolean readyWithExtensionElement = false;
while (readyWithExtensionElement == false && xtr.hasNext()) {
xtr.next();
if (xtr.isCharacters()) {
if (StringUtils.isNotEmpty(xtr.getText().trim())) {
extensionElement.setElementText(xtr.getText().trim());
}
} else if (xtr.isStartElement()) {
ExtensionElement childExtensionElement = parseExtensionElement(xtr);
extensionElement.addChildElement(childExtensionElement);
} else if (xtr.isEndElement() && extensionElement.getName().equalsIgnoreCase(xtr.getLocalName())) {
readyWithExtensionElement = true;
}
}
return extensionElement;
}
public static void writeDefaultAttribute(String attributeName, String value, XMLStreamWriter xtw) throws Exception { public static void writeDefaultAttribute(String attributeName, String value, XMLStreamWriter xtw) throws Exception {
if (StringUtils.isNotEmpty(value) && "null".equalsIgnoreCase(value) == false) { if (StringUtils.isNotEmpty(value) && "null".equalsIgnoreCase(value) == false) {
xtw.writeAttribute(attributeName, value); xtw.writeAttribute(attributeName, value);
...@@ -39,6 +170,85 @@ public class BpmnXMLUtil implements BpmnXMLConstants { ...@@ -39,6 +170,85 @@ public class BpmnXMLUtil implements BpmnXMLConstants {
} }
} }
public static boolean writeExtensionElements(BaseElement baseElement, boolean didWriteExtensionStartElement, XMLStreamWriter xtw) throws Exception {
if (baseElement.getExtensionElements().size() > 0) {
if (didWriteExtensionStartElement == false) {
xtw.writeStartElement(ELEMENT_EXTENSIONS);
didWriteExtensionStartElement = true;
}
Map<String, String> namespaceMap = new HashMap<String, String>();
for (List<ExtensionElement> extensionElements : baseElement.getExtensionElements().values()) {
for (ExtensionElement extensionElement : extensionElements) {
writeExtensionElement(extensionElement, namespaceMap, xtw);
}
}
}
return didWriteExtensionStartElement;
}
protected static void writeExtensionElement(ExtensionElement extensionElement, Map<String, String> namespaceMap, XMLStreamWriter xtw) throws Exception {
if (StringUtils.isNotEmpty(extensionElement.getName())) {
Map<String, String> localNamespaceMap = new HashMap<String, String>();
if (StringUtils.isNotEmpty(extensionElement.getNamespace())) {
if (StringUtils.isNotEmpty(extensionElement.getNamespacePrefix())) {
xtw.writeStartElement(extensionElement.getNamespacePrefix(), extensionElement.getName(), extensionElement.getNamespace());
if (namespaceMap.containsKey(extensionElement.getNamespacePrefix()) == false ||
namespaceMap.get(extensionElement.getNamespacePrefix()).equals(extensionElement.getNamespace()) == false) {
xtw.writeNamespace(extensionElement.getNamespacePrefix(), extensionElement.getNamespace());
namespaceMap.put(extensionElement.getNamespacePrefix(), extensionElement.getNamespace());
localNamespaceMap.put(extensionElement.getNamespacePrefix(), extensionElement.getNamespace());
}
} else {
xtw.writeStartElement(extensionElement.getNamespace(), extensionElement.getName());
}
} else {
xtw.writeStartElement(extensionElement.getName());
}
for (List<ExtensionAttribute> attributes : extensionElement.getAttributes().values()) {
for (ExtensionAttribute attribute : attributes) {
if (StringUtils.isNotEmpty(attribute.getName()) && attribute.getValue() != null) {
if (StringUtils.isNotEmpty(attribute.getNamespace())) {
if (StringUtils.isNotEmpty(attribute.getNamespacePrefix())) {
if (namespaceMap.containsKey(attribute.getNamespacePrefix()) == false ||
namespaceMap.get(attribute.getNamespacePrefix()).equals(attribute.getNamespace()) == false) {
xtw.writeNamespace(attribute.getNamespacePrefix(), attribute.getNamespace());
namespaceMap.put(attribute.getNamespacePrefix(), attribute.getNamespace());
}
xtw.writeAttribute(attribute.getNamespacePrefix(), attribute.getNamespace(), attribute.getName(), attribute.getValue());
} else {
xtw.writeAttribute(attribute.getNamespace(), attribute.getName(), attribute.getValue());
}
} else {
xtw.writeAttribute(attribute.getName(), attribute.getValue());
}
}
}
}
if (extensionElement.getElementText() != null) {
xtw.writeCharacters(extensionElement.getElementText());
} else {
for (List<ExtensionElement> childElements : extensionElement.getChildElements().values()) {
for (ExtensionElement childElement : childElements) {
writeExtensionElement(childElement, namespaceMap, xtw);
}
}
}
for (String prefix : localNamespaceMap.keySet()) {
namespaceMap.remove(prefix);
}
xtw.writeEndElement();
}
}
public static List<String> parseDelimitedList(String s) { public static List<String> parseDelimitedList(String s) {
List<String> result = new ArrayList<String>(); List<String> result = new ArrayList<String>();
if (StringUtils.isNotEmpty(s)) { if (StringUtils.isNotEmpty(s)) {
......
...@@ -9,6 +9,7 @@ import java.util.List; ...@@ -9,6 +9,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import org.activiti.bpmn.model.ActivitiListener; import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BoundaryEvent;
import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.ExtensionAttribute; import org.activiti.bpmn.model.ExtensionAttribute;
import org.activiti.bpmn.model.ExtensionElement; import org.activiti.bpmn.model.ExtensionElement;
...@@ -16,12 +17,13 @@ import org.activiti.bpmn.model.FieldExtension; ...@@ -16,12 +17,13 @@ import org.activiti.bpmn.model.FieldExtension;
import org.activiti.bpmn.model.FlowElement; import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.ImplementationType; import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.ServiceTask; import org.activiti.bpmn.model.ServiceTask;
import org.activiti.bpmn.model.TimerEventDefinition;
import org.junit.Test; import org.junit.Test;
public class CustomExtensionsConverterTest extends AbstractConverterTest { public class CustomExtensionsConverterTest extends AbstractConverterTest {
@Test @Test
public void connvertXMLToModel() throws Exception { public void convertXMLToModel() throws Exception {
BpmnModel bpmnModel = readXMLFile(); BpmnModel bpmnModel = readXMLFile();
validateModel(bpmnModel); validateModel(bpmnModel);
} }
...@@ -39,6 +41,11 @@ public class CustomExtensionsConverterTest extends AbstractConverterTest { ...@@ -39,6 +41,11 @@ public class CustomExtensionsConverterTest extends AbstractConverterTest {
} }
private void validateModel(BpmnModel model) { private void validateModel(BpmnModel model) {
List<ActivitiListener> listeners = model.getMainProcess().getExecutionListeners();
validateExecutionListeners(listeners);
Map<String, List<ExtensionElement>> extensionElementMap = model.getMainProcess().getExtensionElements();
validateExtensionElements(extensionElementMap);
FlowElement flowElement = model.getMainProcess().getFlowElement("servicetask"); FlowElement flowElement = model.getMainProcess().getFlowElement("servicetask");
assertNotNull(flowElement); assertNotNull(flowElement);
assertTrue(flowElement instanceof ServiceTask); assertTrue(flowElement instanceof ServiceTask);
...@@ -56,7 +63,22 @@ public class CustomExtensionsConverterTest extends AbstractConverterTest { ...@@ -56,7 +63,22 @@ public class CustomExtensionsConverterTest extends AbstractConverterTest {
assertEquals("testField2", field.getFieldName()); assertEquals("testField2", field.getFieldName());
assertEquals("${test}", field.getExpression()); assertEquals("${test}", field.getExpression());
List<ActivitiListener> listeners = serviceTask.getExecutionListeners(); listeners = serviceTask.getExecutionListeners();
validateExecutionListeners(listeners);
extensionElementMap = serviceTask.getExtensionElements();
validateExtensionElements(extensionElementMap);
assertEquals(1, serviceTask.getBoundaryEvents().size());
BoundaryEvent boundaryEvent = serviceTask.getBoundaryEvents().get(0);
assertEquals("timerEvent", boundaryEvent.getId());
assertEquals(1, boundaryEvent.getEventDefinitions().size());
assertTrue(boundaryEvent.getEventDefinitions().get(0) instanceof TimerEventDefinition);
extensionElementMap = boundaryEvent.getEventDefinitions().get(0).getExtensionElements();
validateExtensionElements(extensionElementMap);
}
protected void validateExecutionListeners(List<ActivitiListener> listeners) {
assertEquals(3, listeners.size()); assertEquals(3, listeners.size());
ActivitiListener listener = (ActivitiListener) listeners.get(0); ActivitiListener listener = (ActivitiListener) listeners.get(0);
assertTrue(ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(listener.getImplementationType())); assertTrue(ImplementationType.IMPLEMENTATION_TYPE_CLASS.equals(listener.getImplementationType()));
...@@ -70,8 +92,9 @@ public class CustomExtensionsConverterTest extends AbstractConverterTest { ...@@ -70,8 +92,9 @@ public class CustomExtensionsConverterTest extends AbstractConverterTest {
assertTrue(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(listener.getImplementationType())); assertTrue(ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION.equals(listener.getImplementationType()));
assertEquals("${delegateExpression}", listener.getImplementation()); assertEquals("${delegateExpression}", listener.getImplementation());
assertEquals("start", listener.getEvent()); assertEquals("start", listener.getEvent());
}
Map<String, List<ExtensionElement>> extensionElementMap = serviceTask.getExtensionElements();
protected void validateExtensionElements(Map<String, List<ExtensionElement>> extensionElementMap ) {
assertEquals(1, extensionElementMap.size()); assertEquals(1, extensionElementMap.size());
List<ExtensionElement> extensionElements = extensionElementMap.get("test"); List<ExtensionElement> extensionElements = extensionElementMap.get("test");
......
...@@ -33,6 +33,5 @@ public class InCompleteSignalConverterTest extends AbstractConverterTest { ...@@ -33,6 +33,5 @@ public class InCompleteSignalConverterTest extends AbstractConverterTest {
List<Problem> problems = model.getProblems(); List<Problem> problems = model.getProblems();
assertNotNull(problems); assertNotNull(problems);
assertEquals(1, problems.size()); assertEquals(1, problems.size());
System.out.println(problems.get(0));
} }
} }
...@@ -4,6 +4,19 @@ ...@@ -4,6 +4,19 @@
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath"
targetNamespace="http://www.activiti.org/test"> targetNamespace="http://www.activiti.org/test">
<process id="process" name="process1" isExecutable="true"> <process id="process" name="process1" isExecutable="true">
<extensionElements>
<activiti:executionListener event="start" class="org.test.TestClass"></activiti:executionListener>
<activiti:executionListener event="end" expression="${testExpression}"></activiti:executionListener>
<activiti:executionListener event="start" delegateExpression="${delegateExpression}"></activiti:executionListener>
<custom:test xmlns:custom="http://custom.org/bpmn" id="test" name="test">
<custom:name>
<custom:test>test</custom:test>
</custom:name>
<custom:name id="customName" />
<custom:description xmlns:custom2="http://custom2.org/bpmn" custom2:id="test" />
</custom:test>
<custom:test xmlns:custom="http://custom.org/bpmn" id="test2" name="test2" />
</extensionElements>
<endEvent id="sid-F7795B38-72CD-41A4-9549-6CFB7D3E5FB5"></endEvent> <endEvent id="sid-F7795B38-72CD-41A4-9549-6CFB7D3E5FB5"></endEvent>
<sequenceFlow id="sid-C6C56AC3-9561-49E0-A58A-624F6CB8BB82" sourceRef="sid-F62B554B-FF4F-475E-94FF-A3F44EDA6A6A" targetRef="servicetask"></sequenceFlow> <sequenceFlow id="sid-C6C56AC3-9561-49E0-A58A-624F6CB8BB82" sourceRef="sid-F62B554B-FF4F-475E-94FF-A3F44EDA6A6A" targetRef="servicetask"></sequenceFlow>
<serviceTask id="servicetask" name="Service task" activiti:async="true" activiti:exclusive="false" activiti:class="org.test.TestClass"> <serviceTask id="servicetask" name="Service task" activiti:async="true" activiti:exclusive="false" activiti:class="org.test.TestClass">
...@@ -23,6 +36,21 @@ ...@@ -23,6 +36,21 @@
<custom:test xmlns:custom="http://custom.org/bpmn" id="test2" name="test2" /> <custom:test xmlns:custom="http://custom.org/bpmn" id="test2" name="test2" />
</extensionElements> </extensionElements>
</serviceTask> </serviceTask>
<boundaryEvent id="timerEvent" attachedToRef="servicetask">
<timerEventDefinition>
<extensionElements>
<custom:test xmlns:custom="http://custom.org/bpmn" id="test" name="test">
<custom:name>
<custom:test>test</custom:test>
</custom:name>
<custom:name id="customName" />
<custom:description xmlns:custom2="http://custom2.org/bpmn" custom2:id="test" />
</custom:test>
<custom:test xmlns:custom="http://custom.org/bpmn" id="test2" name="test2" />
</extensionElements>
<timeCycle>${cronExpression}</timeCycle>
</timerEventDefinition>
</boundaryEvent>
<startEvent id="sid-F62B554B-FF4F-475E-94FF-A3F44EDA6A6A"></startEvent> <startEvent id="sid-F62B554B-FF4F-475E-94FF-A3F44EDA6A6A"></startEvent>
<sequenceFlow id="sid-91C0F3A0-649F-462E-A1C1-1CE499FEDE3E" sourceRef="servicetask" targetRef="sid-F7795B38-72CD-41A4-9549-6CFB7D3E5FB5"></sequenceFlow> <sequenceFlow id="sid-91C0F3A0-649F-462E-A1C1-1CE499FEDE3E" sourceRef="servicetask" targetRef="sid-F7795B38-72CD-41A4-9549-6CFB7D3E5FB5"></sequenceFlow>
</process> </process>
......
...@@ -48,15 +48,21 @@ public class StandaloneTaskTest extends PluggableActivitiTestCase { ...@@ -48,15 +48,21 @@ public class StandaloneTaskTest extends PluggableActivitiTestCase {
taskService.addCandidateUser(taskId, "kermit"); taskService.addCandidateUser(taskId, "kermit");
taskService.addCandidateUser(taskId, "gonzo"); taskService.addCandidateUser(taskId, "gonzo");
// Retrieve task list for jbarrez // Retrieve task list for kermit
List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list(); List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();
assertEquals(1, tasks.size()); assertEquals(1, tasks.size());
assertEquals("testTask", tasks.get(0).getName()); assertEquals("testTask", tasks.get(0).getName());
// Retrieve task list for tbaeyens // Retrieve task list for gonzo
tasks = taskService.createTaskQuery().taskCandidateUser("gonzo").list(); tasks = taskService.createTaskQuery().taskCandidateUser("gonzo").list();
assertEquals(1, tasks.size()); assertEquals(1, tasks.size());
assertEquals("testTask", tasks.get(0).getName()); assertEquals("testTask", tasks.get(0).getName());
task.setName("Update name");
taskService.saveTask(task);
tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();
assertEquals(1, tasks.size());
assertEquals("Update name", tasks.get(0).getName());
// Claim task // Claim task
taskService.claim(taskId, "kermit"); taskService.claim(taskId, "kermit");
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册