From 3a2fcb56b8069d5dfc0c7265f5f8968f6fff29f4 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 2 Nov 2022 14:30:43 +0800 Subject: [PATCH] =?UTF-8?q?bug=20#I5YEHG=20=E8=84=9A=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E6=9C=89=E5=85=88=E5=90=8E=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parser/base/BaseJsonFlowParser.java | 3 +- .../parser/base/BaseXmlFlowParser.java | 4 +- .../parser/base/BaseYmlFlowParser.java | 3 +- .../liteflow/parser/helper/ParserHelper.java | 110 +++++++++--------- .../LiteflowScriptOrderGroovyELTest.java | 42 +++++++ .../scriptOrder/application.properties | 1 + .../src/test/resources/scriptOrder/flow1.xml | 27 +++++ .../src/test/resources/scriptOrder/flow2.xml | 11 ++ 8 files changed, 145 insertions(+), 56 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptOrder/LiteflowScriptOrderGroovyELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow1.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow2.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseJsonFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseJsonFlowParser.java index e58f62315..a5e02daec 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseJsonFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseJsonFlowParser.java @@ -35,7 +35,8 @@ public abstract class BaseJsonFlowParser implements FlowParser { JsonNode flowJsonNode = JsonUtil.parseObject(content); jsonObjectList.add(flowJsonNode); } - ParserHelper.parseJsonNode(jsonObjectList, CHAIN_NAME_SET, this::parseOneChain); + ParserHelper.parseNodeJson(jsonObjectList); + ParserHelper.parseChainJson(jsonObjectList, CHAIN_NAME_SET, this::parseOneChain); } /** diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseXmlFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseXmlFlowParser.java index 7b4e28647..13ad96420 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseXmlFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseXmlFlowParser.java @@ -36,8 +36,8 @@ public abstract class BaseXmlFlowParser implements FlowParser { documentList.add(document); } - Consumer parseOneChainConsumer = this::parseOneChain; - ParserHelper.parseDocument(documentList, CHAIN_NAME_SET, parseOneChainConsumer); + ParserHelper.parseNodeDocument(documentList); + ParserHelper.parseChainDocument(documentList, CHAIN_NAME_SET, this::parseOneChain); } /** diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseYmlFlowParser.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseYmlFlowParser.java index 4054beb31..d5606c35c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseYmlFlowParser.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/base/BaseYmlFlowParser.java @@ -39,7 +39,8 @@ public abstract class BaseYmlFlowParser implements FlowParser { } Consumer parseOneChainConsumer = this::parseOneChain; - ParserHelper.parseJsonNode(jsonObjectList, CHAIN_NAME_SET,parseOneChainConsumer); + ParserHelper.parseNodeJson(jsonObjectList); + ParserHelper.parseChainJson(jsonObjectList, CHAIN_NAME_SET, parseOneChainConsumer); } protected JsonNode convertToJson(String yamlString) { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java index 9b23357ea..dce14af26 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java @@ -87,35 +87,9 @@ public class ParserHelper { /** * xml 形式的主要解析过程 - * * @param documentList documentList - * @param chainNameSet 用于去重 - * @param parseOneChainConsumer parseOneChain 函数 */ - public static void parseDocument(List documentList, Set chainNameSet, Consumer parseOneChainConsumer) { - //先在元数据里放上chain - //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析 - //这样就不用去像之前的版本那样回归调用 - //同时也解决了不能循环依赖的问题 - documentList.forEach(document -> { - // 解析chain节点 - List chainList = document.getRootElement().elements(CHAIN); - - //先在元数据里放上chain - chainList.forEach(e -> { - //校验加载的 chainName 是否有重复的 - //TODO 这里是否有个问题,当混合格式加载的时候,2个同名的Chain在不同的文件里,就不行了 - String chainName = e.attributeValue(NAME); - if (!chainNameSet.add(chainName)) { - throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); - } - - FlowBus.addChain(chainName); - }); - }); - // 清空 - chainNameSet.clear(); - + public static void parseNodeDocument(List documentList) { for (Document document : documentList) { Element rootElement = document.getRootElement(); Element nodesElement = rootElement.element(NODES); @@ -143,37 +117,42 @@ public class ParserHelper { ParserHelper.buildNode(nodePropBean); } } + } + } - //解析每一个chain + public static void parseChainDocument(List documentList, Set chainNameSet, Consumer parseOneChainConsumer){ + //先在元数据里放上chain + //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析 + //这样就不用去像之前的版本那样回归调用 + //同时也解决了不能循环依赖的问题 + documentList.forEach(document -> { + // 解析chain节点 + List chainList = document.getRootElement().elements(CHAIN); + + //先在元数据里放上chain + chainList.forEach(e -> { + //校验加载的 chainName 是否有重复的 + //TODO 这里是否有个问题,当混合格式加载的时候,2个同名的Chain在不同的文件里,就不行了 + String chainName = e.attributeValue(NAME); + if (!chainNameSet.add(chainName)) { + throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); + } + + FlowBus.addChain(chainName); + }); + }); + // 清空 + chainNameSet.clear(); + + //解析每一个chain + for (Document document : documentList) { + Element rootElement = document.getRootElement(); List chainList = rootElement.elements(CHAIN); chainList.forEach(parseOneChainConsumer); } } - public static void parseJsonNode(List flowJsonObjectList, Set chainNameSet, Consumer parseOneChainConsumer) { - //先在元数据里放上chain - //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析 - //这样就不用去像之前的版本那样回归调用 - //同时也解决了不能循环依赖的问题 - flowJsonObjectList.forEach(jsonObject -> { - // 解析chain节点 - Iterator iterator = jsonObject.get(FLOW).get(CHAIN).elements(); - //先在元数据里放上chain - while (iterator.hasNext()) { - JsonNode innerJsonObject = iterator.next(); - //校验加载的 chainName 是否有重复的 - // TODO 这里是否有个问题,当混合格式加载的时候,2个同名的Chain在不同的文件里,就不行了 - String chainName = innerJsonObject.get(NAME).textValue(); - if (!chainNameSet.add(chainName)) { - throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); - } - - FlowBus.addChain(innerJsonObject.get(NAME).textValue()); - } - }); - // 清空 - chainNameSet.clear(); - + public static void parseNodeJson(List flowJsonObjectList) { for (JsonNode flowJsonNode : flowJsonObjectList) { // 当存在节点定义时,解析node节点 if (flowJsonNode.get(FLOW).has(NODES)) { @@ -200,7 +179,34 @@ public class ParserHelper { ParserHelper.buildNode(nodePropBean); } } + } + } + public static void parseChainJson(List flowJsonObjectList, Set chainNameSet, Consumer parseOneChainConsumer){ + //先在元数据里放上chain + //先放有一个好处,可以在parse的时候先映射到FlowBus的chainMap,然后再去解析 + //这样就不用去像之前的版本那样回归调用 + //同时也解决了不能循环依赖的问题 + flowJsonObjectList.forEach(jsonObject -> { + // 解析chain节点 + Iterator iterator = jsonObject.get(FLOW).get(CHAIN).elements(); + //先在元数据里放上chain + while (iterator.hasNext()) { + JsonNode innerJsonObject = iterator.next(); + //校验加载的 chainName 是否有重复的 + // TODO 这里是否有个问题,当混合格式加载的时候,2个同名的Chain在不同的文件里,就不行了 + String chainName = innerJsonObject.get(NAME).textValue(); + if (!chainNameSet.add(chainName)) { + throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); + } + + FlowBus.addChain(innerJsonObject.get(NAME).textValue()); + } + }); + // 清空 + chainNameSet.clear(); + + for (JsonNode flowJsonNode : flowJsonObjectList) { //解析每一个chain Iterator chainIterator = flowJsonNode.get(FLOW).get(CHAIN).elements(); while (chainIterator.hasNext()) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptOrder/LiteflowScriptOrderGroovyELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptOrder/LiteflowScriptOrderGroovyELTest.java new file mode 100644 index 000000000..5518562e0 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptOrder/LiteflowScriptOrderGroovyELTest.java @@ -0,0 +1,42 @@ +package com.yomahub.liteflow.test.script.groovy.scriptOrder; + +import cn.hutool.core.io.resource.ResourceUtil; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.FlowParserTypeEnum; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.slot.DefaultContext; +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配置 + * @author Bryan.Zhang + * @since 2.6.0 + */ +@RunWith(SpringRunner.class) +@TestPropertySource(value = "classpath:/scriptOrder/application.properties") +@SpringBootTest(classes = LiteflowScriptOrderGroovyELTest.class) +@EnableAutoConfiguration +public class LiteflowScriptOrderGroovyELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + //测试普通脚本节点 + @Test + public void testScript1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/application.properties new file mode 100644 index 000000000..1b520d7a1 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=scriptOrder/flow1.xml,scriptOrder/flow2.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow1.xml b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow1.xml new file mode 100644 index 000000000..7d8648171 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow1.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + // IF(s1, s2, s3); + IF(s1, s2, s4); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow2.xml b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow2.xml new file mode 100644 index 000000000..f47d4f579 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptOrder/flow2.xml @@ -0,0 +1,11 @@ + + + + + + + + + \ No newline at end of file