activiti-bpmn-converter
Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.
目录
概述
activiti-bpmn-converter的是一个非常常见的需求。
需求:
设计思路
实现思路分析
1.BpmnXMLConstants
public interface BpmnXMLConstants {
public static final String BPMN2_NAMESPACE = "http://www.omg.org/spec/BPMN/20100524/MODEL";
public static final String BPMN2_PREFIX = "bpmn2";
public static final String XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance";
public static final String XSI_PREFIX = "xsi";
public static final String SCHEMA_NAMESPACE = "http://www.w3.org/2001/XMLSchema";
public static final String XSD_PREFIX = "xsd";
public static final String TYPE_LANGUAGE_ATTRIBUTE = "typeLanguage";
public static final String XPATH_NAMESPACE = "http://www.w3.org/1999/XPath";
public static final String EXPRESSION_LANGUAGE_ATTRIBUTE = "expressionLanguage";
public static final String PROCESS_NAMESPACE = "http://www.activiti.org/test";
public static final String TARGET_NAMESPACE_ATTRIBUTE = "targetNamespace";
public static final String ACTIVITI_EXTENSIONS_NAMESPACE = "http://activiti.org/bpmn";
public static final String ACTIVITI_EXTENSIONS_PREFIX = "activiti";
public static final String BPMNDI_NAMESPACE = "http://www.omg.org/spec/BPMN/20100524/DI";
public static final String BPMNDI_PREFIX = "bpmndi";
public static final String OMGDC_NAMESPACE = "http://www.omg.org/spec/DD/20100524/DC";
public static final String OMGDC_PREFIX = "omgdc";
public static final String OMGDI_NAMESPACE = "http://www.omg.org/spec/DD/20100524/DI";
public static final String OMGDI_PREFIX = "omgdi";
2.BpmnXMLConverter
public class BpmnXMLConverter implements BpmnXMLConstants {
protected static final Logger LOGGER = LoggerFactory.getLogger(BpmnXMLConverter.class);
protected static final String BPMN_XSD = "org/activiti/impl/bpmn/parser/BPMN20.xsd";
protected static final String DEFAULT_ENCODING = "UTF-8";
protected static Map<String, BaseBpmnXMLConverter> convertersToBpmnMap = new HashMap<String, BaseBpmnXMLConverter>();
protected static Map<Class<? extends BaseElement>, BaseBpmnXMLConverter> convertersToXMLMap = new HashMap<Class<? extends BaseElement>, BaseBpmnXMLConverter>();
protected ClassLoader classloader;
protected List<String> userTaskFormTypes;
protected List<String> startEventFormTypes;
protected BpmnEdgeParser bpmnEdgeParser = new BpmnEdgeParser();
protected BpmnShapeParser bpmnShapeParser = new BpmnShapeParser();
protected DefinitionsParser definitionsParser = new DefinitionsParser();
protected DocumentationParser documentationParser = new DocumentationParser();
protected ExtensionElementsParser extensionElementsParser = new ExtensionElementsParser();
protected ImportParser importParser = new ImportParser();
protected InterfaceParser interfaceParser = new InterfaceParser();
protected ItemDefinitionParser itemDefinitionParser = new ItemDefinitionParser();
protected IOSpecificationParser ioSpecificationParser = new IOSpecificationParser();
protected DataStoreParser dataStoreParser = new DataStoreParser();
protected LaneParser laneParser = new LaneParser();
protected MessageParser messageParser = new MessageParser();
protected MessageFlowParser messageFlowParser = new MessageFlowParser();
protected MultiInstanceParser multiInstanceParser = new MultiInstanceParser();
protected ParticipantParser participantParser = new ParticipantParser();
protected PotentialStarterParser potentialStarterParser = new PotentialStarterParser();
protected ProcessParser processParser = new ProcessParser();
protected ResourceParser resourceParser = new ResourceParser();
protected SignalParser signalParser = new SignalParser();
protected SubProcessParser subProcessParser = new SubProcessParser();
static {
// events
addConverter(new EndEventXMLConverter());
addConverter(new StartEventXMLConverter());
// tasks
addConverter(new BusinessRuleTaskXMLConverter());
addConverter(new ManualTaskXMLConverter());
addConverter(new ReceiveTaskXMLConverter());
addConverter(new ScriptTaskXMLConverter());
addConverter(new ServiceTaskXMLConverter());
addConverter(new SendTaskXMLConverter());
addConverter(new UserTaskXMLConverter());
addConverter(new TaskXMLConverter());
addConverter(new CallActivityXMLConverter());
// gateways
addConverter(new EventGatewayXMLConverter());
addConverter(new ExclusiveGatewayXMLConverter());
addConverter(new InclusiveGatewayXMLConverter());
addConverter(new ParallelGatewayXMLConverter());
addConverter(new ComplexGatewayXMLConverter());
// connectors
addConverter(new SequenceFlowXMLConverter());
// catch, throw and boundary event
addConverter(new CatchEventXMLConverter());
addConverter(new ThrowEventXMLConverter());
addConverter(new BoundaryEventXMLConverter());
// artifacts
addConverter(new TextAnnotationXMLConverter());
addConverter(new AssociationXMLConverter());
// data store reference
addConverter(new DataStoreReferenceXMLConverter());
// data objects
addConverter(new ValuedDataObjectXMLConverter(), StringDataObject.class);
addConverter(new ValuedDataObjectXMLConverter(), BooleanDataObject.class);
addConverter(new ValuedDataObjectXMLConverter(), IntegerDataObject.class);
addConverter(new ValuedDataObjectXMLConverter(), LongDataObject.class);
addConverter(new ValuedDataObjectXMLConverter(), DoubleDataObject.class);
addConverter(new ValuedDataObjectXMLConverter(), DateDataObject.class);
// Alfresco types
addConverter(new AlfrescoStartEventXMLConverter());
addConverter(new AlfrescoUserTaskXMLConverter());
}
public static void addConverter(BaseBpmnXMLConverter converter) {
addConverter(converter, converter.getBpmnElementType());
}
public static void addConverter(BaseBpmnXMLConverter converter, Class<? extends BaseElement> elementType) {
convertersToBpmnMap.put(converter.getXMLElementName(), converter);
convertersToXMLMap.put(elementType, converter);
}
convertToBpmnModel流程如下
3.StartEventXMLConverter
public class StartEventXMLConverter extends BaseBpmnXMLConverter {
@Override
public Class<? extends BaseElement> getBpmnElementType() {
return StartEvent.class;
}
@Override
protected String getXMLElementName() {
return ELEMENT_EVENT_START;
}
@Override
protected BaseElement convertXMLToElement(XMLStreamReader xtr,
BpmnModel model) throws Exception {
String formKey = xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE,
ATTRIBUTE_FORM_FORMKEY);
StartEvent startEvent = null;
if (StringUtils.isNotEmpty(formKey) && model.getStartEventFormTypes() != null && model.getStartEventFormTypes().contains(formKey)) {
startEvent = new AlfrescoStartEvent();
}
if (startEvent == null) {
startEvent = new StartEvent();
}
BpmnXMLUtil.addXMLLocation(startEvent,
xtr);
startEvent.setInitiator(xtr.getAttributeValue(ACTIVITI_EXTENSIONS_NAMESPACE,
ATTRIBUTE_EVENT_START_INITIATOR));
boolean interrupting = true;
String interruptingAttribute = xtr.getAttributeValue(null,
ATTRIBUTE_EVENT_START_INTERRUPTING);
if (ATTRIBUTE_VALUE_FALSE.equalsIgnoreCase(interruptingAttribute)) {
interrupting = false;
}
startEvent.setInterrupting(interrupting);
startEvent.setFormKey(formKey);
parseChildElements(getXMLElementName(),
startEvent,
model,
xtr);
return startEvent;
}
@Override
protected void writeAdditionalAttributes(BaseElement element,
BpmnModel model,
XMLStreamWriter xtw) throws Exception {
StartEvent startEvent = (StartEvent) element;
writeQualifiedAttribute(ATTRIBUTE_EVENT_START_INITIATOR,
startEvent.getInitiator(),
xtw);
writeQualifiedAttribute(ATTRIBUTE_FORM_FORMKEY,
startEvent.getFormKey(),
xtw);
if (startEvent.getEventDefinitions() != null && startEvent.getEventDefinitions().size() > 0) {
writeDefaultAttribute(ATTRIBUTE_EVENT_START_INTERRUPTING,
String.valueOf(startEvent.isInterrupting()),
xtw);
}
}
@Override
protected boolean writeExtensionChildElements(BaseElement element,
boolean didWriteExtensionStartElement,
XMLStreamWriter xtw) throws Exception {
StartEvent startEvent = (StartEvent) element;
didWriteExtensionStartElement = writeFormProperties(startEvent,
didWriteExtensionStartElement,
xtw);
return didWriteExtensionStartElement;
}
@Override
protected void writeAdditionalChildElements(BaseElement element,
BpmnModel model,
XMLStreamWriter xtw) throws Exception {
StartEvent startEvent = (StartEvent) element;
writeEventDefinitions(startEvent,
startEvent.getEventDefinitions(),
model,
xtw);
}
}
convertXMLToElement项目流程如下:
4.EndEventXMLConverter
public class EndEventXMLConverter extends BaseBpmnXMLConverter {
@Override
public Class<? extends BaseElement> getBpmnElementType() {
return EndEvent.class;
}
@Override
protected String getXMLElementName() {
return ELEMENT_EVENT_END;
}
@Override
protected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model) throws Exception {
EndEvent endEvent = new EndEvent();
BpmnXMLUtil.addXMLLocation(endEvent, xtr);
parseChildElements(getXMLElementName(), endEvent, model, xtr);
return endEvent;
}
@Override
protected void writeAdditionalAttributes(BaseElement element, BpmnModel model, XMLStreamWriter xtw) throws Exception {
}
@Override
protected void writeAdditionalChildElements(BaseElement element, BpmnModel model, XMLStreamWriter xtw) throws Exception {
EndEvent endEvent = (EndEvent) element;
writeEventDefinitions(endEvent, endEvent.getEventDefinitions(), model, xtw);
}
类图;
参考资料和推荐阅读
[1]. https://www.activiti.org/
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~