A-A+

Flowable6.4 – 扩展属性

2020年03月08日 技术, 默认 暂无评论 阅读 2,654 次

本次分享一下节点扩展属性的相关知识。

首先,扩展属性在XML文件中的表现形式,可以参见下图:

上图中红框部分,就是被添加的自定义属性。

如何增加自定义属性?

主要代码如下:

if (flowElement instanceof UserTask) {
    UserTask userTask = (UserTask) flowElement;

    ExtensionElement extensionElement = new ExtensionElement();
    extensionElement.setName("user-task-expansion");
    extensionElement.setNamespacePrefix("my");
    extensionElement.setNamespace(BpmnJsonConverter.MODELER_NAMESPACE);
    extensionElement.setElementText("11111");

    userTask.addExtensionElement(extensionElement);
}

如果不清楚FlowElement的查找,可以参见《Flowable6.4 - BpmnModel》。

如何读取自定义属性?

主要代码如下:

if (flowElement instanceof UserTask) {
    UserTask userTask = (UserTask) flowElement;
    return userTask.getExtensionElements();
}

需要注意的是:如果按照以前分享的方法导出流程定义,或者查找FlowElement,会发现通过BpmnJsonConverter转化的Json不会包含这些自定义属性,因为自带的JsonConvert无法识别自定义扩展属性。

如果使用了自定义扩展属性,那么就需要重写BpmnJsonConvert和对应节点的Convert。比如,在本文中,就需要重写UserTaskJsonConvert。

完整代码如下(比较长,关键处做了注释):

public class ExtUserTaskJsonConverter extends UserTaskJsonConverter {
    //固定写法,直接拷贝,注意更改节点类型对应的常量即可
    static void customFillTypes(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, ExtUserTaskJsonConverter.class);
    }

    public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {
        convertersToJsonMap.put(UserTask.class, ExtUserTaskJsonConverter.class);
    }

    //将Element转为Json
    @Override
    protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) {
        super.convertElementToJson(propertiesNode, baseElement);
        if (baseElement instanceof UserTask) {
            final String[] text = {""};
            //读取自定义扩展属性
            baseElement.getExtensionElements().forEach((s, elements) -> elements.forEach(extensionElement -> {
                if ("user-task-expansion".equals(extensionElement.getName())) {
                    text[0] = extensionElement.getElementText();
                }
            }));
            //在Json中增加一个属性
            if (StrUtil.isNotBlank(text[0])) {
                propertiesNode.put("usertaskexpansion", text[0]);
            }
        }
    }

    //将Json转为Element
    @Override
    protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {
        return super.convertJsonToElement(elementNode, modelNode, shapeMap);
    }

    //convertJsonToElement会调用此方法
    @Override
    protected void convertJsonToFormProperties(JsonNode objectNode, BaseElement element) {
        super.convertJsonToFormProperties(objectNode, element);
        if (element instanceof UserTask) {
            //将Json转为UserTask中的Element
            JsonNode userTaskExpansion = getProperty("usertaskexpansion", objectNode);
            if (userTaskExpansion instanceof TextNode) {
                if (StrUtil.isNotBlank(userTaskExpansion.toString())) {
                    addExpansionPropertiesElement((UserTask) element, (TextNode) userTaskExpansion);
                }
            }
        }
    }

    private void addExpansionPropertiesElement(UserTask userTask, TextNode userTaskExpansion) {
        ExtensionElement extensionElement = new ExtensionElement();
        extensionElement.setName("user-task-expansion");
        extensionElement.setNamespacePrefix("my");
        extensionElement.setNamespace(BpmnJsonConverter.MODELER_NAMESPACE);
        extensionElement.setElementText(userTaskExpansion.toString());
        userTask.addExtensionElement(extensionElement);
    }
}

自定义了节点的JsonConvert后,需要声明自己的BpmnConvert,并且将指定节点的JsonConvert替换。

public class ExtBpmnJsonConverter extends BpmnJsonConverter {

    static {
        convertersToBpmnMap.put(STENCIL_TASK_USER, ExtUserTaskJsonConverter.class);
        ExtUserTaskJsonConverter.customFillTypes(convertersToBpmnMap, convertersToJsonMap);
    }
}

经过上述扩展后,与自定义属性有关的功能才能够正常运行。

如何清除自定义属性?

主要代码如下:

if (flowElement instanceof UserTask) {
    UserTask userTask = (UserTask) flowElement;
    userTask.setExtensionElements(new HashMap<>());
}

以上,就是本次分享的内容,如有问题欢迎指正。

觉的不错?可以关注我的公众号↑↑↑

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality 京ICP备14039894号

用户登录

分享到: