From 169a47a4124b8791a8745dc210ea0342dedfeb10 Mon Sep 17 00:00:00 2001 From: bryan31 Date: Fri, 5 Nov 2021 13:15:52 +0800 Subject: [PATCH] =?UTF-8?q?feature=20#I4GYV2=20script=E8=8A=82=E7=82=B9?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=BB=8E=E6=96=87=E4=BB=B6=E4=B8=AD=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/parser/JsonFlowParser.java | 17 +++-- .../liteflow/parser/XmlFlowParser.java | 17 +++-- .../LiteflowJsonScriptFileGroovyTest.java | 70 +++++++++++++++++++ .../groovy/LiteflowJsonScriptGroovyTest.java | 2 +- .../LiteflowXmlScriptFileGroovyTest.java | 70 +++++++++++++++++++ .../groovy/LiteflowXmlScriptGroovyTest.java | 4 +- .../json-script-file/application.properties | 1 + .../test/resources/json-script-file/flow.json | 34 +++++++++ .../json-script-file/flow_update.json | 40 +++++++++++ .../test/resources/json-script-file/s1.groovy | 3 + .../test/resources/json-script-file/s2.groovy | 6 ++ .../json-script-file/s2_update.groovy | 6 ++ .../test/resources/json-script-file/s3.groovy | 4 ++ .../xml-script-file/application.properties | 1 + .../test/resources/xml-script-file/flow.xml | 15 ++++ .../resources/xml-script-file/flow_update.xml | 16 +++++ .../test/resources/xml-script-file/s1.groovy | 3 + .../test/resources/xml-script-file/s2.groovy | 6 ++ .../xml-script-file/s2_update.groovy | 6 ++ .../test/resources/xml-script-file/s3.groovy | 4 ++ .../LiteflowJsonScriptFileQLExpressTest.java | 69 ++++++++++++++++++ .../LiteflowXmlScriptFileQLExpressTest.java | 69 ++++++++++++++++++ .../json-script-file/application.properties | 1 + .../test/resources/json-script-file/flow.json | 34 +++++++++ .../json-script-file/flow_update.json | 40 +++++++++++ .../src/test/resources/json-script-file/s1.ql | 3 + .../src/test/resources/json-script-file/s2.ql | 6 ++ .../resources/json-script-file/s2_update.ql | 6 ++ .../src/test/resources/json-script-file/s3.ql | 4 ++ .../xml-script-file/application.properties | 1 + .../test/resources/xml-script-file/flow.xml | 15 ++++ .../resources/xml-script-file/flow_update.xml | 16 +++++ .../src/test/resources/xml-script-file/s1.ql | 3 + .../src/test/resources/xml-script-file/s2.ql | 6 ++ .../resources/xml-script-file/s2_update.ql | 6 ++ .../src/test/resources/xml-script-file/s3.ql | 4 ++ 36 files changed, 597 insertions(+), 11 deletions(-) create mode 100644 liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptFileGroovyTest.java create mode 100644 liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptFileGroovyTest.java create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/application.properties create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow.json create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow_update.json create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/s1.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2_update.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/json-script-file/s3.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/application.properties create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow.xml create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow_update.xml create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s1.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2_update.groovy create mode 100644 liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s3.groovy create mode 100644 liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowJsonScriptFileQLExpressTest.java create mode 100644 liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowXmlScriptFileQLExpressTest.java create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/application.properties create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow.json create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow_update.json create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s1.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2_update.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s3.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/application.properties create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow.xml create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow_update.xml create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s1.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2_update.ql create mode 100644 liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s3.ql 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 52a6662de..56e3edd23 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 @@ -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 { // 当存在节点定义时,解析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); } } 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 07e8aa316..b08d7c634 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 @@ -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 { // 当存在节点定义时,解析node节点 if (ObjectUtil.isNotNull(nodesElement)){ List 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); } } diff --git a/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptFileGroovyTest.java b/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptFileGroovyTest.java new file mode 100644 index 000000000..b955af764 --- /dev/null +++ b/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 response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1")); + } + + //测试条件脚本节点 + @Test + public void testScript2() { + LiteflowResponse 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 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 responseNew = flowExecutor.execute2Resp("chain2", "arg"); + Assert.assertTrue(responseNew.isSuccess()); + Assert.assertEquals("d==>s2[条件脚本_改]==>b==>s3[普通脚本_新增]", responseNew.getSlot().printStep()); + } +} diff --git a/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptGroovyTest.java b/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptGroovyTest.java index 8e0e5875e..1e1cc3b9b 100644 --- a/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowJsonScriptGroovyTest.java +++ b/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 */ diff --git a/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptFileGroovyTest.java b/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptFileGroovyTest.java new file mode 100644 index 000000000..548dccd11 --- /dev/null +++ b/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 response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1")); + } + + //测试条件脚本节点 + @Test + public void testScript2() { + LiteflowResponse 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 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 responseNew = flowExecutor.execute2Resp("chain2", "arg"); + Assert.assertTrue(responseNew.isSuccess()); + Assert.assertEquals("d==>s2[条件脚本_改]==>b==>s3[普通脚本_新增]", responseNew.getSlot().printStep()); + } +} diff --git a/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptGroovyTest.java b/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptGroovyTest.java index 05307f1ed..f0aedaee7 100644 --- a/liteflow-testcase-script-groovy/src/test/java/com/yomahub/liteflow/test/script/groovy/LiteflowXmlScriptGroovyTest.java +++ b/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"}) diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/application.properties b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/application.properties new file mode 100644 index 000000000..ab170892a --- /dev/null +++ b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=json-script-file/flow.json \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow.json b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow.json new file mode 100644 index 000000000..55ec7755e --- /dev/null +++ b/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)"} + ] + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow_update.json b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/flow_update.json new file mode 100644 index 000000000..9edd1009f --- /dev/null +++ b/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"} + ] + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s1.groovy b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s1.groovy new file mode 100644 index 000000000..8e6120814 --- /dev/null +++ b/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) \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2.groovy b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2.groovy new file mode 100644 index 000000000..3c9bee6fa --- /dev/null +++ b/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" +} \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2_update.groovy b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s2_update.groovy new file mode 100644 index 000000000..a4b61ccfe --- /dev/null +++ b/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" +} \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s3.groovy b/liteflow-testcase-script-groovy/src/test/resources/json-script-file/s3.groovy new file mode 100644 index 000000000..ebc6135af --- /dev/null +++ b/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) \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/application.properties b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/application.properties new file mode 100644 index 000000000..09ee93069 --- /dev/null +++ b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=xml-script-file/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow.xml b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow.xml new file mode 100644 index 000000000..4148563ff --- /dev/null +++ b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow_update.xml b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow_update.xml new file mode 100644 index 000000000..ccab5c58c --- /dev/null +++ b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/flow_update.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s1.groovy b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s1.groovy new file mode 100644 index 000000000..8e6120814 --- /dev/null +++ b/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) \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2.groovy b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2.groovy new file mode 100644 index 000000000..3c9bee6fa --- /dev/null +++ b/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" +} \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2_update.groovy b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s2_update.groovy new file mode 100644 index 000000000..a4b61ccfe --- /dev/null +++ b/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" +} \ No newline at end of file diff --git a/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s3.groovy b/liteflow-testcase-script-groovy/src/test/resources/xml-script-file/s3.groovy new file mode 100644 index 000000000..1cd037347 --- /dev/null +++ b/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); \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowJsonScriptFileQLExpressTest.java b/liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowJsonScriptFileQLExpressTest.java new file mode 100644 index 000000000..90c6eb1a5 --- /dev/null +++ b/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 response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1")); + } + + //测试条件脚本节点 + @Test + public void testScript2() { + LiteflowResponse 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 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 responseNew = flowExecutor.execute2Resp("chain2", "arg"); + Assert.assertTrue(responseNew.isSuccess()); + Assert.assertEquals("d==>s2[条件脚本_改]==>a==>s3[普通脚本_新增]", responseNew.getSlot().printStep()); + } +} diff --git a/liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowXmlScriptFileQLExpressTest.java b/liteflow-testcase-script-qlexpress/src/test/java/com/yomahub/liteflow/test/script/qlexpress/LiteflowXmlScriptFileQLExpressTest.java new file mode 100644 index 000000000..7c6191e22 --- /dev/null +++ b/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 response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals(Integer.valueOf(6), response.getSlot().getData("s1")); + } + + //测试条件脚本节点 + @Test + public void testScript2() { + LiteflowResponse 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 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 responseNew = flowExecutor.execute2Resp("chain2", "arg"); + Assert.assertTrue(responseNew.isSuccess()); + Assert.assertEquals("d==>s2[条件脚本_改]==>a==>s3[普通脚本_新增]", responseNew.getSlot().printStep()); + } +} diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/application.properties b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/application.properties new file mode 100644 index 000000000..ab170892a --- /dev/null +++ b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=json-script-file/flow.json \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow.json b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow.json new file mode 100644 index 000000000..6bcf261cb --- /dev/null +++ b/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)"} + ] + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow_update.json b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/flow_update.json new file mode 100644 index 000000000..85aef3973 --- /dev/null +++ b/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"} + ] + } + ] + } +} \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s1.ql b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s1.ql new file mode 100644 index 000000000..62fc4d5cb --- /dev/null +++ b/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); \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2.ql b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2.ql new file mode 100644 index 000000000..bf6ec12e0 --- /dev/null +++ b/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"; +} \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2_update.ql b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s2_update.ql new file mode 100644 index 000000000..0c647c987 --- /dev/null +++ b/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"; +} \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s3.ql b/liteflow-testcase-script-qlexpress/src/test/resources/json-script-file/s3.ql new file mode 100644 index 000000000..6bb24aa65 --- /dev/null +++ b/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); \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/application.properties b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/application.properties new file mode 100644 index 000000000..09ee93069 --- /dev/null +++ b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=xml-script-file/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow.xml b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow.xml new file mode 100644 index 000000000..dfca6c993 --- /dev/null +++ b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow_update.xml b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow_update.xml new file mode 100644 index 000000000..1e8de7839 --- /dev/null +++ b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/flow_update.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s1.ql b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s1.ql new file mode 100644 index 000000000..62fc4d5cb --- /dev/null +++ b/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); \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2.ql b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2.ql new file mode 100644 index 000000000..bf6ec12e0 --- /dev/null +++ b/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"; +} \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2_update.ql b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s2_update.ql new file mode 100644 index 000000000..0c647c987 --- /dev/null +++ b/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"; +} \ No newline at end of file diff --git a/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s3.ql b/liteflow-testcase-script-qlexpress/src/test/resources/xml-script-file/s3.ql new file mode 100644 index 000000000..6bb24aa65 --- /dev/null +++ b/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); \ No newline at end of file