diff --git a/liteflow-core/pom.xml b/liteflow-core/pom.xml
index a98acb533..b7cbd1f22 100644
--- a/liteflow-core/pom.xml
+++ b/liteflow-core/pom.xml
@@ -62,6 +62,10 @@
com.alibaba
fastjson
+
+ org.yaml
+ snakeyaml
+
dom4j
dom4j
diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java
index 6a9ff0bd2..990653fa7 100644
--- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java
+++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/FlowExecutor.java
@@ -16,6 +16,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists;
import com.yomahub.liteflow.exception.ConfigErrorException;
+import com.yomahub.liteflow.parser.*;
import com.yomahub.liteflow.property.LiteflowConfig;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -29,9 +30,6 @@ import com.yomahub.liteflow.exception.ChainNotFoundException;
import com.yomahub.liteflow.exception.FlowExecutorNotInitException;
import com.yomahub.liteflow.exception.NoAvailableSlotException;
import com.yomahub.liteflow.flow.FlowBus;
-import com.yomahub.liteflow.parser.LocalXmlFlowParser;
-import com.yomahub.liteflow.parser.XmlFlowParser;
-import com.yomahub.liteflow.parser.ZookeeperXmlFlowParser;
/**
* 流程规则主要执行器类
@@ -53,13 +51,18 @@ public class FlowExecutor {
List rulePath = Lists.newArrayList(liteflowConfig.getRuleSource().split(",|;"));
- XmlFlowParser parser = null;
+// XmlFlowParser parser = null;
+ FlowParser parser = null;
for(String path : rulePath){
try {
if(isLocalConfig(path)) { //判断是否是本地的xml文件
parser = new LocalXmlFlowParser();
- }else if(isZKConfig(path)){ //判断是否是zk配置
+ } else if(isLocalJsonConfig(path)) {
+ parser = new LocalJsonFlowParser();
+ } else if(isLocalYmlConfig(path)) {
+ parser = new LocalYmlFlowParser();
+ } else if(isZKConfig(path)){ //判断是否是zk配置
if(StringUtils.isNotBlank(zkNode)) {
parser = new ZookeeperXmlFlowParser(zkNode);
}else {
@@ -90,6 +93,18 @@ public class FlowExecutor {
return m.find();
}
+ private boolean isLocalJsonConfig(String path) {
+ Pattern p = Pattern.compile("^[\\w_\\-\\@\\/]+\\.json$");
+ Matcher m = p.matcher(path);
+ return m.find();
+ }
+
+ private boolean isLocalYmlConfig(String path) {
+ Pattern p = Pattern.compile("^[\\w_\\-\\@\\/]+\\.yml$");
+ Matcher m = p.matcher(path);
+ return m.find();
+ }
+
private boolean isClassConfig(String path) {
Pattern p = Pattern.compile("^\\w+(\\.\\w+)*$");
Matcher m = p.matcher(path);
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
new file mode 100644
index 000000000..e5eaeb605
--- /dev/null
+++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/FlowParser.java
@@ -0,0 +1,38 @@
+package com.yomahub.liteflow.parser;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Author: guodongqing
+ * @Date: 2021/3/25 4:47 下午
+ */
+public abstract class FlowParser {
+
+ public abstract void parseMain(String path) throws Exception;
+
+ public abstract void parse(String content) throws Exception ;
+
+ //条件节点的正则解析
+ public static RegexEntity parseNodeStr(String str) {
+ List list = new ArrayList();
+ Pattern p = Pattern.compile("[^\\)\\(]+");
+ Matcher m = p.matcher(str);
+ while(m.find()){
+ list.add(m.group());
+ }
+ RegexEntity regexEntity = new RegexEntity();
+ regexEntity.setItem(list.get(0).trim());
+ if(list.size() > 1){
+ String[] realNodeArray = list.get(1).split("\\|");
+ for (int i = 0; i < realNodeArray.length; i++) {
+ realNodeArray[i] = realNodeArray[i].trim();
+ }
+ regexEntity.setRealItemArray(realNodeArray);
+ }
+ return regexEntity;
+ }
+
+}
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
new file mode 100644
index 000000000..2943c0ea6
--- /dev/null
+++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java
@@ -0,0 +1,175 @@
+package com.yomahub.liteflow.parser;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.parser.Feature;
+import com.yomahub.liteflow.core.NodeComponent;
+import com.yomahub.liteflow.entity.flow.*;
+import com.yomahub.liteflow.exception.ExecutableItemNotFoundException;
+import com.yomahub.liteflow.exception.ParseException;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.spring.ComponentScaner;
+import com.yomahub.liteflow.util.SpringAware;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.*;
+
+/**
+ * Json格式解析器
+ * @Author: guodongqing
+ * @Date: 2021-03-25 16:40:00
+ */
+public abstract class JsonFlowParser extends FlowParser{
+
+ private final Logger LOG = LoggerFactory.getLogger(JsonFlowParser.class);
+
+ @Override
+ public void parse(String content) throws Exception {
+ //把字符串原生转换为json对象,如果不加第二个参数OrderedField,会无序
+ JSONObject flowJsonObject = JSONObject.parseObject(content, Feature.OrderedField);
+ parse(flowJsonObject);
+ }
+
+ /**
+ * json格式,解析过程
+ * @param flowJsonObject
+ * @throws Exception
+ */
+ public void parse(JSONObject flowJsonObject) throws Exception {
+ try {
+ //判断是以spring方式注册节点,还是以json方式注册
+ if(ComponentScaner.nodeComponentMap.isEmpty()){
+ JSONArray nodeArrayList = flowJsonObject.getJSONObject("nodes").getJSONArray("node");
+ String id;
+ String clazz;
+ Node node;
+ NodeComponent component;
+ Class nodeComponentClass;
+ for(int i = 0; i< nodeArrayList.size(); i++) {
+ JSONObject nodeObject = nodeArrayList.getJSONObject(i);
+ node = new Node();
+ id = nodeObject.getString("id");
+ clazz = nodeObject.getString("class");
+ node.setId(id);
+ node.setClazz(clazz);
+ nodeComponentClass = (Class)Class.forName(clazz);
+ component = SpringAware.registerOrGet(nodeComponentClass);
+ if (component == null) {
+ LOG.error("couldn't find component class [{}] ", clazz);
+ throw new ParseException("cannot parse flow json");
+ }
+ component.setNodeId(id);
+ node.setInstance(component);
+ FlowBus.addNode(id, node);
+ }
+ } else {
+ for(Map.Entry componentEntry : ComponentScaner.nodeComponentMap.entrySet()){
+ if(!FlowBus.containNode(componentEntry.getKey())){
+ FlowBus.addNode(componentEntry.getKey(), new Node(componentEntry.getKey(), componentEntry.getValue().getClass().getName(), componentEntry.getValue()));
+ }
+ }
+ }
+
+ // 解析chain节点
+ JSONArray chainList = flowJsonObject.getJSONObject("flow").getJSONArray("chain");
+ Map chainMap = new HashMap<>();
+ for(int i=0; i chainEntry : chainMap.entrySet()) {
+ parseOneChain(chainEntry.getValue(), chainMap);
+ }
+
+ } catch (Exception e) {
+ LOG.error("JsonFlowParser parser exception", e);
+ throw e;
+ }
+ }
+
+ /**
+ * 解析一个chain的过程
+ * @param chainObject
+ * @param chainMap
+ * @throws Exception
+ */
+ private void parseOneChain(JSONObject chainObject, Map chainMap) throws Exception{
+ String condArrayStr;
+ String[] condArray;
+ List chainNodeList;
+ List conditionList;
+ String chainName = chainObject.getString("name");
+ JSONArray chainTopoArray = chainObject.getJSONArray("topo");
+ conditionList = new ArrayList<>();
+ for(Iterator
+
+ org.yaml
+ snakeyaml
+ ${snakeyaml.version}
+
dom4j
dom4j