activiti-bpmn-converter
- 目录
- 概述
- 需求:
- 设计思路
- 实现思路分析
- 1.BpmnXMLConstants
- 2.BpmnXMLConverter
- 3.StartEventXMLConverter
- 4.EndEventXMLConverter
- 参考资料和推荐阅读
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 {// eventsaddConverter(new EndEventXMLConverter());addConverter(new StartEventXMLConverter());// tasksaddConverter(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());// gatewaysaddConverter(new EventGatewayXMLConverter());addConverter(new ExclusiveGatewayXMLConverter());addConverter(new InclusiveGatewayXMLConverter());addConverter(new ParallelGatewayXMLConverter());addConverter(new ComplexGatewayXMLConverter());// connectorsaddConverter(new SequenceFlowXMLConverter());// catch, throw and boundary eventaddConverter(new CatchEventXMLConverter());addConverter(new ThrowEventXMLConverter());addConverter(new BoundaryEventXMLConverter());// artifactsaddConverter(new TextAnnotationXMLConverter());addConverter(new AssociationXMLConverter());// data store referenceaddConverter(new DataStoreReferenceXMLConverter());// data objectsaddConverter(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 typesaddConverter(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 {@Overridepublic Class<? extends BaseElement> getBpmnElementType() {return StartEvent.class;}@Overrideprotected String getXMLElementName() {return ELEMENT_EVENT_START;}@Overrideprotected 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;}@Overrideprotected 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);}}@Overrideprotected boolean writeExtensionChildElements(BaseElement element,boolean didWriteExtensionStartElement,XMLStreamWriter xtw) throws Exception {StartEvent startEvent = (StartEvent) element;didWriteExtensionStartElement = writeFormProperties(startEvent,didWriteExtensionStartElement,xtw);return didWriteExtensionStartElement;}@Overrideprotected 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 {@Overridepublic Class<? extends BaseElement> getBpmnElementType() {return EndEvent.class;}@Overrideprotected String getXMLElementName() {return ELEMENT_EVENT_END;}@Overrideprotected BaseElement convertXMLToElement(XMLStreamReader xtr, BpmnModel model) throws Exception {EndEvent endEvent = new EndEvent();BpmnXMLUtil.addXMLLocation(endEvent, xtr);parseChildElements(getXMLElementName(), endEvent, model, xtr);return endEvent;}@Overrideprotected void writeAdditionalAttributes(BaseElement element, BpmnModel model, XMLStreamWriter xtw) throws Exception {}@Overrideprotected 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/
欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~