From 3634b92d0fffa916890aa4cca2c2463f3b12aae6 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 23 Jul 2024 23:04:06 +0800 Subject: [PATCH] =?UTF-8?q?bug=20#IADIXE=20[bug]=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E5=BE=AA=E7=8E=AF=E7=BB=84=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E4=B8=8B=E6=B8=B8getCurrLoopObj()=E8=8E=B7=E5=8F=96=E4=B8=BAnu?= =?UTF-8?q?ll?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 17 +++++++++ .../test/iterator/IteratorCase_IADIXE.java | 35 +++++++++++++++++++ .../liteflow/test/iterator/cmp/DCmp.java | 14 ++++++++ .../iterator/application_IADIXE.properties | 2 ++ .../test/resources/iterator/flow_IADIXE.xml | 12 +++++++ 5 files changed, 80 insertions(+) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/IteratorCase_IADIXE.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/application_IADIXE.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/flow_IADIXE.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index 802be9890..20731e891 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java @@ -26,8 +26,10 @@ import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.util.ElRegexUtil; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Objects; +import java.util.function.Consumer; /** * Chain基于代码形式的组装器 EL表达式规则专属组装器 @@ -372,6 +374,21 @@ public class LiteFlowChainELBuilder { // 放入当前主chain的ID context.put(ChainConstant.CURR_CHAIN_ID, chain.getChainId()); + + // 只有当PARSE_ONE_ON_FIRST_EXEC时才会执行这个方法 + // 那么会有一种级联的情况:这个EL中含有其他的chain,如果这时候不先解析其他chain,就到导致诸如循环场景无法设置index或者obj的情况 + // 所以这里要判断表达式里有没有其他的chain,如果有,进行先行解析 + + String[] itemArray = EXPRESS_RUNNER.getOutVarNames(chain.getEl()); + Arrays.stream(itemArray).forEach(item -> { + if (FlowBus.containChain(item)){ + Chain itemChain = FlowBus.getChain(item); + if (!itemChain.isCompiled()){ + buildUnCompileChain(FlowBus.getChain(item)); + } + } + }); + // 解析el成为一个Condition // 为什么这里只是一个Condition,而不是一个List呢 // 这里无论多复杂的,外面必定有一个最外层的Condition,所以这里只有一个,内部可以嵌套很多层,这点和以前的不太一样 diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/IteratorCase_IADIXE.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/IteratorCase_IADIXE.java new file mode 100644 index 000000000..12b1686f2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/IteratorCase_IADIXE.java @@ -0,0 +1,35 @@ +package com.yomahub.liteflow.test.iterator; + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +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 javax.annotation.Resource; +import java.util.List; + +@TestPropertySource(value = "classpath:/iterator/application_IADIXE.properties") +@SpringBootTest(classes = IteratorCase_IADIXE.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.iterator.cmp" }) +public class IteratorCase_IADIXE extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 最简单的情况 + @Test + public void testIt1() throws Exception { + List list = ListUtil.toList("1", "2", "3"); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", list); + Assertions.assertTrue(response.isSuccess()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/DCmp.java new file mode 100644 index 000000000..e675f5501 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/DCmp.java @@ -0,0 +1,14 @@ + +package com.yomahub.liteflow.test.iterator.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp extends NodeComponent { + + @Override + public void process() throws Exception { + System.out.println(this.getCurrLoopObj().toString()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/application_IADIXE.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/application_IADIXE.properties new file mode 100644 index 000000000..aa3509941 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/application_IADIXE.properties @@ -0,0 +1,2 @@ +liteflow.rule-source=iterator/flow_IADIXE.xml +liteflow.parse-mode=PARSE_ONE_ON_FIRST_EXEC \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/flow_IADIXE.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/flow_IADIXE.xml new file mode 100644 index 000000000..e760efd2f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/iterator/flow_IADIXE.xml @@ -0,0 +1,12 @@ + + + + + ITERATOR(it).DO(chain2); + + + + THEN(c,d); + + + \ No newline at end of file