activiti modeler 任务节点自定义属性扩展
Posted 游鱼迁徙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了activiti modeler 任务节点自定义属性扩展相关的知识,希望对你有一定的参考价值。
在工作中使用Activiti modeler时难免会遇到局限,如usertask中的属性,完全不够用,这时需要我们去扩展。
activiti modeler通过读取stencilset.json生成编辑器UI,在界面上的扩展需要了解stencilset.json配置文件,它定义元素的属性,规则的配置文件,页面的展示就是根据这个配置文件生成的。
配置文件说明:
--属性的定义
"propertyPackages" : [ {
"name" : "process_idpackage",
"properties" : [ {
"id" : "name", ---id
"type" : "String", --类型,在赋值的时候会根据类型展示各种输入框,根据properties.js
"title" : "名称", --显示的标题
"value" : "", --值
"description" : "BPMN元素的描述性名称.", --描述
"category":"property", --分类,空的话位popular
"popular" : true, --是否显示
"refToView" : "text_name" --触发svg里面的效果
}]
--节点的定义
"type" : "node",
"id" : "MailTask",
"title" : "邮件任务",--标题
"description" : "邮件任务", --描述
"view" : "<?xml version=\\"1.0\\" encoding=\\"UTF-8\\" standalone=\\"no\\"?>\\n</svg>", --svg的xml
"icon" : "activity/list/type.send.png", --图标
"groups" : [ "任务" ], --归属的组
"propertyPackages" : [ "overrideidpackage" ],--属性
"hiddenPropertyPackages" : [ ],
"roles" : [ "Activity" ] --规则
配置步骤说明:
在stencilset.json文件中添加属性(各种类型可参照其它属性编写),如图:
并引用到UserTask节点中,如图:
这样,ORYX Designer会自动解析该JSON文件并在UI中展示新添加的属性,如图:
接着,我们需要将UI上扩展的属性与activiti进行绑定。不难发现,BpmnJsonConverter起着至关重要的作用,activiti modeler将页面编辑器的数据保存为Json格式文件存储到数据库中,回显也是通过读取该文件,BpmnJsonConverter用于转换BPMN与JSON供activiti解析界面属性并应用。
在UserTask中扩展属性,默认的任务节点Json数据解析类UserTaskJsonConverter,因为它不认识skiprepetition,所以需要定义一个类替换它,以此达到解析自定义属性的目的。
然后,重写convertElementToJson与convertJsonToElement方法,UserTask提供了List<CustomProperty> customProperties用来存储我们的自定义属性。
public class CustomUserTaskJsonConverter extends UserTaskJsonConverter implements CustomStencilConstants{ @Override protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) { super.convertElementToJson(propertiesNode, baseElement); UserTask userTask = (UserTask) baseElement; //解析 Map<String, List<ExtensionElement>> customerPropeties = userTask.getExtensionElements();
if(customerPropeties不为空 && customerPropeties是否包含扩展属性){
ExtensionElement e = customerPropeties.get(扩展属性).get(0);
setPropertyValue(扩展属性, e.getElementText(), propetiesNode);
} } @Override protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) { FlowElement flowElement = super.convertJsonToElement(elementNode, modelNode, shapeMap); //解析 UserTask userTask = (UserTask) flowElement;
List<CustomerPropety> cplist = new ArrayList();
String skiprepetition = getPropetyValueAsString(扩展属性, elementNode);
if(skiprepetition不为空){
CustomerPropety cp = new CustomerPropety();
cp.setName(扩展属性);
cp.setSimpleValue(skiprepetition);
cplist.add(cp);
}
task.setCustomProperties(cplist); return task; } public static void fillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap, Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) { fillJsonTypes(convertersToBpmnMap); fillBpmnTypes(convertersToJsonMap); } public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) { convertersToBpmnMap.put(STENCIL_TASK_USER, CustomUserTaskJsonConverter.class); } public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) { convertersToJsonMap.put(UserTask.class, CustomUserTaskJsonConverter.class); } }
最后,在部署流程时,待BpmnJsonConverter初始化完成后替换掉UserTaskJsonConverter就OK了。
BpmnJsonConverter jsonConverter = new BpmnJsonConverter(); // TODO:UserTask自定义扩展属性 BpmnJsonConverterProperties bjcp = new BpmnJsonConverterProperties(); CustomUserTaskJsonConverter.fillTypes(bjcp.getConvertersToBpmnMap, bjcp.getConvertersToJsonMap); JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(modelData.getId())); BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);
效果图:
以上是关于activiti modeler 任务节点自定义属性扩展的主要内容,如果未能解决你的问题,请参考以下文章
Groovy自定义 Xml 生成器 BuilderSupport ( 构造 Xml 节点类 | 封装节点名称节点值节点属性子节点 | 将封装的节点数据转为 Xml 字符串 )