activiti-bpmn-converter

news/2024/5/3 17:06:37/文章来源:https://blog.csdn.net/xiamaocheng/article/details/128048902

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/

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_37047.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

伸展树原理介绍

一 点睛 伸展树&#xff0c;也叫作分裂树&#xff0c;是一种二叉搜索树&#xff0c;可以在 O (logn ) 内完成插入、查找和删除操作。在任意数据结构的生命周期内执行不同操作的概率往往极不均衡&#xff0c;而且各操作之间有极强的相关性&#xff0c;在整体上多呈现极强的规律…

zabbix集群搭建分布式监控的操作步骤

作用&#xff1a; 分担server的集中式压力解决多机房之间的网络延迟问题环境准备&#xff1a; 服务器1&#xff1a;zabbix-server 服务器2&#xff1a;zabbix-proxy 服务器3&#xff1a;zabbix-agent 关系&#xff1a;zabbix-agent发送数据到代理&#xff0c;代理汇总数据发送…

学习Python要学习哪些课程?

通过学习 Python数据分析与应用课程&#xff0c;可以掌握Python进行科学计算、可视化绘图、数据处理&#xff0c;分析与建模、构建聚类、回归、分类模型的主要方法和技能&#xff0c;并为后续相关课程学习及将来从事数据分析挖掘研究、数据分析工作奠定基础。 Python数据分析与…

XSStrike工具使用说明

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是XSStrike工具使用说明。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权…

记录:微星 GE63 屏轴断裂 之后。。。

2022/11/25 记录 微星 GE63 1070 笔记本&#xff0c;使用的第三年&#xff0c;已过保了一年&#xff0c;上周使用时&#xff0c;准备合上笔记本盖。啪一下&#xff0c;左侧屏轴断裂&#xff0c;B面翘起&#xff0c;A面左下角轴盖断了一截。 网上好多人都有类似的情况&#xff…

Linux多核运行机制(SMP)

一、Linux内核兼容多处理器要求 有多个 CPU 处理器 的 系统中 , Linux 内核需要处理的问题 : 1、公平共享 : CPU 的负载 , 需要公平地共享 , 不能出现某个CPU空闲 , 造成资源浪费。 2、可设置进程 与 CPU 亲和性 : 可以为 某些类型的 进程 与 指定的 处理器设置亲和性 , 可以针…

数据结构与算法之让我们种下一棵字典树(Java/C++双语言实现)

⭐️前面的话⭐️ 本篇文章将介绍一种经常使用的数据结构——字典树&#xff0c;它又称Tire树&#xff0c;前缀树&#xff0c;字典树&#xff0c;顾名思义&#xff0c;是关于“字典”的一棵树。这个词典中的每个“单词”就是从根节点出发一直到某一个目标节点的路径&#xff0…

CSRF漏洞简介

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CSRF漏洞原理、产生与危害。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未…

C语言 * 数组的解析 *

目录 一&#xff1a;一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二&#xff1a;二维数组的创建和初始化 2.1 数组的创建 2.2 数组的初始化 2.3 一维数组的使用 2.4 一维数组在内存中的存储 2.5 数组越…

【蓝桥杯选拔赛真题30】python计算倒数和 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python计算倒数和 一、题目要求 1、编程实现 2、输入输出 3、评分标准

从01背包说起(上)

目录 引入 1.什么是动态规划? 2.什么是背包问题&#xff1f; 3.什么是01背包&#xff1f; 模板题 1.题面 2.思路 Ⅰ为何不可用贪心 Ⅱ状态转移方程 3.代码 下期预告 引入 1.什么是动态规划? 动态规划&#xff08;英语&#xff1a;Dynamic programming&#xff0…

收到多个20k+的offer!选哪一个呢?

“收到offer了&#xff01;”最近&#xff0c;黑马老师收到最多的消息就属这句了。随着黑马各个学科迎来毕业&#xff0c;班主任收到的喜讯越来越多。班主任说&#xff0c;没有比在接近年底时收到学生就业喜讯更让人开心的事了。今天&#xff0c;播妞给大家带来的是黑马HTML&am…

就两秒?这说出去谁信啊!

文 | xiaoyi&#xff08;转载请后台联系&#xff09;关注公众号&#xff1a;小一的学习笔记截止发文&#xff0c;北上广深一共有6510条公交线路为了获取上面的这些线路信息&#xff0c;我写了一个爬虫&#xff0c;大概用了2秒左右就搞定&#xff0c;真爽&#xff01;说出来你们…

【项目实战:核酸检测平台】第三章 利其器

第三章 利其器 摘要:俗话说的好工欲善其事&#xff0c;必先利其器&#xff0c;框架搭的好&#xff0c;开发起来很舒服&#xff0c;搭的不好&#xff0c;开发起来就很痛苦。 一个程序员只会写业务代码&#xff0c;最多算是个码农&#xff0c;搭框架的本事、遇到难题的解决能力…

第八章 兼容多种模块标准的软件包封装

第八章 如何封装兼容多种JS模块标准的软件包&#xff1f; 为了方便用户使用&#xff0c;一款成熟的类库都会提供多种模块封装形式&#xff0c;比如大家最常用到的 Vue&#xff0c;就提供了cjs、esm、umd 等多种封装模式&#xff0c;并且还会提供对应的压缩版本&#xff0c;方便…

微服务之间,最佳的调用方式是什么?

在微服务架构中&#xff0c;需要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式&#xff0c;一种是RPC方式&#xff0c;另一种是事件驱动&#xff08;Event-driven&#xff09;方式&#xff0c;也就是发消息方式。消…

MySQL海量数据优化(理论+实战) 吊打面试官

一、准备表数据 咱们建一张用户表&#xff0c;表中的字段有用户ID、用户名、地址、记录创建时间&#xff0c;如图所示 ​OK&#xff0c;接下来准备写一个存储过程插入一百万条数据 CREATE TABLE t_user (id int NOT NULL,user_name varchar(32) CHARACTER SET utf8 COLLATE ut…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java线上学习系统8e88w

做毕业设计一定要选好题目。毕设想简单&#xff0c;其实很简单。这里给几点建议&#xff1a; 1&#xff1a;首先&#xff0c;学会收集整理&#xff0c;年年专业都一样&#xff0c;岁岁毕业人不同。很多人在做毕业设计的时候&#xff0c;都犯了一个错误&#xff0c;那就是不借鉴…

路由策略和路由控制

路由策略和路由控制 路由策略 针对路由的发布&#xff0c;接收&#xff0c;引入进行控制&#xff0c;从而影响数据的路径或者可达性 路由匹配工具 ACL&#xff1a;访问前缀列表 一个ACL用多条规则组成&#xff0c;不同规则之间通过rule id进行区分&#xff0c;默认rule 步…

[附源码]java毕业设计智慧农业销售平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…