在工作中使用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);
效果圖: