diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/prop/ChainPropBean.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/prop/ChainPropBean.java new file mode 100644 index 000000000..2d8165069 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/prop/ChainPropBean.java @@ -0,0 +1,93 @@ +package com.yomahub.liteflow.builder.prop; + +import com.yomahub.liteflow.enums.ConditionTypeEnum; + +/** + * 构建 chain 的中间属性 + */ +public class ChainPropBean { + + /** + * 执行规则 + */ + String condValueStr; + + /** + * 分组 + */ + String group; + + /** + * 是否抛出异常 + */ + String errorResume; + + /** + * 满足任意条件,执行完成 + */ + String any; + + /** + * 指定线程池 + */ + String threadExecutorClass; + + /** + * chain 类型 + */ + ConditionTypeEnum conditionType; + + public String getCondValueStr() { + return condValueStr; + } + + public ChainPropBean setCondValueStr(String condValueStr) { + this.condValueStr = condValueStr; + return this; + } + + public String getGroup() { + return group; + } + + public ChainPropBean setGroup(String group) { + this.group = group; + return this; + } + + public String getErrorResume() { + return errorResume; + } + + public ChainPropBean setErrorResume(String errorResume) { + this.errorResume = errorResume; + return this; + } + + public String getAny() { + return any; + } + + public ChainPropBean setAny(String any) { + this.any = any; + return this; + } + + public String getThreadExecutorClass() { + return threadExecutorClass; + } + + public ChainPropBean setThreadExecutorClass(String threadExecutorClass) { + this.threadExecutorClass = threadExecutorClass; + return this; + } + + public ConditionTypeEnum getConditionType() { + return conditionType; + } + + public ChainPropBean setConditionType(ConditionTypeEnum conditionType) { + this.conditionType = conditionType; + return this; + } +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/prop/NodePropBean.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/prop/NodePropBean.java new file mode 100644 index 000000000..ac674c2c5 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/prop/NodePropBean.java @@ -0,0 +1,91 @@ +package com.yomahub.liteflow.builder.prop; + +/** + * 构建 node 的中间属性 + */ +public class NodePropBean { + + /** + * id + */ + String id; + + /** + * 名称 + */ + String name; + + /** + * 类 + */ + String clazz; + + /** + * 脚本 + */ + String script; + + /** + * 类型 + */ + String type; + + /** + * 脚本存放位置 + */ + String file; + + public String getId() { + return id; + } + + public NodePropBean setId(String id) { + this.id = id; + return this; + } + + public String getName() { + return name; + } + + public NodePropBean setName(String name) { + this.name = name; + return this; + } + + public String getClazz() { + return clazz; + } + + public NodePropBean setClazz(String clazz) { + this.clazz = clazz; + return this; + } + + public String getScript() { + return script; + } + + public NodePropBean setScript(String script) { + this.script = script; + return this; + } + + public String getType() { + return type; + } + + public NodePropBean setType(String type) { + this.type = type; + return this; + } + + public String getFile() { + return file; + } + + public NodePropBean setFile(String file) { + this.file = file; + return this; + } +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/BaseFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/BaseFlowParser.java index 35a898000..064c643f3 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/BaseFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/BaseFlowParser.java @@ -5,6 +5,8 @@ import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.builder.LiteFlowChainBuilder; import com.yomahub.liteflow.builder.LiteFlowConditionBuilder; import com.yomahub.liteflow.builder.LiteFlowNodeBuilder; +import com.yomahub.liteflow.builder.prop.ChainPropBean; +import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.EmptyConditionValueException; @@ -18,76 +20,75 @@ import com.yomahub.liteflow.exception.NotSupportConditionException; */ public abstract class BaseFlowParser implements FlowParser { - /** - * 构建 node - * - * @param id id - * @param name 名称 - * @param clazz 类 - * @param script 脚本 - * @param type 类型 - * @param file 脚本存放位置 - */ - public void buildNode(String id, String name, String clazz, String script, String type, String file) { - //初始化type - if (StrUtil.isBlank(type)) { - type = NodeTypeEnum.COMMON.getCode(); - } + /** + * 构建 node + * + * @param nodePropBean 构建 node 的中间属性 + */ + public void buildNode(NodePropBean nodePropBean) { + String id = nodePropBean.getId(); + String name = nodePropBean.getName(); + String clazz = nodePropBean.getClazz(); + String script = nodePropBean.getScript(); + String type = nodePropBean.getType(); + String file = nodePropBean.getFile(); - //检查nodeType是不是规定的类型 - NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type); - if (ObjectUtil.isNull(nodeTypeEnum)) { - throw new NodeTypeNotSupportException(StrUtil.format("type [{}] is not support", type)); - } + //初始化type + if (StrUtil.isBlank(type)) { + type = NodeTypeEnum.COMMON.getCode(); + } - //进行node的build过程 - LiteFlowNodeBuilder.createNode().setId(id).setName(name).setClazz(clazz).setType(nodeTypeEnum).setScript(script).setFile(file).build(); - } + //检查nodeType是不是规定的类型 + NodeTypeEnum nodeTypeEnum = NodeTypeEnum.getEnumByCode(type); + if (ObjectUtil.isNull(nodeTypeEnum)) { + throw new NodeTypeNotSupportException(StrUtil.format("type [{}] is not support", type)); + } + + //进行node的build过程 + LiteFlowNodeBuilder.createNode().setId(id).setName(name).setClazz(clazz).setType(nodeTypeEnum).setScript(script).setFile(file).build(); + } - /** - * 构建 chain - * - * @param condValueStr 执行规则 - * @param group 分组 - * @param errorResume 是否抛出异常 - * @param any 满足任意条件,执行完成 - * @param threadExecutorClass 指定线程池 - * @param conditionType chain 类型 - * @param chainBuilder chainBuilder - */ - public void buildChain(String condValueStr - , String group - , String errorResume - , String any - , String threadExecutorClass - , ConditionTypeEnum conditionType - , LiteFlowChainBuilder chainBuilder) { - if (ObjectUtil.isNull(conditionType)) { - throw new NotSupportConditionException("ConditionType is not supported"); - } + /** + * 构建 chain + * + * @param chainPropBean 构建 chain 的中间属性 + * @param chainBuilder chainBuilder + */ + public void buildChain(ChainPropBean chainPropBean + , LiteFlowChainBuilder chainBuilder) { + String condValueStr = chainPropBean.getCondValueStr(); + String group = chainPropBean.getGroup(); + String errorResume = chainPropBean.getErrorResume(); + String any = chainPropBean.getAny(); + String threadExecutorClass = chainPropBean.getThreadExecutorClass(); + ConditionTypeEnum conditionType = chainPropBean.getConditionType(); - if (StrUtil.isBlank(condValueStr)) { - throw new EmptyConditionValueException("Condition value cannot be empty"); - } + if (ObjectUtil.isNull(conditionType)) { + throw new NotSupportConditionException("ConditionType is not supported"); + } - //如果是when类型的话,有特殊化参数要设置,只针对于when的 - if (conditionType.equals(ConditionTypeEnum.TYPE_WHEN)) { - chainBuilder.setCondition( - LiteFlowConditionBuilder.createWhenCondition() - .setErrorResume(errorResume) - .setGroup(group) - .setAny(any) - .setThreadExecutorClass(threadExecutorClass) - .setValue(condValueStr) - .build() - ).build(); - } else { - chainBuilder.setCondition( - LiteFlowConditionBuilder.createCondition(conditionType) - .setValue(condValueStr) - .build() - ).build(); - } - } + if (StrUtil.isBlank(condValueStr)) { + throw new EmptyConditionValueException("Condition value cannot be empty"); + } + + //如果是when类型的话,有特殊化参数要设置,只针对于when的 + if (conditionType.equals(ConditionTypeEnum.TYPE_WHEN)) { + chainBuilder.setCondition( + LiteFlowConditionBuilder.createWhenCondition() + .setErrorResume(errorResume) + .setGroup(group) + .setAny(any) + .setThreadExecutorClass(threadExecutorClass) + .setValue(condValueStr) + .build() + ).build(); + } else { + chainBuilder.setCondition( + LiteFlowConditionBuilder.createCondition(conditionType) + .setValue(condValueStr) + .build() + ).build(); + } + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java index 29a31ee12..e102ff4e7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java @@ -6,6 +6,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; import com.yomahub.liteflow.builder.LiteFlowChainBuilder; +import com.yomahub.liteflow.builder.prop.ChainPropBean; +import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.spi.holder.ContextCmpInitHolder; @@ -38,105 +40,121 @@ import static com.yomahub.liteflow.common.ChainConstant._CLASS; */ public abstract class JsonFlowParser extends BaseFlowParser { - private final Logger LOG = LoggerFactory.getLogger(JsonFlowParser.class); + private final Logger LOG = LoggerFactory.getLogger(JsonFlowParser.class); - public void parse(String content) throws Exception { - parse(ListUtil.toList(content)); - } + public void parse(String content) throws Exception { + parse(ListUtil.toList(content)); + } - @Override - public void parse(List contentList) throws Exception { - if (CollectionUtil.isEmpty(contentList)) { - return; - } + @Override + public void parse(List contentList) throws Exception { + if (CollectionUtil.isEmpty(contentList)) { + return; + } - List jsonObjectList = ListUtil.toList(); - for (String content : contentList) { - //把字符串原生转换为json对象,如果不加第二个参数OrderedField,会无序 - JSONObject flowJsonObject = JSONObject.parseObject(content, Feature.OrderedField); - jsonObjectList.add(flowJsonObject); - } + List jsonObjectList = ListUtil.toList(); + for (String content : contentList) { + //把字符串原生转换为json对象,如果不加第二个参数OrderedField,会无序 + JSONObject flowJsonObject = JSONObject.parseObject(content, Feature.OrderedField); + jsonObjectList.add(flowJsonObject); + } - parseJsonObject(jsonObjectList); - } + parseJsonObject(jsonObjectList); + } - //json格式,解析过程 - public void parseJsonObject(List flowJsonObjectList) throws Exception { - //在相应的环境下进行节点的初始化工作 - //在spring体系下会获得spring扫描后的节点,接入元数据 - //在非spring体系下是一个空实现,等于不做此步骤 - ContextCmpInitHolder.loadContextCmpInit().initCmp(); + //json格式,解析过程 + public void parseJsonObject(List flowJsonObjectList) throws Exception { + //在相应的环境下进行节点的初始化工作 + //在spring体系下会获得spring扫描后的节点,接入元数据 + //在非spring体系下是一个空实现,等于不做此步骤 + ContextCmpInitHolder.loadContextCmpInit().initCmp(); - //先在元数据里放上chain - //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析 - //这样就不用去像之前的版本那样回归调用 - //同时也解决了不能循环依赖的问题 - flowJsonObjectList.forEach(jsonObject -> { - // 解析chain节点 - JSONArray chainArray = jsonObject.getJSONObject(FLOW).getJSONArray(CHAIN); + //先在元数据里放上chain + //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析 + //这样就不用去像之前的版本那样回归调用 + //同时也解决了不能循环依赖的问题 + flowJsonObjectList.forEach(jsonObject -> { + // 解析chain节点 + JSONArray chainArray = jsonObject.getJSONObject(FLOW).getJSONArray(CHAIN); - //先在元数据里放上chain - chainArray.forEach(o -> { - JSONObject innerJsonObject = (JSONObject) o; - FlowBus.addChain(innerJsonObject.getString(NAME)); - }); - }); + //先在元数据里放上chain + chainArray.forEach(o -> { + JSONObject innerJsonObject = (JSONObject) o; + FlowBus.addChain(innerJsonObject.getString(NAME)); + }); + }); - for (JSONObject flowJsonObject : flowJsonObjectList) { - // 当存在节点定义时,解析node节点 - if (flowJsonObject.getJSONObject(FLOW).containsKey(NODES)) { - JSONArray nodeArrayList = flowJsonObject.getJSONObject(FLOW).getJSONObject(NODES).getJSONArray(NODE); - String id, name, clazz, script, type, file; - for (int i = 0; i < nodeArrayList.size(); i++) { - JSONObject nodeObject = nodeArrayList.getJSONObject(i); - id = nodeObject.getString(ID); - name = nodeObject.getString(NAME); - clazz = nodeObject.getString(_CLASS); - type = nodeObject.getString(TYPE); - script = nodeObject.getString(VALUE); - file = nodeObject.getString(FILE); + for (JSONObject flowJsonObject : flowJsonObjectList) { + // 当存在节点定义时,解析node节点 + if (flowJsonObject.getJSONObject(FLOW).containsKey(NODES)) { + JSONArray nodeArrayList = flowJsonObject.getJSONObject(FLOW).getJSONObject(NODES).getJSONArray(NODE); + String id, name, clazz, script, type, file; + for (int i = 0; i < nodeArrayList.size(); i++) { + JSONObject nodeObject = nodeArrayList.getJSONObject(i); + id = nodeObject.getString(ID); + name = nodeObject.getString(NAME); + clazz = nodeObject.getString(_CLASS); + type = nodeObject.getString(TYPE); + script = nodeObject.getString(VALUE); + file = nodeObject.getString(FILE); - // 构建 node - buildNode(id, name, clazz, script, type, file); - } - } + // 构建 node + NodePropBean nodePropBean = new NodePropBean() + .setId(id) + .setName(name) + .setClazz(clazz) + .setScript(script) + .setType(type) + .setFile(file); - //解析每一个chain - JSONArray chainArray = flowJsonObject.getJSONObject(FLOW).getJSONArray(CHAIN); - chainArray.forEach(o -> { - JSONObject jsonObject = (JSONObject) o; - parseOneChain(jsonObject); - }); - } - } + buildNode(nodePropBean); + } + } + + //解析每一个chain + JSONArray chainArray = flowJsonObject.getJSONObject(FLOW).getJSONArray(CHAIN); + chainArray.forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + parseOneChain(jsonObject); + }); + } + } - /** - * 解析一个chain的过程 - */ - private void parseOneChain(JSONObject chainObject) { - String condValueStr; - ConditionTypeEnum conditionType; - String group; - String errorResume; - String any; - String threadExecutorClass; + /** + * 解析一个chain的过程 + */ + private void parseOneChain(JSONObject chainObject) { + String condValueStr; + ConditionTypeEnum conditionType; + String group; + String errorResume; + String any; + String threadExecutorClass; - //构建chainBuilder - String chainName = chainObject.getString(NAME); - LiteFlowChainBuilder chainBuilder = LiteFlowChainBuilder.createChain().setChainName(chainName); + //构建chainBuilder + String chainName = chainObject.getString(NAME); + LiteFlowChainBuilder chainBuilder = LiteFlowChainBuilder.createChain().setChainName(chainName); - for (Object o : chainObject.getJSONArray(CONDITION)) { - JSONObject condObject = (JSONObject) o; - conditionType = ConditionTypeEnum.getEnumByCode(condObject.getString(TYPE)); - condValueStr = condObject.getString(VALUE); - errorResume = condObject.getString(ERROR_RESUME); - group = condObject.getString(GROUP); - any = condObject.getString(ANY); - threadExecutorClass = condObject.getString(THREAD_EXECUTOR_CLASS); + for (Object o : chainObject.getJSONArray(CONDITION)) { + JSONObject condObject = (JSONObject) o; + conditionType = ConditionTypeEnum.getEnumByCode(condObject.getString(TYPE)); + condValueStr = condObject.getString(VALUE); + errorResume = condObject.getString(ERROR_RESUME); + group = condObject.getString(GROUP); + any = condObject.getString(ANY); + threadExecutorClass = condObject.getString(THREAD_EXECUTOR_CLASS); - // 构建 chain - buildChain(condValueStr, group, errorResume, any, threadExecutorClass, conditionType, chainBuilder); - } - } + ChainPropBean chainPropBean = new ChainPropBean() + .setCondValueStr(condValueStr) + .setGroup(group) + .setErrorResume(errorResume) + .setAny(any) + .setThreadExecutorClass(threadExecutorClass) + .setConditionType(conditionType); + + // 构建 chain + buildChain(chainPropBean, chainBuilder); + } + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java index dbdcd9e35..8d6e583dc 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java @@ -4,6 +4,8 @@ import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.builder.LiteFlowChainBuilder; +import com.yomahub.liteflow.builder.prop.ChainPropBean; +import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.spi.holder.ContextCmpInitHolder; @@ -92,7 +94,15 @@ public abstract class XmlFlowParser extends BaseFlowParser { file = e.attributeValue(FILE); // 构建 node - buildNode(id, name, clazz, script, type, file); + NodePropBean nodePropBean = new NodePropBean() + .setId(id) + .setName(name) + .setClazz(clazz) + .setScript(script) + .setType(type) + .setFile(file); + + buildNode(nodePropBean); } } @@ -126,8 +136,16 @@ public abstract class XmlFlowParser extends BaseFlowParser { any = condE.attributeValue(ANY); threadExecutorClass = condE.attributeValue(THREAD_EXECUTOR_CLASS); + ChainPropBean chainPropBean = new ChainPropBean() + .setCondValueStr(condValueStr) + .setGroup(group) + .setErrorResume(errorResume) + .setAny(any) + .setThreadExecutorClass(threadExecutorClass) + .setConditionType(conditionType); + // 构建 chain - buildChain(condValueStr, group, errorResume, any, threadExecutorClass, conditionType, chainBuilder); + buildChain(chainPropBean, chainBuilder); } }