From 40560647e760517947dc2785e48decc9c18d4057 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Sun, 18 Dec 2022 16:41:02 +0800 Subject: [PATCH] =?UTF-8?q?enhancement=20#I5VJ85=20=E5=BE=AA=E7=8E=AF?= =?UTF-8?q?=E7=BB=84=E4=BB=B6=E6=94=AF=E6=8C=81=E8=8E=B7=E5=8F=96=E5=BD=93?= =?UTF-8?q?=E5=89=8D=E5=BE=AA=E7=8E=AF=E7=9A=84=E4=B8=8B=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/operator/ForOperator.java | 2 +- .../yomahub/liteflow/core/NodeComponent.java | 11 ++++++- .../yomahub/liteflow/flow/element/Node.java | 17 ++++++++++ .../flow/element/condition/ForCondition.java | 4 ++- .../flow/element/condition/LoopCondition.java | 12 +++++++ .../element/condition/WhileCondition.java | 3 ++ .../loop/LoopELDeclMultiSpringbootTest.java | 23 +++++++++++++ .../liteflow/test/loop/cmp/CmpConfig.java | 14 ++++++++ .../src/test/resources/loop/flow.xml | 20 +++++++++++ .../test/loop/LoopELDeclSpringbootTest.java | 23 +++++++++++++ .../yomahub/liteflow/test/loop/cmp/ECmp.java | 33 +++++++++++++++++++ .../src/test/resources/loop/flow.xml | 20 +++++++++++ .../yomahub/liteflow/test/loop/LoopTest.java | 23 +++++++++++++ .../yomahub/liteflow/test/loop/cmp/ECmp.java | 29 ++++++++++++++++ .../src/test/resources/loop/flow.xml | 21 ++++++++++++ .../test/loop/LoopELSpringbootTest.java | 23 +++++++++++++ .../yomahub/liteflow/test/loop/cmp/ECmp.java | 31 +++++++++++++++++ .../src/test/resources/loop/flow.xml | 20 +++++++++++ .../liteflow/test/loop/LoopELSpringTest.java | 23 +++++++++++++ .../yomahub/liteflow/test/loop/cmp/ECmp.java | 31 +++++++++++++++++ .../src/test/resources/loop/flow.xml | 20 +++++++++++ 21 files changed, 400 insertions(+), 3 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java index a4b070e39..93e7d85f2 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java @@ -34,7 +34,7 @@ public class ForOperator extends BaseOperator { node = new Node(); NodeForComponent nodeForComponent = new NodeForComponent() { @Override - public int processFor() throws Exception { + public int processFor() { return forCount; } }; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java index febdaedff..5a397769c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java @@ -60,9 +60,14 @@ public abstract class NodeComponent{ private Class nodeExecutorClass = DefaultNodeExecutor.class; /**当前对象为单例,注册进spring上下文,但是node实例不是单例,这里通过对node实例的引用来获得一些链路属性**/ + private final TransmittableThreadLocal refNodeTL = new TransmittableThreadLocal<>(); - /********************以下的属性为线程附加属性********************/ + /** + *******************以下的属性为线程附加属性******************** + * 线程属性是指每一个request的值都是不一样的 + * 这里NodeComponent是单例,所以要用ThreadLocal来修饰 + */ //当前slot的index private final TransmittableThreadLocal slotIndexTL = new TransmittableThreadLocal<>(); @@ -340,6 +345,10 @@ public abstract class NodeComponent{ return JsonUtil.parseObject(cmpData, clazz); } + public Integer getLoopIndex(){ + return this.refNodeTL.get().getLoopIndex(); + } + @Deprecated public void invoke(String chainId, Object param) throws Exception { FlowExecutorHolder.loadInstance().invoke(chainId, param, this.getSlotIndex()); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java index be9dacef2..64ed465cf 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Node.java @@ -12,6 +12,7 @@ import java.text.MessageFormat; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.ttl.TransmittableThreadLocal; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.property.LiteflowConfigGetter; @@ -28,6 +29,7 @@ import org.slf4j.LoggerFactory; /** * Node节点,实现可执行器 + * Node节点并不是单例的,每构建一次都会copy出一个新的实例 * @author Bryan.Zhang */ public class Node implements Executable,Cloneable{ @@ -52,6 +54,8 @@ public class Node implements Executable,Cloneable{ private String currChainId; + private TransmittableThreadLocal loopIndexTL = new TransmittableThreadLocal<>(); + public Node(){ } @@ -150,6 +154,7 @@ public class Node implements Executable,Cloneable{ instance.removeSlotIndex(); instance.removeIsEnd(); instance.removeRefNode(); + removeLoopIndex(); } } @@ -224,4 +229,16 @@ public class Node implements Executable,Cloneable{ public String getCurrChainId() { return currChainId; } + + public void setLoopIndex(int index){ + this.loopIndexTL.set(index); + } + + public Integer getLoopIndex(){ + return this.loopIndexTL.get(); + } + + public void removeLoopIndex(){ + this.loopIndexTL.remove(); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ForCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ForCondition.java index f957e784c..64d8c59c8 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ForCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ForCondition.java @@ -42,6 +42,9 @@ public class ForCondition extends LoopCondition{ //循环执行 for (int i = 0; i < forCount; i++) { + executableItem.setCurrChainId(this.getCurrChainId()); + //设置循环index + setLoopIndex(executableItem, i); executableItem.execute(slotIndex); //如果break组件不为空,则去执行 if (ObjectUtil.isNotNull(breakNode)){ @@ -54,7 +57,6 @@ public class ForCondition extends LoopCondition{ } } } - } @Override diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/LoopCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/LoopCondition.java index 6435e118f..c559585cd 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/LoopCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/LoopCondition.java @@ -1,5 +1,7 @@ package com.yomahub.liteflow.flow.element.condition; +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; /** @@ -20,4 +22,14 @@ public abstract class LoopCondition extends Condition { public void setBreakNode(Node breakNode) { this.breakNode = breakNode; } + + protected void setLoopIndex(Executable executableItem, int index){ + if (executableItem instanceof Chain){ + ((Chain)executableItem).getConditionList().forEach(condition -> setLoopIndex(condition, index)); + }else if(executableItem instanceof Condition){ + ((Condition)executableItem).getExecutableList().forEach(executable -> setLoopIndex(executable, index)); + }else if(executableItem instanceof Node){ + ((Node)executableItem).setLoopIndex(index); + } + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/WhileCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/WhileCondition.java index a58249011..813832902 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/WhileCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/WhileCondition.java @@ -32,7 +32,10 @@ public class WhileCondition extends LoopCondition{ Executable executableItem = this.getDoExecutor(); //循环执行 + int index = 0; while(getWhileResult(slotIndex)){ + executableItem.setCurrChainId(this.getCurrChainId()); + setLoopIndex(executableItem, index++); executableItem.execute(slotIndex); //如果break组件不为空,则去执行 if (ObjectUtil.isNotNull(breakNode)){ diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclMultiSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclMultiSpringbootTest.java index 31aa4492d..930ffe277 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclMultiSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclMultiSpringbootTest.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.test.loop; 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.Assert; import org.junit.Test; @@ -68,4 +69,26 @@ public class LoopELDeclMultiSpringbootTest extends BaseTest { Assert.assertEquals("z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y", response.getExecuteStepStr()); } + //测试FOR循环中的index + @Test + public void testLoop6() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } + + //测试WHILE循环中的index + @Test + public void testLoop7() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/CmpConfig.java index 954b72d05..c8ff75437 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/CmpConfig.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.loop.cmp; +import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; @@ -38,6 +39,19 @@ public class CmpConfig { } } + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeId = "e") + public void processE(NodeComponent bindCmp) { + DefaultContext context = bindCmp.getFirstContextBean(); + String key = StrUtil.format("{}_{}", "loop", bindCmp.getTag()); + if (context.hasData(key)){ + String loopStr = context.getData(key); + String loopStrReturn = StrUtil.format("{}{}", loopStr, bindCmp.getLoopIndex()); + context.setData(key, loopStrReturn); + }else{ + context.setData(key, bindCmp.getLoopIndex().toString()); + } + } + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_FOR, nodeId = "x", nodeType = NodeTypeEnum.FOR) public int processX(NodeComponent bindCmp){ return 3; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/loop/flow.xml index cd02d198d..7bb3b9280 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/loop/flow.xml @@ -19,4 +19,24 @@ WHILE(z).DO(THEN(a,d)).BREAK(y); + + + FOR(5).DO( + WHEN( + THEN(a,e.tag("e1")), + THEN(c,e.tag("e2")), + THEN(b,e.tag("e3")) + ) + ); + + + + WHILE(z).DO( + WHEN( + THEN(d, e.tag("e1")), + THEN(a, e.tag("e2")), + THEN(c, e.tag("e3")) + ) + ); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclSpringbootTest.java index 5d5e6fd4e..c5a506ecf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELDeclSpringbootTest.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.test.loop; 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.Assert; import org.junit.Test; @@ -66,4 +67,26 @@ public class LoopELDeclSpringbootTest extends BaseTest { Assert.assertTrue(response.isSuccess()); Assert.assertEquals("z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y", response.getExecuteStepStr()); } + + //测试FOR循环中的index + @Test + public void testLoop6() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } + + //测试WHILE循环中的index + @Test + public void testLoop7() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java new file mode 100644 index 000000000..76e39e94c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java @@ -0,0 +1,33 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.loop.cmp; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.slot.DefaultContext; +import org.springframework.stereotype.Component; + +@Component("e") +public class ECmp{ + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + DefaultContext context = bindCmp.getFirstContextBean(); + String key = StrUtil.format("{}_{}", "loop", bindCmp.getTag()); + if (context.hasData(key)){ + String loopStr = context.getData(key); + String loopStrReturn = StrUtil.format("{}{}", loopStr, bindCmp.getLoopIndex()); + context.setData(key, loopStrReturn); + }else{ + context.setData(key, bindCmp.getLoopIndex().toString()); + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/loop/flow.xml index cd02d198d..7bb3b9280 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/loop/flow.xml @@ -19,4 +19,24 @@ WHILE(z).DO(THEN(a,d)).BREAK(y); + + + FOR(5).DO( + WHEN( + THEN(a,e.tag("e1")), + THEN(c,e.tag("e2")), + THEN(b,e.tag("e3")) + ) + ); + + + + WHILE(z).DO( + WHEN( + THEN(d, e.tag("e1")), + THEN(a, e.tag("e2")), + THEN(c, e.tag("e3")) + ) + ); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/LoopTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/LoopTest.java index 335bde4bd..e1f449555 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/LoopTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/LoopTest.java @@ -4,6 +4,7 @@ import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.core.FlowExecutorHolder; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.property.LiteflowConfig; +import com.yomahub.liteflow.slot.DefaultContext; import com.yomahub.liteflow.test.BaseTest; import org.junit.Assert; import org.junit.BeforeClass; @@ -58,4 +59,26 @@ public class LoopTest extends BaseTest{ Assert.assertTrue(response.isSuccess()); Assert.assertEquals("z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y", response.getExecuteStepStr()); } + + //测试FOR循环中的index + @Test + public void testLoop6() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } + + //测试WHILE循环中的index + @Test + public void testLoop7() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java new file mode 100644 index 000000000..c289433e5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java @@ -0,0 +1,29 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.loop.cmp; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; + +public class ECmp extends NodeComponent { + + @Override + public void process() { + DefaultContext context = this.getFirstContextBean(); + String key = StrUtil.format("{}_{}", "loop", this.getTag()); + if (context.hasData(key)){ + String loopStr = context.getData(key); + String loopStrReturn = StrUtil.format("{}{}", loopStr, this.getLoopIndex()); + context.setData(key, loopStrReturn); + }else{ + context.setData(key, this.getLoopIndex().toString()); + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/loop/flow.xml index 4c5266663..6535aa5e5 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/loop/flow.xml @@ -5,6 +5,7 @@ + @@ -29,4 +30,24 @@ WHILE(z).DO(THEN(a,d)).BREAK(y); + + + FOR(5).DO( + WHEN( + THEN(a, e.tag("e1")), + THEN(c, e.tag("e2")), + THEN(b, e.tag("e3")) + ) + ); + + + + WHILE(z).DO( + WHEN( + THEN(d, e.tag("e1")), + THEN(a, e.tag("e2")), + THEN(c, e.tag("e3")) + ) + ); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java index fa16c2ca8..2fc7f2bf3 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.test.loop; 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.Assert; import org.junit.Test; @@ -66,4 +67,26 @@ public class LoopELSpringbootTest extends BaseTest { Assert.assertTrue(response.isSuccess()); Assert.assertEquals("z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y", response.getExecuteStepStr()); } + + //测试FOR循环中的index + @Test + public void testLoop6() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } + + //测试WHILE循环中的index + @Test + public void testLoop7() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java new file mode 100644 index 000000000..cf88acc51 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java @@ -0,0 +1,31 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.loop.cmp; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; +import org.springframework.stereotype.Component; + +@Component("e") +public class ECmp extends NodeComponent { + + @Override + public void process() { + DefaultContext context = this.getFirstContextBean(); + String key = StrUtil.format("{}_{}", "loop", this.getTag()); + if (context.hasData(key)){ + String loopStr = context.getData(key); + String loopStrReturn = StrUtil.format("{}{}", loopStr, this.getLoopIndex()); + context.setData(key, loopStrReturn); + }else{ + context.setData(key, this.getLoopIndex().toString()); + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml index cd02d198d..7bb3b9280 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml @@ -19,4 +19,24 @@ WHILE(z).DO(THEN(a,d)).BREAK(y); + + + FOR(5).DO( + WHEN( + THEN(a,e.tag("e1")), + THEN(c,e.tag("e2")), + THEN(b,e.tag("e3")) + ) + ); + + + + WHILE(z).DO( + WHEN( + THEN(d, e.tag("e1")), + THEN(a, e.tag("e2")), + THEN(c, e.tag("e3")) + ) + ); + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringTest.java index 0a35895e8..822fa5deb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringTest.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.test.loop; 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.Assert; import org.junit.Test; @@ -56,4 +57,26 @@ public class LoopELSpringTest extends BaseTest { Assert.assertTrue(response.isSuccess()); Assert.assertEquals("z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y==>z==>a==>d==>y", response.getExecuteStepStr()); } + + //测试FOR循环中的index + @Test + public void testLoop6() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } + + //测试WHILE循环中的index + @Test + public void testLoop7() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("01234", context.getData("loop_e1")); + Assert.assertEquals("01234", context.getData("loop_e2")); + Assert.assertEquals("01234", context.getData("loop_e3")); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java new file mode 100644 index 000000000..cf88acc51 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ECmp.java @@ -0,0 +1,31 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.loop.cmp; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; +import org.springframework.stereotype.Component; + +@Component("e") +public class ECmp extends NodeComponent { + + @Override + public void process() { + DefaultContext context = this.getFirstContextBean(); + String key = StrUtil.format("{}_{}", "loop", this.getTag()); + if (context.hasData(key)){ + String loopStr = context.getData(key); + String loopStrReturn = StrUtil.format("{}{}", loopStr, this.getLoopIndex()); + context.setData(key, loopStrReturn); + }else{ + context.setData(key, this.getLoopIndex().toString()); + } + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/loop/flow.xml index cd02d198d..7bb3b9280 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/loop/flow.xml @@ -19,4 +19,24 @@ WHILE(z).DO(THEN(a,d)).BREAK(y); + + + FOR(5).DO( + WHEN( + THEN(a,e.tag("e1")), + THEN(c,e.tag("e2")), + THEN(b,e.tag("e3")) + ) + ); + + + + WHILE(z).DO( + WHEN( + THEN(d, e.tag("e1")), + THEN(a, e.tag("e2")), + THEN(c, e.tag("e3")) + ) + ); + \ No newline at end of file