From b911d464026a80da88127fac2301f229809e8b54 Mon Sep 17 00:00:00 2001 From: bryan31 Date: Fri, 21 May 2021 14:08:14 +0800 Subject: [PATCH] =?UTF-8?q?enhancement=20#I3S5G8=20=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=B9=B3=E6=BB=91=E5=88=B7=E6=96=B0=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 135 ++++++++++-------- .../yomahub/liteflow/parser/FlowParser.java | 2 +- .../liteflow/parser/XmlFlowParser.java | 6 +- 3 files changed, 80 insertions(+), 63 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 0153b019d..f29114139 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -1,6 +1,7 @@ /** *

Title: liteflow

*

Description: 轻量级的组件式流程框架

+ * * @author Bryan.Zhang * @email weenyc31@163.com * @Date 2020/4/1 @@ -13,7 +14,11 @@ import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.entity.flow.Chain; import com.yomahub.liteflow.entity.flow.Node; +import com.yomahub.liteflow.enums.FlowParserTypeEnum; import com.yomahub.liteflow.exception.ComponentCannotRegisterException; +import com.yomahub.liteflow.parser.LocalJsonFlowParser; +import com.yomahub.liteflow.parser.LocalXmlFlowParser; +import com.yomahub.liteflow.parser.LocalYmlFlowParser; import com.yomahub.liteflow.util.SpringAware; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,75 +32,85 @@ import java.util.Map; */ public class FlowBus { - private static final Logger LOG = LoggerFactory.getLogger(FlowBus.class); + private static final Logger LOG = LoggerFactory.getLogger(FlowBus.class); - private static final Map chainMap = new HashMap<>(); + private static final Map chainMap = new HashMap<>(); - private static final Map nodeMap = new HashMap<>(); - - private FlowBus() { - } - - public static Chain getChain(String id) throws Exception { - if (MapUtil.isEmpty(chainMap)) { - throw new Exception("please config the rule first"); - } - return chainMap.get(id); - } + private static final Map nodeMap = new HashMap<>(); - public static void addChain(String name,Chain chain){ - chainMap.put(name, chain); - } + private FlowBus() { + } - public static boolean containChain(String chainId){ - return chainMap.containsKey(chainId); - } + public static Chain getChain(String id) throws Exception { + if (MapUtil.isEmpty(chainMap)) { + throw new Exception("please config the rule first"); + } + return chainMap.get(id); + } - public static boolean needInit() { - return MapUtil.isEmpty(chainMap); - } + public static void addChain(String name, Chain chain) { + chainMap.put(name, chain); + } - public static boolean containNode(String nodeId) { - return nodeMap.containsKey(nodeId); - } + public static boolean containChain(String chainId) { + return chainMap.containsKey(chainId); + } - public static void addNode(String nodeId, Node node) { - if (containNode(nodeId)) return; - nodeMap.put(nodeId, node); - } + public static boolean needInit() { + return MapUtil.isEmpty(chainMap); + } - public static void addNode(String nodeId, String cmpClazzStr) throws Exception{ - if (containNode(nodeId)) return; - Class cmpClazz = (Class)Class.forName(cmpClazzStr); - addNode(nodeId, cmpClazz); - } + public static boolean containNode(String nodeId) { + return nodeMap.containsKey(nodeId); + } - public static void addNode(String nodeId, Class cmpClazz){ - if (containNode(nodeId)) return; - try{ - //以node方式配置,本质上是为了适配无spring的环境,如果有spring环境,其实不用这么配置 - //这里的逻辑是判断是否能从spring上下文中取到,如果没有spring,则就是new instance了 - NodeComponent cmpInstance = SpringAware.registerOrGet(cmpClazz); - if (ObjectUtil.isNull(cmpInstance)) { - LOG.warn("couldn't find component class [{}] from spring context", cmpClazz.getName()); - cmpInstance = cmpClazz.newInstance(); - } - cmpInstance.setNodeId(nodeId); - cmpInstance.setSelf(cmpInstance); - nodeMap.put(nodeId, new Node(nodeId, cmpClazz.getName(), cmpInstance)); - }catch (Exception e){ - String error = StrUtil.format("component[{}] register error", cmpClazz.getName()); - LOG.error(error, e); - throw new ComponentCannotRegisterException(error); - } - } + public static void addNode(String nodeId, Node node) { + if (containNode(nodeId)) return; + nodeMap.put(nodeId, node); + } - public static Node getNode(String nodeId) { - return nodeMap.get(nodeId); - } + public static void addNode(String nodeId, String cmpClazzStr) throws Exception { + if (containNode(nodeId)) return; + Class cmpClazz = (Class) Class.forName(cmpClazzStr); + addNode(nodeId, cmpClazz); + } - public static void cleanCache(){ - chainMap.clear(); - nodeMap.clear(); - } + public static void addNode(String nodeId, Class cmpClazz) { + if (containNode(nodeId)) return; + try { + //以node方式配置,本质上是为了适配无spring的环境,如果有spring环境,其实不用这么配置 + //这里的逻辑是判断是否能从spring上下文中取到,如果没有spring,则就是new instance了 + NodeComponent cmpInstance = SpringAware.registerOrGet(cmpClazz); + if (ObjectUtil.isNull(cmpInstance)) { + LOG.warn("couldn't find component class [{}] from spring context", cmpClazz.getName()); + cmpInstance = cmpClazz.newInstance(); + } + cmpInstance.setNodeId(nodeId); + cmpInstance.setSelf(cmpInstance); + nodeMap.put(nodeId, new Node(nodeId, cmpClazz.getName(), cmpInstance)); + } catch (Exception e) { + String error = StrUtil.format("component[{}] register error", cmpClazz.getName()); + LOG.error(error, e); + throw new ComponentCannotRegisterException(error); + } + } + + public static Node getNode(String nodeId) { + return nodeMap.get(nodeId); + } + + public static void cleanCache() { + chainMap.clear(); + nodeMap.clear(); + } + + public static void refreshFlowMetaData(FlowParserTypeEnum type, String content) throws Exception { + if (type.equals(FlowParserTypeEnum.TYPE_XML)) { + new LocalXmlFlowParser().parse(content); + } else if (type.equals(FlowParserTypeEnum.TYPE_JSON)) { + new LocalJsonFlowParser().parse(content); + } else if (type.equals(FlowParserTypeEnum.TYPE_YML)) { + new LocalYmlFlowParser().parse(content); + } + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java index 7d89d3443..537a0cfa9 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java @@ -29,7 +29,7 @@ public abstract class FlowParser { public abstract void parse(String content) throws Exception ; //条件节点的正则解析 - public static RegexEntity parseNodeStr(String str) { + public RegexEntity parseNodeStr(String str) { List list = new ArrayList(); Pattern p = Pattern.compile("[^\\)\\(]+"); Matcher m = p.matcher(str); 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 fdab15e00..5af609625 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 @@ -9,6 +9,7 @@ import com.yomahub.liteflow.entity.flow.Condition; import com.yomahub.liteflow.entity.flow.Executable; import com.yomahub.liteflow.entity.flow.Node; import com.yomahub.liteflow.exception.ExecutableItemNotFoundException; +import com.yomahub.liteflow.exception.ParseException; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.spring.ComponentScanner; import com.yomahub.liteflow.util.SpringAware; @@ -67,8 +68,9 @@ public abstract class XmlFlowParser extends FlowParser{ parseOneChain(e); } } catch (Exception e) { - LOG.error("FlowParser parser exception", e); - throw e; + String errorMsg = "FlowParser parser exception"; + LOG.error(errorMsg, e); + throw new ParseException(errorMsg); } }