浏览代码

feature #I4GYV2 script节点支持从文件中获取脚本

bryan31 3 年之前
父节点
当前提交
169a47a412
共有 36 个文件被更改,包括 597 次插入11 次删除
  1. 13 4
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java
  2. 13 4
      liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java
  3. 70 0
      liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptFileGroovyTest.java
  4. 1 1
      liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptGroovyTest.java
  5. 70 0
      liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptFileGroovyTest.java
  6. 2 2
      liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptGroovyTest.java
  7. 1 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/application.properties
  8. 34 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow.json
  9. 40 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow_update.json
  10. 3 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/s1.groovy
  11. 6 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2.groovy
  12. 6 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2_update.groovy
  13. 4 0
      liteflow-testcase-script-groovy/src/test/resources/json-script-file/s3.groovy
  14. 1 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/application.properties
  15. 15 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow.xml
  16. 16 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow_update.xml
  17. 3 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s1.groovy
  18. 6 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2.groovy
  19. 6 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2_update.groovy
  20. 4 0
      liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s3.groovy
  21. 69 0
      liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowJsonScriptFileQLExpressTest.java
  22. 69 0
      liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowXmlScriptFileQLExpressTest.java
  23. 1 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/application.properties
  24. 34 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow.json
  25. 40 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow_update.json
  26. 3 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s1.ql
  27. 6 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2.ql
  28. 6 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2_update.ql
  29. 4 0
      liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s3.ql
  30. 1 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/application.properties
  31. 15 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow.xml
  32. 16 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow_update.xml
  33. 3 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s1.ql
  34. 6 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2.ql
  35. 6 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2_update.ql
  36. 4 0
      liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s3.ql

+ 13 - 4
liteflow-core/src/main/java/com/yomahub/liteflow/parser/JsonFlowParser.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.io.resource.ResourceUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONArray;
@@ -63,13 +64,14 @@ public abstract class JsonFlowParser extends FlowParser {
                 // 当存在<nodes>节点定义时,解析node节点
                 if (flowJsonObject.getJSONObject("flow").containsKey("nodes")){
                     JSONArray nodeArrayList = flowJsonObject.getJSONObject("flow").getJSONObject("nodes").getJSONArray("node");
-                    String id, name, clazz, script, type;
+                    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");
+                        file = nodeObject.getString("file");
 
                         //初始化type
                         if (StrUtil.isBlank(type)){
@@ -86,12 +88,19 @@ public abstract class JsonFlowParser extends FlowParser {
                             if (!FlowBus.containNode(id)){
                                 FlowBus.addCommonNode(id, name, clazz);
                             }
-                        }else{
+                        }else if(nodeTypeEnum.equals(NodeTypeEnum.SCRIPT) || nodeTypeEnum.equals(NodeTypeEnum.COND_SCRIPT)){
                             if (!FlowBus.containNode(id)){
-                                script = nodeObject.getString("value");
+                                //如果file字段不为空,则优先从file里面读取脚本文本
+                                if (StrUtil.isNotBlank(file)){
+                                    script = ResourceUtil.readUtf8Str(StrUtil.format("classpath: {}", file));
+                                }else{
+                                    script = nodeObject.getString("value");
+                                }
+
+                                //根据节点类型把脚本添加到元数据里
                                 if (nodeTypeEnum.equals(NodeTypeEnum.SCRIPT)){
                                     FlowBus.addCommonScriptNode(id, name, script);
-                                }else if(nodeTypeEnum.equals(NodeTypeEnum.COND_SCRIPT)){
+                                }else {
                                     FlowBus.addCondScriptNode(id, name, script);
                                 }
                             }

+ 13 - 4
liteflow-core/src/main/java/com/yomahub/liteflow/parser/XmlFlowParser.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.parser;
 
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.io.resource.ResourceUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.yomahub.liteflow.common.LocalDefaultFlowConstant;
@@ -68,12 +69,13 @@ public abstract class XmlFlowParser extends FlowParser {
             // 当存在<nodes>节点定义时,解析node节点
             if (ObjectUtil.isNotNull(nodesElement)){
                 List<Element> nodeList = nodesElement.elements("node");
-                String id, name, clazz, type, script;
+                String id, name, clazz, type, script, file;
                 for (Element e : nodeList) {
                     id = e.attributeValue("id");
                     name = e.attributeValue("name");
                     clazz = e.attributeValue("class");
                     type = e.attributeValue("type");
+                    file = e.attributeValue("file");
 
                     //初始化type
                     if (StrUtil.isBlank(type)){
@@ -90,12 +92,19 @@ public abstract class XmlFlowParser extends FlowParser {
                         if (!FlowBus.containNode(id)){
                             FlowBus.addCommonNode(id, name, clazz);
                         }
-                    }else{
+                    }else if(nodeTypeEnum.equals(NodeTypeEnum.SCRIPT) || nodeTypeEnum.equals(NodeTypeEnum.COND_SCRIPT)){
                         if (!FlowBus.containNode(id)){
-                            script = e.getTextTrim();
+                            //如果file字段不为空,则优先从file里面读取脚本文本
+                            if (StrUtil.isNotBlank(file)){
+                                script = ResourceUtil.readUtf8Str(StrUtil.format("classpath: {}", file));
+                            }else{
+                                script = e.getTextTrim();
+                            }
+
+                            //根据节点类型把脚本添加到元数据里
                             if (nodeTypeEnum.equals(NodeTypeEnum.SCRIPT)){
                                 FlowBus.addCommonScriptNode(id, name, script);
-                            }else if(nodeTypeEnum.equals(NodeTypeEnum.COND_SCRIPT)){
+                            }else {
                                 FlowBus.addCondScriptNode(id, name, script);
                             }
                         }

+ 70 - 0
liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptFileGroovyTest.java

@@ -0,0 +1,70 @@
+package com.yomahub.liteflow.test.script.groovy;
+
+import cn.hutool.core.io.resource.ResourceUtil;
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.entity.data.DefaultSlot;
+import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.enums.FlowParserTypeEnum;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 测试springboot下的groovy脚本组件,基于json配置
+ * @author Bryan.Zhang
+ * @since 2.6.4
+ */
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/json-script-file/application.properties")
+@SpringBootTest(classes = LiteflowJsonScriptFileGroovyTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.script.groovy.cmp"})
+public class LiteflowJsonScriptFileGroovyTest extends BaseTest {
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    //测试普通脚本节点
+    @Test
+    public void testScript1() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain1", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1"));
+    }
+
+    //测试条件脚本节点
+    @Test
+    public void testScript2() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>a", response.getSlot().printStep());
+    }
+
+    //测试脚本的热重载
+    @Test
+    public void testScript3() throws Exception{
+        //根据配置,加载的应该是flow.xml,执行原来的规则
+        LiteflowResponse<DefaultSlot> responseOld = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseOld.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>a", responseOld.getSlot().printStep());
+        //更改规则,重新加载,更改的规则内容从flow_update.xml里读取,这里只是为了模拟下获取新的内容。不一定是从文件中读取
+        String newContent = ResourceUtil.readUtf8Str("classpath: /json-script-file/flow_update.json");
+        //进行刷新
+        FlowBus.refreshFlowMetaData(FlowParserTypeEnum.TYPE_JSON, newContent);
+
+        //重新执行chain2这个链路,结果会变
+        LiteflowResponse<DefaultSlot> responseNew = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseNew.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本_改]==>b==>s3[普通脚本_新增]", responseNew.getSlot().printStep());
+    }
+}

+ 1 - 1
liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptGroovyTest.java

@@ -20,7 +20,7 @@ import javax.annotation.Resource;
 
 
 /**
- * 测试springboot下的脚本组件,基于json配置
+ * 测试springboot下的groovy脚本组件,基于json配置
  * @author Bryan.Zhang
  * @since 2.6.4
  */

+ 70 - 0
liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptFileGroovyTest.java

@@ -0,0 +1,70 @@
+package com.yomahub.liteflow.test.script.groovy;
+
+import cn.hutool.core.io.resource.ResourceUtil;
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.entity.data.DefaultSlot;
+import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.enums.FlowParserTypeEnum;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 测试springboot下的groovy脚本组件,基于xml配置,file脚本
+ * @author Bryan.Zhang
+ * @since 2.6.4
+ */
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/xml-script-file/application.properties")
+@SpringBootTest(classes = LiteflowXmlScriptFileGroovyTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.script.groovy.cmp"})
+public class LiteflowXmlScriptFileGroovyTest extends BaseTest {
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    //测试普通脚本节点
+    @Test
+    public void testScript1() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain1", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1"));
+    }
+
+    //测试条件脚本节点
+    @Test
+    public void testScript2() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>a", response.getSlot().printStep());
+    }
+
+    //测试脚本的热重载
+    @Test
+    public void testScript3() throws Exception{
+        //根据配置,加载的应该是flow.xml,执行原来的规则
+        LiteflowResponse<DefaultSlot> responseOld = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseOld.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>a", responseOld.getSlot().printStep());
+        //更改规则,重新加载,更改的规则内容从flow_update.xml里读取,这里只是为了模拟下获取新的内容。不一定是从文件中读取
+        String newContent = ResourceUtil.readUtf8Str("classpath: /xml-script-file/flow_update.xml");
+        //进行刷新
+        FlowBus.refreshFlowMetaData(FlowParserTypeEnum.TYPE_XML, newContent);
+
+        //重新执行chain2这个链路,结果会变
+        LiteflowResponse<DefaultSlot> responseNew = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseNew.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本_改]==>b==>s3[普通脚本_新增]", responseNew.getSlot().printStep());
+    }
+}

+ 2 - 2
liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptGroovyTest.java

@@ -20,12 +20,12 @@ import javax.annotation.Resource;
 
 
 /**
- * 测试springboot下的脚本组件,基于xml配置
+ * 测试springboot下的groovy脚本组件,基于xml配置
  * @author Bryan.Zhang
  * @since 2.6.0
  */
 @RunWith(SpringRunner.class)
-@TestPropertySource(value = "classpath:/json-script/application.properties")
+@TestPropertySource(value = "classpath:/xml-script/application.properties")
 @SpringBootTest(classes = LiteflowXmlScriptGroovyTest.class)
 @EnableAutoConfiguration
 @ComponentScan({"com.yomahub.liteflow.test.script.groovy.cmp"})

+ 1 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=json-script-file/flow.json

+ 34 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow.json

@@ -0,0 +1,34 @@
+{
+  "flow": {
+    "nodes": {
+      "node": [
+        {
+          "id": "s1",
+          "name": "普通脚本",
+          "type": "script",
+          "file": "json-script-file/s1.groovy"
+        },
+        {
+          "id": "s2",
+          "name": "条件脚本",
+          "type": "cond_script",
+          "file": "json-script-file/s2.groovy"
+        }
+      ]
+    },
+    "chain": [
+      {
+        "name": "chain1",
+        "condition": [
+          {"type": "then", "value": "a,b,c,s1"}
+        ]
+      },
+      {
+        "name": "chain2",
+        "condition": [
+          {"type": "then", "value": "d,s2(a|b)"}
+        ]
+      }
+    ]
+  }
+}

+ 40 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow_update.json

@@ -0,0 +1,40 @@
+{
+  "flow": {
+    "nodes": {
+      "node": [
+        {
+          "id": "s1",
+          "name": "普通脚本",
+          "type": "script",
+          "file": "json-script-file/s1.groovy"
+        },
+        {
+          "id": "s2",
+          "name": "条件脚本_改",
+          "type": "cond_script",
+          "file": "json-script-file/s2_update.groovy"
+        },
+        {
+          "id": "s3",
+          "name": "普通脚本_新增",
+          "type": "script",
+          "file": "json-script-file/s2_update.groovy"
+        }
+      ]
+    },
+    "chain": [
+      {
+        "name": "chain1",
+        "condition": [
+          {"type": "then", "value": "a,b,c,s1"}
+        ]
+      },
+      {
+        "name": "chain2",
+        "condition": [
+          {"type": "then", "value": "d,s2(a|b),s3"}
+        ]
+      }
+    ]
+  }
+}

+ 3 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/s1.groovy

@@ -0,0 +1,3 @@
+Integer a=3
+Integer b=2
+slot.setData("s1",a*b)

+ 6 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2.groovy

@@ -0,0 +1,6 @@
+Integer count = slot.getData("count")
+if(count > 100){
+    return "a"
+}else{
+    return "b"
+}

+ 6 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2_update.groovy

@@ -0,0 +1,6 @@
+Integer count = slot.getData("count")
+if(count > 150){
+    return "b"
+}else{
+    return "a"
+}

+ 4 - 0
liteflow-testcase-script-groovy/src/test/resources/json-script-file/s3.groovy

@@ -0,0 +1,4 @@
+Integer a=3
+Integer b=2
+Integer c=10
+slot.setData("s1",a*b+c)

+ 1 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=xml-script-file/flow.xml

+ 15 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="s1" name="普通脚本" type="script" file="xml-script-file/s1.groovy"/>
+        <node id="s2" name="条件脚本" type="cond_script" file="xml-script-file/s2.groovy"/>
+    </nodes>
+
+    <chain name="chain1">
+        <then value="a,b,c,s1"/>
+    </chain>
+
+    <chain name="chain2">
+        <then value="d,s2(a|b)"/>
+    </chain>
+</flow>

+ 16 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow_update.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="s1" name="普通脚本" type="script" file="xml-script-file/s1.groovy"/>
+        <node id="s2" name="条件脚本_改" type="cond_script" file="xml-script-file/s2_update.groovy"/>
+        <node id="s3" name="普通脚本_新增" type="script" file="xml-script-file/s3.groovy"/>
+    </nodes>
+
+    <chain name="chain1">
+        <then value="a,b,c,s1"/>
+    </chain>
+
+    <chain name="chain2">
+        <then value="d,s2(a|b),s3"/>
+    </chain>
+</flow>

+ 3 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s1.groovy

@@ -0,0 +1,3 @@
+Integer a=3
+Integer b=2
+slot.setData("s1",a*b)

+ 6 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2.groovy

@@ -0,0 +1,6 @@
+Integer count = slot.getData("count")
+if(count > 100){
+    return "a"
+}else{
+    return "b"
+}

+ 6 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2_update.groovy

@@ -0,0 +1,6 @@
+Integer count = slot.getData("count")
+if(count > 150){
+    return "b"
+}else{
+    return "a"
+}

+ 4 - 0
liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s3.groovy

@@ -0,0 +1,4 @@
+Integer a=3
+Integer b=2
+Integer c=10
+slot.setData("s1",a*b+c);

+ 69 - 0
liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowJsonScriptFileQLExpressTest.java

@@ -0,0 +1,69 @@
+package com.yomahub.liteflow.test.script.qlexpress;
+
+import cn.hutool.core.io.resource.ResourceUtil;
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.entity.data.DefaultSlot;
+import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.enums.FlowParserTypeEnum;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 测试springboot下的脚本组件
+ * @author Bryan.Zhang
+ * @since 2.6.0
+ */
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/json-script-file/application.properties")
+@SpringBootTest(classes = LiteflowJsonScriptFileQLExpressTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.script.qlexpress.cmp"})
+public class LiteflowJsonScriptFileQLExpressTest extends BaseTest {
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    //测试普通脚本节点
+    @Test
+    public void testScript1() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain1", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1"));
+    }
+
+    //测试条件脚本节点
+    @Test
+    public void testScript2() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>b", response.getSlot().printStep());
+    }
+
+    @Test
+    public void testScript3() throws Exception{
+        //根据配置,加载的应该是flow.xml,执行原来的规则
+        LiteflowResponse<DefaultSlot> responseOld = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseOld.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>b", responseOld.getSlot().printStep());
+        //更改规则,重新加载,更改的规则内容从flow_update.xml里读取,这里只是为了模拟下获取新的内容。不一定是从文件中读取
+        String newContent = ResourceUtil.readUtf8Str("classpath: /json-script-file/flow_update.json");
+        //进行刷新
+        FlowBus.refreshFlowMetaData(FlowParserTypeEnum.TYPE_JSON, newContent);
+
+        //重新执行chain2这个链路,结果会变
+        LiteflowResponse<DefaultSlot> responseNew = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseNew.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本_改]==>a==>s3[普通脚本_新增]", responseNew.getSlot().printStep());
+    }
+}

+ 69 - 0
liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowXmlScriptFileQLExpressTest.java

@@ -0,0 +1,69 @@
+package com.yomahub.liteflow.test.script.qlexpress;
+
+import cn.hutool.core.io.resource.ResourceUtil;
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.entity.data.DefaultSlot;
+import com.yomahub.liteflow.entity.data.LiteflowResponse;
+import com.yomahub.liteflow.enums.FlowParserTypeEnum;
+import com.yomahub.liteflow.flow.FlowBus;
+import com.yomahub.liteflow.test.BaseTest;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.test.context.TestPropertySource;
+import org.springframework.test.context.junit4.SpringRunner;
+
+import javax.annotation.Resource;
+
+
+/**
+ * 测试springboot下的脚本组件
+ * @author Bryan.Zhang
+ * @since 2.6.0
+ */
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/xml-script-file/application.properties")
+@SpringBootTest(classes = LiteflowXmlScriptFileQLExpressTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.script.qlexpress.cmp"})
+public class LiteflowXmlScriptFileQLExpressTest extends BaseTest {
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    //测试普通脚本节点
+    @Test
+    public void testScript1() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain1", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1"));
+    }
+
+    //测试条件脚本节点
+    @Test
+    public void testScript2() {
+        LiteflowResponse<DefaultSlot> response = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(response.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>b", response.getSlot().printStep());
+    }
+
+    @Test
+    public void testScript3() throws Exception{
+        //根据配置,加载的应该是flow.xml,执行原来的规则
+        LiteflowResponse<DefaultSlot> responseOld = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseOld.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本]==>b", responseOld.getSlot().printStep());
+        //更改规则,重新加载,更改的规则内容从flow_update.xml里读取,这里只是为了模拟下获取新的内容。不一定是从文件中读取
+        String newContent = ResourceUtil.readUtf8Str("classpath: /xml-script-file/flow_update.xml");
+        //进行刷新
+        FlowBus.refreshFlowMetaData(FlowParserTypeEnum.TYPE_XML, newContent);
+
+        //重新执行chain2这个链路,结果会变
+        LiteflowResponse<DefaultSlot> responseNew = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(responseNew.isSuccess());
+        Assert.assertEquals("d==>s2[条件脚本_改]==>a==>s3[普通脚本_新增]", responseNew.getSlot().printStep());
+    }
+}

+ 1 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=json-script-file/flow.json

+ 34 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow.json

@@ -0,0 +1,34 @@
+{
+  "flow": {
+    "nodes": {
+      "node": [
+        {
+          "id": "s1",
+          "name": "普通脚本",
+          "type": "script",
+          "file": "json-script-file/s1.ql"
+        },
+        {
+          "id": "s2",
+          "name": "条件脚本",
+          "type": "cond_script",
+          "file": "json-script-file/s2.ql"
+        }
+      ]
+    },
+    "chain": [
+      {
+        "name": "chain1",
+        "condition": [
+          {"type": "then", "value": "a,b,c,s1"}
+        ]
+      },
+      {
+        "name": "chain2",
+        "condition": [
+          {"type": "then", "value": "d,s2(a|b)"}
+        ]
+      }
+    ]
+  }
+}

+ 40 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow_update.json

@@ -0,0 +1,40 @@
+{
+  "flow": {
+    "nodes": {
+      "node": [
+        {
+          "id": "s1",
+          "name": "普通脚本",
+          "type": "script",
+          "file": "json-script-file/s1.ql"
+        },
+        {
+          "id": "s2",
+          "name": "条件脚本_改",
+          "type": "cond_script",
+          "file": "json-script-file/s2_update.ql"
+        },
+        {
+          "id": "s3",
+          "name": "普通脚本_新增",
+          "type": "script",
+          "file": "json-script-file/s3.ql"
+        }
+      ]
+    },
+    "chain": [
+      {
+        "name": "chain1",
+        "condition": [
+          {"type": "then", "value": "a,b,c,s1"}
+        ]
+      },
+      {
+        "name": "chain2",
+        "condition": [
+          {"type": "then", "value": "d,s2(a|b),s3"}
+        ]
+      }
+    ]
+  }
+}

+ 3 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s1.ql

@@ -0,0 +1,3 @@
+a=3;
+b=2;
+slot.setData("s1",a*b);

+ 6 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2.ql

@@ -0,0 +1,6 @@
+count = slot.getData("count");
+if(count > 100){
+    return "a";
+}else{
+    return "b";
+}

+ 6 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2_update.ql

@@ -0,0 +1,6 @@
+count = slot.getData("count");
+if(count > 150){
+    return "b";
+}else{
+    return "a";
+}

+ 4 - 0
liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s3.ql

@@ -0,0 +1,4 @@
+a=3;
+b=2;
+c=10;
+slot.setData("s1",a*b+c);

+ 1 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=xml-script-file/flow.xml

+ 15 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="s1" name="普通脚本" type="script" file="xml-script-file/s1.ql"/>
+        <node id="s2" name="条件脚本" type="cond_script" file="xml-script-file/s2.ql"/>
+    </nodes>
+
+    <chain name="chain1">
+        <then value="a,b,c,s1"/>
+    </chain>
+
+    <chain name="chain2">
+        <then value="d,s2(a|b)"/>
+    </chain>
+</flow>

+ 16 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow_update.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+    <nodes>
+        <node id="s1" name="普通脚本" type="script" file="xml-script-file/s1.ql"/>
+        <node id="s2" name="条件脚本_改" type="cond_script" file="xml-script-file/s2_update.ql"/>
+        <node id="s3" name="普通脚本_新增" type="script" file="xml-script-file/s3.ql"/>
+    </nodes>
+
+    <chain name="chain1">
+        <then value="a,b,c,s1"/>
+    </chain>
+
+    <chain name="chain2">
+        <then value="d,s2(a|b),s3"/>
+    </chain>
+</flow>

+ 3 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s1.ql

@@ -0,0 +1,3 @@
+a=3;
+b=2;
+slot.setData("s1",a*b);

+ 6 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2.ql

@@ -0,0 +1,6 @@
+count = slot.getData("count");
+if(count > 100){
+    return "a";
+}else{
+    return "b";
+}

+ 6 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2_update.ql

@@ -0,0 +1,6 @@
+count = slot.getData("count");
+if(count > 150){
+    return "b";
+}else{
+    return "a";
+}

+ 4 - 0
liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s3.ql

@@ -0,0 +1,4 @@
+a=3;
+b=2;
+c=10;
+slot.setData("s1",a*b+c);