From 096f9610b2fde5f81d390c8194fb5f4272b93cc5 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Sat, 23 Dec 2023 21:28:06 +0800 Subject: [PATCH 01/49] =?UTF-8?q?feature=20#I8MW6Q=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E5=8D=B8=E8=BD=BD=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 19 +++++++++++++++++++ .../liteflow/script/ScriptExecutor.java | 8 ++++++++ .../script/jsr223/JSR223ScriptExecutor.java | 12 ++++++++++++ .../graaljs/GraalJavaScriptExecutor.java | 15 +++++++++++++++ .../qlexpress/QLExpressScriptExecutor.java | 11 +++++++++++ 5 files changed, 65 insertions(+) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index c7ea30335..7047fb52b 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -9,6 +9,7 @@ package com.yomahub.liteflow.flow; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.util.AnnoUtil; @@ -297,6 +298,24 @@ public class FlowBus { Arrays.stream(chainIds).forEach(FlowBus::removeChain); } + // 移除节点 + public static boolean removeNode(String nodeId) { + Node node = getNode(nodeId); + // node 不存在或不是脚本节点 + if (ObjectUtil.isNull(node)) { + return false; + } + // 移除 node + nodeMap.remove(nodeId); + // 如果是脚本节点,移除脚本 + if (node.getType().isScript()) { + ScriptExecutorFactory.loadInstance() + .getScriptExecutor(node.getLanguage()) + .unLoad(nodeId); + } + return true; + } + // 判断是否是降级组件,如果是则添加到 fallbackNodeMap private static void addFallbackNode(Node node) { NodeComponent nodeComponent = node.getInstance(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java index 0f4be12dd..0baf37eac 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java @@ -7,9 +7,11 @@ import com.yomahub.liteflow.annotation.util.AnnoUtil; import com.yomahub.liteflow.context.ContextBean; import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.exception.LiteFlowException; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; +import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -27,6 +29,12 @@ public abstract class ScriptExecutor { public abstract void load(String nodeId, String script); + // 卸载脚本(不包含 node) + public abstract void unLoad(String nodeId); + + // 获取该执行器下的所有 nodeId + public abstract List getNodeIds(); + public Object execute(ScriptExecuteWrap wrap) throws Exception{ try { return executeScript(wrap); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java index 0bb20d921..515837633 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -8,6 +8,8 @@ import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.exception.ScriptLoadException; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import javax.script.*; +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -48,6 +50,16 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { } + @Override + public void unLoad(String nodeId) { + compiledScriptMap.remove(nodeId); + } + + @Override + public List getNodeIds() { + return new ArrayList<>(compiledScriptMap.keySet()); + } + @Override public Object executeScript(ScriptExecuteWrap wrap) throws Exception { if (!compiledScriptMap.containsKey(wrap.getNodeId())) { diff --git a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java index e6b194a9d..24260e630 100644 --- a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java @@ -1,7 +1,9 @@ package com.yomahub.liteflow.script.graaljs; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.exception.ScriptLoadException; @@ -10,6 +12,9 @@ import org.graalvm.polyglot.Context; import org.graalvm.polyglot.Engine; import org.graalvm.polyglot.Source; import org.graalvm.polyglot.Value; + +import java.util.ArrayList; +import java.util.List; import java.util.Map; /** @@ -42,6 +47,16 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { } } + @Override + public void unLoad(String nodeId) { + scriptMap.remove(nodeId); + } + + @Override + public List getNodeIds() { + return new ArrayList<>(scriptMap.keySet()); + } + @Override public Object executeScript(ScriptExecuteWrap wrap) { if (!scriptMap.containsKey(wrap.getNodeId())) { diff --git a/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java b/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java index f83a4833e..f18522389 100644 --- a/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java @@ -14,6 +14,7 @@ import com.yomahub.liteflow.util.CopyOnWriteHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; @@ -49,6 +50,16 @@ public class QLExpressScriptExecutor extends ScriptExecutor { } } + @Override + public void unLoad(String nodeId) { + compiledScriptMap.remove(nodeId); + } + + @Override + public List getNodeIds() { + return new ArrayList<>(compiledScriptMap.keySet()); + } + @Override public Object executeScript(ScriptExecuteWrap wrap) throws Exception { List errorList = new ArrayList<>(); From c3c72c5cc1bb72315a4858473ede7830ecb0deb5 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Sun, 24 Dec 2023 16:35:34 +0800 Subject: [PATCH 02/49] =?UTF-8?q?feature=20#I8MW6Q=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../remove/LiteFlowJsScriptRemoveELTest.java | 100 ++++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 ++++++ .../remove/LiteFlowJsScriptRemoveELTest.java | 100 ++++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 ++++++ 6 files changed, 262 insertions(+) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/flow.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/flow.xml diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java new file mode 100644 index 000000000..c593e6b3d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java @@ -0,0 +1,100 @@ +package com.yomahub.liteflow.test.script.graaljs.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +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.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowJsScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowJsScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private final ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(nodeIds.size(), 2); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain().setChainId("chain3").setEL( + "THEN(s2)" + ).build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..0f3dad229 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java new file mode 100644 index 000000000..ce0f25210 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java @@ -0,0 +1,100 @@ +package com.yomahub.liteflow.test.script.javascript.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +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.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowJsScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowJsScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private final ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(nodeIds.size(), 2); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain().setChainId("chain3").setEL( + "THEN(s2)" + ).build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..994730065 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file From b858dacdcca8a07e24655f23f0dec30448d590f8 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Mon, 25 Dec 2023 20:18:03 +0800 Subject: [PATCH 03/49] =?UTF-8?q?feature=20#I8MW6Q=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 18 +++------ .../script/jsr223/JSR223ScriptExecutor.java | 8 +++- .../graaljs/GraalJavaScriptExecutor.java | 6 +++ .../liteflow/script/java/JavaExecutor.java | 20 ++++++++++ .../remove/LiteFlowJsScriptRemoveELTest.java | 39 ++----------------- 5 files changed, 43 insertions(+), 48 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 7047fb52b..9e8c9e8c7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -300,20 +300,14 @@ public class FlowBus { // 移除节点 public static boolean removeNode(String nodeId) { - Node node = getNode(nodeId); - // node 不存在或不是脚本节点 - if (ObjectUtil.isNull(node)) { + if (containNode(nodeId)) { + nodeMap.remove(nodeId); + return true; + } else { + String errMsg = StrUtil.format("cannot find the node[{}]", nodeId); + LOG.error(errMsg); return false; } - // 移除 node - nodeMap.remove(nodeId); - // 如果是脚本节点,移除脚本 - if (node.getType().isScript()) { - ScriptExecutorFactory.loadInstance() - .getScriptExecutor(node.getLanguage()) - .unLoad(nodeId); - } - return true; } // 判断是否是降级组件,如果是则添加到 fallbackNodeMap diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java index 515837633..7141bffc6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -1,6 +1,7 @@ package com.yomahub.liteflow.script.jsr223; import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; @@ -42,17 +43,22 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { try { CompiledScript compiledScript = ((Compilable) scriptEngine).compile(convertScript(script)); compiledScriptMap.put(nodeId, compiledScript); + // 更新 node + if (FlowBus.containNode(nodeId)) { + FlowBus.getNode(nodeId).setScript(script); + } } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); throw new ScriptLoadException(errorMsg); } - } @Override public void unLoad(String nodeId) { compiledScriptMap.remove(nodeId); + // 移除节点 + FlowBus.removeNode(nodeId); } @Override diff --git a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java index 24260e630..1d8d7b1d5 100644 --- a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java @@ -40,6 +40,10 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { try { String wrapScript = StrUtil.format("function process(){{}} process();", script); scriptMap.put(nodeId, Source.create("js", wrapScript)); + // 更新 node + if (FlowBus.containNode(nodeId)) { + FlowBus.getNode(nodeId).setScript(script); + } } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); @@ -50,6 +54,8 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { @Override public void unLoad(String nodeId) { scriptMap.remove(nodeId); + // 移除节点 + FlowBus.removeNode(nodeId); } @Override diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java index b0693fda4..7154a2fe6 100644 --- a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java +++ b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java @@ -3,6 +3,7 @@ package com.yomahub.liteflow.script.java; import cn.hutool.core.util.ReUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.body.JaninoCommonScriptBody; @@ -10,6 +11,9 @@ import com.yomahub.liteflow.script.exception.ScriptLoadException; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import org.codehaus.commons.compiler.CompilerFactoryFactory; import org.codehaus.commons.compiler.IScriptEvaluator; + +import java.util.ArrayList; +import java.util.List; import java.util.Map; public class JavaExecutor extends ScriptExecutor { @@ -25,6 +29,10 @@ public class JavaExecutor extends ScriptExecutor { se.setParameters(new String[] {"_meta"}, new Class[] {ScriptExecuteWrap.class}); se.cook(convertScript(script)); compiledScriptMap.put(nodeId, se); + // 更新 node + if (FlowBus.containNode(nodeId)) { + FlowBus.getNode(nodeId).setScript(script); + } }catch (Exception e){ String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage()); throw new ScriptLoadException(errorMsg); @@ -32,6 +40,18 @@ public class JavaExecutor extends ScriptExecutor { } + @Override + public void unLoad(String nodeId) { + compiledScriptMap.remove(nodeId); + // 移除节点 + FlowBus.removeNode(nodeId); + } + + @Override + public List getNodeIds() { + return new ArrayList<>(compiledScriptMap.keySet()); + } + @Override public Object executeScript(ScriptExecuteWrap wrap) throws Exception { if (!compiledScriptMap.containsKey(wrap.getNodeId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java index c593e6b3d..6e0491c3c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java @@ -16,7 +16,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; 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.junit.jupiter.SpringExtension; @@ -37,13 +36,10 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { @Resource private FlowExecutor flowExecutor; - private final ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() - .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); - - // 仅卸载脚本 @Test public void testUnload() { - flowExecutor.reloadRule(); + ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); // 获取节点id List nodeIds = scriptExecutor.getNodeIds(); @@ -66,35 +62,8 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { // 脚本已卸载 Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); - } - - // 卸载节点和脚本 - @Test - public void testRemove() { - flowExecutor.reloadRule(); - - // 保证脚本可以正常运行 - LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); - Assertions.assertTrue(response.isSuccess()); - DefaultContext context = response.getFirstContextBean(); - Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); - - // 卸载节点 - FlowBus.removeNode("s2"); - - // 旧 chain 报脚本加载错误 - response = flowExecutor.execute2Resp("chain2", "arg"); - Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); - - // 新 chian 会找不到节点 - Assertions.assertThrows(ELParseException.class, - () -> LiteFlowChainELBuilder.createChain().setChainId("chain3").setEL( - "THEN(s2)" - ).build()); - // 节点已卸载 - Assertions.assertFalse(FlowBus.containNode("s2")); - // 脚本已卸载 - Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + Assertions.assertFalse(FlowBus.containNode("s1")); + Assertions.assertFalse(FlowBus.removeNode("s1")); } } From 5c6b8387dd145fa2a514f1ccdf6c4c4b4975431e Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Mon, 15 Jan 2024 12:26:33 +0800 Subject: [PATCH 04/49] =?UTF-8?q?bug=20#I8MXHX=20=E4=BF=AE=E5=A4=8D=20When?= =?UTF-8?q?Condition=20=E4=B8=8B=E7=9A=84=20node=20=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=20isAccess=20=E6=96=B9=E6=B3=95=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/flow/element/Node.java | 22 ++++++++++++------- .../strategy/AllOfParallelExecutor.java | 7 ------ .../strategy/AnyOfParallelExecutor.java | 16 -------------- .../strategy/ParallelStrategyExecutor.java | 14 +++++++----- .../strategy/SpecifyParallelExecutor.java | 17 -------------- 5 files changed, 22 insertions(+), 54 deletions(-) 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 269a4dd62..50ec99f48 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 @@ -21,8 +21,6 @@ import com.yomahub.liteflow.flow.executor.NodeExecutor; import com.yomahub.liteflow.flow.executor.NodeExecutorHelper; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; -import com.yomahub.liteflow.property.LiteflowConfig; -import com.yomahub.liteflow.property.LiteflowConfigGetter; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; @@ -30,6 +28,7 @@ import com.yomahub.liteflow.slot.Slot; * Node节点,实现可执行器 Node节点并不是单例的,每构建一次都会copy出一个新的实例 * * @author Bryan.Zhang + * @author luo yi */ public class Node implements Executable, Cloneable, Rollbackable{ @@ -57,6 +56,9 @@ public class Node implements Executable, Cloneable, Rollbackable{ private String currChainId; + // node 的 isAccess 结果,主要用于 WhenCondition 的提前 isAccess 判断,避免 isAccess 方法重复执行 + private boolean accessResult; + private TransmittableThreadLocal loopIndexTL = new TransmittableThreadLocal<>(); private TransmittableThreadLocal currLoopObject = new TransmittableThreadLocal<>(); @@ -125,16 +127,13 @@ public class Node implements Executable, Cloneable, Rollbackable{ throw new FlowSystemException("there is no instance for node id " + id); } - Slot slot = DataBus.getSlot(slotIndex); try { // 把线程属性赋值给组件对象 instance.setSlotIndex(slotIndex); instance.setRefNode(this); - LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); - // 判断是否可执行,所以isAccess经常作为一个组件进入的实际判断要素,用作检查slot里的参数的完备性 - if (instance.isAccess()) { + if (accessResult || instance.isAccess()) { LOG.info("[O]start component[{}] execution", instance.getDisplayName()); // 这里开始进行重试的逻辑和主逻辑的运行 @@ -142,8 +141,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ .buildNodeExecutor(instance.getNodeExecutorClass()); // 调用节点执行器进行执行 nodeExecutor.execute(instance); - } - else { + } else { LOG.info("[X]skip component[{}] execution", instance.getDisplayName()); } // 如果组件覆盖了isEnd方法,或者在在逻辑中主要调用了setEnd(true)的话,流程就会立马结束 @@ -253,6 +251,14 @@ public class Node implements Executable, Cloneable, Rollbackable{ return currChainId; } + public boolean getAccessResult() { + return accessResult; + } + + public void setAccessResult(boolean accessResult) { + this.accessResult = accessResult; + } + public void setLoopIndex(int index) { this.loopIndexTL.set(index); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java index 3ca243fbd..dd5f518e6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java @@ -1,12 +1,10 @@ package com.yomahub.liteflow.flow.parallel.strategy; -import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.WhenCondition; import com.yomahub.liteflow.flow.parallel.WhenFutureObj; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.stream.Stream; /** * 完成全部任务 @@ -31,9 +29,4 @@ public class AllOfParallelExecutor extends ParallelStrategyExecutor { } - //在allOf这个场景中,不需要过滤 - @Override - protected Stream filterAccess(Stream stream, Integer slotIndex) { - return stream; - } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AnyOfParallelExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AnyOfParallelExecutor.java index 6f4c19257..ca1475dec 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AnyOfParallelExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AnyOfParallelExecutor.java @@ -1,12 +1,10 @@ package com.yomahub.liteflow.flow.parallel.strategy; -import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.WhenCondition; import com.yomahub.liteflow.flow.parallel.WhenFutureObj; import java.util.List; import java.util.concurrent.CompletableFuture; -import java.util.stream.Stream; /** * 完成任一任务 @@ -31,18 +29,4 @@ public class AnyOfParallelExecutor extends ParallelStrategyExecutor { } - //在anyOf这个场景中,需要过滤掉isAccess为false的场景 - //因为不过滤这个的话,如果加上了 any,那么 isAccess 为 false 那就是最快的了 - //换句话说,就是anyOf这个场景,isAccess会被执行两次 - @Override - protected Stream filterAccess(Stream stream, Integer slotIndex) { - return stream.filter(executable -> { - try { - return executable.isAccess(slotIndex); - } catch (Exception e) { - LOG.error("there was an error when executing the when component isAccess", e); - return false; - } - }); - } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java index b8199419e..0cf8f2bd0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ParallelStrategyEnum; import com.yomahub.liteflow.exception.WhenExecuteException; import com.yomahub.liteflow.flow.element.Executable; +import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.condition.FinallyCondition; import com.yomahub.liteflow.flow.element.condition.PreCondition; import com.yomahub.liteflow.flow.element.condition.WhenCondition; @@ -92,22 +93,23 @@ public abstract class ParallelStrategyExecutor { protected Stream filterWhenTaskList(List executableList, Integer slotIndex) { // 1.先进行过滤,前置和后置组件过滤掉,因为在 EL Chain 处理的时候已经提出来了 // 2.过滤 isAccess 为 false 的情况,因为不过滤这个的话,如果加上了 any,那么 isAccess 为 false 那就是最快的了 - Stream stream = executableList.stream() + // 3.为避免同一个 node 的 isAccess 方法重复执行,给 node 设置 isAccess 方法执行结果 + return executableList.stream() .filter(executable -> !(executable instanceof PreCondition) && !(executable instanceof FinallyCondition)) .filter(executable -> { try { - return executable.isAccess(slotIndex); + boolean access = executable.isAccess(slotIndex); + if (executable instanceof Node) { + ((Node) executable).setAccessResult(access); + } + return access; } catch (Exception e) { LOG.error("there was an error when executing the when component isAccess", e); return false; } }); - return filterAccess(stream, slotIndex); } - //过滤isAccess的抽象接口方法 - protected abstract Stream filterAccess(Stream stream, Integer slotIndex); - /** * 获取 WHEN 所需线程池 * @param whenCondition diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java index c345a83fd..e9a78ef9a 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java @@ -1,14 +1,12 @@ package com.yomahub.liteflow.flow.parallel.strategy; import cn.hutool.core.collection.CollUtil; -import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.WhenCondition; import com.yomahub.liteflow.flow.parallel.WhenFutureObj; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; -import java.util.stream.Stream; /** * 完成指定任务执行器,使用 ID 进行比较 @@ -77,19 +75,4 @@ public class SpecifyParallelExecutor extends ParallelStrategyExecutor { } - //在must这个场景中,需要过滤掉isAccess为false的场景 - //因为不过滤这个的话,如果加上了 any,那么 isAccess 为 false 那就是最快的了 - //换句话说,就是must这个场景,isAccess会被执行两次 - @Override - protected Stream filterAccess(Stream stream, Integer slotIndex) { - return stream.filter(executable -> { - try { - return executable.isAccess(slotIndex); - } catch (Exception e) { - LOG.error("there was an error when executing the when component isAccess", e); - return false; - } - }); - } - } From 40253dd06ff04bf03f092c44cb0413a80dcf88c6 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 15 Jan 2024 14:56:28 +0800 Subject: [PATCH 05/49] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9C=89=E4=BA=9BBeanD?= =?UTF-8?q?efinition=E5=AE=9A=E4=B9=89=E4=B8=AD=E5=B9=B6=E6=B2=A1=E6=9C=89?= =?UTF-8?q?root=20class=EF=BC=8C=E5=AF=BC=E8=87=B4=E4=BA=86NPE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/spring/DeclBeanDefinition.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java index 017211abf..2a30ebb2a 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java @@ -30,7 +30,11 @@ public class DeclBeanDefinition implements BeanDefinitionRegistryPostProcessor { beanDefinitionHolderMap.entrySet().stream().filter(entry -> { Class rawClass = entry.getValue().getResolvableType().getRawClass(); - return Arrays.stream(rawClass.getMethods()).anyMatch(method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null); + if (rawClass == null){ + return false; + }else{ + return Arrays.stream(rawClass.getMethods()).anyMatch(method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null); + } }).forEach(entry -> { Class rawClass = entry.getValue().getResolvableType().getRawClass(); List declWarpBeanList = DeclComponentParserHolder.loadDeclComponentParser().parseDeclBean(rawClass); From e33fd3b0f769967b9542dcfd233b1650dd8940b2 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 15 Jan 2024 15:11:50 +0800 Subject: [PATCH 06/49] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=88=902.11.4.1?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E4=B8=81=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 789f9544e..eda93cec2 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 2.11.4 + 2.11.4.1 UTF-8 UTF-8 8 From e60a60e12fc1b0a9cc0d5e4eae4a890b37488ea9 Mon Sep 17 00:00:00 2001 From: guorunze Date: Mon, 15 Jan 2024 16:20:05 +0800 Subject: [PATCH 07/49] =?UTF-8?q?STYLE=20#I8VSD6=20=E8=B0=83=E6=95=B4=20ch?= =?UTF-8?q?eckObjectSizeGteTwo=20=E5=90=8D=E7=A7=B0=E3=80=81=E6=B3=A8?= =?UTF-8?q?=E9=87=8A=E3=80=81=E5=88=A4=E6=96=AD=20=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E8=AF=AF=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/builder/el/operator/AndOperator.java | 2 +- .../liteflow/builder/el/operator/MustOperator.java | 2 +- .../yomahub/liteflow/builder/el/operator/OrOperator.java | 2 +- .../yomahub/liteflow/builder/el/operator/ToOperator.java | 2 +- .../liteflow/builder/el/operator/base/OperatorHelper.java | 8 +++----- 5 files changed, 7 insertions(+), 9 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AndOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AndOperator.java index 0e5f731ab..29d663cbe 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AndOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AndOperator.java @@ -16,7 +16,7 @@ import com.yomahub.liteflow.flow.element.condition.BooleanConditionTypeEnum; public class AndOperator extends BaseOperator { @Override public AndOrCondition build(Object[] objects) throws Exception { - OperatorHelper.checkObjectSizeGtTwo(objects); + OperatorHelper.checkObjectSizeGteTwo(objects); AndOrCondition andOrCondition = new AndOrCondition(); andOrCondition.setBooleanConditionType(BooleanConditionTypeEnum.AND); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/MustOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/MustOperator.java index b3e3f0c28..8a903008c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/MustOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/MustOperator.java @@ -19,7 +19,7 @@ public class MustOperator extends BaseOperator { @Override public WhenCondition build(Object[] objects) throws Exception { - OperatorHelper.checkObjectSizeGtTwo(objects); + OperatorHelper.checkObjectSizeGteTwo(objects); String errorMsg = "The caller must be WhenCondition item"; WhenCondition whenCondition = OperatorHelper.convert(objects[0], WhenCondition.class, errorMsg); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/OrOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/OrOperator.java index d084a7536..361ab62bb 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/OrOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/OrOperator.java @@ -16,7 +16,7 @@ import com.yomahub.liteflow.flow.element.condition.BooleanConditionTypeEnum; public class OrOperator extends BaseOperator { @Override public AndOrCondition build(Object[] objects) throws Exception { - OperatorHelper.checkObjectSizeGtTwo(objects); + OperatorHelper.checkObjectSizeGteTwo(objects); AndOrCondition andOrCondition = new AndOrCondition(); andOrCondition.setBooleanConditionType(BooleanConditionTypeEnum.OR); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java index d38722a03..4eede8779 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java @@ -15,7 +15,7 @@ public class ToOperator extends BaseOperator { @Override public SwitchCondition build(Object[] objects) throws Exception { - OperatorHelper.checkObjectSizeGtTwo(objects); + OperatorHelper.checkObjectSizeGteTwo(objects); String errorMsg = "The caller must be SwitchCondition item"; SwitchCondition switchCondition = OperatorHelper.convert(objects[0], SwitchCondition.class, errorMsg); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java index c54681a63..07a163412 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java @@ -10,8 +10,6 @@ import com.yomahub.liteflow.exception.DataNotFoundException; import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; -import com.yomahub.liteflow.flow.element.condition.AndOrCondition; -import com.yomahub.liteflow.flow.element.condition.NotCondition; import java.util.Objects; @@ -35,13 +33,13 @@ public class OperatorHelper { } /** - * 检查参数数量,大于 2 + * 检查参数数量,大于等于 2 * @param objects objects * @throws QLException QLException */ - public static void checkObjectSizeGtTwo(Object[] objects) throws QLException { + public static void checkObjectSizeGteTwo(Object[] objects) throws QLException { checkObjectSizeGtZero(objects); - if (objects.length <= 1) { + if (objects.length < 2) { throw new QLException("parameter error"); } } From 924768705c14eea00da680c8707d4420b20523bf Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Mon, 15 Jan 2024 21:46:36 +0800 Subject: [PATCH 08/49] =?UTF-8?q?feature=20#I8MW6Q=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 30 ++++- .../script/jsr223/JSR223ScriptExecutor.java | 15 +-- .../graaljs/GraalJavaScriptExecutor.java | 6 - .../liteflow/script/java/JavaExecutor.java | 6 - .../LiteFlowAviatorScriptRemoveELTest.java | 114 ++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 +++++ .../remove/LiteFlowJsScriptRemoveELTest.java | 57 +++++++- .../LiteFlowGroovyScriptRemoveELTest.java | 114 ++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 +++++ .../LiteFlowJavaScriptRemoveELTest.java | 124 ++++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 50 +++++++ .../remove/LiteFlowJsScriptRemoveELTest.java | 28 +++- .../remove/LiteFlowLuaScriptRemoveELTest.java | 114 ++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 +++++ .../LiteFlowPythonScriptRemoveELTest.java | 114 ++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 +++++ .../LiteFlowQLExpressScriptRemoveELTest.java | 114 ++++++++++++++++ .../resources/remove/application.properties | 1 + .../src/test/resources/remove/flow.xml | 30 +++++ 24 files changed, 1003 insertions(+), 39 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/flow.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/flow.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/flow.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/flow.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/flow.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/flow.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 9e8c9e8c7..abb9446a7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -300,14 +300,19 @@ public class FlowBus { // 移除节点 public static boolean removeNode(String nodeId) { - if (containNode(nodeId)) { - nodeMap.remove(nodeId); - return true; - } else { - String errMsg = StrUtil.format("cannot find the node[{}]", nodeId); - LOG.error(errMsg); + Node node = getNode(nodeId); + if (node == null) { + // 节点不存在 return false; } + nodeMap.remove(nodeId); + // 如果是脚本节点,移除脚本 + if (node.getType().isScript()) { + ScriptExecutorFactory.loadInstance() + .getScriptExecutor(node.getLanguage()) + .unLoad(nodeId); + } + return true; } // 判断是否是降级组件,如果是则添加到 fallbackNodeMap @@ -322,6 +327,19 @@ public class FlowBus { fallbackNodeMap.put(nodeType, node); } + // 重新加载脚本 + public static void reloadScript(String nodeId, String script) { + Node node = getNode(nodeId); + if (node == null) { + return; + } + // 更新脚本 + node.setScript(script); + ScriptExecutorFactory.loadInstance() + .getScriptExecutor(node.getLanguage()) + .load(nodeId, script); + } + public static void clearStat(){ initStat.set(false); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java index 7141bffc6..61fece39f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -1,14 +1,19 @@ package com.yomahub.liteflow.script.jsr223; import cn.hutool.core.util.StrUtil; -import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.exception.ScriptLoadException; import com.yomahub.liteflow.util.CopyOnWriteHashMap; -import javax.script.*; + +import javax.script.Bindings; +import javax.script.Compilable; +import javax.script.CompiledScript; +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.SimpleBindings; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -43,10 +48,6 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { try { CompiledScript compiledScript = ((Compilable) scriptEngine).compile(convertScript(script)); compiledScriptMap.put(nodeId, compiledScript); - // 更新 node - if (FlowBus.containNode(nodeId)) { - FlowBus.getNode(nodeId).setScript(script); - } } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); @@ -57,8 +58,6 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { @Override public void unLoad(String nodeId) { compiledScriptMap.remove(nodeId); - // 移除节点 - FlowBus.removeNode(nodeId); } @Override diff --git a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java index 1d8d7b1d5..24260e630 100644 --- a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java @@ -40,10 +40,6 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { try { String wrapScript = StrUtil.format("function process(){{}} process();", script); scriptMap.put(nodeId, Source.create("js", wrapScript)); - // 更新 node - if (FlowBus.containNode(nodeId)) { - FlowBus.getNode(nodeId).setScript(script); - } } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); @@ -54,8 +50,6 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { @Override public void unLoad(String nodeId) { scriptMap.remove(nodeId); - // 移除节点 - FlowBus.removeNode(nodeId); } @Override diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java index 7154a2fe6..e7861d38a 100644 --- a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java +++ b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java @@ -29,10 +29,6 @@ public class JavaExecutor extends ScriptExecutor { se.setParameters(new String[] {"_meta"}, new Class[] {ScriptExecuteWrap.class}); se.cook(convertScript(script)); compiledScriptMap.put(nodeId, se); - // 更新 node - if (FlowBus.containNode(nodeId)) { - FlowBus.getNode(nodeId).setScript(script); - } }catch (Exception e){ String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage()); throw new ScriptLoadException(errorMsg); @@ -43,8 +39,6 @@ public class JavaExecutor extends ScriptExecutor { @Override public void unLoad(String nodeId) { compiledScriptMap.remove(nodeId); - // 移除节点 - FlowBus.removeNode(nodeId); } @Override diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java new file mode 100644 index 000000000..738bd09e5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java @@ -0,0 +1,114 @@ +package com.yomahub.liteflow.test.script.aviator.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载和重载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowAviatorScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowAviatorScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.AVIATOR.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(2, nodeIds.size()); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Long.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Long.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "setData(defaultContext,\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..a9c631831 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java index 6e0491c3c..86db95027 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java @@ -23,7 +23,7 @@ import javax.annotation.Resource; import java.util.List; /** - * 测试脚本的卸载功能 + * 测试脚本的卸载和重载功能 * * @author DaleLee */ @@ -36,14 +36,17 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { @Resource private FlowExecutor flowExecutor; + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); + + // 仅卸载脚本 @Test public void testUnload() { - ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() - .getScriptExecutor(ScriptTypeEnum.JS.getDisplayName()); + flowExecutor.reloadRule(); // 获取节点id List nodeIds = scriptExecutor.getNodeIds(); - Assertions.assertEquals(nodeIds.size(), 2); + Assertions.assertEquals(2, nodeIds.size()); Assertions.assertTrue(nodeIds.contains("s1")); Assertions.assertTrue(nodeIds.contains("s2")); @@ -62,8 +65,50 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { // 脚本已卸载 Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + // 节点已卸载 - Assertions.assertFalse(FlowBus.containNode("s1")); - Assertions.assertFalse(FlowBus.removeNode("s1")); + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "defaultContext.setData(\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java new file mode 100644 index 000000000..e1c0e6ad6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java @@ -0,0 +1,114 @@ +package com.yomahub.liteflow.test.script.groovy.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载和重载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowGroovyScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowGroovyScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.GROOVY.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(2, nodeIds.size()); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "defaultContext.setData(\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..9dbcefb10 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java new file mode 100644 index 000000000..205ba5a36 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java @@ -0,0 +1,124 @@ +package com.yomahub.liteflow.test.script.java.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载和重载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowJavaScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowJavaScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.JAVA.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(2, nodeIds.size()); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = " import com.yomahub.liteflow.slot.DefaultContext;\n" + + " import com.yomahub.liteflow.script.body.JaninoCommonScriptBody;\n" + + " import com.yomahub.liteflow.script.ScriptExecuteWrap;\n" + + "\n" + + " public class Demo implements JaninoCommonScriptBody {\n" + + " public Void body(ScriptExecuteWrap wrap) {\n" + + " DefaultContext ctx = (DefaultContext) wrap.getCmp().getFirstContextBean();\n" + + " ctx.setData(\"s1\", \"abc\");\n" + + " return null;\n" + + " }\n" + + " }"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..dded8d6f5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java index ce0f25210..a104fd333 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java @@ -16,7 +16,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; 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.junit.jupiter.SpringExtension; @@ -47,7 +46,7 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { // 获取节点id List nodeIds = scriptExecutor.getNodeIds(); - Assertions.assertEquals(nodeIds.size(), 2); + Assertions.assertEquals(2, nodeIds.size()); Assertions.assertTrue(nodeIds.contains("s1")); Assertions.assertTrue(nodeIds.contains("s2")); @@ -55,7 +54,7 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); Assertions.assertTrue(response.isSuccess()); DefaultContext context = response.getFirstContextBean(); - Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + Assertions.assertEquals(Double.valueOf(6), context.getData("s1")); // 卸载脚本 scriptExecutor.unLoad("s1"); @@ -77,7 +76,7 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); Assertions.assertTrue(response.isSuccess()); DefaultContext context = response.getFirstContextBean(); - Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + Assertions.assertEquals(Double.valueOf(5), context.getData("s2")); // 卸载节点 FlowBus.removeNode("s2"); @@ -88,13 +87,28 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { // 新 chian 会找不到节点 Assertions.assertThrows(ELParseException.class, - () -> LiteFlowChainELBuilder.createChain().setChainId("chain3").setEL( - "THEN(s2)" - ).build()); + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); // 节点已卸载 Assertions.assertFalse(FlowBus.containNode("s2")); // 脚本已卸载 Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "defaultContext.setData(\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java new file mode 100644 index 000000000..951d0a94a --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java @@ -0,0 +1,114 @@ +package com.yomahub.liteflow.test.script.lua.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载和重载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowLuaScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowLuaScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.LUA.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(2, nodeIds.size()); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "defaultContext:setData(\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..80888321f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java new file mode 100644 index 000000000..fd06b7eaa --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java @@ -0,0 +1,114 @@ +package com.yomahub.liteflow.test.script.python.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载和重载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowPythonScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowPythonScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.PYTHON.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(2, nodeIds.size()); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "defaultContext.setData(\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..0ca8f80fd --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java new file mode 100644 index 000000000..c86d6a2d3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java @@ -0,0 +1,114 @@ +package com.yomahub.liteflow.test.script.qlexpress.remove; + +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.ScriptExecutorFactory; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +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.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 测试脚本的卸载和重载功能 + * + * @author DaleLee + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/remove/application.properties") +@SpringBootTest(classes = LiteFlowQLExpressScriptRemoveELTest.class) +@EnableAutoConfiguration +public class LiteFlowQLExpressScriptRemoveELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + private ScriptExecutor scriptExecutor = ScriptExecutorFactory.loadInstance() + .getScriptExecutor(ScriptTypeEnum.QLEXPRESS.getDisplayName()); + + // 仅卸载脚本 + @Test + public void testUnload() { + flowExecutor.reloadRule(); + + // 获取节点id + List nodeIds = scriptExecutor.getNodeIds(); + Assertions.assertEquals(2, nodeIds.size()); + Assertions.assertTrue(nodeIds.contains("s1")); + Assertions.assertTrue(nodeIds.contains("s2")); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(6), context.getData("s1")); + + // 卸载脚本 + scriptExecutor.unLoad("s1"); + response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + Assertions.assertEquals("script for node[s1] is not loaded", response.getMessage()); + + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s1")); + } + + // 卸载节点和脚本 + @Test + public void testRemove() { + flowExecutor.reloadRule(); + + // 保证脚本可以正常运行 + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); + + // 卸载节点 + FlowBus.removeNode("s2"); + + // 旧 chain 报脚本加载错误 + response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertEquals(ScriptLoadException.class, response.getCause().getClass()); + + // 新 chian 会找不到节点 + Assertions.assertThrows(ELParseException.class, + () -> LiteFlowChainELBuilder.createChain() + .setChainId("chain3") + .setEL("THEN(s2)") + .build()); + + // 节点已卸载 + Assertions.assertFalse(FlowBus.containNode("s2")); + // 脚本已卸载 + Assertions.assertFalse(scriptExecutor.getNodeIds().contains("s2")); + } + + // 重载脚本 + @Test + public void testReloadScript() { + flowExecutor.reloadRule(); + String script = "defaultContext.setData(\"s1\",\"abc\");"; + FlowBus.reloadScript("s1", script); + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + // 执行结果变更 + Assertions.assertEquals("abc", context.getData("s1")); + // 脚本变更 + Assertions.assertEquals(FlowBus.getNode("s1").getScript(), script); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/application.properties new file mode 100644 index 000000000..21b596255 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=remove/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/flow.xml new file mode 100644 index 000000000..21e82c24b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/remove/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(s1); + + + + THEN(s2); + + \ No newline at end of file From af48be6061476f7d9e746dda16d76d0add31078d Mon Sep 17 00:00:00 2001 From: noear Date: Tue, 16 Jan 2024 22:40:59 +0800 Subject: [PATCH 09/49] =?UTF-8?q?=E3=80=90=E6=9B=B4=E6=96=B0=E3=80=91solon?= =?UTF-8?q?=20=E7=89=88=E6=9C=AC=E5=8D=87=E4=B8=BA=202.6.5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solon/config/LiteflowMainAutoConfiguration.java | 6 +++--- .../abstractChain/AbstractChainJsonELSpringBootTest.java | 4 ++-- .../abstractChain/AbstractChainXMLELSpringBootTest.java | 4 ++-- .../abstractChain/AbstractChainYmlELSpringBootTest.java | 4 ++-- .../test/asyncNode/AsyncNodeELSpringbootTest.java | 4 ++-- .../yomahub/liteflow/test/base/BaseELSpringbootTest.java | 4 ++-- .../liteflow/test/cmpData/CmpDataELSpringbootTest.java | 4 ++-- .../test/cmpRetry/LiteflowRetryELSpringbootTest.java | 4 ++-- .../liteflow/test/cmpStep/CmpStepELSpringbootTest.java | 4 ++-- .../test/comments/LiteflowNodeELSpringbootTest.java | 4 ++-- .../liteflow/test/complex/ComplexELSpringbootTest1.java | 4 ++-- .../liteflow/test/complex2/ComplexELSpringbootTest2.java | 4 ++-- .../test/component/FlowExecutorELSpringbootTest.java | 4 ++-- .../test/customNodes/CustomNodesELSpringbootTest.java | 4 ++-- .../CustomWhenThreadPoolELSpringbootTest.java | 4 ++-- .../liteflow/test/event/EventELSpringbootTest.java | 4 ++-- .../test/exception/Exception2ELSpringBootTest.java | 9 ++++----- .../execute2Future/Executor2FutureELSpringbootTest.java | 4 ++-- .../liteflow/test/fallback/FallbackELSolonTest.java | 4 ++-- .../test/getChainName/GetChainNameELSpringbootTest.java | 4 ++-- .../yomahub/liteflow/test/ifelse/IfELSpringbootTest.java | 4 ++-- .../lfCmpAnno/LiteflowComponentELSpringbootTest.java | 4 ++-- .../yomahub/liteflow/test/loop/LoopELSpringbootTest.java | 4 ++-- .../MaxWaitMillisecondsSolonTest.java | 4 ++-- .../test/maxWaitSeconds/MaxWaitSecondsSolonTest.java | 4 ++-- .../liteflow/test/monitor/MonitorELSpringbootTest.java | 4 ++-- .../test/multiContext/MultiContextELSpringbootTest.java | 4 ++-- .../LiteflowMultipleTypeELSpringbootTest.java | 4 ++-- .../LiteflowNodeExecutorELSpringbootTest.java | 4 ++-- .../test/nullParam/NullParamELSpringbootTest.java | 4 ++-- .../test/parallelLoop/ParallelLoopELSpringbootTest.java | 5 ++--- .../parsecustom/CustomParserJsonELSpringbootTest.java | 4 ++-- .../parsecustom/CustomParserXmlELSpringbootTest.java | 4 ++-- .../parsecustom/CustomParserYmlELSpringbootTest.java | 4 ++-- .../liteflow/test/parser/JsonParserELSpringbootTest.java | 4 ++-- .../test/parser/SpringELSupportELSpringbootTest.java | 4 ++-- .../liteflow/test/parser/XmlParserELSpringbootTest.java | 4 ++-- .../liteflow/test/parser/YmlParserELSpringbootTest.java | 4 ++-- .../preAndFinally/PreAndFinallyELSpringbootTest.java | 4 ++-- .../privateDelivery/PrivateDeliveryELSpringbootTest.java | 4 ++-- .../test/refreshRule/RefreshRuleELSpringbootTest.java | 4 ++-- .../liteflow/test/reload/ReloadELSpringbootTest.java | 4 ++-- .../test/removeChain/RemoveChainELSpringbootTest.java | 4 ++-- .../requestId/LiteflowRequestIdELSpringbootTest.java | 4 ++-- .../liteflow/test/rollback/RollbackSpringbootTest.java | 3 ++- .../test/subflow/ImplicitSubFlowELSpringbootTest.java | 4 ++-- .../SubflowInDifferentConfigELSpringbootTest.java | 8 ++++---- .../test/subflow/SubflowXMLELSpringBootTest.java | 4 ++-- .../test/subflow/SubflowYmlELSpringBootTest.java | 4 ++-- .../test/subflow2/SubflowJsonELSpringBootTest.java | 4 ++-- .../liteflow/test/switchcase/SwitchELSpringbootTest.java | 4 ++-- .../liteflow/test/tag/NodeTagELSpringbootJsonTest.java | 4 ++-- .../liteflow/test/tag/NodeTagELSpringbootXmlTest.java | 4 ++-- .../test/useTTLInWhen/UseTTLInWhenELSpringbootTest.java | 4 ++-- .../test/whenTimeOut/WhenTimeOutELSpringbootTest1.java | 4 ++-- .../test/whenTimeOut/WhenTimeOutELSpringbootTest2.java | 4 ++-- pom.xml | 2 +- 57 files changed, 118 insertions(+), 119 deletions(-) diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java index e40faa398..319ed9edf 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/config/LiteflowMainAutoConfiguration.java @@ -5,7 +5,7 @@ import com.yomahub.liteflow.property.LiteflowConfig; import org.noear.solon.annotation.Configuration; import org.noear.solon.annotation.Init; import org.noear.solon.annotation.Inject; -import org.noear.solon.core.AopContext; +import org.noear.solon.core.AppContext; /** * 主要的业务装配器 在这个装配器里装配了执行器,执行器初始化类,监控器 @@ -22,7 +22,7 @@ public class LiteflowMainAutoConfiguration { boolean parseOnStart; @Inject - AopContext aopContext; + AppContext appContext; @Inject LiteflowConfig liteflowConfig; @@ -39,7 +39,7 @@ public class LiteflowMainAutoConfiguration { flowExecutor.init(true); } - aopContext.wrapAndPut(FlowExecutor.class, flowExecutor); + appContext.wrapAndPut(FlowExecutor.class, flowExecutor); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringBootTest.java index d2a6809ae..e419124ac 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainJsonELSpringBootTest.java @@ -6,12 +6,12 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/abstractChain/application-json.properties") +@Import(profiles="classpath:/abstractChain/application-json.properties") public class AbstractChainJsonELSpringBootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringBootTest.java index e4be4203c..d94db943a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainXMLELSpringBootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试显示调用子流程(xml) 单元测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author justin.xu */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/abstractChain/application.properties") +@Import(profiles="classpath:/abstractChain/application.properties") public class AbstractChainXMLELSpringBootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYmlELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYmlELSpringBootTest.java index 454011c00..2ce1b74b2 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYmlELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/abstractChain/AbstractChainYmlELSpringBootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试显示调用子流程(yml) 单元测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author justin.xu */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/abstractChain/application-yml.properties") +@Import(profiles="classpath:/abstractChain/application-yml.properties") public class AbstractChainYmlELSpringBootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/asyncNode/AsyncNodeELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/asyncNode/AsyncNodeELSpringbootTest.java index 6b223f825..05ca42dc4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/asyncNode/AsyncNodeELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/asyncNode/AsyncNodeELSpringbootTest.java @@ -9,9 +9,9 @@ import com.yomahub.liteflow.test.asyncNode.exception.TestException; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试隐式调用子流程 单元测试 @@ -19,7 +19,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author ssss */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/asyncNode/application.properties") +@Import(profiles="classpath:/asyncNode/application.properties") public class AsyncNodeELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/base/BaseELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/base/BaseELSpringbootTest.java index 4b6fbc38e..296825816 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/base/BaseELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/base/BaseELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL常规的例子测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/base/application.properties") +@Import(profiles="classpath:/base/application.properties") public class BaseELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java index 46a28ce6e..5297fed2b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java @@ -9,9 +9,9 @@ import com.yomahub.liteflow.test.cmpData.vo.User; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL常规的例子测试 @@ -19,7 +19,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/cmpData/application.properties") +@Import(profiles="classpath:/cmpData/application.properties") public class CmpDataELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpRetry/LiteflowRetryELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpRetry/LiteflowRetryELSpringbootTest.java index 8e28792e9..29f92fdb8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpRetry/LiteflowRetryELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpRetry/LiteflowRetryELSpringbootTest.java @@ -7,9 +7,9 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.noear.snack.ONode; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试springboot下的节点执行器 @@ -18,7 +18,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.10 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/cmpRetry/application.properties") +@Import(profiles="classpath:/cmpRetry/application.properties") public class LiteflowRetryELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepELSpringbootTest.java index 7624a3690..f7d98c0e2 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/cmpStep/CmpStepELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import java.util.*; @@ -20,7 +20,7 @@ import java.util.*; * @since 2.7.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/cmpStep/application.properties") +@Import(profiles="classpath:/cmpStep/application.properties") public class CmpStepELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/comments/LiteflowNodeELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/comments/LiteflowNodeELSpringbootTest.java index c188d3a92..f75a91614 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/comments/LiteflowNodeELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/comments/LiteflowNodeELSpringbootTest.java @@ -7,12 +7,12 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/comments/application.properties") +@Import(profiles="classpath:/comments/application.properties") public class LiteflowNodeELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex/ComplexELSpringbootTest1.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex/ComplexELSpringbootTest1.java index adfa6d0da..08e63f399 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex/ComplexELSpringbootTest1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex/ComplexELSpringbootTest1.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL复杂例子测试1 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/complex/application1.properties") +@Import(profiles="classpath:/complex/application1.properties") public class ComplexELSpringbootTest1 extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex2/ComplexELSpringbootTest2.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex2/ComplexELSpringbootTest2.java index 9d79f629c..21d3c15e4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex2/ComplexELSpringbootTest2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/complex2/ComplexELSpringbootTest2.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL复杂例子测试1 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/complex/application2.properties") +@Import(profiles="classpath:/complex/application2.properties") public class ComplexELSpringbootTest2 extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/component/FlowExecutorELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/component/FlowExecutorELSpringbootTest.java index 58450c05e..00068cd0d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/component/FlowExecutorELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/component/FlowExecutorELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,7 +18,7 @@ import org.slf4j.LoggerFactory; * @author donguo.tao */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/component/application.properties") +@Import(profiles="classpath:/component/application.properties") public class FlowExecutorELSpringbootTest extends BaseTest { private static final Logger LOG = LoggerFactory.getLogger(FlowExecutorELSpringbootTest.class); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customNodes/CustomNodesELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customNodes/CustomNodesELSpringbootTest.java index be2c7cbe5..b2e80dc18 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customNodes/CustomNodesELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customNodes/CustomNodesELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,7 @@ import org.slf4j.LoggerFactory; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/customNodes/application.properties") +@Import(profiles="classpath:/customNodes/application.properties") public class CustomNodesELSpringbootTest extends BaseTest { private final Logger log = LoggerFactory.getLogger(this.getClass()); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomWhenThreadPoolELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomWhenThreadPoolELSpringbootTest.java index 3711f87c5..bb4caef34 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomWhenThreadPoolELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/customWhenThreadPool/CustomWhenThreadPoolELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/customWhenThreadPool/application.properties") +@Import(profiles="classpath:/customWhenThreadPool/application.properties") public class CustomWhenThreadPoolELSpringbootTest extends BaseTest { private final Logger log = LoggerFactory.getLogger(this.getClass()); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/event/EventELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/event/EventELSpringbootTest.java index 8b7696891..4de9c6ee9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/event/EventELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/event/EventELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境事件回调测试 @@ -18,7 +18,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.7.1 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/event/application.properties") +@Import(profiles="classpath:/event/application.properties") public class EventELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/exception/Exception2ELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/exception/Exception2ELSpringBootTest.java index 115f35e55..530fc24da 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/exception/Exception2ELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/exception/Exception2ELSpringBootTest.java @@ -2,7 +2,6 @@ package com.yomahub.liteflow.test.exception; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.exception.ChainNotFoundException; -import com.yomahub.liteflow.exception.FlowSystemException; import com.yomahub.liteflow.exception.LiteFlowException; import com.yomahub.liteflow.exception.NoSwitchTargetNodeException; import com.yomahub.liteflow.flow.LiteflowResponse; @@ -10,10 +9,10 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; -import org.noear.solon.core.AopContext; +import org.noear.solon.core.AppContext; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 流程执行异常 单元测试 @@ -21,14 +20,14 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author zendwang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/exception/application.properties") +@Import(profiles="classpath:/exception/application.properties") public class Exception2ELSpringBootTest extends BaseTest { @Inject private FlowExecutor flowExecutor; @Inject - private AopContext context; + private AppContext context; @Test public void testChainNotFoundException() throws Exception { diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureELSpringbootTest.java index 2cdcf6ac2..6afc58dda 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/execute2Future/Executor2FutureELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import java.util.concurrent.Future; /** @@ -19,7 +19,7 @@ import java.util.concurrent.Future; * @since 2.6.13 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/execute2Future/application.properties") +@Import(profiles="classpath:/execute2Future/application.properties") public class Executor2FutureELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/FallbackELSolonTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/FallbackELSolonTest.java index db1603212..dae75cc12 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/FallbackELSolonTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/FallbackELSolonTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -20,7 +20,7 @@ import java.util.concurrent.Future; * @since 2.11.1 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/fallback/application.properties") +@Import(profiles="classpath:/fallback/application.properties") public class FallbackELSolonTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/getChainName/GetChainNameELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/getChainName/GetChainNameELSpringbootTest.java index c1ec728ed..41bba0aeb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/getChainName/GetChainNameELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/getChainName/GetChainNameELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境获取ChainName的测试 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/getChainName/application.properties") +@Import(profiles="classpath:/getChainName/application.properties") public class GetChainNameELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java index 3138f2f80..92924a969 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL常规的例子测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/ifelse/application.properties") +@Import(profiles="classpath:/ifelse/application.properties") public class IfELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lfCmpAnno/LiteflowComponentELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lfCmpAnno/LiteflowComponentELSpringbootTest.java index 1e40ced58..5260c9dad 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lfCmpAnno/LiteflowComponentELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/lfCmpAnno/LiteflowComponentELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试@LiteflowComponent标注 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.10 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/lfCmpAnno/application.properties") +@Import(profiles="classpath:/lfCmpAnno/application.properties") public class LiteflowComponentELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java index e70731910..00abc254e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL循环的例子测试 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/loop/application.properties") +@Import(profiles="classpath:/loop/application.properties") public class LoopELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/MaxWaitMillisecondsSolonTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/MaxWaitMillisecondsSolonTest.java index d246c786b..3c977c1ed 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/MaxWaitMillisecondsSolonTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/MaxWaitMillisecondsSolonTest.java @@ -14,9 +14,9 @@ import com.yomahub.liteflow.test.maxWaitSeconds.cmp.CCmp; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import java.util.concurrent.TimeoutException; @@ -29,7 +29,7 @@ import static com.yomahub.liteflow.test.maxWaitSeconds.cmp.DCmp.CONTENT_KEY; * @since 2.11.1 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/maxWaitMilliseconds/application.properties") +@Import(profiles="classpath:/maxWaitMilliseconds/application.properties") public class MaxWaitMillisecondsSolonTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsSolonTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsSolonTest.java index 981d6b215..b4c40a3ad 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsSolonTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsSolonTest.java @@ -14,9 +14,9 @@ import com.yomahub.liteflow.test.maxWaitSeconds.cmp.CCmp; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import java.util.concurrent.TimeoutException; @@ -29,7 +29,7 @@ import static com.yomahub.liteflow.test.maxWaitSeconds.cmp.DCmp.CONTENT_KEY; * @since 2.11.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/maxWaitSeconds/application.properties") +@Import(profiles="classpath:/maxWaitSeconds/application.properties") public class MaxWaitSecondsSolonTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/monitor/MonitorELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/monitor/MonitorELSpringbootTest.java index 69db27030..dbdf47464 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/monitor/MonitorELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/monitor/MonitorELSpringbootTest.java @@ -9,9 +9,9 @@ import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境最普通的例子测试 @@ -20,7 +20,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/monitor/application.properties") +@Import(profiles="classpath:/monitor/application.properties") public class MonitorELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multiContext/MultiContextELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multiContext/MultiContextELSpringbootTest.java index 8c9173c28..5a718dc70 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multiContext/MultiContextELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multiContext/MultiContextELSpringbootTest.java @@ -9,9 +9,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境最普通的例子测试 @@ -20,7 +20,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/multiContext/application.properties") +@Import(profiles="classpath:/multiContext/application.properties") public class MultiContextELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeELSpringbootTest.java index 5052d86a5..3a10ed4cf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/multipleType/LiteflowMultipleTypeELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试springboot下混合格式规则的场景 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.10 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/multipleType/application.properties") +@Import(profiles="classpath:/multipleType/application.properties") public class LiteflowMultipleTypeELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nodeExecutor/LiteflowNodeExecutorELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nodeExecutor/LiteflowNodeExecutorELSpringbootTest.java index 524199bbd..063675732 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nodeExecutor/LiteflowNodeExecutorELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nodeExecutor/LiteflowNodeExecutorELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试springboot下的组件重试 @@ -18,7 +18,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.10 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/nodeExecutor/application.properties") +@Import(profiles="classpath:/nodeExecutor/application.properties") public class LiteflowNodeExecutorELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nullParam/NullParamELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nullParam/NullParamELSpringbootTest.java index f2ffff350..ad15f97c7 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nullParam/NullParamELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/nullParam/NullParamELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 单元测试:传递null param导致NPE的优化代码 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.6 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/nullParam/application.properties") +@Import(profiles="classpath:/nullParam/application.properties") public class NullParamELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELSpringbootTest.java index fffe2b305..e19394d65 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/ParallelLoopELSpringbootTest.java @@ -9,11 +9,10 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; -//import javax.annotation.Resource; import java.util.List; import java.util.regex.Pattern; @@ -24,7 +23,7 @@ import java.util.regex.Pattern; * @since 2.11.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parallelLoop/application.properties") +@Import(profiles="classpath:/parallelLoop/application.properties") public class ParallelLoopELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserJsonELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserJsonELSpringbootTest.java index 60911af80..3ecccc553 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserJsonELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserJsonELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境的自定义json parser单元测试 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parsecustom/application-custom-json.properties") +@Import(profiles="classpath:/parsecustom/application-custom-json.properties") public class CustomParserJsonELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserXmlELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserXmlELSpringbootTest.java index 9a6b92ab2..8fff7ff8a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserXmlELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserXmlELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境的自定义xml parser单元测试 主要测试自定义配置源类是否能引入springboot中的其他依赖 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.7 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parsecustom/application-custom-xml.properties") +@Import(profiles="classpath:/parsecustom/application-custom-xml.properties") public class CustomParserXmlELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserYmlELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserYmlELSpringbootTest.java index 7a61da242..798c368de 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserYmlELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parsecustom/CustomParserYmlELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境的自定义yml parser单元测试 主要测试自定义配置源类是否能引入springboot中的其他依赖 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author junjun */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parsecustom/application-custom-yml.properties") +@Import(profiles="classpath:/parsecustom/application-custom-yml.properties") public class CustomParserYmlELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/JsonParserELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/JsonParserELSpringbootTest.java index 13e66a5f9..f50590f02 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/JsonParserELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/JsonParserELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * spring环境的json parser单元测试 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parser/application-json.properties") +@Import(profiles="classpath:/parser/application-json.properties") public class JsonParserELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportELSpringbootTest.java index 0e03bbc88..b66b02b1c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/SpringELSupportELSpringbootTest.java @@ -6,12 +6,12 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parser/application-springEL.properties") +@Import(profiles="classpath:/parser/application-springEL.properties") public class SpringELSupportELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/XmlParserELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/XmlParserELSpringbootTest.java index 5df5042b7..e77846c3b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/XmlParserELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/XmlParserELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境的xml parser单元测试 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parser/application-xml.properties") +@Import(profiles="classpath:/parser/application-xml.properties") public class XmlParserELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/YmlParserELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/YmlParserELSpringbootTest.java index ba528c532..ad2ddac0d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/YmlParserELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parser/YmlParserELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot下的yml parser测试用例 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/parser/application-yml.properties") +@Import(profiles="classpath:/parser/application-yml.properties") public class YmlParserELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/preAndFinally/PreAndFinallyELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/preAndFinally/PreAndFinallyELSpringbootTest.java index b652e25ef..2e9d4841f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/preAndFinally/PreAndFinallyELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/preAndFinally/PreAndFinallyELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境下pre节点和finally节点的测试 @@ -18,7 +18,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/preAndFinally/application.properties") +@Import(profiles="classpath:/preAndFinally/application.properties") public class PreAndFinallyELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/privateDelivery/PrivateDeliveryELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/privateDelivery/PrivateDeliveryELSpringbootTest.java index ed0558750..2d5498757 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/privateDelivery/PrivateDeliveryELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/privateDelivery/PrivateDeliveryELSpringbootTest.java @@ -8,9 +8,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境下隐私投递的测试 @@ -19,7 +19,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/privateDelivery/application.properties") +@Import(profiles="classpath:/privateDelivery/application.properties") public class PrivateDeliveryELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/refreshRule/RefreshRuleELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/refreshRule/RefreshRuleELSpringbootTest.java index 605880ee6..33a870d20 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/refreshRule/RefreshRuleELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/refreshRule/RefreshRuleELSpringbootTest.java @@ -9,9 +9,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境下重新加载规则测试 @@ -20,7 +20,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/refreshRule/application.properties") +@Import(profiles="classpath:/refreshRule/application.properties") public class RefreshRuleELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/reload/ReloadELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/reload/ReloadELSpringbootTest.java index a42a3112b..07b7666b4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/reload/ReloadELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/reload/ReloadELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境下重新加载规则测试 @@ -17,7 +17,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/reload/application.properties") +@Import(profiles="classpath:/reload/application.properties") public class ReloadELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/removeChain/RemoveChainELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/removeChain/RemoveChainELSpringbootTest.java index c9d81b0b8..38a201f96 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/removeChain/RemoveChainELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/removeChain/RemoveChainELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境最普通的例子测试 @@ -18,7 +18,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/removeChain/application.properties") +@Import(profiles="classpath:/removeChain/application.properties") public class RemoveChainELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/requestId/LiteflowRequestIdELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/requestId/LiteflowRequestIdELSpringbootTest.java index 269add359..95ef6040d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/requestId/LiteflowRequestIdELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/requestId/LiteflowRequestIdELSpringbootTest.java @@ -6,15 +6,15 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * @author tangkc */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/requestId/application.properties") +@Import(profiles="classpath:/requestId/application.properties") public class LiteflowRequestIdELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java index fdaa63d62..03f08da50 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/RollbackSpringbootTest.java @@ -7,13 +7,14 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.annotation.TestPropertySource; @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/rollback/application.properties") +@Import(profiles="classpath:/rollback/application.properties") public class RollbackSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java index d463b70ac..dba7ce268 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/ImplicitSubFlowELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import java.util.HashSet; import java.util.Set; @@ -20,7 +20,7 @@ import java.util.Set; * @author justin.xu */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/subflow/application-implicit.properties") +@Import(profiles="classpath:/subflow/application-implicit.properties") public class ImplicitSubFlowELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowInDifferentConfigELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowInDifferentConfigELSpringbootTest.java index 46d611a9a..9f85741a8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowInDifferentConfigELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowInDifferentConfigELSpringbootTest.java @@ -8,10 +8,10 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; -import org.noear.solon.core.AopContext; +import org.noear.solon.core.AppContext; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试主流程与子流程在不同的配置文件的场景 @@ -19,7 +19,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/subflow/application-subInDifferentConfig1.properties") +@Import(profiles = "classpath:/subflow/application-subInDifferentConfig1.properties") public class SubflowInDifferentConfigELSpringbootTest extends BaseTest { @Inject @@ -34,7 +34,7 @@ public class SubflowInDifferentConfigELSpringbootTest extends BaseTest { } @Inject - private AopContext context; + private AppContext context; // 主要测试有不同的配置类型后会不会报出既定的错误 @Test diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowXMLELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowXMLELSpringBootTest.java index 30d2e5ee4..428d218fa 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowXMLELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowXMLELSpringBootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试显示调用子流程(xml) 单元测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author justin.xu */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/subflow/application-xml.properties") +@Import(profiles ="classpath:/subflow/application-xml.properties") public class SubflowXMLELSpringBootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowYmlELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowYmlELSpringBootTest.java index a85349784..d0bffb02d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowYmlELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow/SubflowYmlELSpringBootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试显示调用子流程(yml) 单元测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author justin.xu */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/subflow/application-yml.properties") +@Import(profiles ="classpath:/subflow/application-yml.properties") public class SubflowYmlELSpringBootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow2/SubflowJsonELSpringBootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow2/SubflowJsonELSpringBootTest.java index 512d4870f..b0bf2c19f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow2/SubflowJsonELSpringBootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/subflow2/SubflowJsonELSpringBootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 测试显示调用子流程(json) 单元测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author justin.xu */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/subflow/application-json.properties") +@Import(profiles ="classpath:/subflow/application-json.properties") public class SubflowJsonELSpringBootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/switchcase/SwitchELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/switchcase/SwitchELSpringbootTest.java index 7d1b2c09f..54cabd667 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/switchcase/SwitchELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/switchcase/SwitchELSpringbootTest.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境EL常规的例子测试 @@ -16,7 +16,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @author Bryan.Zhang */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/switchcase/application.properties") +@Import(profiles ="classpath:/switchcase/application.properties") public class SwitchELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootJsonTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootJsonTest.java index d5301e3f3..277096fd8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootJsonTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootJsonTest.java @@ -8,9 +8,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境下隐私投递的测试 @@ -19,7 +19,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/tag/application-json.properties") +@Import(profiles ="classpath:/tag/application-json.properties") public class NodeTagELSpringbootJsonTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootXmlTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootXmlTest.java index a25f63b63..2d123f80c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootXmlTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/tag/NodeTagELSpringbootXmlTest.java @@ -8,9 +8,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * springboot环境下隐私投递的测试 @@ -19,7 +19,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.5.0 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/tag/application-xml.properties") +@Import(profiles ="classpath:/tag/application-xml.properties") public class NodeTagELSpringbootXmlTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/useTTLInWhen/UseTTLInWhenELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/useTTLInWhen/UseTTLInWhenELSpringbootTest.java index f12ece677..49b7cd5f6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/useTTLInWhen/UseTTLInWhenELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/useTTLInWhen/UseTTLInWhenELSpringbootTest.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; /** * 在when异步节点的情况下去拿ThreadLocal里的测试场景 @@ -18,7 +18,7 @@ import org.noear.solon.test.annotation.TestPropertySource; * @since 2.6.3 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/useTTLInWhen/application.properties") +@Import(profiles ="classpath:/useTTLInWhen/application.properties") public class UseTTLInWhenELSpringbootTest extends BaseTest { @Inject diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest1.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest1.java index 904fbcc9b..4d109e4da 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest1.java @@ -7,9 +7,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +20,7 @@ import org.slf4j.LoggerFactory; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/whenTimeOut/application1.properties") +@Import(profiles ="classpath:/whenTimeOut/application1.properties") public class WhenTimeOutELSpringbootTest1 extends BaseTest { private final Logger log = LoggerFactory.getLogger(this.getClass()); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest2.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest2.java index 3612d67d3..f797525f1 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/whenTimeOut/WhenTimeOutELSpringbootTest2.java @@ -6,9 +6,9 @@ import com.yomahub.liteflow.test.BaseTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Import; import org.noear.solon.annotation.Inject; import org.noear.solon.test.SolonJUnit5Extension; -import org.noear.solon.test.annotation.TestPropertySource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,7 +19,7 @@ import org.slf4j.LoggerFactory; * @since 2.6.4 */ @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/whenTimeOut/application2.properties") +@Import(profiles ="classpath:/whenTimeOut/application2.properties") public class WhenTimeOutELSpringbootTest2 extends BaseTest { private final Logger log = LoggerFactory.getLogger(this.getClass()); diff --git a/pom.xml b/pom.xml index eda93cec2..d71032f10 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,7 @@ 1.14.10 1.8.13 1.2.3 - 2.5.3 + 2.6.5 4.1.84.Final 4.5.13 1.9.4 From 86c961351da703e83ee3a88dbe5cd6650e4774f2 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Thu, 18 Jan 2024 09:00:19 +0800 Subject: [PATCH 10/49] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20ScriptJavaCommonELTe?= =?UTF-8?q?st?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/script/java/common/ScriptJavaCommonELTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/common/ScriptJavaCommonELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/common/ScriptJavaCommonELTest.java index 10d7ae843..6b29f6ebf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/common/ScriptJavaCommonELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/common/ScriptJavaCommonELTest.java @@ -3,6 +3,7 @@ package com.yomahub.liteflow.test.script.java.common; 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.junit.jupiter.api.extension.ExtendWith; @@ -19,7 +20,7 @@ import javax.annotation.Resource; @SpringBootTest(classes = ScriptJavaCommonELTest.class) @EnableAutoConfiguration @ComponentScan({ "com.yomahub.liteflow.test.script.java.common.cmp" }) -public class ScriptJavaCommonELTest { +public class ScriptJavaCommonELTest extends BaseTest { @Resource private FlowExecutor flowExecutor; From 18fe4e0915213809af4587a2e4920f5f01ae4b00 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Thu, 18 Jan 2024 10:07:30 +0800 Subject: [PATCH 11/49] =?UTF-8?q?feature=20#I8MW6Q=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E8=8A=82=E7=82=B9=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yomahub/liteflow/flow/FlowBus.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index abb9446a7..8b7b97d71 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -330,7 +330,7 @@ public class FlowBus { // 重新加载脚本 public static void reloadScript(String nodeId, String script) { Node node = getNode(nodeId); - if (node == null) { + if (node == null || !node.getType().isScript()) { return; } // 更新脚本 From cfc1994fd47816b602de3638a840c99b922f137e Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 18 Jan 2024 11:48:25 +0800 Subject: [PATCH 12/49] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E6=88=902.11.4.1?= =?UTF-8?q?=EF=BC=8C=E8=A1=A5=E4=B8=81=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parallel/strategy/ParallelStrategyExecutor.java | 10 +--------- .../java/com/yomahub/liteflow/test/base/cmp/ACmp.java | 1 - .../java/com/yomahub/liteflow/test/base/cmp/CCmp.java | 5 +++++ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java index b8199419e..701c74188 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java @@ -93,15 +93,7 @@ public abstract class ParallelStrategyExecutor { // 1.先进行过滤,前置和后置组件过滤掉,因为在 EL Chain 处理的时候已经提出来了 // 2.过滤 isAccess 为 false 的情况,因为不过滤这个的话,如果加上了 any,那么 isAccess 为 false 那就是最快的了 Stream stream = executableList.stream() - .filter(executable -> !(executable instanceof PreCondition) && !(executable instanceof FinallyCondition)) - .filter(executable -> { - try { - return executable.isAccess(slotIndex); - } catch (Exception e) { - LOG.error("there was an error when executing the when component isAccess", e); - return false; - } - }); + .filter(executable -> !(executable instanceof PreCondition) && !(executable instanceof FinallyCondition)); return filterAccess(stream, slotIndex); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/ACmp.java index c2361cacb..c33792217 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/ACmp.java @@ -17,5 +17,4 @@ public class ACmp extends NodeComponent { public void process() { System.out.println("ACmp executed!"); } - } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/CCmp.java index 6b6f84b41..f744fdbb8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/base/cmp/CCmp.java @@ -18,4 +18,9 @@ public class CCmp extends NodeComponent { System.out.println("CCmp executed!"); } + @Override + public boolean isAccess() { + System.out.println("hello"); + return true; + } } From 9677b128cad64f4747fbb4a2d05308105ff8fd03 Mon Sep 17 00:00:00 2001 From: rain <672378783@qq.com> Date: Thu, 18 Jan 2024 15:59:46 +0800 Subject: [PATCH 13/49] =?UTF-8?q?=E5=85=81=E8=AE=B8EL=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E9=87=8C=E8=AE=BE=E7=BD=AE=E9=87=8D=E8=AF=95=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 1 + .../el/operator/RetryTimesOperator.java | 30 +++++ .../liteflow/common/ChainConstant.java | 2 + .../element/condition/RetryCondition.java | 87 ++++++++++++++ .../RetryTimesELDeclMultiSpringbootTest.java | 108 ++++++++++++++++++ .../test/retryTimes/cmp/CmpConfig.java | 82 +++++++++++++ .../retryTimes/application.properties | 1 + .../src/test/resources/retryTimes/flow.el.xml | 43 +++++++ .../RetryTimesELDeclSpringbootTest.java | 104 +++++++++++++++++ .../liteflow/test/retryTimes/cmp/ACmp.java | 12 ++ .../liteflow/test/retryTimes/cmp/BCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/CCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/DCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/FCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/ICmp.java | 23 ++++ .../liteflow/test/retryTimes/cmp/NCmp.java | 17 +++ .../retryTimes/application.properties | 1 + .../src/test/resources/retryTimes/flow.el.xml | 43 +++++++ .../test/retryTimes/RetryTimesTest.java | 103 +++++++++++++++++ .../liteflow/test/retryTimes/cmp/ACmp.java | 11 ++ .../liteflow/test/retryTimes/cmp/BCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/CCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/DCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/FCmp.java | 15 +++ .../liteflow/test/retryTimes/cmp/ICmp.java | 21 ++++ .../liteflow/test/retryTimes/cmp/NCmp.java | 16 +++ .../src/test/resources/retryTimes/flow.el.xml | 52 +++++++++ .../retryTimes/RetryTimesSpringbootTest.java | 100 ++++++++++++++++ .../liteflow/test/retryTimes/cmp/ACmp.java | 12 ++ .../liteflow/test/retryTimes/cmp/BCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/CCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/DCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/FCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/ICmp.java | 23 ++++ .../liteflow/test/retryTimes/cmp/NCmp.java | 17 +++ .../retryTimes/application.properties | 1 + .../src/test/resources/retryTimes/flow.el.xml | 43 +++++++ .../retryTimes/RetryTimesSpringbootTest.java | 105 +++++++++++++++++ .../liteflow/test/retryTimes/cmp/ACmp.java | 12 ++ .../liteflow/test/retryTimes/cmp/BCmp.java | 18 +++ .../liteflow/test/retryTimes/cmp/CCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/DCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/FCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/ICmp.java | 23 ++++ .../liteflow/test/retryTimes/cmp/NCmp.java | 17 +++ .../retryTimes/application.properties | 1 + .../src/test/resources/retryTimes/flow.el.xml | 42 +++++++ .../test/retryTimes/RetryTimesSpringTest.java | 101 ++++++++++++++++ .../liteflow/test/retryTimes/cmp/ACmp.java | 12 ++ .../liteflow/test/retryTimes/cmp/BCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/CCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/DCmp.java | 17 +++ .../liteflow/test/retryTimes/cmp/FCmp.java | 16 +++ .../liteflow/test/retryTimes/cmp/ICmp.java | 23 ++++ .../liteflow/test/retryTimes/cmp/NCmp.java | 17 +++ .../test/resources/retryTimes/application.xml | 23 ++++ .../src/test/resources/retryTimes/flow.el.xml | 43 +++++++ 57 files changed, 1704 insertions(+) create mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java create mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.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 0f1a65ad7..f749aee94 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 @@ -92,6 +92,7 @@ public class LiteFlowChainELBuilder { EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.MAX_WAIT_SECONDS, Object.class, new MaxWaitSecondsOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.MAX_WAIT_MILLISECONDS, Object.class, new MaxWaitMillisecondsOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.PARALLEL, Object.class, new ParallelOperator()); + EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.RETRY_TIMES, Object.class, new RetryTimesOperator()); } public static LiteFlowChainELBuilder createChain() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java new file mode 100644 index 000000000..72ac3dded --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java @@ -0,0 +1,30 @@ +package com.yomahub.liteflow.builder.el.operator; + +import com.yomahub.liteflow.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.flow.element.Condition; +import com.yomahub.liteflow.flow.element.Executable; +import com.yomahub.liteflow.flow.element.condition.RetryCondition; +import com.yomahub.liteflow.flow.element.condition.ThenCondition; +import com.yomahub.liteflow.flow.element.condition.WhileCondition; + +/** + * + * @author Rain + * @since 2.11.5 + * + */ +public class RetryTimesOperator extends BaseOperator { + @Override + public Condition build(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeGtTwo(objects); + Executable executable = OperatorHelper.convert(objects[0], Executable.class); + Integer retryTimes = OperatorHelper.convert(objects[1], Integer.class); + RetryCondition retryCondition = new RetryCondition(); + retryCondition.addExecutable(executable); + retryCondition.setRetryTimes(retryTimes); + return retryCondition; + } + +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java b/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java index 884b8b157..977a9371a 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java @@ -94,4 +94,6 @@ public interface ChainConstant { String EXTENDS = "extends"; + String RETRY_TIMES = "retryTimes"; + } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java new file mode 100644 index 000000000..6f4bbaf99 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java @@ -0,0 +1,87 @@ +package com.yomahub.liteflow.flow.element.condition; + +import cn.hutool.core.text.StrFormatter; +import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.exception.ChainEndException; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Condition; +import com.yomahub.liteflow.flow.element.Executable; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.log.LFLog; +import com.yomahub.liteflow.log.LFLoggerManager; +import com.yomahub.liteflow.slot.DataBus; + +public class RetryCondition extends ThenCondition{ + + private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); + + private Integer retryTimes; + + public Integer getRetryTimes() { + return retryTimes; + } + + public void setRetryTimes(Integer retryTimes) { + this.retryTimes = retryTimes; + } + + @Override + public void executeCondition(Integer slotIndex) throws Exception { + int retryTimes = this.getRetryTimes() < 0 ? 0 : this.getRetryTimes(); + for (int i = 0; i <= retryTimes; i ++) { + try { + if(i == 0) { + super.executeCondition(slotIndex); + } else { + retry(slotIndex, i); + } + break; + } catch (ChainEndException e) { + throw e; + } catch (Exception e) { + if(i >= retryTimes) { + if(retryTimes > 0) { + String retryFailMsg = StrFormatter.format("retry fail when executing the chain[{}] because {} occurs {}.", + this.getCurrChainId(), this.getCurrentExecutableId(), e); + LOG.error(retryFailMsg); + } + throw e; + } else { + DataBus.getSlot(slotIndex).removeException(); + } + } + } + } + + private void retry(Integer slotIndex, int retryTime) throws Exception { + LOG.info("{} performs {} retry ", this.getCurrentExecutableId(), retryTime); + super.executeCondition(slotIndex); + } + + /** + * 获取当前组件的 id + * + * @return + */ + private String getCurrentExecutableId() { + // retryCondition 只有一个 Executable + Executable executable = this.getExecutableList().get(0); + if (ObjectUtil.isNotNull(executable.getId())) { + // 已经有 id 了 + return executable.getId(); + } + // 定义 id + switch (executable.getExecuteType()) { + // chain 和 node 一般都有 id + case CHAIN: + return ((Chain) executable).getChainId(); + case CONDITION: + return "condition-" + ((Condition) executable).getConditionType().getName(); + case NODE: + return "node-" + ((Node) executable).getType().getCode(); + default: + return "unknown-executable"; + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java new file mode 100644 index 000000000..2ed4fe38e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java @@ -0,0 +1,108 @@ +package com.yomahub.liteflow.test.retryTimes; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import com.yomahub.liteflow.test.rollback.RollbackELDeclMultiSpringbootTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + + +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/retryTimes/application.properties") +@SpringBootTest(classes = RetryTimesELDeclMultiSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.retryTimes.cmp" }) +public class RetryTimesELDeclMultiSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // THEN测试 + @Test + public void testThen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b==>a==>b==>a==>b", response.getExecuteStepStr()); + } + + // WHEN测试 + @Test + public void testWhen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // node测试 + @Test + public void testNode() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); + } + + // FOR测试 + @Test + public void testFor() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("c==>c==>c==>c==>a", response.getExecuteStepStr()); + } + + // SWITCH测试 + @Test + public void testSwitch() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("d==>d==>d==>d==>a", response.getExecuteStepStr()); + } + + // IF测试 + @Test + public void testIf() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("f==>f==>f==>f==>a", response.getExecuteStepStr()); + } + + // WHILE测试 + @Test + public void testWhile() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("n==>n==>n==>n==>a==>n", response.getExecuteStepStr()); + } + + // ITERATOR测试 + @Test + public void testIterator() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("i==>i==>i==>i==>a", response.getExecuteStepStr()); + } + + // 重试失败提示信息测试 + @Test + public void testRetryFail() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b", response.getExecuteStepStr()); + } + + // FINALLY测试 + @Test + public void testFinally() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b", response.getExecuteStepStr()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java new file mode 100644 index 000000000..da8c2cb99 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java @@ -0,0 +1,82 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; +import com.yomahub.liteflow.slot.DefaultContext; + +import java.util.Iterator; +import java.util.List; + +@LiteflowComponent +public class CmpConfig { + + int flagb = 0; + int flagc = 0; + int flagd = 0; + int flagf = 0; + int flagi = 0; + int flagn = 0; + int flagw = 0; + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "a") + public void processA(NodeComponent bindCmp) { + System.out.println("ACmp executed!"); + } + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "b") + public void processB(NodeComponent bindCmp) { + flagb ++; + System.out.println("BCmp executed!"); + if(flagb < 4) throw new RuntimeException(); + else flagb = 0; + } + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_FOR, nodeId = "c", nodeType = NodeTypeEnum.FOR) + public int processC(NodeComponent bindCmp) { + flagc ++; + System.out.println("CCmp executed!"); + if(flagc < 4) throw new RuntimeException(); + else return 1; + } + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeId = "d", nodeType = NodeTypeEnum.SWITCH) + public String processD(NodeComponent bindCmp) { + flagd ++; + System.out.println("DCmp executed!"); + if(flagd < 4) throw new RuntimeException(); + else return "a"; + } + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "f", nodeType = NodeTypeEnum.IF) + public boolean processF(NodeComponent bindCmp) { + System.out.println("FCmp executed!"); + flagf ++; + if(flagf < 4) throw new RuntimeException(); + else return true; + } + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_ITERATOR, nodeId = "i", nodeType = NodeTypeEnum.ITERATOR) + public Iterator processI(NodeComponent bindCmp) { + flagi ++; + if(flagi < 4) throw new RuntimeException(); + else { + List list = ListUtil.toList("jack"); + return list.iterator(); + } + } + + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "n", nodeType = NodeTypeEnum.WHILE) + public boolean processN(NodeComponent bindCmp) { + flagn ++; + System.out.println("NCmp executed!"); + if(flagn < 4) throw new RuntimeException(); + else return flagn == 4 ? true : false; + } + + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties new file mode 100644 index 000000000..ecdb08bea --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml new file mode 100644 index 000000000..775e7a742 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml @@ -0,0 +1,43 @@ + + + + THEN( a, b ).retryTimes(3); + + + + WHEN( a, b ).retryTimes(3); + + + + THEN( a, b.retryTimes(3) ); + + + + FOR(c).DO(a).retryTimes(3); + + + + SWITCH(d).TO(a).retryTimes(3); + + + + IF(f, a).retryTimes(3); + + + + WHILE(n).DO(a).retryTimes(3); + + + + ITERATOR(i).DO(a).retryTimes(3); + + + + THEN( a, b ).retryTimes(1); + + + + THEN( a, FINALLY(b, a).retryTimes(3) ); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java new file mode 100644 index 000000000..9a65758dc --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java @@ -0,0 +1,104 @@ +package com.yomahub.liteflow.test.retryTimes; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +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; + + +@TestPropertySource(value = "classpath:/retryTimes/application.properties") +@SpringBootTest(classes = RetryTimesELDeclSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.retryTimes.cmp" }) +public class RetryTimesELDeclSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // THEN测试 + @Test + public void testThen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b==>a==>b==>a==>b", response.getExecuteStepStr()); + } + + // WHEN测试 + @Test + public void testWhen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // node测试 + @Test + public void testNode() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); + } + + // FOR测试 + @Test + public void testFor() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("c==>c==>c==>c==>a", response.getExecuteStepStr()); + } + + // SWITCH测试 + @Test + public void testSwitch() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("d==>d==>d==>d==>a", response.getExecuteStepStr()); + } + + // IF测试 + @Test + public void testIf() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("f==>f==>f==>f==>a", response.getExecuteStepStr()); + } + + // WHILE测试 + @Test + public void testWhile() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("n==>n==>n==>n==>a==>n", response.getExecuteStepStr()); + } + + // ITERATOR测试 + @Test + public void testIterator() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("i==>i==>i==>i==>a", response.getExecuteStepStr()); + } + + // 重试失败提示信息测试 + @Test + public void testRetryFail() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b", response.getExecuteStepStr()); + } + + // FINALLY测试 + @Test + public void testFinally() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b", response.getExecuteStepStr()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java new file mode 100644 index 000000000..46e99dc1f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("a") +public class ACmp extends NodeComponent { + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java new file mode 100644 index 000000000..5a02501b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("b") +public class BCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() { + flag ++; + System.out.println("BCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java new file mode 100644 index 000000000..f6a1014ee --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeForComponent; + +@LiteflowComponent("c") +public class CCmp extends NodeForComponent { + int flag = 0; + + @Override + public int processFor() throws Exception { + flag ++; + System.out.println("CCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return 1; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java new file mode 100644 index 000000000..319c98cd5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeSwitchComponent; + +@LiteflowComponent("d") +public class DCmp extends NodeSwitchComponent { + int flag = 0; + + @Override + public String processSwitch() throws Exception { + flag ++; + System.out.println("DCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return "a"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java new file mode 100644 index 000000000..f9764757e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeIfComponent; + +@LiteflowComponent("f") +public class FCmp extends NodeIfComponent { + int flag = 0; + @Override + public boolean processIf() throws Exception { + System.out.println("FCmp executed!"); + flag ++; + if(flag < 4) throw new RuntimeException(); + else return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java new file mode 100644 index 000000000..3341869d8 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeIteratorComponent; + +import java.util.Iterator; +import java.util.List; + +@LiteflowComponent("i") +public class ICmp extends NodeIteratorComponent { + int flag = 0; + @Override + public Iterator processIterator() throws Exception { + flag ++; + if(flag < 4) throw new RuntimeException(); + else { + List list = ListUtil.toList("jack"); + return list.iterator(); + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java new file mode 100644 index 000000000..d4e371647 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeWhileComponent; + +@LiteflowComponent("n") +public class NCmp extends NodeWhileComponent { + int flag = 0; + + @Override + public boolean processWhile() throws Exception { + flag ++; + System.out.println("NCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return flag == 4 ? true : false; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties new file mode 100644 index 000000000..ecdb08bea --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml new file mode 100644 index 000000000..775e7a742 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml @@ -0,0 +1,43 @@ + + + + THEN( a, b ).retryTimes(3); + + + + WHEN( a, b ).retryTimes(3); + + + + THEN( a, b.retryTimes(3) ); + + + + FOR(c).DO(a).retryTimes(3); + + + + SWITCH(d).TO(a).retryTimes(3); + + + + IF(f, a).retryTimes(3); + + + + WHILE(n).DO(a).retryTimes(3); + + + + ITERATOR(i).DO(a).retryTimes(3); + + + + THEN( a, b ).retryTimes(1); + + + + THEN( a, FINALLY(b, a).retryTimes(3) ); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java new file mode 100644 index 000000000..b3dec4514 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java @@ -0,0 +1,103 @@ +package com.yomahub.liteflow.test.retryTimes; + + +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.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +public class RetryTimesTest extends BaseTest { + + private static FlowExecutor flowExecutor; + + @BeforeAll + public static void init() { + LiteflowConfig config = new LiteflowConfig(); + config.setRuleSource("retryTimes/flow.el.xml"); + flowExecutor = FlowExecutorHolder.loadInstance(config); + } + + // THEN测试 + @Test + public void testThen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b==>a==>b==>a==>b", response.getExecuteStepStr()); + } + + // WHEN测试 + @Test + public void testWhen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // node测试 + @Test + public void testNode() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); + } + + // FOR测试 + @Test + public void testFor() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("c==>c==>c==>c==>a", response.getExecuteStepStr()); + } + + // SWITCH测试 + @Test + public void testSwitch() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("d==>d==>d==>d==>a", response.getExecuteStepStr()); + } + + // IF测试 + @Test + public void testIf() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("f==>f==>f==>f==>a", response.getExecuteStepStr()); + } + + // WHILE测试 + @Test + public void testWhile() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("n==>n==>n==>n==>a==>n", response.getExecuteStepStr()); + } + + // ITERATOR测试 + @Test + public void testIterator() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("i==>i==>i==>i==>a", response.getExecuteStepStr()); + } + + // 重试失败提示信息测试 + @Test + public void testRetryFail() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b", response.getExecuteStepStr()); + } + + // FINALLY测试 + @Test + public void testFinally() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b", response.getExecuteStepStr()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java new file mode 100644 index 000000000..23ed69a7a --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java @@ -0,0 +1,11 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import com.yomahub.liteflow.core.NodeComponent; + +public class ACmp extends NodeComponent { + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java new file mode 100644 index 000000000..d52cfdb2d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import com.yomahub.liteflow.core.NodeComponent; + +public class BCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() { + flag ++; + System.out.println("BCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java new file mode 100644 index 000000000..9a39cb349 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import com.yomahub.liteflow.core.NodeForComponent; + +public class CCmp extends NodeForComponent { + int flag = 0; + + @Override + public int processFor() throws Exception { + flag ++; + System.out.println("CCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return 1; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java new file mode 100644 index 000000000..e88942178 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import com.yomahub.liteflow.core.NodeSwitchComponent; + +public class DCmp extends NodeSwitchComponent { + int flag = 0; + + @Override + public String processSwitch() throws Exception { + flag ++; + System.out.println("DCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return "a"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java new file mode 100644 index 000000000..bd5601bbb --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java @@ -0,0 +1,15 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import com.yomahub.liteflow.core.NodeIfComponent; + +public class FCmp extends NodeIfComponent { + int flag = 0; + @Override + public boolean processIf() throws Exception { + System.out.println("FCmp executed!"); + flag ++; + if(flag < 4) throw new RuntimeException(); + else return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java new file mode 100644 index 000000000..058bb3c4e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java @@ -0,0 +1,21 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.core.NodeIteratorComponent; + +import java.util.Iterator; +import java.util.List; + +public class ICmp extends NodeIteratorComponent { + int flag = 0; + @Override + public Iterator processIterator() throws Exception { + flag ++; + if(flag < 4) throw new RuntimeException(); + else { + List list = ListUtil.toList("jack"); + return list.iterator(); + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java new file mode 100644 index 000000000..68409ab83 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import com.yomahub.liteflow.core.NodeWhileComponent; + +public class NCmp extends NodeWhileComponent { + int flag = 0; + + @Override + public boolean processWhile() throws Exception { + flag ++; + System.out.println("NCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return flag == 4 ? true : false; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml new file mode 100644 index 000000000..685f6ef27 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + THEN( a, b ).retryTimes(3); + + + + WHEN( a, b ).retryTimes(3); + + + + THEN( a, b.retryTimes(3) ); + + + + FOR(c).DO(a).retryTimes(3); + + + + SWITCH(d).TO(a).retryTimes(3); + + + + IF(f, a).retryTimes(3); + + + + WHILE(n).DO(a).retryTimes(3); + + + + ITERATOR(i).DO(a).retryTimes(3); + + + + THEN( a, b ).retryTimes(1); + + + + THEN( a, FINALLY(b, a).retryTimes(3) ); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java new file mode 100644 index 000000000..79b92c2b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java @@ -0,0 +1,100 @@ +package com.yomahub.liteflow.test.retryTimes; + + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.noear.solon.annotation.Inject; +import org.noear.solon.test.SolonJUnit5Extension; +import org.noear.solon.test.annotation.TestPropertySource; + +@ExtendWith(SolonJUnit5Extension.class) +@TestPropertySource("classpath:/retryTimes/application.properties") +public class RetryTimesSpringbootTest extends BaseTest { + + @Inject + private FlowExecutor flowExecutor; + + // THEN测试 + @Test + public void testThen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b==>a==>b==>a==>b", response.getExecuteStepStr()); + } + + // WHEN测试 + @Test + public void testWhen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // node测试 + @Test + public void testNode() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); + } + + // FOR测试 + @Test + public void testFor() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("c==>c==>c==>c==>a", response.getExecuteStepStr()); + } + + // SWITCH测试 + @Test + public void testSwitch() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("d==>d==>d==>d==>a", response.getExecuteStepStr()); + } + + // IF测试 + @Test + public void testIf() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("f==>f==>f==>f==>a", response.getExecuteStepStr()); + } + + // WHILE测试 + @Test + public void testWhile() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("n==>n==>n==>n==>a==>n", response.getExecuteStepStr()); + } + + // ITERATOR测试 + @Test + public void testIterator() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("i==>i==>i==>i==>a", response.getExecuteStepStr()); + } + + // 重试失败提示信息测试 + @Test + public void testRetryFail() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b", response.getExecuteStepStr()); + } + + // FINALLY测试 + @Test + public void testFinally() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b", response.getExecuteStepStr()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java new file mode 100644 index 000000000..9c5531a86 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.noear.solon.annotation.Component; + +@Component("a") +public class ACmp extends NodeComponent { + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java new file mode 100644 index 000000000..b4890b4ef --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.noear.solon.annotation.Component; + +@Component("b") +public class BCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() { + flag ++; + System.out.println("BCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java new file mode 100644 index 000000000..069acb496 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeForComponent; +import org.noear.solon.annotation.Component; + +@Component("c") +public class CCmp extends NodeForComponent { + int flag = 0; + + @Override + public int processFor() throws Exception { + flag ++; + System.out.println("CCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return 1; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java new file mode 100644 index 000000000..ccbd72a3e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeSwitchComponent; +import org.noear.solon.annotation.Component; + +@Component("d") +public class DCmp extends NodeSwitchComponent { + int flag = 0; + + @Override + public String processSwitch() throws Exception { + flag ++; + System.out.println("DCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return "a"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java new file mode 100644 index 000000000..5d13709bb --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeIfComponent; +import org.noear.solon.annotation.Component; + +@Component("f") +public class FCmp extends NodeIfComponent { + int flag = 0; + @Override + public boolean processIf() throws Exception { + System.out.println("FCmp executed!"); + flag ++; + if(flag < 4) throw new RuntimeException(); + else return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java new file mode 100644 index 000000000..922ace500 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.core.NodeIteratorComponent; +import org.noear.solon.annotation.Component; + +import java.util.Iterator; +import java.util.List; + +@Component("i") +public class ICmp extends NodeIteratorComponent { + int flag = 0; + @Override + public Iterator processIterator() throws Exception { + flag ++; + if(flag < 4) throw new RuntimeException(); + else { + List list = ListUtil.toList("jack"); + return list.iterator(); + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java new file mode 100644 index 000000000..e6b27d11f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeWhileComponent; +import org.noear.solon.annotation.Component; + +@Component("n") +public class NCmp extends NodeWhileComponent { + int flag = 0; + + @Override + public boolean processWhile() throws Exception { + flag ++; + System.out.println("NCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return flag == 4 ? true : false; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties new file mode 100644 index 000000000..ecdb08bea --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml new file mode 100644 index 000000000..775e7a742 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml @@ -0,0 +1,43 @@ + + + + THEN( a, b ).retryTimes(3); + + + + WHEN( a, b ).retryTimes(3); + + + + THEN( a, b.retryTimes(3) ); + + + + FOR(c).DO(a).retryTimes(3); + + + + SWITCH(d).TO(a).retryTimes(3); + + + + IF(f, a).retryTimes(3); + + + + WHILE(n).DO(a).retryTimes(3); + + + + ITERATOR(i).DO(a).retryTimes(3); + + + + THEN( a, b ).retryTimes(1); + + + + THEN( a, FINALLY(b, a).retryTimes(3) ); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java new file mode 100644 index 000000000..24d30a669 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java @@ -0,0 +1,105 @@ +package com.yomahub.liteflow.test.retryTimes; + +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; + + +@TestPropertySource(value = "classpath:/retryTimes/application.properties") +@SpringBootTest(classes = RetryTimesSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.retryTimes.cmp" }) +public class RetryTimesSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // THEN测试 + @Test + public void testThen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b==>a==>b==>a==>b", response.getExecuteStepStr()); + } + + // WHEN测试 + @Test + public void testWhen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // node测试 + @Test + public void testNode() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); + } + + // FOR测试 + @Test + public void testFor() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("c==>c==>c==>c==>a", response.getExecuteStepStr()); + } + + // SWITCH测试 + @Test + public void testSwitch() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("d==>d==>d==>d==>a", response.getExecuteStepStr()); + } + + // IF测试 + @Test + public void testIf() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("f==>f==>f==>f==>a", response.getExecuteStepStr()); + } + + // WHILE测试 + @Test + public void testWhile() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("n==>n==>n==>n==>a==>n", response.getExecuteStepStr()); + } + + // ITERATOR测试 + @Test + public void testIterator() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("i==>i==>i==>i==>a", response.getExecuteStepStr()); + } + + // 重试失败提示信息测试 + @Test + public void testRetryFail() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b", response.getExecuteStepStr()); + } + + // FINALLY测试 + @Test + public void testFinally() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b", response.getExecuteStepStr()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java new file mode 100644 index 000000000..46e99dc1f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("a") +public class ACmp extends NodeComponent { + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java new file mode 100644 index 000000000..e5ab69d42 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java @@ -0,0 +1,18 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.annotation.LiteflowRetry; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("b") +public class BCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() { + flag ++; + System.out.println("BCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else flag = 0; + } +} \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java new file mode 100644 index 000000000..f6a1014ee --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeForComponent; + +@LiteflowComponent("c") +public class CCmp extends NodeForComponent { + int flag = 0; + + @Override + public int processFor() throws Exception { + flag ++; + System.out.println("CCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return 1; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java new file mode 100644 index 000000000..319c98cd5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeSwitchComponent; + +@LiteflowComponent("d") +public class DCmp extends NodeSwitchComponent { + int flag = 0; + + @Override + public String processSwitch() throws Exception { + flag ++; + System.out.println("DCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return "a"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java new file mode 100644 index 000000000..f9764757e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeIfComponent; + +@LiteflowComponent("f") +public class FCmp extends NodeIfComponent { + int flag = 0; + @Override + public boolean processIf() throws Exception { + System.out.println("FCmp executed!"); + flag ++; + if(flag < 4) throw new RuntimeException(); + else return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java new file mode 100644 index 000000000..3341869d8 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeIteratorComponent; + +import java.util.Iterator; +import java.util.List; + +@LiteflowComponent("i") +public class ICmp extends NodeIteratorComponent { + int flag = 0; + @Override + public Iterator processIterator() throws Exception { + flag ++; + if(flag < 4) throw new RuntimeException(); + else { + List list = ListUtil.toList("jack"); + return list.iterator(); + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java new file mode 100644 index 000000000..d4e371647 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeWhileComponent; + +@LiteflowComponent("n") +public class NCmp extends NodeWhileComponent { + int flag = 0; + + @Override + public boolean processWhile() throws Exception { + flag ++; + System.out.println("NCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return flag == 4 ? true : false; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties new file mode 100644 index 000000000..ecdb08bea --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml new file mode 100644 index 000000000..b12f5eced --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml @@ -0,0 +1,42 @@ + + + + THEN( a, b ).retryTimes(3); + + + + WHEN( a, b ).retryTimes(3); + + + + THEN( a, b.retryTimes(3) ); + + + + FOR(c).DO(a).retryTimes(3); + + + + SWITCH(d).TO(a).retryTimes(3); + + + + IF(f, a).retryTimes(3); + + + + WHILE(n).DO(a).retryTimes(3); + + + + ITERATOR(i).DO(a).retryTimes(3); + + + + THEN( a, b ).retryTimes(1); + + + + THEN( a, FINALLY(b, a).retryTimes(3) ); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java new file mode 100644 index 000000000..7026672e5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java @@ -0,0 +1,101 @@ +package com.yomahub.liteflow.test.retryTimes; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; + + +@ExtendWith(SpringExtension.class) +@ContextConfiguration("classpath:/retryTimes/application.xml") +public class RetryTimesSpringTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // THEN测试 + @Test + public void testThen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b==>a==>b==>a==>b", response.getExecuteStepStr()); + } + + // WHEN测试 + @Test + public void testWhen() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // node测试 + @Test + public void testNode() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); + } + + // FOR测试 + @Test + public void testFor() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("c==>c==>c==>c==>a", response.getExecuteStepStr()); + } + + // SWITCH测试 + @Test + public void testSwitch() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("d==>d==>d==>d==>a", response.getExecuteStepStr()); + } + + // IF测试 + @Test + public void testIf() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("f==>f==>f==>f==>a", response.getExecuteStepStr()); + } + + // WHILE测试 + @Test + public void testWhile() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("n==>n==>n==>n==>a==>n", response.getExecuteStepStr()); + } + + // ITERATOR测试 + @Test + public void testIterator() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain8", "arg"); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("i==>i==>i==>i==>a", response.getExecuteStepStr()); + } + + // 重试失败提示信息测试 + @Test + public void testRetryFail() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain9", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b==>a==>b", response.getExecuteStepStr()); + } + + // FINALLY测试 + @Test + public void testFinally() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain10", "arg"); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals("a==>b", response.getExecuteStepStr()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java new file mode 100644 index 000000000..0dd4114a0 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java new file mode 100644 index 000000000..a50952f53 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() { + flag ++; + System.out.println("BCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java new file mode 100644 index 000000000..51949af98 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeForComponent; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp extends NodeForComponent { + int flag = 0; + + @Override + public int processFor() throws Exception { + flag ++; + System.out.println("CCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return 1; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java new file mode 100644 index 000000000..ee453a2ab --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeSwitchComponent; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp extends NodeSwitchComponent { + int flag = 0; + + @Override + public String processSwitch() throws Exception { + flag ++; + System.out.println("DCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return "a"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java new file mode 100644 index 000000000..d41ed62c9 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeIfComponent; +import org.springframework.stereotype.Component; + +@Component("f") +public class FCmp extends NodeIfComponent { + int flag = 0; + @Override + public boolean processIf() throws Exception { + System.out.println("FCmp executed!"); + flag ++; + if(flag < 4) throw new RuntimeException(); + else return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java new file mode 100644 index 000000000..e936cc096 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java @@ -0,0 +1,23 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + + +import cn.hutool.core.collection.ListUtil; +import com.yomahub.liteflow.core.NodeIteratorComponent; +import org.springframework.stereotype.Component; + +import java.util.Iterator; +import java.util.List; + +@Component("i") +public class ICmp extends NodeIteratorComponent { + int flag = 0; + @Override + public Iterator processIterator() throws Exception { + flag ++; + if(flag < 4) throw new RuntimeException(); + else { + List list = ListUtil.toList("jack"); + return list.iterator(); + } + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java new file mode 100644 index 000000000..5bb3b5865 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java @@ -0,0 +1,17 @@ +package com.yomahub.liteflow.test.retryTimes.cmp; + +import com.yomahub.liteflow.core.NodeWhileComponent; +import org.springframework.stereotype.Component; + +@Component("n") +public class NCmp extends NodeWhileComponent { + int flag = 0; + + @Override + public boolean processWhile() throws Exception { + flag ++; + System.out.println("NCmp executed!"); + if(flag < 4) throw new RuntimeException(); + else return flag == 4 ? true : false; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml new file mode 100644 index 000000000..c1d4af03e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml new file mode 100644 index 000000000..775e7a742 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml @@ -0,0 +1,43 @@ + + + + THEN( a, b ).retryTimes(3); + + + + WHEN( a, b ).retryTimes(3); + + + + THEN( a, b.retryTimes(3) ); + + + + FOR(c).DO(a).retryTimes(3); + + + + SWITCH(d).TO(a).retryTimes(3); + + + + IF(f, a).retryTimes(3); + + + + WHILE(n).DO(a).retryTimes(3); + + + + ITERATOR(i).DO(a).retryTimes(3); + + + + THEN( a, b ).retryTimes(1); + + + + THEN( a, FINALLY(b, a).retryTimes(3) ); + + + \ No newline at end of file From dd9d2014be1210ba34dac08943776c5a0a3958ce Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 22 Jan 2024 16:12:47 +0800 Subject: [PATCH 14/49] =?UTF-8?q?=E6=96=B0=E7=9A=84=E5=A3=B0=E6=98=8E?= =?UTF-8?q?=E5=BC=8F=E6=94=B9=E9=80=A0=E6=94=AF=E6=8C=81=E4=BD=8E=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E7=9A=84spring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/spring/DeclBeanDefinition.java | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java index 2a30ebb2a..7d4d396b6 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/DeclBeanDefinition.java @@ -4,6 +4,8 @@ import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.util.ReflectUtil; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.proxy.DeclWarpBean; +import com.yomahub.liteflow.log.LFLog; +import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.spi.holder.DeclComponentParserHolder; import org.springframework.beans.BeansException; import org.springframework.beans.MutablePropertyValues; @@ -12,6 +14,7 @@ import org.springframework.beans.factory.config.ConfigurableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.*; +import java.lang.reflect.Method; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -23,38 +26,42 @@ import java.util.Map; * @since 2.11.4 */ public class DeclBeanDefinition implements BeanDefinitionRegistryPostProcessor { + + private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { DefaultListableBeanFactory defaultListableBeanFactory = (DefaultListableBeanFactory) registry; - Map beanDefinitionHolderMap = (Map)ReflectUtil.getFieldValue(defaultListableBeanFactory, "mergedBeanDefinitions"); - beanDefinitionHolderMap.entrySet().stream().filter(entry -> { - Class rawClass = entry.getValue().getResolvableType().getRawClass(); + String[] beanDefinitionNames = defaultListableBeanFactory.getBeanDefinitionNames(); + + Arrays.stream(beanDefinitionNames).filter(beanName -> { + BeanDefinition beanDefinition = defaultListableBeanFactory.getMergedBeanDefinition(beanName); + Class rawClass = getRawClassFromBeanDefinition(beanDefinition); if (rawClass == null){ return false; }else{ return Arrays.stream(rawClass.getMethods()).anyMatch(method -> AnnotationUtil.getAnnotation(method, LiteflowMethod.class) != null); } - }).forEach(entry -> { - Class rawClass = entry.getValue().getResolvableType().getRawClass(); + }).forEach(beanName -> { + BeanDefinition beanDefinition = defaultListableBeanFactory.getMergedBeanDefinition(beanName); + Class rawClass = getRawClassFromBeanDefinition(beanDefinition); List declWarpBeanList = DeclComponentParserHolder.loadDeclComponentParser().parseDeclBean(rawClass); declWarpBeanList.forEach(declWarpBean -> { - GenericBeanDefinition beanDefinition = new GenericBeanDefinition(); - beanDefinition.setBeanClass(DeclWarpBean.class); - beanDefinition.setScope(ConfigurableBeanFactory.SCOPE_SINGLETON); + GenericBeanDefinition newBeanDefinition = new GenericBeanDefinition(); + newBeanDefinition.setBeanClass(DeclWarpBean.class); + newBeanDefinition.setScope(ConfigurableBeanFactory.SCOPE_SINGLETON); MutablePropertyValues mutablePropertyValues = new MutablePropertyValues(); mutablePropertyValues.add("nodeId", declWarpBean.getNodeId()); mutablePropertyValues.add("nodeName", declWarpBean.getNodeName()); mutablePropertyValues.add("nodeType", declWarpBean.getNodeType()); mutablePropertyValues.add("rawClazz", declWarpBean.getRawClazz()); mutablePropertyValues.add("methodWrapBeanList", declWarpBean.getMethodWrapBeanList()); - mutablePropertyValues.add("rawBean", entry.getValue()); - beanDefinition.setPropertyValues(mutablePropertyValues); + mutablePropertyValues.add("rawBean", beanDefinition); + newBeanDefinition.setPropertyValues(mutablePropertyValues); defaultListableBeanFactory.setAllowBeanDefinitionOverriding(true); - defaultListableBeanFactory.registerBeanDefinition(declWarpBean.getNodeId(), beanDefinition); + defaultListableBeanFactory.registerBeanDefinition(declWarpBean.getNodeId(), newBeanDefinition); }); - }); } @@ -62,4 +69,19 @@ public class DeclBeanDefinition implements BeanDefinitionRegistryPostProcessor { public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { } + + private Class getRawClassFromBeanDefinition(BeanDefinition beanDefinition){ + try{ + Method method = ReflectUtil.getMethodByName(DeclBeanDefinition.class, "getResolvableType"); + if (method != null){ + Object resolvableType = ReflectUtil.invoke(beanDefinition, method); + return ReflectUtil.invoke(resolvableType, "getRawClass"); + }else{ + return ReflectUtil.invoke(beanDefinition, "getTargetType"); + } + }catch (Exception e){ + LOG.error("An error occurred while obtaining the rowClass.",e); + return null; + } + } } From 1fb4f9902890c429bcd84ad27aa80eca94434571 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 22 Jan 2024 16:16:11 +0800 Subject: [PATCH 15/49] =?UTF-8?q?bug=20#I8Y0X4=20=E5=B9=B6=E8=A1=8C?= =?UTF-8?q?=E5=BE=AA=E7=8E=AF=E4=B8=AD=E6=9C=89=E5=8F=AF=E8=83=BD=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84ConditionStack=E7=9A=84=E5=B9=B6=E5=8F=91?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/yomahub/liteflow/slot/Slot.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java index 8bd133c14..e8cbb8cba 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java @@ -11,6 +11,7 @@ import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.ttl.TransmittableThreadLocal; import com.yomahub.liteflow.exception.NoSuchContextBeanException; import com.yomahub.liteflow.exception.NullParamException; import com.yomahub.liteflow.flow.element.Condition; @@ -92,7 +93,7 @@ public class Slot { private List contextBeanList; - private static final ThreadLocal> conditionStack = ThreadLocal.withInitial(LinkedList::new); + private static final TransmittableThreadLocal> conditionStack = TransmittableThreadLocal.withInitial(ConcurrentLinkedDeque::new); public Slot() { } From b850ebf5e591a271a9f119d313693e0502003143 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 22 Jan 2024 16:16:27 +0800 Subject: [PATCH 16/49] =?UTF-8?q?=E5=8D=87=E7=BA=A7=E5=88=B02.11.4.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d71032f10..3e880236f 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 2.11.4.1 + 2.11.4.2 UTF-8 UTF-8 8 From a132d39502b5f9fb3a2ef6a5da0b3f6e533f88a0 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 23 Jan 2024 14:12:50 +0800 Subject: [PATCH 17/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 25 +++++++++++++++++++++++++ README.zh-CN.md | 24 ++++++++++++++++++++++++ static/img/zsxq-gitee.png | Bin 0 -> 50434 bytes static/img/zsxq-github.png | Bin 0 -> 51092 bytes 4 files changed, 49 insertions(+) create mode 100644 static/img/zsxq-gitee.png create mode 100644 static/img/zsxq-github.png diff --git a/README.md b/README.md index 31d5086b9..cf35b4ffc 100644 --- a/README.md +++ b/README.md @@ -62,6 +62,31 @@ Looking forward to your use! Discord Link: [https://discord.gg/MpdBSBnFTu](https://discord.gg/MpdBSBnFTu) +## LF CLUB Community + +LF CLUB is a premium paid community founded by the author of LiteFlow. + +LF CLUB can help all users of the LiteFlow framework, as well as potential developers who want to use LiteFlow. + +LF CLUB provides the following services: + +**1.Weekly releases of a condensed analysis series for LF. As long as users study along with the Planet series articles, they will definitely be able to fully grasp LF.** + +**2.Provide a Q&A service where members can ask unlimited questions and receive detailed replies and guidance on the same day.** + +**3.Each enrolled user is entitled to two remote one-on-one tutoring sessions per year as part of the remote assistance service.** + +**4.Every 1 to 2 days, there will be updates on LF's current progress and the focus of the next version.** + +The LF CLUB can solve all the problems you encounter when using the LiteFlow framework. It offers a series of courses to help you gain a deep understanding of the LiteFlow framework. Unlike the WeChat community, the LF CLUB prioritizes the importance of questions and provides detailed answers. + +Exclusive content helps you gain a profound understanding without the need to search for answers on other platforms. The author personally teaches, providing expert guidance at your fingertips, eliminating the need to seek help from others. + +To join the LF CLUB, please scan the QR code below or click on the image to go directly to the website. + + + + ## 🦾Sponsor **MISBoot低代码开发平台** diff --git a/README.zh-CN.md b/README.zh-CN.md index 66de111d2..9376a260b 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -57,6 +57,30 @@ LiteFlow拥有极其详细易懂的文档体系,能帮助你解决在使用框 LiteFlow期待你的了解! +## LF CLUB社区 + +LF CLUB是由LiteFlow作者创办的高级付费社区 + +LF CLUB能帮助到所有LiteFlow框架的使用者,以及想使用LiteFlow的潜在开发者。 + +LF CLUB提供以下服务: + +**1.每周发布一篇LF的解析精华系列。从头开始解析LF,只要跟着星球解析系列走,使用者一定能完全掌握LF。** + +**2.提供答疑服务,会员可以无限制提问,当天必定得到详细的回复和指导建议。** + +**3.每个加入的用户每年提供2次远程一对一答疑,远程协助服务。** + +**4.每1到2天会分享LF目前的进度,以及下一个版本的重点。** + +LF CLUB里能解决你在使用LiteFlow框架时碰到的所有问题,并有系列课程能帮助你深刻理解LiteFlow框架,不同于微信社区,LF CLUB的问题优先级程度是最高的,且答疑非常详细。 + +独家内容帮助深刻理解,不用在其他平台去搜索问题的答案。作者亲授,相当于随时拥有专家在身边,不用再去求助其他人。 + +加入LF CLUB,请扫描以下二维码,或者直接点击图片也可以直达: + + + ## 🦾赞助商 **MISBoot低代码开发平台** diff --git a/static/img/zsxq-gitee.png b/static/img/zsxq-gitee.png new file mode 100644 index 0000000000000000000000000000000000000000..cd26d0ac77a55e0cc5378da2970874fef6279078 GIT binary patch literal 50434 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%0D!L6`7_hT*_vEFF!G!?v^Ya7+5milC1D=M`xNi zA}+y;yc{T4Y~aTNlu(PsR=sbi6h!X#_7xR{K*6oIx18X}-{26RgE~yQSPvZv(T%1V z3mJD39IWtt+8VE#hPxtSOTff1WuliHy51dp1z$ZOns(gps{MEK5_pJ@Ya8nvmMO`1 zJne+no8;B*wWG!KO?2H*jgU!&X3gkm?<(#w4S#Bp@U0;V-~#h!4uObSN9nl9B|t zc`OL=^17KCkMzk7c8t#BW6*f=rqW!yZ`rt?MS0EAD4eLiJSM}=xUJ9sqtyKmm^&qS zHwa;KSIf*&O#J$yiaLfMo--5v=}Huon29=U^_fx6mz8L9F&dE`z1P01YSRO2=XG!B zx{>SMh?90QQFrPIL$9NgF_!73z5b||?+_F=F_1$AZi5U^%Lkpa_R5>mdLe|ZwN}*k zrexJ}rh?$h?Uvy_6T`6u)ABpS(US8Y$HzY71YWEWVu~&x&+N$jN=y_!81MKWfu0sw z^10Ffn1IznDb8UA+A&Y7L$|(7*UThFC8oN5d_5|l7;3HFzq4Q!muMHKFk*S6-n%$c_z zE+G!?>~yG^spk(a|ACMK@6u?v^l<$srYAUlY2aD_-RBfM)1t3lG$d4s__ zVOFi1pfcB{k33B~=K7{2uh2={PVi3BMHtNbo6UyhSZcvi!Bla9p>0<@?WjDNHqpFR z!w)rAD%m2`fUX##WaA$RE>81Td~-5*#YMn=!MwT&qX-xvgAH)e2wYd-PSv{CY+sGu zss5yvEo5AWsT3ewWpxWCE>fKL{{tMT8yXF74t8tV zXj-zWlX^RCfB$Ysw-?C?`E#rq7SbpclGNe_3@5JnY2&C)XFTf}-mH{Y9;4O(`8FES zPFs$dS>ZXQe8uCHW7z(s^|jJa4*RjA33dKE(^H{Rj7sdwgHyr5&CkfR!tN$b3J%_C zVnetV`0N==^vXWF_BpZ#Bgq;@BW1q!@Li_N*C@ih&hXh`l{ipa6_XqexYv4G#`+}G zz5_*W#VQ^ob?*U8G8MSdcmd+|2R~DMPtE4`PXiCli7R%ne`e8CZ5o7dGiD?7OC0!_ z<;fd4%wtKE83T2@Cy#v0odI9hp{#4q9KNY}2bs6s-W_Iyl>>KJ*@04!qcg@LR*Goz z)Wecon_xELF4yC9LGH4_~@9KUdW!rEnMOsBa&46$0%o{(eu7oyhwN~@+-@v%!Po543Y*Jc&^ zT(;xd;u&?&<|!`d<;00>4s=ZY0e}=$n5|feIauS5zKXHqsbVUZ%Y!>h^#zB_)*VEM zbfo9rFt-nXr#=yQ6~y9Jt<-?Sq?ayfKIIvs_|(T;Yk~d!X&>~T8cOW$O#2w^y�$ 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 literal 0 HcmV?d00001 From c8ebd4b2d3e32d5d474bb8a156ac3fb1c1a092f2 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 23 Jan 2024 14:16:03 +0800 Subject: [PATCH 18/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/img/zsxq-gitee.png | Bin 50434 -> 24941 bytes static/img/zsxq-github.png | Bin 51092 -> 24640 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/static/img/zsxq-gitee.png b/static/img/zsxq-gitee.png index cd26d0ac77a55e0cc5378da2970874fef6279078..be9c435ea7f4cb08ebdbd81d30a89af36eba6f15 100644 GIT binary patch literal 24941 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%0D!L6`7_hT*_vEFF!G!?v^Ya7+5milC1D=M`xNi zA}+y;yc{T4Y~aTNlu(PsR=sbi6h!X#_7xR{K*6oIx18X}-{26RgE~yQSPvZv(T%1V z3mJD39IWtt+8VE#hPxtSOTff1WuliHy51dp1z$ZOns(gps{MEK5_pJ@Ya8nvmMO`1 zJne+no8;B*wWG!KO?2H*jgU!&X3gkm?<(#w4S#Bp@U0;V-~#h!4uObSN9nl9B|t zc`OL=^17KCkMzk7c8t#BW6*f=rqW!yZ`rt?MS0EAD4eLiJSM}=xUJ9sqtyKmm^&qS zHwa;KSIf*&O#J$yiaLfMo--5v=}Huon29=U^_fx6mz8L9F&dE`z1P01YSRO2=XG!B zx{>SMh?90QQFrPIL$9NgF_!73z5b||?+_F=F_1$AZi5U^%Lkpa_R5>mdLe|ZwN}*k zrexJ}rh?$h?Uvy_6T`6u)ABpS(US8Y$HzY71YWEWVu~&x&+N$jN=y_!81MKWfu0sw z^10Ffn1IznDb8UA+A&Y7L$|(7*UThFC8oN5d_5|l7;3HFzq4Q!muMHKFk*S6-n%$c_z zE+G!?>~yG^spk(a|ACMK@6u?v^l<$srYAUlY2aD_-RBfM)1t3lG$d4s__ zVOFi1pfcB{k33B~=K7{2uh2={PVi3BMHtNbo6UyhSZcvi!Bla9p>0<@?WjDNHqpFR z!w)rAD%m2`fUX##WaA$RE>81Td~-5*#YMn=!MwT&qX-xvgAH)e2wYd-PSv{CY+sGu zss5yvEo5AWsT3ewWpxWCE>fKL{{tMT8yXF74t8tV zXj-zWlX^RCfB$Ysw-?C?`E#rq7SbpclGNe_3@5JnY2&C)XFTf}-mH{Y9;4O(`8FES zPFs$dS>ZXQe8uCHW7z(s^|jJa4*RjA33dKE(^H{Rj7sdwgHyr5&CkfR!tN$b3J%_C zVnetV`0N==^vXWF_BpZ#Bgq;@BW1q!@Li_N*C@ih&hXh`l{ipa6_XqexYv4G#`+}G zz5_*W#VQ^ob?*U8G8MSdcmd+|2R~DMPtE4`PXiCli7R%ne`e8CZ5o7dGiD?7OC0!_ z<;fd4%wtKE83T2@Cy#v0odI9hp{#4q9KNY}2bs6s-W_Iyl>>KJ*@04!qcg@LR*Goz z)Wecon_xELF4yC9LGH4_~@9KUdW!rEnMOsBa&46$0%o{(eu7oyhwN~@+-@v%!Po543Y*Jc&^ zT(;xd;u&?&<|!`d<;00>4s=ZY0e}=$n5|feIauS5zKXHqsbVUZ%Y!>h^#zB_)*VEM zbfo9rFt-nXr#=yQ6~y9Jt<-?Sq?ayfKIIvs_|(T;Yk~d!X&>~T8cOW$O#2w^y�$ zou1VlW@0#SEI)-%hRv+8d4Dl?05FsdET3JNa-tA&tSeeZZJMAS-qXfjLa60a*LPcL z=al)*qO#B3Un|QdGPUg+qk|s^J%j35^af2%go?`O9H#tS1m%W_lYULJOnrP2tu#TfMib+pJZ3r%>!@RqZ_mf#>E6uLCkn0Zic4>4@2tz^!>2mb_@Jv5n$h2yEmdiA)1#2Y-zIMOblW>{t`XuXZ-034nUrOtE9 z#jxA0efNn#F%FkwxMF$_q{-DdQ2thP1R;)9*`fY+&C}^<3xm)VhX|gDAI)8bQ1N$d z+;8pTndzONTmGD8fbDq8+%6Zuk4b{;bf&be6AmG-vHzg!|G4O17x{0l>)|# z{Aavt*F=fDg8K z5%Uj#E`68}CGv=w$RcoSSNt?|$t*w*s=xvc{)cjC(lZfR%!2-1=5IOupONNmT7b5_ z&C1O!EdxMwQh3?B@crj<3v;8`1|*cM=Vnfrgx~1+k}p(l z=}YkX5-xeUwOr9J(D;%d3Z0@%^h64eQq&x8)pZXvZ%+%7iw+mH6XwUXQ*1`bL)q1V z59}Vis@K}q^>EPEDZ6Akq7CUYtAc$0oZsVI@l%jY!Ac+CEDMn%=apa_X8Kb*tAz8N z?P930v!$zJYR3M^efCT?8aj)!K*{&9{4pFlmSnu`JDhtjI+>p2WovpSSk`0zkB~Ax zfP!ux|5+S5({8<`n)O8A(Z92u5+7f6)_?4y*aCmzJ?VB})caVOi6)RLVS+Jec!61y ztOp4X>|*>)HllE~US7k3(qP70)EUP)f18zJy5bo|Qny6u($Y&2lkx^Siz(stuen2@ z3YebE=R+~h`#FwuxXojp)IS07Q!$_FtG)sgq#A0VA`L!>VqLUtWHwrS=4WLPOUdie zA6d@Qy#h80;k{m}JcdT;hj^-@4p;+aPVS6$3UwIN(RerJVt(!*g^4`J}cF@RrwPQRpU*jK1Q zSlWxWZdUXEypLakiI0O5=!*p(a2Qm#!l#{ns2-ZDzg+jCL&t?2pyP&pyNs2yUrRBE z?zno{%xu(U?GT3bro>MRmgk7)HO*L)?>e8MgJXSHdo(ENFXwwjx<2C`*xqkuytkJz zn3j&?>@Ux&^~dW4(#9Ue#iuMY&+1_LyRyjlUzl#TD}TI?4_7Rkoz-%Fnjucw^{b(5|!f|W#!WHs{& z80V3uTr)_4rzEhmWXm@zxRw-@B6>FXUHFTgG&I~#C} z+Z`ENnz9eO>Z|inA{Wus#UM`iJ4hT~Z*+W~Aq*4^#RMGuX{CR}cL;=AmAzIqhx_v@ z(LV3>vkIKboChSzH!kyA7L=YhoF!?n9Kihkh$xcrXZEf6)Zy1_c?=>P6Mjs-MDM_d8fhg`WU@ zW2frd$-nwmmp#t2)(yG&*#DS>e$7R@TS=i6TN7kRwtwVhjtke6GU-Shmp@MYR3d|h zjJ4lZ*~Jj|ePC^OK-fIG=TD4dI`r=CxL*fq)~(?)^8>-@j<~{P(vV{IRaPbue-%;#Yj{=Ij2G0Kri?0#2pw@2P+#Y^QbDcI@Q)L4PK>9mZXDh}r~YU|*`)dpO#3 zy*>Cfwx8#Q%g{~ed#?%~yDxo}7P-Jyj)1`5bP-6K8l{0d5e`C=-(*ZN{*VuNH2Gb} z%LkiOH{WJ>5%lc5zE6_g#yU93@kOUm9F+)mY=w`Hw%WtYB~% zH0iF)2ShD3qdTuqyDkH&r_AF9RL9OhosRFnOjj|QRzWcTzzf5c#vh(BLwaI@Rg*Z) zYbG~znCpG5m8;bei}Dhg6?vV@eewcOJK49~dU&5Z&2qlkmE0@`6w^zE{yPzeD zFU(T5s0r*}yXQ2tK6i|l*~dNFacr0Y?tXA$?MDfF89@BVPw;J(!4wCy78D#GU^o^k z{-avAScx6ok*a@U5E}v#0c?Dch$YiCPwa6O)~bM7DFN3 zoomLMOGKr(9YHAC)I}UC@Q7zWdZt|CiUL8JGhHK6)A!n8oCcD$r?RpOI=T~RqHG+& z&B&*H4yfPN)W6~J+yxYJV02M9Z-Su}_r>amIGoaux zqViOpEOH56f72Ib=DI@&|yRP`t zDy90<2_V>vCGt8Jw`|RkBRV<>_7bC63?S^Drv`f9U4LcBbS%JCOYx1=C=G1lt`VrP zN_hb+W~d-5_m)d`{kJ`-~~~6{_(2PFLZz&fNRDGOKF}X`i~Z2{j_c+5%Wl@GIE=6G=0F zm)i5AwIYOdDnc|i>TiXV1Wkjq{3Hm;!SobpMc?-w+g$yM60M%Jx73U-_Ga(K#7ESu zCCF7+!jLl`yG|_g50a`jW|D`j*2aa16Jr%(Q#&wzbxM#3#p*Qim3jwzQ4Kr`e>Y3uO{{b-SukpPtqTHL}jWlBu)(HV3WD6J4IF11-&uI;K&7;CD!wAHazZ-(^K zdjYn{1-97vcZ+o@dzR0jP9!@KFdYTa-SO^}eat2820uYicUyjw-CLG!l_z50A~hok ze^TMTq$2j(-g(|$3>!o=t-VuI>0p5LCFF#uK%FJIF%bNt`NQPpxY$A8={+EADF6!l z^`Epwhw*){xkTr)MPdk7bfmw7q%S$OiebPZ*b&b7v}|xb$63j*bB!8#+VMEIp)n z!=yk?rY%Rc+oV5s%fZBdu~c=ZF+`$EejRkP-vW?$#N}7_Ss7%XDo2Q;W7D1y{F-_t z%AI4Iz)iQs5Vx#!%jLy#3qt@7dTLrZy=Y-nu!uNz3d_!W-q>II0C2(a)O;uP-_r39 zsPbxXFhoaCH5R0Fo+Cp((zj)kf~kC`Y|_cI z(dgA^8t(bYs1g6Dh6}2fL$2$(4^6%RWF7`D2kdb#rx^wrx0U+>gkF%P@}*PV-rGM3 zWu02!OqQ>9v&Zb23#t+A;SG#an}$4*1!4Q=>=V5(huyB0*A%SA_juhg8>u$(ttxw8 znR{z6m2~rgIjqmS6_mM={;-Xxve2NpPUKU@Y_ma3GXU?!K=RLO7adGx{+UoSh?jqi zvx@V(Hte*0Ppw(**sRy`mm@OMq2|W0mR|S5SE;4kCK1P$CX4#>#^cv``G?q3-pS)Z zFX#q-EyZ|V!{2G2^5`^=JR1WY7;XQmfXTx~iHtKkQQ22v{hEJOu9d07OuuTHDZ7hFQ*)`jt{30bX z0UiB?@Hx|Urmn=!mbLZOZ?qN^W(C9_Psv zb>t6F{6NL?T>sQMKd+C2F7mlFo<)))M6e{nce=1@tEeD1Tn=R}e>cWw2PJOOgSNtJ z%3QFXS38tGJs2~gSJu9Hf1s)n8QI^G9-fk^w~EI%3ZzkbzehK%Tq56>?ma(K>*IfD zG%7_Sq!IP2#Y9CYST5{NdbRF{qf{QD&37WJZ>Po~4p-*+O5erbYCgBIhU62WVhbCs z>^g%rNbI!Knj6#V{sEOHwAiRcROG2GEfNm9_onXjzRM|qmtI2Pb`S&h4|)`8-Gi&* zJ}kh*wWrIXsd;*-qkE@eT-8~4zInb(@^OIo)`bFfsRxkrFT~W0Y18V{h}%^9hXUVG zJWe1ZwdVBug+vh|m0p)-yz+2tVld6WTHi$~Y-{c@Ya^}*NLR_acnb(hO@gwjV6I2M)y*@GaL6rqyx;p(NyBFEyj^5HA0iTx|QI zs>ELJox3Z?fA=+fYqX%GYK!nIiA7ru z2)*N{Fx6Yai-eennODa6sDHc5Wye`MW;rH08=mcNFf(Xw}rZ zfmSGL_?-B{%RDQW>_Qa}?C8TA%}{qZ(ml1;GC;bO7c z+0T9hrRx5(B)7@?Yl!K*RU}i<)O5%i%{?h1 zUZ|eG#$q*7ity0EK4+1w>{FEdf}_5;qqcBcm#7* zdfqEN-to!$;8fSkB$np)s|gGZa=FtM!@h6I&wf=H3hk<%LYGh|T*`@8x};u9o_r7` z4B6B)9zK_GT<!%(WxvESK;@;^fUYpra;)g z-1R}yJh%}O%I@i8?{EWW30=NdnCa`GF(0wxPIjnp`c8L=GTU|9%iO!`F4Sv-Vhzxg zkHm3#8N?uOU(G$qvnariO~PG#Xz@+0P(IryBYl>WS{sZ|VW9OtAa+1GZ6*uR#-B>) zM6U0dwZskzY;Jqb9TuxV;2U?OUc>7;O-x{jLC=`X8PmRvg<2<*3qv*X;$2%geF~9B zHYv64n*jCaG{3Ss1Q#CN?WqvP!$FbQ0Ea&c-__5Y*1ZPflu?swUea zh4)tRtFciU_Y$U(5tf*N(`Ik zxHusn)|krQy^Z0wnc7)?k)}sa0!T)?J3y#FOzg#6q|9}h?|DRReBGl4KAFFURu>N# z(P-v{widu>i%&dO9@<&@t&ls}0iSvW(R0MBC(mEg{?z@v&P&|rR@Od+n5n_I7n6Bv zwhz$C+`xNBQehZ%roZFynY&1ttFJ7yqzamwE?vbC_%enkQum)9dXDhWkFD}rYiV+b zzrps=|nln??F{DJ$^Q8P)e{79GO|3;CfIT^eH*Hmu z&zj4u#YmdttcddN+am1Gj9h!xqyg2NnwS@8LDBBPK99!CKMt-fXbZV_qs|e+0x#99 z3@EhOuVQH_H)yCwNDXPzw12|nBjLL>OtWekTHPCA897{5^2uHUmnN>7XE?g>>JPyR zxvwaRE-2`3c)U}Sb#8cNLvD}a;>`O=<^j+>hr3if7u>PaXf0!+$Icz5Mp}q^VXGj( zs5h37AjLG@kOi)byfx09oQdv^Cav)1un@Dp$MEc({HiCa z24(>ZwZv#qD|I;kwz>SwJui=*BcQFLBQLQ@=e1M!MeLnre6p`NerY2Zh`4ao*`~nD zt2wp+f!(RH&cva9wn=*QByZEm6xuH&&!GI5-N-E}S~IKU$$cIs)G{);t@ zo+o*zK8zZ^B6oclguXK_K_BF!fNl|m)o}8%FZ*G4B?eUpE^?NPJJ|u2N(w0{d-ZsK z<)>s36x@EuEG}g^G#LO#bbtfg$~d#7GS=>9#<{KlwfN{`^%*6}%OK%cWmXFlP1?FU zxShnFRUY-h)W{-0IAQ zT`mCW@tWcV77!)$s8ND**S8nc*?V2G@kEgqp|^-YEvO1Gi~{!Nd0Es6LMyN+h}L8IwqF{u9i;D z_#y91u~ASZJ4_W5k6DX(0KA9xE{HqAnmmelzw!Vt?3%(# zBD7X6r98h&WV2k$MTU^mzpJ4ottGCMxwCt@%vtN=ac7b260P5SWv5Cv3YNYVY7~fU z-*f4igeN39$+f!l#QGB|LpKmDfA{*84-ef|q}EuP$wN;}G9juLv_zxiQD6 ziWUPb;9s)9FE+^kCiTKv7 zfP22X)I*QlJ#-^xfrcymqfU1;5~P$;Ih<#%19H)KYM~_bC#aldrJ+S!Zg|v$Q@!&f z;%Srt&|Vd)_U<+o$E)k8e!4y<-pilcwQ>*VxRGx}-?PtLbeq(!RP!!cUv*@CaQMNe zvZGSUHy*(!ZsjrEenYLD=l)v3p4X#WpA)MWsO1=i)0F{WmiEAnTkKLq>eOh;S`Il6 zGc7a~PpdP<DsBF?NN>0$apK@vsvZWZ>0%G{q(Mj=0;<`A~7$>yf(w`NY{*m0GivBuy8+iG(K&_XL5sAgW&VJG8LDyY`9qos;G%UM7F^E0 zATpWtM9TJUtSYfFnWK6kPU1D!-p%yCL!fMYB&|M{4D53MQ>?^0pEq!KuDR)q#@ed~3%%z>XK zRBwdiS0glRT+&Jr z#Xj(+?nOIQ)%Oo6OLSB20MTjIat#ef6QaWKJ4?>ZyO& zJ#`3O`-8lf3-u`lVrErV-vwwtQ2XXj|E822&y-!#if!{u0SO@ylTrKf-TdI34Y9T+ z>$TaHa{IKkWvhCw>l(2{0wyon_YUBhF!zkzeMvbR+J1}?+I zMYgr1W?h#7IKg6%sd>ptG4o7oiCM651i9(reH)b&$bg_sz2c(B?$E!*e<{kbQ?_{Uek?MyPh^aZA5Xt?)$4-pr+ zPCiy0{;Kl42r&&@1nJC0I?@V{A6xN*oE^TEK8mhlaEql_qy)2S` zk+o;I6of`GrSV)@{%7-SYu7wY$KUk6y7D)9TzN%wYuGK z1N0@VsM6F6+VvI(&o<>!8cYn^_Oqr&BD5;6fx;uO>b-qN?8pGP>cAc@tLLGf94z}9 zCh_eI{0Bu72xR-sh;lcuBS`cb=Zds@Lj4VlV307xurUrZ5faUDy0sZSo>Z1 znw;-pgP`7q5waVTC4EhHDGkK3)x%!DW3 zUC+}p9i?uSXLqaRv`s7v0IZ$l<$}WA_YJiq3j#%dg^&~#MqMa&^9Qh5uI#`eH!F4ZnISJLwVPuFzXSotLQUFr$DOxE9*MB`+fDEuh0#CD}?$=R>?EP zGgSU*#%_Den*Z)6wAZ0!wa;Z{$+OVzTx0s0_wjR`ftPh-^|ee?aBUQLQx-&yer6!n+2CB zL4@f5Xq~lU$QA0lmmWG9nhXwgHBsL;kw^<@qttgbjr0!lQLpVsIGdk_5HJE7swQ<; z>ncDY(8B z{`0gnPhc`N*_#BJRODG3R8AW zkarurB3N_*2`L(NfT3Zs&`PwwM2k&ZH_*Wj!Jql%KS!Olwvqmny zpAFVPC;2_i`7m3gL7DP#tdSXBkzy;oH!~Rm&>qm5=4XpnZ^9sJd?0=_~L*muA$b za6aP-iRu5VnjWTYz-RQ^rK))U@`1(Fl@`WTU(!5c@{07(s# zoRM7ACB=x`ZhkHKBl&Xqlau5XZdVlD#yB-ixb(Y6VaDQ6{WI(HR=Dza=27xNo}+7A ze%kSl%?(-Xk_3j;OFx#uVallfbC~?@A9p%UCR~_T>ZzAYEXIFp954Vb|6vyLleD68 zN&bH7)0Mp?;NW=M$rvB^_p{C??N}3|=}6Kq(`%_xZvG=>njpktNI|6eIvweL%Zu^t zGTW0U-*6j|3Jxz_5k#SR)7<1i;dH6;SN>-Pnkz399G+}`5<;oUnz=IN7fuI<-9CBJ zVdF#y=4x};I8Vrdm2!6AD29KP&yR!^T_D@<4==H%jq?y5HSxc%Ok$VRb#?i@pkq=& zh?Cbp$?k9I3}X&Q6+z> z3cuw3qry#qtG4;(g>0e5&kwFY3t)y5Rukj7?5_8RY>2}vL(N0_ybc@lxn*|%_+oha z&M^WgSSNltLF#PKq)Y>xTR%r_f0aTIP~?8uhs-lyuPHqdCRm>`PP7x8 zavmC(zp$K7N9uj)T#*cX*U_8*&%Zu^Q#;*ZltFcKmw#o(Rp76x;tnyEQAs8K0WK^w)uo*U`zlX>C zuNL13-l{`qVE9wg+|v^H4Nu3yE~;Y3x%)eII-GRClpbS68XInT3>0>ij`UZ~6=|Ro zx2EKYlBaJt{vxpm{WXpm9!aEmr=(I>77TgQnrfyU6}6H!l5CO$%*!Vl1$o<*c0 z>|t`=Hl{?)h5h)M)N(51Q1W+rPF%2{6F<$9ah|vHL@%W4#Qsj~#CUt)IMFH9(4qs_ z%e!A?5mhomC`Juaj1q<-}JyZ6RO*V90iSdoq=Vd_)` zLGCIDb?$E%y1Mi-CZgokCj*$5C%`mj!wwVQEvQB%0;a=KmQ_*Qng9bg*^!+NptZX;Gl$Q-z$}zxDF)5C5e@;OrWZ;cWqRWEwGio73tkdQIRf1f}kQ;P^5z(p_fRBlz`aiUFnF32uPETgr-!5 zP^1b8fq?WRN(&HyZ!Sc3`JHpWbH^R`+%vxW`)9kyV68Rhe9QAb?=$CG*-y$>OL3N@ z;igNncRldPam^gE7jW=m|LZ<@sNF=;a<>8kxS(fn1$xk5V*{u;zYAXS0R<5FcOqXqp26;fQwIlI4L#|7I%mK; zOQ|M+-oQno>-z%|90=@m}d({?#-{f6e_{)cu!c^`9AmmNL>6 zT8}N{v;+o#BK!G?8&l9`?1{f6g*`j`!C>&v!sADh54^wGG~Ff*gcfT1ISz_e&~+R* zz6km0z%M_65bJCxWso}O*hpMe`@jJverD_>(xGYKHSiT1_Tl932fRR3eF*-0R6R;~ zQASwy5gZKx=1fGyE6P|pK%l@tdhh!9_i9j5Z*RTr@@Hs&xO~+J;awB??Ys*!A4aZ? zH|bOvsEBB=s&{ISO@aI0Zf$>UffgBjqfNvo>AuYS=BD?rO}M3Qp%Bm-}=+7X&gU43S8pj!X-DN_H09bXgTIV;vA%)<&8 z?N+GNU)G*|*okM)O>BK$SOTV^(rdvSyo%-LXa@l8XLvIFN9e_l)sjXyKDbgya{!o2 zrh=<{L@FT1rFU!jqfO!IMNn`_Z3(3fS`Y?Q-vH^g!h*%~iE>LNA>6;(|8*P*umRtY z#R$|@I)<;S5msd!P7@t%wYr;@k!wElo7U6>`NIpV4(?;7)mIR|Jr#%q=QDI%Bzx`a z53l@j;%Xs*?<}`*n9;X{`kNIH>e5nNESs<8Rs=lX1OD@RtS%nRhk=xl_)_M5z({+r z_kbr?vu6_@5m&MA-H{4f{~;I(GAO8+eS%$di3o}+=>0P3Y)uGz|} zmwk7DO@8IQJQnP_F+y^9f6&BbnSwO62@$|PzQ5_w10s0T*6Dz)P{h1FFw3C~{pt7a z;H`l$(oJd1GVAU)Av%K2Va*K%VIPdx0ZCAD|9#8=h3Q<_My1L7WlZ@> zLHxbvT~Ouy&I2>^2Iv{e^9!jc1m+|R;NT!7aw|ACrQgV>V`k$=@>w%9Aies+PE`Wz z{tMI&u!DSW^b50Vw^;yvgS~n-_^>$k!1bNV0@?2We+I(maDYhg!fW*E7mo{5PbW#j98iv-F{2F}1_lz2zOOx@)P}`*Z%hn+J^28K~$In0{ z8}*h`0OFMWuWNe_N`S5n`!?DLfV4*HuQH5|tJgc2;&C9+ktQccd0>Ae#C8D>w%Z4A znZrr{qd0K*&%FSs2IE?9p9s-G|BjLI?*%++Z_71B7mTCujddoNwm z?z>PebX?PN9Hjv?lJUg5-+KUFx7sWt{*CHYI+ZU{w|RjWHLzNys&~WPE?CTr{6@L%$Xjc z?L&+;@;8Av30_SIXo})jsVDz+d=!S9t5vu(z(Qf9r}G$rm3dZ(>x~> zlk;>C>I5xx{=$ku7rT8W1L@twg~ADi_qd6hm&D&IHSh>j1gMU&NP;6XP*ZJ~doreg zUj{{A$p@%w%81j#@iZAH8qh0gJo<$`KU>R36LJo>|8W_>g}}cL`+z#6Cc|{@^=t|!67TuVG8`DttTB?8h@Eg?wZc4P2GPRnpLb5X-xU}H99Ro>l0?10VTmkpM zVSdPBH~zPF02m@6**U?HrL97EdwmjMA3UGOAsIpq5UnAo*XydjIhi{YGiQ^Xr9_>j|9w^}sV|kBzW?48C zR)4m5`r(OGHB%T6+0w872O`@65r+@{+WZbc@(COveJUIvHr;;yW%2#9D}n`J=$vcW z|H^9L{mv#cS_g?f8p7%>$glcy+iUui8QBkp?#;TPfd&EapPE9b0)1D^1C5BcmO;6E z)orl{L)+aro(|f0i{zd10F<=+2amMnwj}Q^dSGMugJ_&wn-tJ^=8ug_gQ2C5KkJeJ zwYhz#Hg5@Q9}e?u>FzdEkXQ@8n9J( zqmwMtLfdQRe4jtv`~TEU{uO(X+?SKg2r{(}w*BxwhV$L6;N9%EP%m&Rp$MLdhuZw7 z?HNeW0Rpfl&^Uq5en65UkjWk-u0QqIz8Dfa&bHmsa*4Q9bQ*lv>O|Al;ozSwrqZXN z+2h#3#jczDK7S5t z^vD}XqSFNH-CBZ3g=WTiMeqp;S0GQ)gu$x7`wq~=vi|2y?5GIPJUJgm&AQ(>`qWXS zWU?4Y_iHbzC3GQFK)wAAQMA4$L8f(gcgHQHihswoFUiBi#0ZY|aeWhZru6UYoa8%v zE3F=G0fni_t=ml?(6(e$Cd3o~iQ=uNwe{)`l+4Zy0st!ldg3=s_Bl0Az2A%1HIFS= zPvEmRM=zk1S2v5-+jwGDeab2k1;d#YG?!Rf08s?;$4u#M_8H@)uERZzTLc)0CQ!jj z(DpMa{qw1iN(ln(mtdwPjdc7Fm!n+yd&m||1w{wKYDh8zf^LqzaK%u|^`9E-KZ%Q3 z{@T=Wu`Rt9h@#L~Te8_rbbfx=h?B6EV`SZ?J^Abl;=4BrXOBgyvPEanTkPI<^pjec zz`?6=FDvFOV86Y8V3JF3ajr36zt9|ZBUd0eFqpS6?S;@XQ`XUgGz=nw4Egv*Po2Y3 zlsSCcoOcIy6)t{ov#Q)0kE(Gcq4CMy6Z;9KLXRrw=vj;OXaW@pzPW|7Ew}W-42t4! z7R2=1CdKpzxvvdm%bsx78)88Qh!u*`1bPRt5cmYtTMQWlNP*PCrhH*D18Mk23%zO` z(@aMl(<6P;mYKu3RR)eQEN@XmEWH3pR4vf^K8v8e==};|QZpAi+{danUNppDNx?Iv zOx`m^KQki5t9Tw>%7{R=uo(&6uZW`;B<)svl>2NKA-sa$eokTj*-gt>F?jFnxclJ5 zxVuG)vd0YOQ&O)?15QxOA!yfs^FmH)VsSFosFRBBa?*01yiqRm3QO?b$e&iLZ_9ok z>1_*|}{?Z+k8xXj?LGX|oiP6ra%Rk3?4X%Nh+ zLU*3gvQVrliBGMX1jk$AV){puZo+^^hI91;61q8bs*T?4Mj$oz76wuuow{Ff<$lw# z9D(~4lHJ<>+fmMAkA&`SK+&AhG58Jqo8Y8im4Kj^pZ_}UzVdU)vM2g(Pb@yxCCA#S zVpF2di4l}--9%H#X-uiL&8|IB*j_DC+z1;e?>3x~Q;=T7P6ont^ zH=sToQpFxo9ea9{1z33cwQekDK%}slj%k3i9wQWu#TLA99W%Klr|i8AI8M$6ArgDj zE`suIuFTvAy9hOxWmAgUmBqj=<9l)v@IA~_QSy$@*_ zdqKibS0L5+L9*EiD8im2HuUBBSL|ES`?VXCLWBu5JO-1f&H#O{@NO}X&t(a|P8~wGgzh1^d*(KSav@0m` zCX{m1Wu*)rdeyC+>eymAAyRA9d2F2J#lsQ12z(=tE9eARi!NjhHp zihUes1({t1W+$SickzWDB6T6H;)dp(i^aOBx({PyL!9-h4IEqFl<%#P?ipE3VxKL+ zOj{l)&~;Xcr8|j9Ykn8#Z4S(|`@*B#Xb``{j?z9Oiqdj>PHJ5(n!(r^=~YXA%S+pv ziBHxCkj<~?nc~GtkuQ-ezXI?nlwrpttQ1kYeBp~)HBPc|0Opqzq~&;$z3j8z+d^aJ z?S%)TyV2Vauid>fV0eY3ybJF|!+CdBN>aDmc;9r0E@?~*TrKq>P#mmH>k(L+pjzLh zT?kEV91l8E%$+GyY`5D=-_?ipZ9(pXdV8cAaMLChS|Eqm1RIo810zd;i@v2s>hZS%HJrwMkMovweHjZ*Lsl_UF#zB|r@kCK-^A&i846^)1p9`0lH>9N(&6 z(R(-$e&U$i1fu|FMrkqmGA0BfwlTNEpOcasRTx$k==~y<^`{?x&b1<3Ut+Z~AW|W7 z_&=X;-=8(LW_-Y1#P(zVd91Teca%}4q|UpD;&?$)JH2q3`YwbdD+tp^^addCc@buJ z=bjh!$R`)kc8(gs7@4Gw^w}CQwy_{HkwJemo4GyV`H~=M+`TDS_$X9zZGlU57af;|FZx`P_Tnv&9hG>i00~`z%9eM%I%+wU_*9Uw;g?0k=8vd z|5AVBK#j+QUwvj;PW8^*3&N~G7p6DNHK+$;v>ywpP)vU^z_z=gTAd!j%p!CrkCp}5 zP<_Uu_)+O%B>+8C^?jZ_Jw{@&XhMa?O8N2<+8aSRi4^@8!%BvkX!=aF?3W^C zJpblPUVPl$taAX=m9H2(?*H_L8J@J`)gaKA1mV~OM5?T*oHzLCIEt!S80rw?dex@X zI+F6RfJ$A)!&JKE*YV7a)xEC1LY*{f0w*s+!JYEB0Q^jyfd2wBUW6p0aYG6x z*XtT@e z&%VtRFr>8bo$0QHpbI--hUTh&W*;-&F(7(RLp8SCbv!3|y@It}&hnaCo zWuS1`KhWmCaLYf+Ydx|%Z5$*Kg~+pd+*-xykyLx~rQ-PBs|C9CP?eJ+1pd7~u7AV1 z9hFzbwxSd@Yd(F6;2sT?%KR(_m+qPEIT-+P5xIYqI29jRU<4M*U3_~~!QJIC4Y{$l z>@y(-jKFMdPze?e|3@Wd#%urYR{lSK86b4p1Cq_#R$t`szOEMv0g+?hnk22q!=%G# z&&{keWEYrMh-aa2X*7A+kL_75Rx>Zup&r5+E-^ar9yH)7veP#j&iy{(;$o*ibk7BV-`wCDsDM3JWkE^rRN1Qh zNx~z(0?;iZ|GwqFW-*qdELo#_N}g~P?G5fO69c%C1o#b%(UX_Sps;-a5ikFf?#_rF zq|pKlV9%MYY7BZ8e)s)y(Qcm}L^q~AsnX;%-=q+>t_Qs6{m0oJEiu|yz{BWlgdiFO z`Yx53LoOoIPk$4Io*to42V(b|?jBmM2BnkqTTJWcGw%d_y~Zs)+E^^t6N#h=Z@hw# zSmS}~q!|E^Oz{eOTo(;$z%IZ`cLlKk%BRV@CtM_@=*1mGmLT~W-61KG^hoAj`jcaP zoO=SjAF-Wc8Mso%${&y+oCc^`2?lVRiIc8&S%NaqH0(!aLwP}iR+h^JK)kv^&HN%w z+s>Ttb5hd7cWXxL7+fs^v!P_|3FZ7b>3Bp0=*g7Sf)0U^eA`Y%ipDlObU*EHCtQUM zA3GbX-286JHD2C*t5f)CI&)AH*dg9Y3r6^-?b<5(@27GJ)P;KA0ko0zQiCcO+cMl= ztne&6>2;OI!2qs#ozcQY`S$avpu3gIfmncKA&Y+WE-BJ(!2AL0WifAB&$6tGdZl~t zsTh;=xYEon%cknRKYDiUhGT_6cNcM02yRcy6UCY&X5coHmA2P9S#AlAX!$hj(h}@G z7<+S%rF7OhFb``sWbvZ0Jcm+1!> z=nX*%2arxmG1;;?d*_{EAo_#+nQp4)2%1c>qdG%87w^tX4BtK=>K1SHj0mKMf*9Ex zM;-9nijl}9h@;gC|IB)t5Oz7MbBMu-3(+yi?@T#I)9S@?93bTZXb_IBGnhC2RYMR= ztnvQL4Ho_6x?}r-yJa+^ldD3I`sW#V;RaTUKzINWgk6#@Xrae(hato#|BQNQAs|7M z%jBcS$4#p0k6)TP*?N2k=njwq0SI}qod8(|^cw!YnoxyYS}6+pbr!&X7wy3#E}tF{ zN-$9(N5}+Ty=!W~1YaNt0*Db%^n#=)zX&xgicqPfrxkcB=dXM4k4(pK5qVDz^4nlG zATfRN015=qB6?+j@W$1G)&^Yc1^y>c?(%PBNG^II=jbZ(@gw?Pz|E(fw_|UXL7EWY z{$&unst!9s$hsa5^|&;<>BV$Lp8nQon zxBxoA^h`5V`t%-l%UB3r{ZpcJh^iaB^CnjL?yL0J#B_H#%MYU?<6(V?oVQ>@MRow( z7MlkF5NU|ff}e}{)ys;r=_g(8{j3@8)^pvpgvt6cXsfHb45h~GYyhYkc&2RV8-Z>v z@UiM&l+E)r_A%LpYb{aXhIZk7qoE7|KngIlhZ{43k_Rxco8La?y)Abk%h5kO?6M2y zj;C*G@yma{riJNJNIo?Rq$CY{OlZz8>skKQdOwxjgABRaukEIVH5Kf#F+OydjPnzo02DtvTzmA`puQXw6p#Q4 zJjq-@2QfWT&@Hpo-u^6X1ilyY%W%Fm&rRz!GKoK&L>}^EUcWrK=%?}ra@8tsuc0bE zZS0W|AAy}li+8EA62c}ZCw?>Ci`lRa$+h0>!Mzd~JRUK#{8{7@N zDqXVi!e-JvERGxmWunsfVxg2rvMK=vx z^~bV#TGm4Ftq4H1pA-S)TQakH11ixidH%)S<||Jh|9go43q#$);;@|GQkW6Ywg=~a ztS?}oqq9JmdkjgZTeZyymJ5QRA0Y2Th&TPr(B-plP*d8&n+Y3eYC!s5g#;7dFB$#^ zS!n#fGRW}<=I^R}7w2r^y1WrG?lI#&UiXnZ+x1eYF8S$?DAyvnJD^lTqi~NJ>V|?* zhWANm&%CCJ@d_+<%6)8oy< zD=-!E=H*S?x^VY8ib_sPolf2$2M{D`=RT|MqxY|y2M}@v(y2D+-I_b*g)8K#+(}W2 z!kP7ATKXwmJbNLH59}D40_{i)@Rj>#x3qu>dO7~*U@J1bqGOYNv}&^GQE&Ep+d?2Y zLi-SL`t&>@fDj5qY{~KRH0=RLw#40qO?5f)JF(kfnuc>*0qqX8J>csA6?83IT+ku> z{=#Sw(18P~KU7%Ty(OSoBp>{#er+{&;Fq{ayXSv(5kB{XNMIhyn^zt!Ja1*w%iNpU z_&K&H`JOeC;eix(8#Ql|Lzj$aw!K*kuLO7<}7j;4jRu2r@ShFgFD+V9(BP zU8U&Q`pKxCUj%F+R5O`D+YejN@fXS-37R+Mai9nDBKS9eJ0toIhX9dU<%I#*Mkuy( zkz@I1VT*)e0cZdzd?w;f>={MBZlJpavwG^pL2ZE1uZD2@nPBf=O*lam(~d96<%+dX zf8GstnCaFIZf&nXHB25nNfT7cjExKMi^U7FfWBlLikftT=y=U}h>m~Z**ytkf-VA3 zm8}wO@OkcscI%tl$27*}O&}WWyhWp-68b-RYOaka$CE&F;$M;OxeBYz3wx;Re9#Q+ zj%@W2Wo2H)a*-4_5a9kb>c5r^AU#!PjI{rFrivZQap1(cK{?QO@FeS7pN0C56t9$l z(%#vUuzv;toe&5D{uxF>XlrSZ)j?Q5{jmjixjRe0d2SP9Y3+x<@{>+(=UOgx(9(sZ zL3I$cDrKd;NsazhnJ}oi5#7oCK7Hasz`Kz8#9>r7$x2`G#~hG9?JqA>gosYo?z>XyxOkDXJZ zz2RA_J=SEf05S3>+qi%Ap-V1n<$^!?q{n=Il#vET`kT95i#a$lk^YJ5$R*pJ2yI%N z+)g5Yu1A*tkqsMATsMcEyDJcVK2T{B+z#&^0UrBDB(N15no?yy9(&D|(Ih*gL8(>^8Xv|6edU=-O3x(Xia#MJo^qHdUENw!jVO3j(`- z{^bIMjNi7k(4QBAzr2F_{(IX(!OkPDLk0mmpOB~rJ@MxwvLTO|ZVNHnW9{<40oJ!m za$B3&9_zm9ao~Xa9NUV@uSW=g!#sR-A=@Iuzo+|e>;5|!{*Ozw-1~K@o2#j^942np zTr(AM)9~JnC9_TU1^e1%dvvPbTBhHcxxMe#TfP~dUs_H3s#cR~JzX0Q+|n1{=-B+x zG2vZH0blyv{Ko7|x*La{Q=+79Os6KQtj4I=I{8tDWXX#<B2SsrE8iesO5gt@}%;6A>{+K3vA=u z&Q*o0qx>7ACIj3xques&^quKA#-P(=WTHggazi)J55-*d- zn2;5)1%Lh(|3=-O=FNG@&CgiE!E&4D^G`GX7>i@-{B3ZIk5Vz=+2L*KI-Lq}duL4oV%J@>|cj#iy0BF{B>_+0g`Ny(};SO_qDT!0!jPW8HWG@>Jt~vw2ao&sFWS zRqYtU8X>>%rE_V1<;)wLthoZ&ad^Tpc$ERvzr?-ZSQX8-Q7)?zz8y=QKcCJO0 zH7a`PS1z=I!c$O+T{FSxn!*0i5u@r}BWe6MM*LeN-|vO|)IzkL9fJmye4$vH`X=E# zuk)gYbI*k=3a{be^aMlR%9fR$E9*TitynR5YK6)u!xfw7Ydx7dpK=n&0m_SM){}f{ z*d@ltHQ7gbn-3y;kvR8$;-j^Qjj0HaufyNNkq&&+fo7TVs;}Z&UyW+X!Dv&MWvdd1 zu8o}4oZ7VG0a!9I`T99V#e zPILzB12w63H7TsGkgQnpLp>mNA=z(ZH9f6>T3LWbvv4XfiINQY=5yRsQ(e5%)XE6+ z#>fP_%6E26Gc~-0O?Jb($>)lPx~oT`|Imoll_N;pepV67l-J?g0^_^>JNgUR{n|H! z)Fp$k*p4ZIL|?Cm{6wZ zZy=91Yv>DyuoE)Y9Q!M?m#MXz)DTa1SM%1iLqGg>SEemOfr{KLy@GX@azOuap^6NE zj;W@hwBHoXuDXuu_43TyN9K=S0$79}TG!_|yS~(I_@HOlXXts3l}5Cd$^J!a>QKA~ zT-FG?_!@{m;OYq#NF9AheNs-{*_8>*>{9ZzMd$= z57DWtyhjtcOR?h%Dw_*QNbho_VouQs(xAV3@dLx*7wJ?ykqh~e3XtHfJ7`3z?|G1h*%#WJ%5mv zj+XGfJm40U?#!~tcu{c(kLj(x5O}v+-=^Ol*=T}~b&C_3PI~CU@giG_f+omEz= z`;#wqpCb1J+r{1bp5>OWIjUD5YHAv#| zTyF_QZ|DWbsDI1DujNrl_g)T`)Q2*O=Xq{|+W^8d>!%}uphZTuwD90zeHJWhj z#U*K$7WkoEJ9!ZOY{!Tii=S@Q-0fFh8shN#&Y>B}VF|g)-V(lB0grSnUMGw$r=51pw^o`p06(&T)-=N|Io36!u+7>+nR#Ml6xo}s zg#3uY3KQ}TtS}O@M=`^8Xw34HzO<#;wX&Bc`~_cS3_ZG48caEKaWLC2@75C`3>~VI?u+F`ybx*<>1&#fiQ*O_alsDUDK0-6e{< zk(FfZUQ!H>Ksl$jWjhkjgy8rpr>|3Q%jNfnBp2(a3RX*S#(oyuykpa6P9jd`g zXO2Pcdy`d;c1C0QWj5NiPS<bBBN zZzQ@de~QeGT-S+K`Pw=79W|tWd{WRFE6twcczWsno5C>@{E|sWSx?VnOo-VJ0**1W z@_UKj*)h(J0i{D)0rML081#dcSU~N<)~b|xtOq}8wk?{A^L~*cRo?HEJzjagXZ^rn z!lbCA=SPyob?@}qCW3r(T7wBkHIcEol0&^U&@GFXSpR-8EGD*LYKWE>hoYd@U%HkU z-KV7X|2hj0*;LTfHtEwod1iC1V6#$D(+C!hyLvW&eNt@%+A{SY-qIZWRU2u~biWbh ziDn9V=@A&EdY;eW)%xI2-ds-uVB0zvh~~=TP&l;Wa~th4IJ0|tj?FS{isP9T_|>3nZt-D{i%YVhl%@}W!Dix(6Ino&+<#D*SZfae;Ja_O&{L3?J8Sb_~dS30K}!(;fW z5J6(KFYK}5gy8pn#(RT~>WZIiJg#X8oOw8O;0S7|AW5w>->_&%`P@RhJyzN>kK5gy zwOct?Qw^&u&@x?9Q!%TiI@^WTdU$5f3C`{`t5ebC9!=}#CB3?IhTW$8m7>ubf*w)Qt}uH7>GRx#9}$ciJmvU16=R zCHba~J&iBnuSzp(n_dm38&C>OkV5N%8kGWF+9{PRT$SexQTbmL6wb`nI-9K*_V-lp zi|}1c@9@R>QeU0I_Z3)4tfda-IG6O`iRTT>u%(YKm6q9Wy7Pa8xO@_}g4b3B95NGv zj-<@);Fh}4-8V<>lxdzId6`k19eC^>j2jVNiZUl&?Af1L^SR%l6uwW?>dL(j>`r&z zc!)>6x~Oxe+iO3f|1_icD5qCl=VwCxav8I~-MI@_-Roa5F{IopAt+l11(YTAgi8ai zc9TO}VGaCJXxzkM;^-eMp)eH~a`&&8*5HIH=(^)0I-lN7Z}jT~J4@>Y$#f zyr1Bz?xfS}x^FN8bp<(|TzmCJNI~;koEPVzhd9J7M3dn6v z&%2W>hK{;lP}nL9k^IUFosWazeM6|}p#{;ai9vmH=;ic&w!jU>5=&gx(wDqYcWdkt zWzesdj@}Tnp0xIQBp+ElYi_KLy&3b|Jg2`~uG69NxsamUlo4y#MNp6gw(9ZLt1M7G zKGS++^r^tbXi-ICDEd>cM-33FL5PsQut)v&mTjLCJ1S*gGYJkHAtmzmwXHl&N0<9}*Tj;hl6J4_Fjsax4({Wb zji)xWqX_x^o&@&P3h%&Zi92p$$4Hd{FL0h397l+;(I_W2a~%2w_f_e1JkDLSxVw_I z937(lq{1F

e~Oj(v6Mv*=qKjN`sxWx6xmEusP9>auHlMZKn8-vFO3{VfAtN+CA9 z+}Ad#vbl=xsr>FXHxx{=2S548OTMS6gSCMrtIMjbm@;d(0|vHG|1T; zG1p8R&ix&>AJdA=7{b$%_=hssED8BZ$HLdQY_Svms3^g1@ z*vQgUdebE#sT)or9VM=^sfqh_Y5TKP!kp-`xk}uQ!m#M#R-Dxl6Q@dBedfW>_}LA; z$lz`+SB3(SO4P~j&jbkrzj0xHPmfc5IJQE3GtNqhOSAHJWl6Pl5{!9I_v5Ebr3M93 z9(M{5{jz#qDpTAXCTE6$#xV5kGwMyA({-n~N4AH}&=RG1wW**cqVCPiDrPx48Y5wl zonAaYv-27IAvVgS64^7%={W#S=|Oi`v40*tV~{t6C+|Q%Tc~J*$%phW{h%YWGzr}w z*!Bl9>|AMjb-_7~ zDz4_r&g-eA%!=Lh@eO90=UHOX*HFHNa%= z$`hhJKBC8OX^v}PmTSUfO!2uTLMn?EpKzq-uaW|^TCbO|N5#HfWEKzjtld%R(mUrx zxoTQ^v(?W{@_~ox=d_J(6kTP($d)c+omVkCbkdRG4OQKZy~0U>gm>WO6mC#8w}*IB z#LvT!fH%Pi5+5T^&PFC{ovb9}6Ze;joRgKd+js7x7TVWf@B3J*B zoqC8qSplkf^?z}p*6-2}2XI1fPmmmAO6JZ zm58?JuYVAgNu;Z`)(NHi)2laMB&DOBS31iDDn~x&gK8|5tJLA%b^wWznYwLU$y&Ca z?1H@1)%axQUc2k_;+%^^fioX0<^*+vyYyZe&Zi@CG7AAw-xxi59hW<#{9TXYf(6SN z4l!dJR-Svq*rTiKPJYB>VmvjppU8m6dA@GF&SC6j=jbgw7hjP>G(6nxtNT*s;;_~g zT90Pt?<{iAX~q|_+gx4Vzor72x}43cG?=NiY<*IiJu3l5jLI)qU!tgfXFI_V6?=Y4 zP}@?`TfNalih?sBoJwZn#?dNRgHKW@Bb@1PpodD^VD>FHohcJNX=|B*=;cAbkv;qs zM*V(3d`-s1bWV^-Z(oXXuN^$E*z6WTLNN?h7Mm>hJkw4YGI`VESP<)J!`(?r+gH`B zyj&<7H312rXe)&%(JMG(!%r_4N@(9aLlQIceOx0%`zmHXTwumT=Z4@T^>fHek1PuN zi!wa$UcD-ZNoy%5C6;gJY0ts15O;NgubQ+T9r^&nkde6n2*V#7O8S8ruf&Big!Njjz zDkCx!al!cq#S zLZ~68i!X6v@8IYm7{>vEi6KmRS)p=Qm+U^n<#gD5fz|o7*Dw48Uj#f^;?I|ky)}2n z)P3s1G}Q2B4M{KfeX)uoT9hKu&)p0a-1r}?z3>}d{2W)~M(I4pi_19es9dVq>L*b- z^%A#1O)Q)Q!r&9=Btn$`)}EOECkD{UN{Ar#>A785OMVO%{&*AmTBYa-n5gthE=f}bDSOb zn)1nRHl6{?wEc|Xl>?vq;-hUav^l9mFo01U`X-3}u#Y(BvpvHe5$k|Gb05TIWm~42 zYknz1uo;_}mr9Y>R$=^WoxEgH+Nl9$#$HsIO;v204fcvs4;`EDQs$bfV|QA>ecLPR z8)^GanCwSd&t%rfOoECDnPd3p-lghST7Xej^lZ0+UXB|}y~Dwz?h}1`*vv6|FA+*^ zs4~}p-V z!(#6lRfgqJDA6!wIS_X4JPiJ?Lg(iRO)iX4t@y$%HQ9FldrUET2>-NFRsjn zoRTu*&-s~1yJIlFFAv~TrRVRU|1f`3Az8{h4)vSGCPrt5vJIT_o`s9K5A;7?n@CHs z>dUq99}HRUQKj#j@7x+;#hvqm{9uU?vzFs3O)4H^pbv?M z$@clxBM-x_~Y=U9lzk zX+`5ERb$O>i#Pg~9S=!W8^YN@8z!PL%fT~_39)vxENnkUg- zA`H7X114dPM9lx1Ru*X0R(ER_65%nV9|_M|^{ z7Nq(@^yDpUGklnp^0*OoVb0)qJvZmhUmXHK-_U`wvzv|2MQqk0dTN6?y@X~u=e&`? z0obMDR*7nihsFu<$2-u*efV3^2{YfmHK2JnRF}Lqxu}1i&fl6dOsY=bPuNK8$KEMu%V=1S4w1BLS0q=3?Kend*zri& z#SyTdW@C!z?G5zKrUpC@R}dM_NX4WeoUKXdO~0-@XB^m2o{USZBkx4hE?T|IBfSMR zHSgA*6;uUP#5rB&O-dne_}FMB#H1j|m)wwIi&psRbEW8E8yk6TYO#^Yz1yzue=9fs ze)5&u&atIk{%rpC1=abUz0&>q1U`e=ng+c{%a>+$x|@_qW9TCxh$~#dsfx3tU~lhp zR|gFyek^p@OVmug6ivJUgp!>_Ut%zJU+Tpy_2aMpK?%(5uSjpx+31%b5f8L=hMy*O zRGcgQj67s@Zs&&I=;p$D{zQ3lM_ruLRpLY^yb*DiTfl+7>?jg43orEo@j35z*Wj``jkC6n^JyU{8tq8PZ zw||pkhW>3l-UrEhYPP8-hK(Y4QRPX+taRy}3DCpg<_~2OcZM`yqIIhJ-h^XIAaw<= zvbEkZyhZGYMa#a9eKkBC*y!<$GiCum7f~o+`7T+;Daf6Kt9(kXa_w-Gs96yj$8m}_ z{26?~^cMyTDraUUo^U&#MF$}84r`s-uQR?-2AwYBolaG zJ{N>re7Ss{tbFO$8g|i~qan`6Z%EyLqK-8=+?}c#-k#5IaiV3W5p}s!n4o;H`@q^h z$*LFczCGAC;COgNLva6&0eM31^N7VxSDLw=0Cq}g4#ki+-eu$oQoh>Wwrfr>O7`=09rm0g_0`S# zX*uGHZv;fq?aVRx`0mxjzJgglS*(lY!pv-ebIBR_)FC6T?gJB_2bT-??XpHu?EvsJ zpkD~fW-*zJs>9p02+D`o*8N#bZs9Tgn}$|4E{vtsi-VbKuV0z`a%FCS>K!&$F?dVV zGRERc!l>!m>mET4qUrucZ_?G)J02YLTEoc-=dl6p2}Q=QB|pQ8YOj2vn3$`>*QqHo zhi6#*B~9jXC-ZbNcAglds{R>G45FtF+?mu-2Sr#6_lGTcVrnwDEit0n7k{2ws&Qye z(RwC6OAm_<3k!5r$5J^Ms3Hn$iQ+4T?^#h{*}N@(ro>1jZ8GP?DHX2h!4`!jR1rTb zrNzNdeT9`W9N3!Zo_d@dwNM$&m*P*B8A=IL8BcoJ|6m(NK~)ec{zk2`p89c2is+i5 z--xPQ=5e-&$z)QauPLJUjGob*cNk-T&521S z`}TlePy5|J@D*~Qopo7|(?jH5``|K)4ZPeLbZeU8#D7ze1e?chCJG77qP{4LbyZAW*uhcNr*$=)V_8E_V?U|WBJp!xL$Mo=9Npw~@Y2Fd z9%iomtuxkGqtW61z`~4Eup-67r1gGI_F3N}B*g*|j1JC{NS+LIv&qh%N{W#CH8p{g z8s@<i7+T?lL41_7R=hxRW@K>g5-!xV~`~I$& zw4U=8#laA@F9LPSvUsdL_Z_=pMz{Q*PkKr(N02`_yHRBnQ`}>PFG{iDvo5RlL!4~* zJbG&;WSMddFcULPr^&WTW!)=ef(4!%pP6(W1YJ3W> zLx*z&DaDMm*QYkc4$S3vUZPGef4$a#N*#z0hXu7)lG(qBd8T@$eI}m0<4d|a;q%Kl zMfB?Mh&UDl%_^hp@LYRI6PDcDWvKoqq0%JLs1zX*YJ}QXNm-!ODjy@V=&r5T$ezDg zr&Y`UN$G2HuB?RTFW1Rw)3C~u%d6aUrYSfd*H_i#pbYors8S-V2;XO92f|2Kv$LxK z6{R1~}R7>XNEBT0gsLUBxF0ziz)@cZ_A= zND*t4vt?}T@~LykSzh$XmML_42vzwVf6Ur3Ex3?{GIF_k=v>=#>;1Rx{;D!>_tIn- zOa{I!x4T=b&+onc-tX2vFP<6K1#~Vm!Kw-%=r%-g zoCUW?O}?SZF`~beeQg|?%K)h;-qN!l*Skb^9d?%{g&Q_ZE6BcRF4StVO-&B8v?CyT zAPKDlllY}u$ODV8d&Etc8g-7vjz5Gtu30-uNG@0P9OsT{TV6PZ~CPlR@N;Rm> z$u{g5+FAd;t#6a^~xn){ffEYKl zi%<5J)ff=jFARIt^z+5gIpmR`iTW0YaCsayc8@0JE;spT<2eZ89djvTsUl?XA~NQV zZv|3F;hWN-)tuh9Qzh|(_;zId0mdIGGp`x(PnMCl(gxL>duu;`?9>#lHtR&Fa*BTz z{)YI8S5ppBMam{4g56@Uey4k847)jO9DKQVbWQ~n>ztinixL&$85!;T1j2e@ymVw+ z<_Gv?8X!9mqPXjBUo3VMGZ?Shz*=M1HI0v#Hr6!)hH>jX6lHdBLd5`6;0(4`7Jh^d zSKsQwjsJ9b#8+KMBD|hK(&XYy2-r`ew_$8=;etlgv*Ypt^7ZIrJ|>w{z9+3pTA{ z<+(+wn@G$hmwtmyEcB)6oxEJM$<;vC%{T&l8 z>&{(hXmPxR>(3+kL6z9{8U0<2XkbYpZ8;^D>gH8LJc6HVl;>2Bu*QT)o5%(J%WCeUTwy25M=ZAe z{9S-EHlR|(mo${zY&?*>VCK5W#EokbvT?LKfD2O$CiGYEpdU&;&T%X>&f`F>Y^d1eQoD;p67Lb&hvALymMQF@h{H5sHmtI zwKQ)TQc=+msHmu4(;ow#Jm(R}1pcG;Hq^LDRo-`Qfr^TkO6%4Q<44xZnG8+bCNNUJ z-ot8fW=)!lFPXRAU!iZS?r_A)!G*4CTR!wI7z`;V;`kKAx`X2U4IcJeYr+0$3Ut;EZL;8aH(=t}}vJYM_ z+#MZm?s|WNiiY_y6)i6nHN6TI4Wr(hBM|WX+FS2G9x_MJ^AdDv58wa$RGOL^+01Y( z^2*KM&s3-&&L{u)M&%6y&`$5FrVq=ncEIZh1@AxG(C7i}z)x%9b|1RgS3ub@ZpKWN8GG&))}VX_-laXD>F={}jv5XH?Y4O!+_BP=yNeK8DMEPi;o?aXE4<1mM4*Sd+t9y0|NF%mnpnYAMgf8*v|87G zm*JNdPlT!PcR@c#K&7;yQd{KTWrW59!=~45? zid5bh(8|Y}@NY0e^kYuEn>vvq1N+yC-<+qHej;kw7dw!0gPrv8jN|AG6W8^xK7J>O zjp`#6)AwaPF!Qx>p1o_w?82P4jO|*k+5`m;UbRUT?@a;G++#xdDxIiPWZGRD_4Ng> zH#}CY_dPxLQPE3`y>=NaR@JpurNNbTWc;uJsFf#8yq6uPBkwvlO?t1DYY}iVS%ql? z0;=JRy8QNpV0*YnNc5V4sISdeh~e2(6)DV{*kJ@^-1bS zUe7-VK@hsYEZFPQsv1rcpY41KTHwEPfPdRjnj*e);^xN6+nBOo%jP(CyMo@NwdjGJlzSS=BJI;9a}LgzPVMqYB0Gzi}x1p_GSH;DOnBN;(9yo zw?4Zwzr_3c`W7UQ7>kXVbo6t+y}?2%u3k1@OLFDW&Tp0}H|?YOR|V>X-mjJQLOCOf zXB!u{i{_-yG8LF!CYV=lewcgEKYI?n??&}Y!I@ni&`jdxZZRc~T28T$SlRejoF22L zvECm){p*mBz8YHSkdILC-)s@Sh=@v6OSODwoPQ}y*<<0$$?|PzLw^v-uc#8PWV(Fp1Az7 z@-Kyb)3C;9M6?US&w4ou%TSEWWc>B9${Sw>O^j93)r+BlJy4@)=-{_`Vqc$aV%O8x zZ;?-at%^}oWmXbD3chr2OCi@IJZAPujcePa+QiZO$cXQv)C-bqE=PWuQ+n#-_EF7SLVe#)+(31MCtkgPG5TamGqJjdDqQ&Bu54)t7e+z;7o zATF|d^p~tZu{~h%KQE(G=l*KdVykGgm#f9N-2^jKwfy8}d-F)q$Kc;yxq)62Glay* z;H{&dj#lZH8RG>Bd_4~LxV39NnMoD}$H>1IfxGZcn1D+61v5bUyXz7l;PU9$sb2wC zs3dJEyxwi(JVabdVT}FP9;v*s1;Vb-=b!40+iUBrCZp^12pUDYZ>TSx_`UcCG!Tfs z)8vrbpsG@?Ma6Z}a}*pA1+`9#0ddLs>4xb`G}8TAA20Kh4;dw`M1VMrLaH~ z4q#`I(n806_ZSR_^NmDlIJ`hhk%OdiMDy&g9Ub^a8;>m~v{x^xaXf+sw&aPoEW5Xj z8Rtm`jQdh+miTI5+%q|seh-)){TMlEHUe{-u6E%iWXLk!2lQvOO%?o0e^ithfHk_1 z6T6=VUNx~2n&Eb#V)(6uoUc_b0qa|izKtl8BGg7eN8(>bKnIOyynj!M6A+(J8)EVL zp_1;OD&w{HkE~b4SkB!1A^Iy6RAB+)+=!Pmb0#U>FCqTt=+l31&l!Qoa5~Ph0W2XM z_P;0aI2w*WwXW^Fba^+ib-P9^>^)yfm~O(Jg=r$oS!8qX#(kULb5W#qV`p;u3NX5gGyabak z0JNrr8| zyr}740xPCtCaLiLp}4#%?akftkKtxoDP#W`>Ie#uIkV=cKVs6C|2Irk#gc7%pe@^V zjCeq*-jDO1uIl3#Q*Z7cFJJrt=vWU2gbDfIFPKS-;nPCVgrVdZ=%#%*oX#!=PDi8lxA$>z2fWhe=N0}L zkS7aiu>%+YdG+xS<&KcRa?@Y5{pkSSlmSj=n5p&9dekr_JPN=L z*#F)IU}>uXh1J@3Tq&yo*JMh-AUQ$Dyz%h3e$`wP2tCW_-0Kof`)ts5of-xf=~$!j zTe)jw0Jj3(W+AzWA4N{4zIbs`sIz?e^^;lY#Y0qHVO#2z`gkyi}N~jaxV>mxyGri>R@0dw9Z%O||$f2@= zf4|xP|McdY2mw@5lWWUZnXauwekmgp#O<(Y-kg^;hm$%3N{P_F$0G}Z(GMq^IMTfO z@%`&BUG~(Yf~;@_^SG*Gs>QjGN($A4MvEACL{)3kU6Xv#k1Aww>!z_%^J>AUk@0a? zziAjLoxj6==NQLzpTaa5_v96?v}K#%9Y?8<{h(@}1;c8)w!etD3~;*ZP=4CNP=Ut5 zf?`K3R|-^dx!R#Ceo7V%Zfzd7ixzWRw3i(DT4aPmMzUqvd5*pRsJJy|-|VRo$L;Ai z;aV`&iYKZ?pW&diy0Fb@B?zXK)lW?X6cxQo4LV6pUqeTYJP*U$Ro zvI(c~wWHQjP(p(<7#%>wrP=JSr!TwkWb{Z>M+6ifjmWi1TgyJ!n@bZy;L8!|jy=hn z!3bt>;Sw2`q`OmZ>LB>QkHtT8BT^{KrR9LKk`Pd_C&x9i{`Yaw9|kXDjGM3kID9QGxjYH#9Yqu1yT zuKnH7R#_hMSjX;iiSF*4@jGpHHU?{U%(X<{Fuvk>k8yB)?@BNukZo@rioh#}4&zzSga4gLAALn6E z!^p9%+CGOD^mB6G)_dT(DOX@>GIIqIy!w$&xh}24%nD9BIzlS>{*2w)rSIBI%oHr$1T#&{BIQOw&ppR&Hq2$Ym$&RLPVt0% zKW-Bd+g=xV+I5oQE5{&Bw?tLp}{ ze{$HltKx-_{sXn4UJjCTHf-da&%ljlp~6{FaPy|Al*icBxe(vlt-WaRmN9g2Hf(F5 z%p2?rG0SXC?yEs7Q-+i`dp;ZRbAFT;JJpEI>OC9sgP%tt zn~a&GLA@U7gHQX8TH(GL=`VLIzS7{9u=Hwhyc$dkATo<+m68aAe)6a@ElgWJNOBlN z@qAjxm%3BxG2`7NjJ`k!oxeZ`<0o8S3|HQ>oik9xmsTGW?YLV*bWE{2(|oJT%Z9RO zh8lOywyMb>&Y{vF)An&ny;?$<(%%#j2m}fc{i)_>CgR0WV32@%AC)VRBdj?E9M2)w zSo{wbxUuS=4+@8uLg94SC^%CVoP5GoOot_S+1*BJdZ*7nkSQn0VdKoe9n0z{#L5of z#%=*A%nX)8Pk)g*8+`K1JRjjJoGFzZFvlqJ^Z{j>WO-B_-+&i;^R^DK zJhAK|)|@aV(6v+7u|QZLruox?NlWsFF^ISl61Ix85~+iG9c;%PxHzHGXD1ZhNGNb{ z_4N8P<-PArsI?BBmDBtc5MUnG!M;cqjohpWE^w1=7T|$`MHa@M?`~lySAzZj6)Y9@ z1#r4VKxbQrnMogk^GKAgh&7Jbr%*wnZQX7YPgf>aD<79F04%`D`oqQ^v0uYc-GXk~ zi*+Bd(t?iRQ3jn=r2zuyGSv@en3C(>*>vo{9(9itl9yIK=TBi^+q3^56E93b%JVN2T?N6{{JwFR;F z8ayzc6?u3Bf|Indkt)@%ID`S5OEWp%muVw9{3^4{4Vuj}ouW?# zWl~GxrCfN4jZk*b!xac<<1JH~c*suAZOUuqkQRB$#t;;p<=rPw8L_D_!JNLsbTnjd zhG!*~;vYitrDjWCc2nr$99!W&_)L@%zEENoMKt-nbuIM(!2( z8%9YzV`2?~w>cmO?Q$(FN@kU>48xrFFdL_YwipdS88xY695pJ zyo53_LU(!zPT@*jJc)-guhCHQ^%K|$0IDQ1Y(lqV{34wb@s-6f%X8phA{TKm zF4#wX^()Y+)zsB!p{OV`rsHphc8ax6DjX?CRW241ovv+!(oAQSbeJZg?AJ!dn zR>JN>a90e%>{~sjP@9#qsa1>hwbT7g>}{sXn`Mt-4`ioWO5q|y<)^){BBQ4^!~6ND zLbrfZnV%3Qk3Wn=ctS-##vLe*3*x0HL3{AZF!|QZI3?(o$6+uyx7GE0Ee5KX+zmP- zdiRbu#=_s2BVy{!Zix-0c-l>>>rp{gVDS!82sDUrf=;Z(GqsF-DUgPkoooJR%t6q( z(s0r2Tio@{JyMkvq9uZE&vOLDgvb| zEGX5C{-+xZ3phIReJq+?T(&1!Ov)n4VB9luu{TW$RpUC;``-5R;=qx5)u!FW5_R`4 zcxrU5`>47c+b%f6vraje@S*j`T?jLzLf-#J-@5n{FT*~^!NE?U@B|3cz77k-U$xO~Sh(8u^Reo-GnO0Z?`h6i68O;yIfa!b z;$xLV`%w))DI?|7``~(~dquO8^`q}crMz*vQg+A)YI3P%eV-x;< z==otY8<|6+Q&@T*#-SYCG};pTWgEaxFWT>?Sosyz=uA#d;@a44V(!*XZ0+JJGJrsO z$^(dZoq$u5rQi1R^V$j5hal#&rw(;J>-8hxC-+_o3zqPFqZ~ny6frHms&U>o(Y)G8 z@8SkQMzjtnP)P~1#B2IC=vlmC2^tZW~biKXv6@T=nt>7#{0+*bZwEr}$-aE!1 zN1cNqcQPwzT`R}CZ^9?662O$44E}?Hw#o$f%)^Xf9gK`0wzL${LK$FG8`qomyOiH@ zc@Xs)Ul+LPmIJmssko{l<@zNz7%>@4UUr)8PAYnvsHeO!ph_2XhTT6l4z~gX<_^FX zWM4Yo51_2CxBo@7ThqKRpce=`Z;%>a$~_vZmb)(?BFKl4t`~q#s)5bT05S^fFWSH4 z>7Z1ZlpKJBL0sWE4RV3!ZUfRvq8e!>cl`YM^AtaQHvdUc%!AL2&tOJJYR^kK#mHkL z_yf@;OE(RR^aK=ltGx`DDg}0d0Of_3-MTD8!^Ok^ix`-ij`)%RG{ByzaSt;?E*90yE^)ZzIn>}0n>e75W{|Y+Bq17khL62DdEtzi<{U*CZebZ6o+X~Bx7RQogPIm9& z^F_pFxTl@>_jU}nC`dN_B}%1NzHtT5bi521~GN^yw zh}cJ{*O7$$;HpU88gbk>sL53mlVBlP6gsW|4ip;+cMhw`;~mP^i|)2t66`Y7igvIb zzvFn_M4>#~AnC0MM-Py(;WwyzSKM2uZDef29haBNdL=Risbwf`tNT|<{{wWmzGs== zL`(dje>2{y&z6X^qL`$`adV<}pA~_5d~P>NM1mU|?u^)cD$I!5-U5IqN7Ci-Wgr@l z%vCg(e3!v**>?eAR%gz%+AfzAHsAh915?}jg9Jo`5!%5UHf0&7Nfx9EHH>c#zX53+ zi(RSa@dWlXga#yOCCi2P7M+%oKX_9e=>MvwN2Ig~tsMR`fJ{?-u{g>N zK1zfce^!9 z`mX)Z7K}GZ+IAU2g;v!!G8p7rjoS||A-n>xUbB8vO#w%qj<=hc!m!9l1KhQi1@*Z; zg%w>Tf6Gs{XmkT7&+&}5`b`Y0|F9QcUAQH(vKtoEHaTUiwd*_dinQv%ts_DJqTiI! z&mRNtn)kDOy+8oB>^S*UpPe=~%mMrOBqTO97$ANWYn2nj{Fomda9&#cxr`jP5`IgElx=Pu_BK~$%goQ!$~@iE4K#Yl0b^k}5B$jGH*FBdtolYw8|?@ciV2 zdFq}Fug1$VCFKI#2dm-A*M`kX&S@O*&YK@WTpkiH2ZxZ+IXutK_?OY<^tQ^5&Yk{p ztTc*~v<>;9?f7MvCFELClEdpOVw^YLNYa#DBAhW*#FuC1Ies6?Rj`gv6D-(N!DQ5lLhM2r>h3f82NYwoecF88W6^o8**gWj;0Fs0HRac*K=zsRS&rx z1#Q|>mzco<#iAJ-y~Cp4O-%F+i?tdVO#DJAr_XSW&WoD3;3AhuRm#nVtqJ#>aLXBS zCd01SAKD^FO>5PZ?ysttWw&dtrvQHz83{90`IH%SZS#c!A!2cCQ^j*I-=nbw6_JA0 z#0h*hi9mF}l~!l9nXD;tP;)e@btpcq!)k@kcczLL?=y^y*LJNb`l>xmGrrC~JcG|T zsdTR_DcHk2@w9(t80_p_0j=Ezuco`KRU<5R%Jkc8mqZBW8XJ-LY5YF4@To?>j|>7{ zAVD<$*gki|G<$7rL3O;cG%y5+Z*7rEJh_YS1i;;Jw}zWt3EHwA%a0y{lR65$ESb`^ zpI=O5?Qt(}$j?qi(_P=ZTHs)+!vyRbN5F6q!ecitt^R_h;!Jrh(l>`!YbZdIDq40} zU8MSa|222Q{IfgV^g08}pYs;0_p7m9?!&d3Gih-Vi^kZP~15ZadtC z&(j1$(da;g2xQbvVrx9~WuD}&tcqPJJ7^qyW+O;tq+34VgiIXrM(+^PM!>)>b?ewv zDV$SPiMdQ~)^Zou9_;=W>?h6cYoD8OtkO*D)oFi;k@|C-LS4<=>3!t(e3#%=d0O6Y z`fr3oiHC9t#d`H95xZ^U^Q2_8C#rSU`s3wjcY6tJk~1&hDVYpyK-Aq9^V))!u#1el}+*dgN?9wp=o&)OR6aE_u_*46z&2l6j}B zVRA$7`L@LxlK>&`{arbiH99Mk=!#O{be2;FWt7eKUss+STR2wXB1SH?cN&IAXC&8r zMF%C>#;8cCe?yLwQpybmSow=2^ zBUV7(QOA*)R3-KHQ3$d*^_9_aq!L#G?5crX&WV6~n56HzUb04_uEVNj@fU}S++|LS zRJm@hnPab*_XX0+mW{^GZRZ;@L^kXjDJO0wz1AAL_@Ubv;nfvxG%Po~j1NL;$Q?1q zmVbHoj-7wJH^lUEl$cpm3aoIY`xD-rrpzTrED??uE9gpL)q1kY7?x#{s^DKP(pZ>D zNmeg8m4~9v%ub$9yzlJESuyE9t+YAQ6mFE1W;SBAiEj-3diPQ?F1+RY`{};|GMQrm zME!*}h?Wa7eNUmHtnf-pvM-Qb{4&&V6{to=be2(Lv--5|C8A8s!;p6z*#J%ebTF=} z8YmB_fK?pR1dRP6l|)jy_?;pVXnLo5!+eujS=O5(qvjmb@9Y5|8)S^T@M?rH3Ko!v zy(mRctK4jG+CciUr+|Yf_{j^R%M!4sT9H=p}+Wi|MhRqYe-VbOk^e|#+kJKlx zKaZ!CWpO-uPm7j9&Xx7^JqyeC+nQT5OncOz_b_vNyOM?Uz+2kkB4EOLz|Q5;>eVg^ zGib5-M<%+J*A|W3y_t4OiJ`(lEA30^?yM-p=KcK}PGT^N3W57;CYCjgvB5hFp=!f! z%6qGytv_)nt4}<9xjS2YqNO{iI||`eRyzV4S-fn4x0>dh&ofx#+!iT^UtsmfpcWS) zG;$-Ym>5eEFYS~)r5y_%dQ-)>hC*+|z0!V$)SfjmUsg@-o}C}Dx~}oH z7c9xqf@Zjj#eihM#lw(4@0b>(b-i08$0JWNWg>CXH1?q(W;yD-t4Q$}zjGwQu2_+O zCx5^p&e#4;lKHx6UXh!;=B9u?#;o)%OLK%Uc*sqmvFlENwgm-_D+J1b<=i=s;_V^> z_da%4Vaw;(d=mIS4%aidW>{$nnS--OMv^VtQfzeH*|jmg#Qea(NzA+#-7Lb=X)#(|vvOqBhh zzdR;3ydx3u45r^|46U9z}5Nn(Xm7xExL<3Ml-uBb(1U7-9t8v1UCwqjZH( zY*r@{J~rAnDoo(aepmZhprgA`_8nZOJ&A%sC#sn#HE`ohk`>Y@weD}wv)4RD9Up8Q zx0#k4tL^TIK(xpVD%0-@sxcvOjzgZV+Ec7i=|bIoc&@mxlh-fpnhHigYtg&Yei@I- z+jZhE(^XFkYBO&2O%Sp*>q;JR7!7ct1htK*4(w`(@6ZTB+2S26gG>ehDxD_lDhgTm z4lcx_2$Tk=xnOAbZ14DcB5zp^aK;RDFfZ6G$KpUijaIfzg)3RN2KOh-)fE)BdqZ*6De4K}o~lJFq^n_$RB8ZG25`QX-JbmtV|DWo@zC2BrtTL6gSwJSQkea%M&v zhYf{uCIV2(4A6%%oQ~gQ^lN>b_B;z+vE><5nc-eEj~I-~_&bA{ujX5|DU}$vgLI6B zF?Zrc&1cG6=MIT4W-^>@K+4BX{k9l0$xasnF>^AyP$XJq-OKMmD zT6U5DZGwZAi^=EApl=fT7!$PF24~=To7sy2d6KU92od|Y6aJ%O4KEOr;+F~WewigD z@RBmqLW5)Kd6H{-Oi{wXl;ig>I4DV>O`s4;a>v36o>S2uQ zYmaPq)uUt8%c?D5K*Dig`PBg$7VD;_+ln6@N zyA&2jf4!mZso=tg18{$_?pm+y%em-?+`3!xog`Pp$i_3}oOCoJz_ z1UiNBnofcOue$e&kv9d{1IG+y+P2(pY9(rOZBUggPR{hu;35%#Sfs`r`q^aV5RC1kT&#aV1_8KW_sY6?Y;t7kbfu zHJ!^jYZ0lwxw@8eMhmkkl~jO~i%m=IXqy}n*QdnscQc+h^n!$zc_Rh^$J^}-1t@(io0q5md<2o>Yk;~2@pV8s$$rthtcn> z%UfGiz{qc=hqgZ6X{(mB>Zyt;Cu+79V3~?0C{dCG^EFuN&bk(Nbymm2S@Sr*2q%+d{AZszVxyeKG@!g@_B(69+WC+4-m?dmPkHrI<2v^i*tQ7gC7Q<{^Gl(%BR9D@1m-DCXA;u>$Nxq4p`eA+D*;xpEqh9 z{9f&GYI?2I{nY_RKS85s_SF`}OHhHchDP#c%vy$^ed+4m9Ym%lNDfHc3Kkz$>7H(*6v{mc0D? zGiv%=W)}^}=))K5$6-0eV9HW`mZMOF)z;vZqeULAb{(yrYM36wa;HPAVD_JU_^OrL zdlqX;n>wZm<%V;)+N{e`IuBzGYmxVWV(;LQJ;!=|*rE~c$?+=@+5)G^^{o_7pVDoo zw#m8Ym&eX1FN-E?vOz}BW)l-n&|w{|x*wzvDBJC{vP{07=v!~u z)P5eqB%%7L4PdQR{!u-skqPxX?VkZj(bpVES{qsKSUcUiguM3sDO)d)Tg9y8L1a}c zWG(pgMB>Ly>^4Fe8k09-Tc4pDqd`Ml#h%Bk0Zo^~IY#_EgMU%i0Me9;89>d%BqZ=I zaMazNymC;o)R;^=;$&7>DT2I&;I?5DZKc6Fd3iZjBS+FXti=lk5=iiynaOC4C#Px_@>wv<~1vffq@v zN+NjEA2Uxf6FrA3ZF~mRa81NMyb!?@d%7q2b8cH?%E%bIvcb&M-4uR+BB=N$MNgCO zjw$bHNzZ3&*>FBn&91bC+?(N5gOEEnNJ4Tnqd2X$Z7vfHM;(vhbs z4C+Jb-0Mo}l&tYyq}s}5h{qXj2)MV084%Nz-(sQ$YDSci`}G`;GJM6mI}3*4&Pi=Z zM`dn6rvK|>K&Iai#k!oO%o5!vpXl>^mEEVw&rL;_1_VWRK05fqeP6Gq+;S~WCn(6g zYa3MC^tfy8``4B0nugp=qd_ht@6)+^jAp>C?jmsgU=NH(=ZLRl$X%76U{+T$KNj)a@XlLjWkm z|3__f1~N~mA=8LR=ZR(Xotb?W@w~`Zc^Pxr1kog|X^Y}kfQtC=F23N3s$MSc%iMJ3={u-K6HnY`GwCakN5(vWX)@&}Qnp$R8uF6|0b)X7t!UmH$ zNh)9es5pA+eK3=SIaFrR%tN`$!w77n1!ed(;>1qOv;MV3c`p!!Go}uh`Qm?O|4k$V zRCQOMdP9k6^ad#sKQywr9RZ~`tnC2G`_7|a{onR*NYhNxL&AtYYXRm)<6Nnw42uAH zF`>yL1U8qbKfO442Jo>!@#|l9FF-pD66n!5gTMT^W$yd+c@P9P(a4=0^Q(IefVigc zFB4ak+GhL~rVGw)r3AR_OH=oQU%=_!=>wnqL)HbxFRXXii3o`ZEh^4!n^WxG`Z#x& zFEy{Nb9XD(W4b$7#AtYD0;r|)e)`WE4_P6takqBqMX*`0$epV^F~?5>GX=c$A2S8G zQj@bZyfZCnhCrcIynH)58dR+yKB~!q(9BevO7b_LmgxPF<>=ow z0o4NLuLn`$a0&FCpbceIJ@Yg>TPd>nP_?ZA)->XJP4*86vtD~$2|5zHM)*E3C zQe-qdJdG1*22^+(k|St-8lk7kn=GaayV#9ajm$k3$*29ZiNuA9{J2wZ2Zua{u{0U3JT1amjJs3oNBGy|FQgk2x~UfKo;31?tdu% z&%L$Y0V06rhsbk(Uxb`^{I~*cR%`r5Kj67OPmo&+Z1h4`R*M#SB ze+4Q&0SJ32{ll%Ya*_b72GPrgY(6Dmf5ob9AP75%?%mCbJ#s;B{+#Vp{iGL82Z6#< zbl;IG!@-hfVj&YJmgleXWP;FppRaglLLrkq{i#wbt%7bLLmyWpRCTA#w7YoGG3Pw% z&dPpLY;kk+3WAB$qEp3;&`m2XCB1qgS<6aOrIlsFKCWpobX!>jJm zD-zT9g21ic*jLC`h~-*C(M&Eek-$B|lQ!s?JKkGc)xEN<d9{6aaC*ML_KI3lEGFBmU_0BrFqHFDH*)lAfZrjL_XUuo zM!!rxZJtem1>Q}P2KJyBwEcj7_|VI+0_DI4pXChP`=cotwOn$yV*4^%>UX-m=oDTl zuQ1i8>STp9*`O=>uh-a69$CME!)=sTCSU1>ELKh*TE=~xZmLI1?cDcf1X#f?X1vP# z7BJmt1WGF0Q>KhWw6qTB3$p#bY!Fi#gWzn%G|TSlqy6|hZq3To8RrW_%-ScDXRn3I zwC|yM>(i9eC5PY<IjI_l1q7Evv^!_;c?H8N`w~NH(5cj{=J1A7TA)X5?&X-WOs?J0$szbT&bf z(%HZ^9sLYt*lMFL8;9)F*mVdBwiVENoOq$5q(qa6x zHq4Zy?)X$c*g7(*&cxU1zvzWifN~q?$c@weWSs)ctRvQ@4zMlKg00DyrJ?EK-EW`y zj4grFOAD!V{zo<5G_9fDinUDi-NP3OOt9=UMa5P{K@Qj9_D$S~Syr6eH>S*MGJ%@I zzLu>;LT)@EmuiI}(?nc$`f0G^#BeJ~A3Yi5J%Wn?rU&xqd^vBcpS`@@CDpsnmVeC= zV}+#5E9|2cE8X&TkhjShty2)9YPqx0gR%xeK7!37>`CHGUfeA?nUrP!C;BO_z*X9s z!#{FScjJo4Py2r_?7Fo8Hi4~vXZ|OJo^^6vLx)Gg!u*zHPU!{1BskADSqCLDiGL@+ zB)75g)dZu#c;3lNX?r8xiRenQw#_mps(ZyEqT$)Z559wo$_3#1lATs?SzERsA>`ro zFs}Wy4vMY-CCT1*y(S-2%?6lfBdvuM1~xUaz+Yg3ijZC?E4BgYC_cY7?Q|*-xP#fr zm4Nt5YmeFd3C}@5mEMT+?#?!(O(c=_dRzLZyIMniX1z*nfHowiW1nJ*gdz2?y$_Vp z)am9uT_8V6o84sMcn?YGi6%%NtZy7~Y8A^*Ex~26F2|b+=Wx9iI0#wj6kn3<-+MM! zPs`Vra2BA1+5=G>xxGO6##S121cIq-@sLx0HUXd_$bu_=t8Pu>f!m!^;YKib zjHNloWPRh|C@0Zwl+(KpP^p65$>z8yZqZ4%ZA~fI*GJx6#N()d5cs&qp!_FM#q}j) zh}puI4Sa})tk+^>mhXTR)6bg<*u&cdN zDHEsC(nv`eXnY$^Nvg!&9}EQBjs1! zxVHuHS}&uT)~0hdJL@^*+Z7*;(cQa)t819sOzCCt-@opb<9NDOTW8ADNxsvfjY0uT zr#vLU)k>0J*4l(@nrQA@y6X1Yph5ScQCHum;S8Hg0$sP=?MZ2}5ASXG4b_ynocAv? z3z>5lS7%~%hc0zize|x6&~ZGB8Jb}Gjs_V=0e?9jdD>CihK=^IO35M75|}i(Sa61W zUXB}U%>y}@D_D^`a2~W8{J8J9lG6*Vo6P%;RH`s`s;{(62e&7`>0R6#&2H*&+39Lx zzq*;K=QPI^!a8}DvJ(UA)iQEANnemoW@_2Q-92yC(Ld20MUEo)I`wCWzxZSm@a^(o zSVfm12h8%}2xauFk}kP-FvRV-eEG>!^O6FG_ep?1hjMr+LjxmnVDb!Jz<<(8n7Gg} zml0yKtLgK;hon4s4g_%{jFpeW`2vr-29ZlNyd?e0f+Q>~)@`;xRV4oAkKUN~-}7`F z*Ch!pY(P4j$8xh+-tJ?_&huW6Y_pmD?pUBsE37m6Q*mp2K#s0Zpy4Gh6 zHRbB*_k}UI8c%3Z#--rVk)G;R%!9hN&8 zV3`G>A`uc~2(q z!P3u*7YJLt7D=-UG8GyjnV`U+4RtfbW&1KPO^v7A!UAXLT^lL=IQz8y*17tm2FR4_;1yRqe8sz`AEjee zf;tLqntWYN$(pk7JbB1hXIp)R64rVN>Ce{zuF|HZ@NfYTiyH_QIM@mPx3g@6ug_&p zeN8GGQO(Ad%DpevZ67f~93$^bF{Sm3H#OUMJGO2PI0Z@MR&kJO!i{_fVl!mZ>{s@9 zh@D&_y{WdDI8u01eKx#=+eW0k@I_E}goM*RUje(*2b<{uPrv3hp>q0%z)7?U?d7%? z!qs)L`6EEVd(SU<4i=-hKvGVIeV}3ZOQ6yHr#j zwA{{UfbcF@@ocF=f9(6Q0);gMtia6Do9$LAkrzKmyU9H1>E(Lb->WA!~+-2D}g`jz_i|K6Z9o$ z<1JSpSCJnXUwu+0!CPCdhUy>$bO7H82mFpNSnHrE5}js4@P9&-d{TVm0GU&tX4AUu z;ImZ3-=WTQTiCL~krf=QGc}ye(+3g^y!#~zI>Ir0fxtTTnSC$CV4?dpLjr1;E-QXV zvKR<;{Bcn!Sy9$e585yZfWvp6v|hBZ-)fk39wdyO+vsqb=5+5iiO>0uGoBAZ`k+ z5Jofo!H8)2kU0tpQ=g?A;Y=7pQtHgISPzj^@H()xOep#jb3ZB{3b^G(e>wfnj4OmcLo!FO8_0- z+bU`i3?Wsrp%{r%nSnX$%ZGCaBza2EJ#4P| z@d9PYPcHoSYp4CaxA+{^H$rjOJ49D3+;2CKLvr%2)%NW{3kXgv)pINc*D^=1$Wb(m zw>E6Z*=HT`IsDvnD^8rp!Ys1(ecwFH6#P_i5Z|H8MgoV zdA+7Oi+4>+-Enr_-q#P$%OBFoZr_YNx_e;9rnKx<;Ke595b%&r6#L3YKG`fp^pS7*Zy6(4DAfyv)XuwR zH&K}xkPCJho>#*hD)Tj;1%G7bdJB)?Nw)L2DT(SStAWgfa|OlU{Kicu+ehh5?N-iB zB+n8%_2*iI+^ADVOTWxP+nNm9vLLD-YMBV!=hloN=R?5IZzAVE&d*(*tX6y*andh{ zLYpiSpBW${5sPw3MHY>TIes;bX+OQ$UN|j@U{X)a4UsD>xZA4|^t|3h_Evoxdi)C4 z_Ke<`gSSf_*v(yJkP8n37z8RFfY)?$puQX^qXCyL!+lvc1!6*DGK3qk5y&bW1-(@C z!u?fY+o`<`{`;7q1hCCYgFCb5SV~Pv3NCaqUin7p7$^#XrJI5%pIe1xT;x2iKP;fa z)&Ar7_Xn-&V*zh4mDp1}sD$?FYzpsdKv&QM+=abgHYp0ADK{en(gAmYPY&Q+C?pJF zTQ`F=P8}^oaddYAmi}K`%y>@W%s$`{ke9<3|J|+p@HXgIm^)@3 zsS65^A;D`y1-zJaxLC**0%>9^sTg}k7yT6QsBlL+1=yw{En!}&TMAhh#Q0M?%bs8u zd`4y!ucn%K6Fu2vO`i92UYQ)45TJhQUbrBcG<^$_d#xFL=<(r4tsRuz!^r7mKC*_AZq=) zZzj?5PN7m?#sA}CfSqfiQ7HEK7CUkeR_VvQ{z)}{YL4z8-cZ(e3A5_>H;|fUcjfc! zY_4d~#jdA#%f<+>!9K3nGH+i0xVget>uj?)-y6@gmqZ}b+U-)HwpW3;5M*}<+f+|0 z-ghIsANtFT59kg1C*=NL=4rV8s;_SqOR)^`CkezLNh)8y-xv&k=8oP=vB)&ITLQyB>hzDKYEC8ipKvt{C zK3kK0Nx@OVb|6h-5T2Q~aQxsjr{y<&+?1yM>+`s}e68ga7I6G-LL&YuzSAkxig0w2 zXBoM4{%)!FJZhYpP}=?S>`>6incgfE^O4gD{_EqX-$ix2#=;@2abu9)@i7iOg#`&3 zxGjPHPT^HtIXQ?s=k@R<9g|wDs-%Q_-I~#6ma2b8Vj~Aej;3B;oEr%rzFw~gQKyBs zHt2$GwCyeU=9hpxc+@%*2at&yCm+WM(bv$8Y8<2#b>u6|pSl7t;$+96c%$Bl$9)fK zcG?sSYID$Nx@TVh%l4xEl~T^6Vv7X4)+X-fVfR4@R9k)A-;WqVYs^}wfy}diA8;jB z){J-=Kt$SZ6=8LvOOln3_uymzN3mb$oK6Xk^Z2_~kZ7s$ANEqGd`5SjLUu%`ckilU zZ{7(l2{LmC?4C!PEY49W-$k%XG9FA^Kr?6dc`n_w9a$k0N6M_3$F=u0)I6p=3@|2p?uGfjvBi*DZ?%=hT^5U z^1;teVFN=L+4nRQ2%p1baP3dxpjCyLdHBG`J<70xF9C(s;{|ut@%fUiJRanb*$!dK zoqT#t7nRvaqg1N9qB#1-d(5rSwG|-%IHo6g$gR+Q`96&$b!&3vK}(?Ccu$K9=b$ z=RkxZXq7ZS@Cy?)oTkCBmCBN%PQP&Sc>%kq=bco#LK6b#&nQGSyp#;w*YSvuNdH6M8q&Wm&k1zm5n*xiW%u5y7Y&@xpWXTa6 ztO)KT!j-uqA= zXQjN6LbX46yq+KFY?W4%YMV@>pJ^Tz70jcm?Dc1{4cG>ku84wRIH^qXDC_$kjVEPT znY896Ow#_c3$mtxsMH+N;9|KO`fhW!+YM4ns{TM)g0NNtt&HtzNZUa3I7SlAJRq=3 zoCxI?CUHF>E+9zHSS}r5ovgOG7!+b)R);B^QY~P?bwxAkUtntu&La#g z%i|_m-^cJ-v_;2)QIJ09Zw^-{&rJEX&D`s$(!9PfnYD?FDqvGxIwPW;h1DjY=c0;N zRt=_7#RxrqA!Vc4cO$sduln}!Hg z>{1()wV%~y@fu(@EvD~_sy-^#L>!2>-*Twk!o!HHP~~cQfnb|X|C>}!HS@yO+)%*0$_K=lT0mynel9 z1%&O}`~-e2g0p9iF>&?M@E<2!_9qR%bq`Kc@KOiZ&~fx2gZg0O=h)}yXcI-g&i-^k z^khShM@}mX-T6Y9ek9GTEK!=U!!NHOccYJBK%fv2#I*XJbyu>0A@elJ;{xLn5}gyf7uOG&pNllCh$fD`PscJ+;l0G_SU-}x1-}eLCDuaakXu9FNSmyZ}N{o3AyE&Qjs`HD=(GW@sigr1&;+E+PC)#!~e#85co<5%HYREreq;VuAY{*52naCzkcg4GqA|V~OW$u#7j=x@`3$S@XYdFydel=Zv!i1ggr3bzev9C*koqGfv$>{z&;j4fbnN|RQ}3YN~RLX`MP z?5Z$dK){*8L8@Bq0V6Rqb{m05m@n*9Hq);Nn1fG&7uWdZ;yU;DzR{nH( zyLn?Fyp~$+Fkhg{+pn;IHR2+eRr}+c%OKGI^B`w#aO*nPNcz3j6#^eq_-SLxNyp#* E1)LP09RL6T literal 51092 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 From f9c302b415ce583c07666aaffe6f3e259228f5fe Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 23 Jan 2024 14:17:34 +0800 Subject: [PATCH 19/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9readme?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- README.zh-CN.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index cf35b4ffc..d523e5a25 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ Looking forward to your use! Discord Link: [https://discord.gg/MpdBSBnFTu](https://discord.gg/MpdBSBnFTu) -## LF CLUB Community +## 👑LF CLUB Community LF CLUB is a premium paid community founded by the author of LiteFlow. diff --git a/README.zh-CN.md b/README.zh-CN.md index 9376a260b..fa636c339 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -57,7 +57,7 @@ LiteFlow拥有极其详细易懂的文档体系,能帮助你解决在使用框 LiteFlow期待你的了解! -## LF CLUB社区 +## 👑LF CLUB社区 LF CLUB是由LiteFlow作者创办的高级付费社区 From 6f63864b65c59bb9761aa0afd8d19b540c7c6aa9 Mon Sep 17 00:00:00 2001 From: gezuao <673843192@qq.com> Date: Thu, 25 Jan 2024 20:03:53 +0800 Subject: [PATCH 20/49] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E8=84=9A=E6=9C=AC=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/script/ScriptExecutor.java | 9 ++ .../script/jsr223/JSR223ScriptExecutor.java | 11 ++- .../script/validator/ScriptValidator.java | 82 +++++++++++++++++++ .../graaljs/GraalJavaScriptExecutor.java | 11 ++- .../liteflow/script/java/JavaExecutor.java | 17 ++-- .../qlexpress/QLExpressScriptExecutor.java | 10 ++- .../ValidateAviatorScriptComponentTest.java | 41 ++++++++++ .../ValidateGraaljsScriptComponentTest.java | 51 ++++++++++++ .../ValidateGroovyScriptComponentTest.java | 79 ++++++++++++++++++ .../ValidateJavaScriptComponentTest.java | 63 ++++++++++++++ ...ValidateJavaScriptScriptComponentTest.java | 51 ++++++++++++ .../ValidateLuaScriptComponentTest.java | 37 +++++++++ ...idateMultiLanguageScriptComponentTest.java | 62 ++++++++++++++ .../ValidatePythonScriptComponentTest.java | 53 ++++++++++++ .../ValidateQLExpressScriptComponentTest.java | 31 +++++++ 15 files changed, 596 insertions(+), 12 deletions(-) create mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java index 0f4be12dd..64d47c0b8 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java @@ -10,6 +10,7 @@ import com.yomahub.liteflow.exception.LiteFlowException; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; +import javax.script.ScriptException; import java.util.Map; import java.util.function.BiConsumer; @@ -86,4 +87,12 @@ public abstract class ScriptExecutor { ScriptBeanManager.getScriptBeanMap().forEach(putIfAbsentConsumer); } + /** + * 利用相应框架编译脚本 + * + * @param script 脚本 + * @return boolean + * @throws Exception 例外 + */ + public abstract Object compile(String script) throws Exception; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java index 0bb20d921..4d7882015 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -38,8 +38,7 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { @Override public void load(String nodeId, String script) { try { - CompiledScript compiledScript = ((Compilable) scriptEngine).compile(convertScript(script)); - compiledScriptMap.put(nodeId, compiledScript); + compiledScriptMap.put(nodeId, (CompiledScript) compile(script)); } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); @@ -68,4 +67,12 @@ public abstract class JSR223ScriptExecutor extends ScriptExecutor { compiledScriptMap.clear(); } + @Override + public Object compile(String script) throws ScriptException { + if(scriptEngine == null) { + LOG.error("script engine has not init"); + } + return ((Compilable) scriptEngine).compile(convertScript(script)); + } + } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java new file mode 100644 index 000000000..dd1c7b72c --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java @@ -0,0 +1,82 @@ +package com.yomahub.liteflow.script.validator; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.log.LFLog; +import com.yomahub.liteflow.log.LFLoggerManager; +import com.yomahub.liteflow.script.ScriptExecutor; + +import java.util.*; + +/** + * 脚本验证类 + * + * @author Ge_Zuao + * @since 2.12.0 + */ +public class ScriptValidator { + + private static final LFLog LOG = LFLoggerManager.getLogger(ScriptValidator.class); + + private static Map scriptExecutors; + + static { + List scriptExecutorList = new ArrayList<>(); + scriptExecutors = new HashMap<>(); + ServiceLoader.load(ScriptExecutor.class).forEach(scriptExecutorList::add); + scriptExecutorList.stream() + .peek(ScriptExecutor::init) + .forEach(scriptExecutor -> scriptExecutors.put(scriptExecutor.scriptType(), scriptExecutor)); + } + + /** + * 只引入一种脚本语言时,使用该语言验证 + * + * @param script 脚本 + * @return boolean + */ + public static boolean validate(String script){ + if(scriptExecutors.isEmpty()){ + LOG.error("The loaded script modules not found."); + return false; + } + // 使用多脚本语言需要指定验证语言 + if(scriptExecutors.size() > 1){ + LOG.error("The loaded script modules more than 1. Please specify the script language."); + return false; + } + + ScriptExecutor scriptExecutor = scriptExecutors.values().iterator().next(); + try { + scriptExecutor.compile(script); + } catch (Exception e) { + LOG.error("script component validate failure. " + e.getMessage()); + return false; + } + return true; + } + + /** + * 多语言脚本验证 + * + * @param scripts 脚本 + * @return boolean + */ + public static boolean validate(Map scripts){ + for(Map.Entry script : scripts.entrySet()){ + ScriptExecutor scriptExecutor = scriptExecutors.getOrDefault(script.getValue(), null); + if(scriptExecutor == null){ + LOG.error(StrUtil.format("Specified script language {} was not found.", script.getValue())); + return false; + } + try { + scriptExecutor.compile(script.getKey()); + } catch (Exception e) { + LOG.error(StrUtil.format("{} script component validate failure. ", script.getValue()) + e.getMessage()); + return false; + } + } + return true; + } +} diff --git a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java index e6b194a9d..936e10464 100644 --- a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java @@ -33,8 +33,7 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { @Override public void load(String nodeId, String script) { try { - String wrapScript = StrUtil.format("function process(){{}} process();", script); - scriptMap.put(nodeId, Source.create("js", wrapScript)); + scriptMap.put(nodeId, Source.create("js", (CharSequence) compile(script))); } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); @@ -84,4 +83,12 @@ public class GraalJavaScriptExecutor extends ScriptExecutor { return ScriptTypeEnum.JS; } + @Override + public Object compile(String script) throws Exception { + String wrapScript = StrUtil.format("function process(){{}} process();", script); + Context context = Context.newBuilder().allowAllAccess(true).engine(engine).build(); + context.parse(Source.create("js", wrapScript)); + return wrapScript; + } + } diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java index b0693fda4..900db68f3 100644 --- a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java +++ b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java @@ -19,12 +19,7 @@ public class JavaExecutor extends ScriptExecutor { @Override public void load(String nodeId, String script) { try{ - IScriptEvaluator se = CompilerFactoryFactory.getDefaultCompilerFactory(this.getClass().getClassLoader()).newScriptEvaluator(); - se.setTargetVersion(8); - se.setReturnType(Object.class); - se.setParameters(new String[] {"_meta"}, new Class[] {ScriptExecuteWrap.class}); - se.cook(convertScript(script)); - compiledScriptMap.put(nodeId, se); + compiledScriptMap.put(nodeId, (IScriptEvaluator) compile(script)); }catch (Exception e){ String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage()); throw new ScriptLoadException(errorMsg); @@ -52,6 +47,16 @@ public class JavaExecutor extends ScriptExecutor { return ScriptTypeEnum.JAVA; } + @Override + public Object compile(String script) throws Exception { + IScriptEvaluator se = CompilerFactoryFactory.getDefaultCompilerFactory(this.getClass().getClassLoader()).newScriptEvaluator(); + se.setTargetVersion(8); + se.setReturnType(Object.class); + se.setParameters(new String[] {"_meta"}, new Class[] {ScriptExecuteWrap.class}); + se.cook(convertScript(script)); + return se; + } + private String convertScript(String script){ //替换掉public,private,protected等修饰词 String script1 = script.replaceAll("public class", "class") diff --git a/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java b/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java index f83a4833e..a2a7604a3 100644 --- a/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java @@ -13,6 +13,8 @@ import com.yomahub.liteflow.script.exception.ScriptLoadException; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + +import javax.script.ScriptException; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -40,8 +42,7 @@ public class QLExpressScriptExecutor extends ScriptExecutor { @Override public void load(String nodeId, String script) { try { - InstructionSet instructionSet = expressRunner.getInstructionSetFromLocalCache(script); - compiledScriptMap.put(nodeId, instructionSet); + compiledScriptMap.put(nodeId, (InstructionSet) compile(script)); } catch (Exception e) { String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage()); @@ -85,4 +86,9 @@ public class QLExpressScriptExecutor extends ScriptExecutor { return ScriptTypeEnum.QLEXPRESS; } + @Override + public Object compile(String script) throws Exception { + return expressRunner.getInstructionSetFromLocalCache(script); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java new file mode 100644 index 000000000..9a6b5553e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java @@ -0,0 +1,41 @@ +package com.yomahub.liteflow.test.script.aviator.validate; + +import com.yomahub.liteflow.script.aviator.AviatorScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +@SpringBootTest(classes = ValidateAviatorScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateAviatorScriptComponentTest { + + @Test + public void testAviatorScriptComponentValidateFunction(){ + String correctScript = " use java.util.Date;\n" + + " use cn.hutool.core.date.DateUtil;\n" + + " let d = DateUtil.formatDateTime(new Date());\n" + + " println(d);\n" + + "\n" + + " a = 2;\n" + + " b = 3;\n" + + "\n" + + " setData(defaultContext, \"s1\", a*b);"; + // 语法错误 + String wrongScript = " use java.util.Date;\n" + + " use cn.hutool.core.date.DateUtil;\n" + + " lt d = DateUtil.formatDateTime(new Date());\n" + + " println(d);\n" + + "\n" + + " a = 2;\n" + + " b = 3;\n" + + "\n" + + " setData(defaultContext, \"s1\", a*b);"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java new file mode 100644 index 000000000..7a01031f6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java @@ -0,0 +1,51 @@ +package com.yomahub.liteflow.test.script.graaljs.validate; + +import com.yomahub.liteflow.script.graaljs.GraalJavaScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidateGraaljsScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateGraaljsScriptComponentTest { + @Test + public void testGraaljsScriptComponentValidateFunction(){ + String correctScript = " var a=3;\n" + + " var b=2;\n" + + " var c=1;\n" + + " var d=5;\n" + + "\n" + + " function addByArray(values) {\n" + + " var sum = 0;\n" + + " for (var i = 0; i < values.length; i++) {\n" + + " sum += values[i];\n" + + " }\n" + + " return sum;\n" + + " }\n" + + "\n" + + " var result = addByArray([a,b,c,d]);\n" + + "\n" + + " defaultContext.setData(\"s1\",parseInt(result));"; + // 语法错误 + String wrongScript = " var a=3;\n" + + " var b=2;\n" + + " var c=1;\n" + + " var d=5;\n" + + "\n" + + " fn addByArray(values) {\n" + + " var sum = 0;\n" + + " for (var i = 0; i < values.length; i++) {\n" + + " sum += values[i];\n" + + " }\n" + + " return sum;\n" + + " }\n" + + "\n" + + " var result = addByArray([a,b,c,d]);\n" + + "\n" + + " defaultContext.setData(\"s1\",parseInt(result));"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java new file mode 100644 index 000000000..912590029 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java @@ -0,0 +1,79 @@ +package com.yomahub.liteflow.test.script.groovy.validate; + +import com.yomahub.liteflow.script.groovy.GroovyScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidateGroovyScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateGroovyScriptComponentTest { + @Test + public void testGroovyScriptComponentValidateFunction(){ + String correctScript = " import cn.hutool.core.collection.ListUtil\n" + + " import cn.hutool.core.date.DateUtil\n" + + "\n" + + " import java.util.function.Consumer\n" + + " import java.util.function.Function\n" + + " import java.util.stream.Collectors\n" + + "\n" + + " def date = DateUtil.parse(\"2022-10-17 13:31:43\")\n" + + " println(date)\n" + + " defaultContext.setData(\"demoDate\", date)\n" + + "\n" + + " List list = ListUtil.toList(\"a\", \"b\", \"c\")\n" + + "\n" + + " List resultList = list.stream().map(s -> \"hello,\" + s).collect(Collectors.toList())\n" + + "\n" + + " defaultContext.setData(\"resultList\", resultList)\n" + + "\n" + + " class Student {\n" + + " int studentID\n" + + " String studentName\n" + + " }\n" + + "\n" + + " Student student = new Student()\n" + + " student.studentID = 100301\n" + + " student.studentName = \"张三\"\n" + + " defaultContext.setData(\"student\", student)\n" + + "\n" + + " def a = 3\n" + + " def b = 2\n" + + " defaultContext.setData(\"s1\", a * b)"; + // 语法错误 + String wrongScript = " import cn.hutool.core.collection.ListUtil\n" + + " import cn.hutool.core.date.DateUtil\n" + + "\n" + + " import java.util.function.Consumer\n" + + " import java.util.function.Function\n" + + " import java.util.stream.Collectors\n" + + "\n" + + " d date = DateUtil.parse(\"2022-10-17 13:31:43\")\n" + + " println(date)\n" + + " defaultContext.setData(\"demoDate\", date)\n" + + "\n" + + " List list = ListUtil.toList(\"a\", \"b\", \"c\")\n" + + "\n" + + " List resultList = list.stream().map(s -> \"hello,\" + s).collect(Collectors.toList())\n" + + "\n" + + " defaultContext.setData(\"resultList\", resultList)\n" + + "\n" + + " class Student {\n" + + " int studentID\n" + + " String studentName\n" + + " }\n" + + "\n" + + " Student student = new Student()\n" + + " student.studentID = 100301\n" + + " student.studentName = \"张三\"\n" + + " defaultContext.setData(\"student\", student)\n" + + "\n" + + " def a = 3\n" + + " def b = 2\n" + + " defaultContext.setData(\"s1\", a * b)"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java new file mode 100644 index 000000000..548d6d023 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java @@ -0,0 +1,63 @@ +package com.yomahub.liteflow.test.script.java.validate; + +import com.yomahub.liteflow.script.java.JavaExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidateJavaScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateJavaScriptComponentTest { + @Test + public void testJavaScriptComponentValidateFunction(){ + String correctScript = "import com.alibaba.fastjson2.JSON;\n" + + " import com.yomahub.liteflow.slot.DefaultContext;\n" + + " import com.yomahub.liteflow.spi.holder.ContextAwareHolder;\n" + + " import com.yomahub.liteflow.test.script.java.common.cmp.TestDomain;\n" + + " import com.yomahub.liteflow.script.body.JaninoCommonScriptBody;\n" + + " import com.yomahub.liteflow.script.ScriptExecuteWrap;\n" + + "\n" + + " public class Demo implements JaninoCommonScriptBody {\n" + + " public Void body(ScriptExecuteWrap wrap) {\n" + + " int v1 = 2;\n" + + " int v2 = 3;\n" + + " DefaultContext ctx = (DefaultContext) wrap.getCmp().getFirstContextBean();\n" + + " ctx.setData(\"s1\", v1 * v2);\n" + + "\n" + + " TestDomain domain = (TestDomain) ContextAwareHolder.loadContextAware().getBean(TestDomain.class);\n" + + " System.out.println(JSON.toJSONString(domain));\n" + + " String str = domain.sayHello(\"jack\");\n" + + " ctx.setData(\"hi\", str);\n" + + "\n" + + " return null;\n" + + " }\n" + + " }"; + // 未指定类型名错误 + String wrongScript = "import com.alibaba.fastjson2.JSON;\n" + + " import com.yomahub.liteflow.slot.DefaultContext;\n" + + " import com.yomahub.liteflow.spi.holder.ContextAwareHolder;\n" + + " import com.yomahub.liteflow.test.script.java.common.cmp.TestDomain;\n" + + " import com.yomahub.liteflow.script.body.JaninoCommonScriptBody;\n" + + " import com.yomahub.liteflow.script.ScriptExecuteWrap;\n" + + "\n" + + " public class Demo implements JaninoCommonScriptBody {\n" + + " public Void body(ScriptExecuteWrap wrap) {\n" + + " v1 = 2;\n" + + " int v2 = 3;\n" + + " DefaultContext ctx = (DefaultContext) wrap.getCmp().getFirstContextBean();\n" + + " ctx.setData(\"s1\", v1 * v2);\n" + + "\n" + + " TestDomain domain = (TestDomain) ContextAwareHolder.loadContextAware().getBean(TestDomain.class);\n" + + " System.out.println(JSON.toJSONString(domain));\n" + + " String str = domain.sayHello(\"jack\");\n" + + " ctx.setData(\"hi\", str);\n" + + "\n" + + " return null;\n" + + " }\n" + + " }"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java new file mode 100644 index 000000000..6c923ad34 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java @@ -0,0 +1,51 @@ +package com.yomahub.liteflow.test.script.javascript.validate; + +import com.yomahub.liteflow.script.javascript.JavaScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidateJavaScriptScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateJavaScriptScriptComponentTest { + @Test + public void testJavaScriptScriptComponentValidateFunction(){ + String correctScript = "var a=3;\n" + + " var b=2;\n" + + " var c=1;\n" + + " var d=5;\n" + + "\n" + + " function addByArray(values) {\n" + + " var sum = 0;\n" + + " for (var i = 0; i < values.length; i++) {\n" + + " sum += values[i];\n" + + " }\n" + + " return sum;\n" + + " }\n" + + "\n" + + " var result = addByArray([a,b,c,d]);\n" + + "\n" + + " defaultContext.setData(\"s1\",parseInt(result));"; + // 语法错误 + String wrongScript = "var a=3;\n" + + " var b=2;\n" + + " var c=1;\n" + + " var d=5;\n" + + "\n" + + " fon addByArray(values) {\n" + + " var sum = 0;\n" + + " for (var i = 0; i < values.length; i++) {\n" + + " sum += values[i];\n" + + " }\n" + + " return sum;\n" + + " }\n" + + "\n" + + " var result = addByArray([a,b,c,d]);\n" + + "\n" + + " defaultContext.setData(\"s1\",parseInt(result));"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java new file mode 100644 index 000000000..f5983e785 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java @@ -0,0 +1,37 @@ +package com.yomahub.liteflow.test.script.lua.validate; + +import com.yomahub.liteflow.script.lua.LuaScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidateLuaScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateLuaScriptComponentTest { + @Test + public void testLuaScriptComponentValidateFunction(){ + String correctScript = " local a=6\n" + + " local b=10\n" + + " if(a>5) then\n" + + " b=5\n" + + " else\n" + + " b=2\n" + + " end\n" + + " defaultContext:setData(\"s1\",a*b)\n" + + " defaultContext:setData(\"s2\",_meta:get(\"nodeId\"))"; + // 语法错误 + String wrongScript = " local a=6\n" + + " local b=10\n" + + " if(a>5) tn\n" + + " b=5\n" + + " else\n" + + " b=2\n" + + " end\n" + + " defaultContext:setData(\"s1\",a*b)\n" + + " defaultContext:setData(\"s2\",_meta:get(\"nodeId\"))"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java new file mode 100644 index 000000000..31a9792ba --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java @@ -0,0 +1,62 @@ +package com.yomahub.liteflow.test.script.multi.language.validate; + +import com.yomahub.liteflow.enums.ScriptTypeEnum; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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 java.util.HashMap; +import java.util.Map; + +@SpringBootTest(classes = ValidateMultiLanguageScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateMultiLanguageScriptComponentTest { + @Test + public void testMultiLanguageScriptComponentValidateFunction(){ + String correctGroovyScript = " class Student {\n" + + " int studentID;\n" + + " String studentName;\n" + + "\n" + + " public void setStudentID(int id){\n" + + " this.studentID = id;\n" + + " }\n" + + " }\n" + + "\n" + + " Student student = new Student()\n" + + " student.studentID = 100301\n" + + " student.studentName = \"张三\"\n" + + " defaultContext.setData(\"student\", student)\n" + + "\n" + + " def a = 3\n" + + " def b = 2\n" + + " defaultContext.setData(\"s1\", a * b)"; + String correctJavascriptScript = " var student = defaultContext.getData(\"student\");\n" + + " student.setStudentID(10032);"; + String correctPythonScript = " a = 3\n" + + " s1 = defaultContext.getData(\"s1\")\n" + + " defaultContext.setData(\"s1\",s1*a)"; + // 语法错误 缩进 + String wrongPythonScript = " a = 3\n" + + " s1 = defaultContext.getData(\"s1\")\n" + + " defaultContext.setData(\"s1\",s1*a)"; + // 在加载多脚本时使用默认验证方法会错误 + Assertions.assertFalse(ScriptValidator.validate(correctGroovyScript)); + + // 多语言脚本验证 正确样例 + Map correctData = new HashMap<>(); + correctData.put(correctGroovyScript, ScriptTypeEnum.GROOVY); + correctData.put(correctJavascriptScript, ScriptTypeEnum.JS); + correctData.put(correctPythonScript, ScriptTypeEnum.PYTHON); + Assertions.assertTrue(ScriptValidator.validate(correctData)); + + // 多语言脚本验证 错误样例 + Map wrongData = new HashMap<>(); + wrongData.put(correctGroovyScript, ScriptTypeEnum.GROOVY); + wrongData.put(correctJavascriptScript, ScriptTypeEnum.JS); + wrongData.put(wrongPythonScript, ScriptTypeEnum.PYTHON); + Assertions.assertFalse(ScriptValidator.validate(wrongData)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java new file mode 100644 index 000000000..27eb00eb2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java @@ -0,0 +1,53 @@ +package com.yomahub.liteflow.test.script.python.validate; + +import com.yomahub.liteflow.script.python.PythonScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidatePythonScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidatePythonScriptComponentTest { + @Test + public void testPythonScriptComponentValidateFunction(){ + String correctScript = " import json\n" + + "\n" + + " x='{\"name\": \"杰克\", \"age\": 75, \"nationality\": \"China\"}'\n" + + " jsonData=json.loads(x)\n" + + " name=jsonData['name']\n" + + " defaultContext.setData(\"name\", name.decode('utf-8'))\n" + + "\n" + + "\n" + + " a=6\n" + + " b=10\n" + + " if a>5:\n" + + " b=5\n" + + " print '你好'.decode('UTF-8')\n" + + " else:\n" + + " print 'hi'\n" + + " defaultContext.setData(\"s1\",a*b)\n" + + " defaultContext.setData(\"td\", td.sayHi(\"jack\"))"; + // 语法错误 缩进 + String wrongScript = " import json\n" + + "\n" + + " x='{\"name\": \"杰克\", \"age\": 75, \"nationality\": \"China\"}'\n" + + " jsonData=json.loads(x)\n" + + " name=jsonData['name']\n" + + " defaultContext.setData(\"name\", name.decode('utf-8'))\n" + + "\n" + + "\n" + + " a=6\n" + + " b=10\n" + + " if a>5:\n" + + " b=5\n" + + " print '你好'.decode('UTF-8')\n" + + " else:\n" + + " print 'hi'\n" + + " defaultContext.setData(\"s1\",a*b)\n" + + " defaultContext.setData(\"td\", td.sayHi(\"jack\"))"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java new file mode 100644 index 000000000..44a5f63ab --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java @@ -0,0 +1,31 @@ +package com.yomahub.liteflow.test.script.qlexpress.validate; + +import com.yomahub.liteflow.script.qlexpress.QLExpressScriptExecutor; +import com.yomahub.liteflow.script.validator.ScriptValidator; +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; + +@SpringBootTest(classes = ValidateQLExpressScriptComponentTest.class) +@EnableAutoConfiguration +public class ValidateQLExpressScriptComponentTest { + @Test + public void testQLExpressScriptComponentValidateFunction(){ + String correctScript = " count = defaultContext.getData(\"count\");\n" + + " if(count > 100){\n" + + " return \"a\";\n" + + " }else{\n" + + " return \"b\";\n" + + " }"; + // 语法错误 + String wrongScript = " count = defaultContext.getData(\"count\");\n" + + " if(count > 100){\n" + + " return \"a\";\n" + + " }el{\n" + + " return \"b\";\n" + + " }"; + Assertions.assertTrue(ScriptValidator.validate(correctScript)); + Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + } +} From 82348cb926f69f916beb01bf0dfe09b857c5bf00 Mon Sep 17 00:00:00 2001 From: rain <672378783@qq.com> Date: Fri, 26 Jan 2024 14:31:36 +0800 Subject: [PATCH 21/49] =?UTF-8?q?=E5=AF=B9EL=E8=AF=AD=E5=8F=A5=E9=87=8C?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E9=87=8D=E8=AF=95=E6=AC=A1=E6=95=B0=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=BF=9B=E8=A1=8C=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/annotation/LiteflowRetry.java | 1 + .../builder/el/LiteFlowChainELBuilder.java | 2 +- ...yTimesOperator.java => RetryOperator.java} | 13 ++-- .../liteflow/common/ChainConstant.java | 2 +- .../element/condition/RetryCondition.java | 19 +++++- .../RetryELDeclMultiSpringbootTest.java} | 26 +++++--- .../{retryTimes => retry}/cmp/CmpConfig.java | 15 +++-- .../resources/retry/application.properties | 1 + .../src/test/resources/retry/flow.el.xml | 51 ++++++++++++++++ .../retryTimes/application.properties | 1 - .../src/test/resources/retryTimes/flow.el.xml | 43 ------------- .../retry/RetryELDeclSpringbootTest.java} | 26 +++++--- .../test/{retryTimes => retry}/cmp/ACmp.java | 2 +- .../test/{retryTimes => retry}/cmp/BCmp.java | 2 +- .../liteflow/test/retry}/cmp/CCmp.java | 2 +- .../liteflow/test/retry}/cmp/DCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/FCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/ICmp.java | 2 +- .../yomahub/liteflow/test/retry/cmp/MCmp.java | 18 ++++++ .../test/{retryTimes => retry}/cmp/NCmp.java | 2 +- .../resources/retry/application.properties | 1 + .../src/test/resources/retry/flow.el.xml | 51 ++++++++++++++++ .../retryTimes/application.properties | 1 - .../src/test/resources/retryTimes/flow.el.xml | 43 ------------- .../RetryTest.java} | 21 +++++-- .../test/{retryTimes => retry}/cmp/ACmp.java | 2 +- .../test/{retryTimes => retry}/cmp/BCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/CCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/DCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/FCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/ICmp.java | 2 +- .../yomahub/liteflow/test/retry/cmp/MCmp.java | 16 +++++ .../test/{retryTimes => retry}/cmp/NCmp.java | 2 +- .../src/test/resources/retry/flow.el.xml | 61 +++++++++++++++++++ .../src/test/resources/retryTimes/flow.el.xml | 52 ---------------- .../RetrySpringbootTest.java} | 21 +++++-- .../test/{retryTimes => retry}/cmp/ACmp.java | 2 +- .../test/{retryTimes => retry}/cmp/BCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/CCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/DCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/FCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/ICmp.java | 2 +- .../yomahub/liteflow/test/retry/cmp/MCmp.java | 18 ++++++ .../test/{retryTimes => retry}/cmp/NCmp.java | 2 +- .../resources/retry/application.properties | 1 + .../src/test/resources/retry/flow.el.xml | 51 ++++++++++++++++ .../retryTimes/application.properties | 1 - .../src/test/resources/retryTimes/flow.el.xml | 43 ------------- .../test/retry/RetrySpringbootTest.java} | 25 ++++++-- .../test/{retryTimes => retry}/cmp/ACmp.java | 2 +- .../test/{retryTimes => retry}/cmp/BCmp.java | 3 +- .../liteflow/test/retry}/cmp/CCmp.java | 2 +- .../liteflow/test/retry}/cmp/DCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/FCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/ICmp.java | 2 +- .../yomahub/liteflow/test/retry/cmp/MCmp.java | 18 ++++++ .../test/{retryTimes => retry}/cmp/NCmp.java | 2 +- .../resources/retry/application.properties | 1 + .../src/test/resources/retry/flow.el.xml | 50 +++++++++++++++ .../retryTimes/application.properties | 1 - .../src/test/resources/retryTimes/flow.el.xml | 42 ------------- .../RetrySpringTest.java} | 21 +++++-- .../test/{retryTimes => retry}/cmp/ACmp.java | 2 +- .../test/{retryTimes => retry}/cmp/BCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/CCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/DCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/FCmp.java | 2 +- .../test/{retryTimes => retry}/cmp/ICmp.java | 2 +- .../yomahub/liteflow/test/retry/cmp/MCmp.java | 18 ++++++ .../test/{retryTimes => retry}/cmp/NCmp.java | 2 +- .../{retryTimes => retry}/application.xml | 4 +- .../src/test/resources/retry/flow.el.xml | 51 ++++++++++++++++ .../src/test/resources/retryTimes/flow.el.xml | 43 ------------- 73 files changed, 592 insertions(+), 352 deletions(-) rename liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/{RetryTimesOperator.java => RetryOperator.java} (66%) rename liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes/RetryTimesELDeclMultiSpringbootTest.java => retry/RetryELDeclMultiSpringbootTest.java} (82%) rename liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/CmpConfig.java (86%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml rename liteflow-testcase-el/{liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java => liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclSpringbootTest.java} (81%) rename liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ACmp.java (84%) rename liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/BCmp.java (88%) rename liteflow-testcase-el/{liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes => liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry}/cmp/CCmp.java (89%) rename liteflow-testcase-el/{liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes => liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry}/cmp/DCmp.java (89%) rename liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/FCmp.java (89%) rename liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ICmp.java (91%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java rename liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/NCmp.java (89%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes/RetryTimesTest.java => retry/RetryTest.java} (84%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ACmp.java (79%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/BCmp.java (85%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/CCmp.java (86%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/DCmp.java (87%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/FCmp.java (86%) rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ICmp.java (90%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java rename liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/NCmp.java (87%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retry/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes/RetryTimesSpringbootTest.java => retry/RetrySpringbootTest.java} (84%) rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ACmp.java (83%) rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/BCmp.java (87%) rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/CCmp.java (88%) rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/DCmp.java (88%) rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/FCmp.java (88%) rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ICmp.java (91%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java rename liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/NCmp.java (89%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml rename liteflow-testcase-el/{liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java => liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java} (81%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ACmp.java (84%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/BCmp.java (78%) rename liteflow-testcase-el/{liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes => liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry}/cmp/CCmp.java (89%) rename liteflow-testcase-el/{liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes => liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry}/cmp/DCmp.java (89%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/FCmp.java (89%) rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ICmp.java (91%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java rename liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/NCmp.java (89%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes/RetryTimesSpringTest.java => retry/RetrySpringTest.java} (84%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ACmp.java (83%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/BCmp.java (87%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/CCmp.java (88%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/DCmp.java (88%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/FCmp.java (88%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/ICmp.java (91%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/{retryTimes => retry}/cmp/NCmp.java (89%) rename liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/{retryTimes => retry}/application.xml (91%) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/flow.el.xml delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java index 2af9f5dae..34ad6ac8f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java @@ -12,6 +12,7 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited +@Deprecated public @interface LiteflowRetry { @LFAliasFor("retry") 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 f749aee94..6de02fb00 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 @@ -92,7 +92,7 @@ public class LiteFlowChainELBuilder { EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.MAX_WAIT_SECONDS, Object.class, new MaxWaitSecondsOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.MAX_WAIT_MILLISECONDS, Object.class, new MaxWaitMillisecondsOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.PARALLEL, Object.class, new ParallelOperator()); - EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.RETRY_TIMES, Object.class, new RetryTimesOperator()); + EXPRESS_RUNNER.addFunctionAndClassMethod(ChainConstant.RETRY, Object.class, new RetryOperator()); } public static LiteFlowChainELBuilder createChain() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java similarity index 66% rename from liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java rename to liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java index 72ac3dded..2e8b5a4a1 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryTimesOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java @@ -2,12 +2,9 @@ package com.yomahub.liteflow.builder.el.operator; import com.yomahub.liteflow.builder.el.operator.base.BaseOperator; import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; -import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.RetryCondition; -import com.yomahub.liteflow.flow.element.condition.ThenCondition; -import com.yomahub.liteflow.flow.element.condition.WhileCondition; /** * @@ -15,7 +12,7 @@ import com.yomahub.liteflow.flow.element.condition.WhileCondition; * @since 2.11.5 * */ -public class RetryTimesOperator extends BaseOperator { +public class RetryOperator extends BaseOperator { @Override public Condition build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeGtTwo(objects); @@ -24,6 +21,14 @@ public class RetryTimesOperator extends BaseOperator { RetryCondition retryCondition = new RetryCondition(); retryCondition.addExecutable(executable); retryCondition.setRetryTimes(retryTimes); + if(objects.length > 2) { + Class[] forExceptions = new Class[objects.length - 2]; + for(int i = 2; i < objects.length; i ++) { + String className = OperatorHelper.convert(objects[i], String.class); + forExceptions[i - 2] = Class.forName(className); + } + retryCondition.setRetryForExceptions(forExceptions); + } return retryCondition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java b/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java index 977a9371a..c90600165 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java @@ -94,6 +94,6 @@ public interface ChainConstant { String EXTENDS = "extends"; - String RETRY_TIMES = "retryTimes"; + String RETRY = "retry"; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java index 6f4bbaf99..91c1d14f3 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java @@ -3,7 +3,6 @@ package com.yomahub.liteflow.flow.element.condition; import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.exception.ChainEndException; -import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Executable; @@ -12,12 +11,25 @@ import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.slot.DataBus; +import java.util.Arrays; +import java.util.List; + public class RetryCondition extends ThenCondition{ private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); private Integer retryTimes; + private Class[] retryForExceptions = new Class[] { Exception.class }; + + public Class[] getRetryForExceptions() { + return retryForExceptions; + } + + public void setRetryForExceptions(Class[] retryForExceptions) { + this.retryForExceptions = retryForExceptions; + } + public Integer getRetryTimes() { return retryTimes; } @@ -29,6 +41,7 @@ public class RetryCondition extends ThenCondition{ @Override public void executeCondition(Integer slotIndex) throws Exception { int retryTimes = this.getRetryTimes() < 0 ? 0 : this.getRetryTimes(); + List> forExceptions = Arrays.asList(this.getRetryForExceptions()); for (int i = 0; i <= retryTimes; i ++) { try { if(i == 0) { @@ -40,7 +53,9 @@ public class RetryCondition extends ThenCondition{ } catch (ChainEndException e) { throw e; } catch (Exception e) { - if(i >= retryTimes) { + // 判断抛出的异常是不是指定异常的子类 + boolean flag = forExceptions.stream().anyMatch(clazz -> clazz.isAssignableFrom(e.getClass())); + if(!flag || i >= retryTimes) { if(retryTimes > 0) { String retryFailMsg = StrFormatter.format("retry fail when executing the chain[{}] because {} occurs {}.", this.getCurrChainId(), this.getCurrentExecutableId(), e); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclMultiSpringbootTest.java similarity index 82% rename from liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclMultiSpringbootTest.java index 2ed4fe38e..664816a7d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclMultiSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclMultiSpringbootTest.java @@ -1,9 +1,8 @@ -package com.yomahub.liteflow.test.retryTimes; +package com.yomahub.liteflow.test.retry; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.test.BaseTest; -import com.yomahub.liteflow.test.rollback.RollbackELDeclMultiSpringbootTest; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,11 +16,11 @@ import javax.annotation.Resource; @ExtendWith(SpringExtension.class) -@TestPropertySource(value = "classpath:/retryTimes/application.properties") -@SpringBootTest(classes = RetryTimesELDeclMultiSpringbootTest.class) +@TestPropertySource(value = "classpath:/retry/application.properties") +@SpringBootTest(classes = RetryELDeclMultiSpringbootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.retryTimes.cmp" }) -public class RetryTimesELDeclMultiSpringbootTest extends BaseTest { +@ComponentScan({"com.yomahub.liteflow.test.retry.cmp"}) +public class RetryELDeclMultiSpringbootTest extends BaseTest { @Resource private FlowExecutor flowExecutor; @@ -46,7 +45,6 @@ public class RetryTimesELDeclMultiSpringbootTest extends BaseTest { public void testNode() throws Exception { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); Assertions.assertTrue(response.isSuccess()); - Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); } // FOR测试 @@ -105,4 +103,18 @@ public class RetryTimesELDeclMultiSpringbootTest extends BaseTest { Assertions.assertEquals("a==>b", response.getExecuteStepStr()); } + // 指定异常重试测试1 + @Test + public void testException1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // 指定异常重试测试2 + @Test + public void testException2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain12", "arg"); + Assertions.assertFalse(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java similarity index 86% rename from liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java index da8c2cb99..996ace9ee 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java @@ -1,13 +1,12 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import cn.hutool.core.collection.ListUtil; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; -import com.yomahub.liteflow.annotation.LiteflowRetry; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.exception.ELParseException; import java.util.Iterator; import java.util.List; @@ -21,7 +20,7 @@ public class CmpConfig { int flagf = 0; int flagi = 0; int flagn = 0; - int flagw = 0; + int flagm = 0; @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "a") public void processA(NodeComponent bindCmp) { @@ -70,6 +69,14 @@ public class CmpConfig { } } + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "m") + public void processM(NodeComponent bindCmp) { + flagm ++; + System.out.println("MCmp executed!"); + if(flagm < 4) throw new ELParseException("MCmp error!"); + else flagm = 0; + } + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "n", nodeType = NodeTypeEnum.WHILE) public boolean processN(NodeComponent bindCmp) { flagn ++; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/application.properties new file mode 100644 index 000000000..4323c74b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retry/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/flow.el.xml new file mode 100644 index 000000000..c567d84d5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retry/flow.el.xml @@ -0,0 +1,51 @@ + + + + THEN( a, b ).retry(3); + + + + WHEN( a, b ).retry(3); + + + + THEN( a, b.retry(3) ); + + + + FOR(c).DO(a).retry(3); + + + + SWITCH(d).TO(a).retry(3); + + + + IF(f, a).retry(3); + + + + WHILE(n).DO(a).retry(3); + + + + ITERATOR(i).DO(a).retry(3); + + + + THEN( a, b ).retry(1); + + + + THEN( a, FINALLY(b, a).retry(3) ); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.ELParseException", "com.yomahub.liteflow.exception.FlowSystemException"); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.AndOrConditionException"); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties deleted file mode 100644 index ecdb08bea..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/application.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml deleted file mode 100644 index 775e7a742..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/resources/retryTimes/flow.el.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - THEN( a, b ).retryTimes(3); - - - - WHEN( a, b ).retryTimes(3); - - - - THEN( a, b.retryTimes(3) ); - - - - FOR(c).DO(a).retryTimes(3); - - - - SWITCH(d).TO(a).retryTimes(3); - - - - IF(f, a).retryTimes(3); - - - - WHILE(n).DO(a).retryTimes(3); - - - - ITERATOR(i).DO(a).retryTimes(3); - - - - THEN( a, b ).retryTimes(1); - - - - THEN( a, FINALLY(b, a).retryTimes(3) ); - - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclSpringbootTest.java similarity index 81% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclSpringbootTest.java index 24d30a669..486aaddf6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetryELDeclSpringbootTest.java @@ -1,8 +1,7 @@ -package com.yomahub.liteflow.test.retryTimes; +package com.yomahub.liteflow.test.retry; 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; @@ -14,11 +13,11 @@ import org.springframework.test.context.TestPropertySource; import javax.annotation.Resource; -@TestPropertySource(value = "classpath:/retryTimes/application.properties") -@SpringBootTest(classes = RetryTimesSpringbootTest.class) +@TestPropertySource(value = "classpath:/retry/application.properties") +@SpringBootTest(classes = RetryELDeclSpringbootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.retryTimes.cmp" }) -public class RetryTimesSpringbootTest extends BaseTest { +@ComponentScan({"com.yomahub.liteflow.test.retry.cmp"}) +public class RetryELDeclSpringbootTest extends BaseTest { @Resource private FlowExecutor flowExecutor; @@ -43,7 +42,6 @@ public class RetryTimesSpringbootTest extends BaseTest { public void testNode() throws Exception { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); Assertions.assertTrue(response.isSuccess()); - Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); } // FOR测试 @@ -102,4 +100,18 @@ public class RetryTimesSpringbootTest extends BaseTest { Assertions.assertEquals("a==>b", response.getExecuteStepStr()); } + // 指定异常重试测试1 + @Test + public void testException1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // 指定异常重试测试2 + @Test + public void testException2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain12", "arg"); + Assertions.assertFalse(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java similarity index 84% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java index 46e99dc1f..98bcc2379 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java index 5a02501b3..991f5e68a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java index f6a1014ee..ecf7f1a25 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeForComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java index 319c98cd5..34e9bb5b7 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeSwitchComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index f9764757e..1bc95f542 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeIfComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java similarity index 91% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java index 3341869d8..9ccd8457e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import cn.hutool.core.collection.ListUtil; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java new file mode 100644 index 000000000..0498cee17 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java @@ -0,0 +1,18 @@ +package com.yomahub.liteflow.test.retry.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.exception.ELParseException; + +@LiteflowComponent("m") +public class MCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() throws Exception { + flag ++; + System.out.println("MCmp executed!"); + if(flag < 4) throw new ELParseException("MCmp error!"); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index d4e371647..ac0434c95 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeWhileComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/application.properties new file mode 100644 index 000000000..4323c74b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retry/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/flow.el.xml new file mode 100644 index 000000000..c567d84d5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retry/flow.el.xml @@ -0,0 +1,51 @@ + + + + THEN( a, b ).retry(3); + + + + WHEN( a, b ).retry(3); + + + + THEN( a, b.retry(3) ); + + + + FOR(c).DO(a).retry(3); + + + + SWITCH(d).TO(a).retry(3); + + + + IF(f, a).retry(3); + + + + WHILE(n).DO(a).retry(3); + + + + ITERATOR(i).DO(a).retry(3); + + + + THEN( a, b ).retry(1); + + + + THEN( a, FINALLY(b, a).retry(3) ); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.ELParseException", "com.yomahub.liteflow.exception.FlowSystemException"); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.AndOrConditionException"); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties deleted file mode 100644 index ecdb08bea..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/application.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml deleted file mode 100644 index 775e7a742..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/retryTimes/flow.el.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - THEN( a, b ).retryTimes(3); - - - - WHEN( a, b ).retryTimes(3); - - - - THEN( a, b.retryTimes(3) ); - - - - FOR(c).DO(a).retryTimes(3); - - - - SWITCH(d).TO(a).retryTimes(3); - - - - IF(f, a).retryTimes(3); - - - - WHILE(n).DO(a).retryTimes(3); - - - - ITERATOR(i).DO(a).retryTimes(3); - - - - THEN( a, b ).retryTimes(1); - - - - THEN( a, FINALLY(b, a).retryTimes(3) ); - - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/RetryTest.java similarity index 84% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/RetryTest.java index b3dec4514..19cde5ca8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/RetryTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes; +package com.yomahub.liteflow.test.retry; import com.yomahub.liteflow.core.FlowExecutor; @@ -10,14 +10,14 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -public class RetryTimesTest extends BaseTest { +public class RetryTest extends BaseTest { private static FlowExecutor flowExecutor; @BeforeAll public static void init() { LiteflowConfig config = new LiteflowConfig(); - config.setRuleSource("retryTimes/flow.el.xml"); + config.setRuleSource("retry/flow.el.xml"); flowExecutor = FlowExecutorHolder.loadInstance(config); } @@ -41,7 +41,6 @@ public class RetryTimesTest extends BaseTest { public void testNode() throws Exception { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); Assertions.assertTrue(response.isSuccess()); - Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); } // FOR测试 @@ -100,4 +99,18 @@ public class RetryTimesTest extends BaseTest { Assertions.assertEquals("a==>b", response.getExecuteStepStr()); } + // 指定异常重试测试1 + @Test + public void testException1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // 指定异常重试测试2 + @Test + public void testException2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain12", "arg"); + Assertions.assertFalse(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java similarity index 79% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java index 23ed69a7a..689fe29f6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java similarity index 85% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java index d52cfdb2d..1c5ecbf14 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java similarity index 86% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java index 9a39cb349..cad5acb41 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeForComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java similarity index 87% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java index e88942178..b845c6008 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeSwitchComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java similarity index 86% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index bd5601bbb..6135b9444 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeIfComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java similarity index 90% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java index 058bb3c4e..8fbc1c767 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import cn.hutool.core.collection.ListUtil; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java new file mode 100644 index 000000000..9dd76d1bd --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java @@ -0,0 +1,16 @@ +package com.yomahub.liteflow.test.retry.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.exception.ELParseException; + +public class MCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() throws Exception { + flag ++; + System.out.println("MCmp executed!"); + if(flag < 4) throw new ELParseException("MCmp error!"); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java similarity index 87% rename from liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index 68409ab83..709dce3a0 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeWhileComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retry/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retry/flow.el.xml new file mode 100644 index 000000000..175044312 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retry/flow.el.xml @@ -0,0 +1,61 @@ + + + + + + + + + + + + + + THEN( a, b ).retry(3); + + + + WHEN( a, b ).retry(3); + + + + THEN( a, b.retry(3) ); + + + + FOR(c).DO(a).retry(3); + + + + SWITCH(d).TO(a).retry(3); + + + + IF(f, a).retry(3); + + + + WHILE(n).DO(a).retry(3); + + + + ITERATOR(i).DO(a).retry(3); + + + + THEN( a, b ).retry(1); + + + + THEN( a, FINALLY(b, a).retry(3) ); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.ELParseException", "com.yomahub.liteflow.exception.FlowSystemException"); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.AndOrConditionException"); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml deleted file mode 100644 index 685f6ef27..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/retryTimes/flow.el.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - THEN( a, b ).retryTimes(3); - - - - WHEN( a, b ).retryTimes(3); - - - - THEN( a, b.retryTimes(3) ); - - - - FOR(c).DO(a).retryTimes(3); - - - - SWITCH(d).TO(a).retryTimes(3); - - - - IF(f, a).retryTimes(3); - - - - WHILE(n).DO(a).retryTimes(3); - - - - ITERATOR(i).DO(a).retryTimes(3); - - - - THEN( a, b ).retryTimes(1); - - - - THEN( a, FINALLY(b, a).retryTimes(3) ); - - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java similarity index 84% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java index 79b92c2b3..ed5371230 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes; +package com.yomahub.liteflow.test.retry; import com.yomahub.liteflow.core.FlowExecutor; @@ -12,8 +12,8 @@ import org.noear.solon.test.SolonJUnit5Extension; import org.noear.solon.test.annotation.TestPropertySource; @ExtendWith(SolonJUnit5Extension.class) -@TestPropertySource("classpath:/retryTimes/application.properties") -public class RetryTimesSpringbootTest extends BaseTest { +@TestPropertySource("classpath:/retry/application.properties") +public class RetrySpringbootTest extends BaseTest { @Inject private FlowExecutor flowExecutor; @@ -38,7 +38,6 @@ public class RetryTimesSpringbootTest extends BaseTest { public void testNode() throws Exception { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); Assertions.assertTrue(response.isSuccess()); - Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); } // FOR测试 @@ -97,4 +96,18 @@ public class RetryTimesSpringbootTest extends BaseTest { Assertions.assertEquals("a==>b", response.getExecuteStepStr()); } + // 指定异常重试测试1 + @Test + public void testException1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // 指定异常重试测试2 + @Test + public void testException2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain12", "arg"); + Assertions.assertFalse(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java similarity index 83% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java index 9c5531a86..795d8247e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeComponent; import org.noear.solon.annotation.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java similarity index 87% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java index b4890b4ef..0eb4b1573 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeComponent; import org.noear.solon.annotation.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java index 069acb496..9d135e74d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeForComponent; import org.noear.solon.annotation.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java index ccbd72a3e..7848456db 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeSwitchComponent; import org.noear.solon.annotation.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index 5d13709bb..54df152d5 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeIfComponent; import org.noear.solon.annotation.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java similarity index 91% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java index 922ace500..a711d5b4f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import cn.hutool.core.collection.ListUtil; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java new file mode 100644 index 000000000..37e1d9f35 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java @@ -0,0 +1,18 @@ +package com.yomahub.liteflow.test.retry.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.exception.ELParseException; +import org.noear.solon.annotation.Component; + +@Component("m") +public class MCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() throws Exception { + flag ++; + System.out.println("MCmp executed!"); + if(flag < 4) throw new ELParseException("MCmp error!"); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index e6b27d11f..5605c729f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeWhileComponent; import org.noear.solon.annotation.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/application.properties b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/application.properties new file mode 100644 index 000000000..4323c74b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retry/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/flow.el.xml new file mode 100644 index 000000000..c567d84d5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retry/flow.el.xml @@ -0,0 +1,51 @@ + + + + THEN( a, b ).retry(3); + + + + WHEN( a, b ).retry(3); + + + + THEN( a, b.retry(3) ); + + + + FOR(c).DO(a).retry(3); + + + + SWITCH(d).TO(a).retry(3); + + + + IF(f, a).retry(3); + + + + WHILE(n).DO(a).retry(3); + + + + ITERATOR(i).DO(a).retry(3); + + + + THEN( a, b ).retry(1); + + + + THEN( a, FINALLY(b, a).retry(3) ); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.ELParseException", "com.yomahub.liteflow.exception.FlowSystemException"); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.AndOrConditionException"); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties deleted file mode 100644 index ecdb08bea..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/application.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml deleted file mode 100644 index 775e7a742..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/resources/retryTimes/flow.el.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - THEN( a, b ).retryTimes(3); - - - - WHEN( a, b ).retryTimes(3); - - - - THEN( a, b.retryTimes(3) ); - - - - FOR(c).DO(a).retryTimes(3); - - - - SWITCH(d).TO(a).retryTimes(3); - - - - IF(f, a).retryTimes(3); - - - - WHILE(n).DO(a).retryTimes(3); - - - - ITERATOR(i).DO(a).retryTimes(3); - - - - THEN( a, b ).retryTimes(1); - - - - THEN( a, FINALLY(b, a).retryTimes(3) ); - - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java similarity index 81% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java index 9a65758dc..da8fa7f5e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesELDeclSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringbootTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes; +package com.yomahub.liteflow.test.retry; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.flow.LiteflowResponse; @@ -13,11 +13,11 @@ import org.springframework.test.context.TestPropertySource; import javax.annotation.Resource; -@TestPropertySource(value = "classpath:/retryTimes/application.properties") -@SpringBootTest(classes = RetryTimesELDeclSpringbootTest.class) +@TestPropertySource(value = "classpath:/retry/application.properties") +@SpringBootTest(classes = RetrySpringbootTest.class) @EnableAutoConfiguration -@ComponentScan({ "com.yomahub.liteflow.test.retryTimes.cmp" }) -public class RetryTimesELDeclSpringbootTest extends BaseTest { +@ComponentScan({"com.yomahub.liteflow.test.retry.cmp"}) +public class RetrySpringbootTest extends BaseTest { @Resource private FlowExecutor flowExecutor; @@ -42,7 +42,6 @@ public class RetryTimesELDeclSpringbootTest extends BaseTest { public void testNode() throws Exception { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); Assertions.assertTrue(response.isSuccess()); - Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); } // FOR测试 @@ -101,4 +100,18 @@ public class RetryTimesELDeclSpringbootTest extends BaseTest { Assertions.assertEquals("a==>b", response.getExecuteStepStr()); } + // 指定异常重试测试1 + @Test + public void testException1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // 指定异常重试测试2 + @Test + public void testException2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain12", "arg"); + Assertions.assertFalse(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java similarity index 84% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java index 46e99dc1f..98bcc2379 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java similarity index 78% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java index e5ab69d42..d622bed92 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java @@ -1,7 +1,6 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.annotation.LiteflowRetry; import com.yomahub.liteflow.core.NodeComponent; @LiteflowComponent("b") diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java index f6a1014ee..ecf7f1a25 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeForComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java index 319c98cd5..34e9bb5b7 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeSwitchComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index f9764757e..1bc95f542 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeIfComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java similarity index 91% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java index 3341869d8..9ccd8457e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import cn.hutool.core.collection.ListUtil; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java new file mode 100644 index 000000000..0498cee17 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java @@ -0,0 +1,18 @@ +package com.yomahub.liteflow.test.retry.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.exception.ELParseException; + +@LiteflowComponent("m") +public class MCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() throws Exception { + flag ++; + System.out.println("MCmp executed!"); + if(flag < 4) throw new ELParseException("MCmp error!"); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index d4e371647..ac0434c95 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.core.NodeWhileComponent; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/application.properties new file mode 100644 index 000000000..4323c74b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=retry/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/flow.el.xml new file mode 100644 index 000000000..6e3410c57 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retry/flow.el.xml @@ -0,0 +1,50 @@ + + + + THEN( a, b ).retry(3); + + + + WHEN( a, b ).retry(3); + + + + THEN( a, b.retry(3) ); + + + + FOR(c).DO(a).retry(3); + + + + SWITCH(d).TO(a).retry(3); + + + + IF(f, a).retry(3); + + + + WHILE(n).DO(a).retry(3); + + + + ITERATOR(i).DO(a).retry(3); + + + + THEN( a, b ).retry(1); + + + + THEN( a, FINALLY(b, a).retry(3) ); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.ELParseException", "com.yomahub.liteflow.exception.FlowSystemException"); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.AndOrConditionException"); + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties deleted file mode 100644 index ecdb08bea..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/application.properties +++ /dev/null @@ -1 +0,0 @@ -liteflow.rule-source=retryTimes/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml deleted file mode 100644 index b12f5eced..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/retryTimes/flow.el.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - THEN( a, b ).retryTimes(3); - - - - WHEN( a, b ).retryTimes(3); - - - - THEN( a, b.retryTimes(3) ); - - - - FOR(c).DO(a).retryTimes(3); - - - - SWITCH(d).TO(a).retryTimes(3); - - - - IF(f, a).retryTimes(3); - - - - WHILE(n).DO(a).retryTimes(3); - - - - ITERATOR(i).DO(a).retryTimes(3); - - - - THEN( a, b ).retryTimes(1); - - - - THEN( a, FINALLY(b, a).retryTimes(3) ); - - \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringTest.java similarity index 84% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringTest.java index 7026672e5..be03cb224 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/RetryTimesSpringTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/RetrySpringTest.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes; +package com.yomahub.liteflow.test.retry; import com.yomahub.liteflow.core.FlowExecutor; import com.yomahub.liteflow.flow.LiteflowResponse; @@ -13,8 +13,8 @@ import javax.annotation.Resource; @ExtendWith(SpringExtension.class) -@ContextConfiguration("classpath:/retryTimes/application.xml") -public class RetryTimesSpringTest extends BaseTest { +@ContextConfiguration("classpath:/retry/application.xml") +public class RetrySpringTest extends BaseTest { @Resource private FlowExecutor flowExecutor; @@ -39,7 +39,6 @@ public class RetryTimesSpringTest extends BaseTest { public void testNode() throws Exception { LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); Assertions.assertTrue(response.isSuccess()); - Assertions.assertEquals("a==>b==>b==>b==>b", response.getExecuteStepStr()); } // FOR测试 @@ -98,4 +97,18 @@ public class RetryTimesSpringTest extends BaseTest { Assertions.assertEquals("a==>b", response.getExecuteStepStr()); } + // 指定异常重试测试1 + @Test + public void testException1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + + // 指定异常重试测试2 + @Test + public void testException2() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain12", "arg"); + Assertions.assertFalse(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java similarity index 83% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java index 0dd4114a0..e56306412 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ACmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/ACmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeComponent; import org.springframework.stereotype.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java similarity index 87% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java index a50952f53..85898c803 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/BCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeComponent; import org.springframework.stereotype.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java index 51949af98..c3ed52c34 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/CCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeForComponent; import org.springframework.stereotype.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java index ee453a2ab..236546f45 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/DCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/DCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeSwitchComponent; import org.springframework.stereotype.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java similarity index 88% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index d41ed62c9..ee942ea6c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeIfComponent; import org.springframework.stereotype.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java similarity index 91% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java index e936cc096..5c29b8d15 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/ICmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/ICmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import cn.hutool.core.collection.ListUtil; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java new file mode 100644 index 000000000..cf7755b06 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/MCmp.java @@ -0,0 +1,18 @@ +package com.yomahub.liteflow.test.retry.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.exception.ELParseException; +import org.springframework.stereotype.Component; + +@Component("m") +public class MCmp extends NodeComponent { + int flag = 0; + + @Override + public void process() throws Exception { + flag ++; + System.out.println("MCmp executed!"); + if(flag < 4) throw new ELParseException("MCmp error!"); + else flag = 0; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java similarity index 89% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index 5bb3b5865..ff24b004d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retryTimes/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,4 +1,4 @@ -package com.yomahub.liteflow.test.retryTimes.cmp; +package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.core.NodeWhileComponent; import org.springframework.stereotype.Component; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/application.xml similarity index 91% rename from liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml rename to liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/application.xml index c1d4af03e..441929a5c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/application.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/application.xml @@ -7,14 +7,14 @@ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/flow.el.xml new file mode 100644 index 000000000..c567d84d5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retry/flow.el.xml @@ -0,0 +1,51 @@ + + + + THEN( a, b ).retry(3); + + + + WHEN( a, b ).retry(3); + + + + THEN( a, b.retry(3) ); + + + + FOR(c).DO(a).retry(3); + + + + SWITCH(d).TO(a).retry(3); + + + + IF(f, a).retry(3); + + + + WHILE(n).DO(a).retry(3); + + + + ITERATOR(i).DO(a).retry(3); + + + + THEN( a, b ).retry(1); + + + + THEN( a, FINALLY(b, a).retry(3) ); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.ELParseException", "com.yomahub.liteflow.exception.FlowSystemException"); + + + + THEN( a, m ).retry(3, "com.yomahub.liteflow.exception.AndOrConditionException"); + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml deleted file mode 100644 index 775e7a742..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/retryTimes/flow.el.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - THEN( a, b ).retryTimes(3); - - - - WHEN( a, b ).retryTimes(3); - - - - THEN( a, b.retryTimes(3) ); - - - - FOR(c).DO(a).retryTimes(3); - - - - SWITCH(d).TO(a).retryTimes(3); - - - - IF(f, a).retryTimes(3); - - - - WHILE(n).DO(a).retryTimes(3); - - - - ITERATOR(i).DO(a).retryTimes(3); - - - - THEN( a, b ).retryTimes(1); - - - - THEN( a, FINALLY(b, a).retryTimes(3) ); - - - \ No newline at end of file From bf8894ad82f471de61f010c9d194579e3819be13 Mon Sep 17 00:00:00 2001 From: Dale Lee <1658850308@qq.com> Date: Fri, 26 Jan 2024 16:35:44 +0800 Subject: [PATCH 22/49] =?UTF-8?q?feature=20#I8YNCB=20=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E4=B8=80=E4=B8=AAchainId=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E6=89=80=E6=9C=89node?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 8 ++- .../yomahub/liteflow/util/NodeScanner.java | 71 +++++++++++++++++++ .../LiteFlowScriptGetNodesGraaljsTest.java | 44 ++++++++++++ .../script/graaljs/getnodes/cmp/ACmp.java | 21 ++++++ .../script/graaljs/getnodes/cmp/BCmp.java | 21 ++++++ .../script/graaljs/getnodes/cmp/CCmp.java | 21 ++++++ .../resources/getnodes/application.properties | 1 + .../src/test/resources/getnodes/flow.xml | 30 ++++++++ 8 files changed, 216 insertions(+), 1 deletion(-) create mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 8b7b97d71..04841ef87 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -9,7 +9,6 @@ package com.yomahub.liteflow.flow; import cn.hutool.core.collection.ListUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.util.AnnoUtil; @@ -38,6 +37,7 @@ import com.yomahub.liteflow.spi.holder.ContextAwareHolder; import com.yomahub.liteflow.spi.holder.DeclComponentParserHolder; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; +import com.yomahub.liteflow.util.NodeScanner; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; @@ -242,6 +242,12 @@ public class FlowBus { return nodeMap.get(nodeId); } + // 获取某一个 chainId 下的所有 nodeId + public static List getNodeByChainId(String chainId) { + Chain chain = getChain(chainId); + return NodeScanner.getNodesInChain(chain); + } + public static Map getNodeMap() { return nodeMap; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java new file mode 100644 index 000000000..c984ab722 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java @@ -0,0 +1,71 @@ +package com.yomahub.liteflow.util; + +import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Condition; +import com.yomahub.liteflow.flow.element.Executable; +import com.yomahub.liteflow.flow.element.Node; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Queue; +import java.util.Set; + +/** + * 节点扫描器 + * + * @author DaleLee + * @since 2.12.0 + */ +public class NodeScanner { + + /** + * 获取 Chain 中的所有 Node + * + * @param chain Chain + * @return Node 集合 + */ + public static List getNodesInChain(Chain chain) { + List result = new ArrayList<>(); + if (chain == null) { + return result; + } + for (Condition condition : chain.getConditionList()) { + result.addAll(getNodesInCondition(condition)); + } + return result; + } + + /** + * 获取 Condition 中的所有 Node + * + * @param condition Condition + * @return Node 集合 + */ + public static List getNodesInCondition(Condition condition) { + List result = new ArrayList<>(); + if (condition == null) { + return result; + } + + // 层序遍历 + Queue queue = new LinkedList<>(); + queue.offer(condition); + + while (!queue.isEmpty()) { + Executable cur = queue.poll(); + if (cur instanceof Condition) { + Map> executableGroup = ((Condition) cur).getExecutableGroup(); + for (List executables : executableGroup.values()) { + executables.forEach(queue::offer); + } + } else if (cur instanceof Node) { + result.add((Node) cur); + } + } + + return result; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java new file mode 100644 index 000000000..fb3d6243f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java @@ -0,0 +1,44 @@ +package com.yomahub.liteflow.test.script.graaljs.getnodes; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.List; + +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/getnodes/application.properties") +@SpringBootTest(classes = LiteFlowScriptGetNodesGraaljsTest.class) +@EnableAutoConfiguration +@ComponentScan("com.yomahub.liteflow.test.script.graaljs.getnodes.cmp") +public class LiteFlowScriptGetNodesGraaljsTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void getNodesTest1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodeByChainId("chain1"); + Assertions.assertEquals(5, nodes.size()); + } + + @Test + public void getNodesTest2() { + List nodes = FlowBus.getNodeByChainId("chain2"); + Assertions.assertEquals(5, nodes.size()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/ACmp.java new file mode 100644 index 000000000..2eb120512 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/ACmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.graaljs.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/BCmp.java new file mode 100644 index 000000000..9818266eb --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/BCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.graaljs.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/CCmp.java new file mode 100644 index 000000000..f42ce1b19 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/CCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.graaljs.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/application.properties new file mode 100644 index 000000000..4acf0f012 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=getnodes/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml new file mode 100644 index 000000000..717d756be --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + THEN(a, b, c, s1, s2); + + + + THEN(a, WHEN(b, c), WHEN(s1, s2)); + + \ No newline at end of file From bed132b25a50db3d5fce637bcd5f027911347c9c Mon Sep 17 00:00:00 2001 From: rain <672378783@qq.com> Date: Tue, 30 Jan 2024 15:51:35 +0800 Subject: [PATCH 23/49] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yomahub/liteflow/annotation/LiteflowRetry.java | 5 +++++ .../yomahub/liteflow/builder/el/operator/RetryOperator.java | 2 +- .../liteflow/flow/element/condition/RetryCondition.java | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java index 34ad6ac8f..15bdd48ef 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java @@ -12,6 +12,11 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited +/** + * This class has been deprecated due to its only component retry function. Please use the retry method in the EL expression. + * @Deprecated + * @see # retry(int retryTimes) e.g. THEN( a, b.retry(3) ); WHEN( a, b ).retry(3); + */ @Deprecated public @interface LiteflowRetry { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java index 2e8b5a4a1..a6c756b17 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java @@ -9,7 +9,7 @@ import com.yomahub.liteflow.flow.element.condition.RetryCondition; /** * * @author Rain - * @since 2.11.5 + * @since 2.12.0 * */ public class RetryOperator extends BaseOperator { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java index 91c1d14f3..6d5b42906 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/RetryCondition.java @@ -14,6 +14,12 @@ import com.yomahub.liteflow.slot.DataBus; import java.util.Arrays; import java.util.List; +/** + * + * @author Rain + * @since 2.12.0 + * + */ public class RetryCondition extends ThenCondition{ private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); From 3565045d54beecf11fbfcc8c3c1c5055888a71ec Mon Sep 17 00:00:00 2001 From: rain <672378783@qq.com> Date: Tue, 30 Jan 2024 15:59:57 +0800 Subject: [PATCH 24/49] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yomahub/liteflow/annotation/LiteflowRetry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java index 15bdd48ef..f436c6554 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowRetry.java @@ -12,12 +12,12 @@ import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited +@Deprecated /** * This class has been deprecated due to its only component retry function. Please use the retry method in the EL expression. * @Deprecated * @see # retry(int retryTimes) e.g. THEN( a, b.retry(3) ); WHEN( a, b ).retry(3); */ -@Deprecated public @interface LiteflowRetry { @LFAliasFor("retry") From 13af5f704af809e5aeeefa78d5c0a9e6c7bc762d Mon Sep 17 00:00:00 2001 From: gezuao <673843192@qq.com> Date: Tue, 30 Jan 2024 16:08:45 +0800 Subject: [PATCH 25/49] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E8=84=9A=E6=9C=AC=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../script/validator/ScriptValidator.java | 60 +++++++++++++------ .../ValidateAviatorScriptComponentTest.java | 6 ++ .../ValidateGraaljsScriptComponentTest.java | 4 ++ .../ValidateGroovyScriptComponentTest.java | 4 ++ .../ValidateJavaScriptComponentTest.java | 4 ++ ...ValidateJavaScriptScriptComponentTest.java | 4 ++ .../ValidateLuaScriptComponentTest.java | 4 ++ ...idateMultiLanguageScriptComponentTest.java | 16 ++--- .../ValidatePythonScriptComponentTest.java | 4 ++ .../ValidateQLExpressScriptComponentTest.java | 4 ++ 10 files changed, 83 insertions(+), 27 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java index dd1c7b72c..a05ce0606 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/validator/ScriptValidator.java @@ -31,49 +31,71 @@ public class ScriptValidator { } /** - * 只引入一种脚本语言时,使用该语言验证 + * 验证脚本逻辑的公共部分 * - * @param script 脚本 + * @param script 脚本 + * @param scriptType 脚本类型 * @return boolean */ - public static boolean validate(String script){ + private static boolean validateScript(String script, ScriptTypeEnum scriptType){ + // 未加载任何脚本模块 if(scriptExecutors.isEmpty()){ LOG.error("The loaded script modules not found."); return false; } - // 使用多脚本语言需要指定验证语言 - if(scriptExecutors.size() > 1){ + + // 指定脚本语言未加载 + if (scriptType != null && !scriptExecutors.containsKey(scriptType)) { + LOG.error(StrUtil.format("Specified script language {} was not found.", scriptType)); + return false; + } + + // 加载多个脚本语言需要指定语言验证 + if (scriptExecutors.size() > 1 && scriptType == null) { LOG.error("The loaded script modules more than 1. Please specify the script language."); return false; } - ScriptExecutor scriptExecutor = scriptExecutors.values().iterator().next(); + ScriptExecutor scriptExecutor = (scriptType != null) ? scriptExecutors.get(scriptType) : scriptExecutors.values().iterator().next(); try { scriptExecutor.compile(script); } catch (Exception e) { - LOG.error("script component validate failure. " + e.getMessage()); + LOG.error(StrUtil.format("{} Script component validate failure. ", scriptExecutor.scriptType()) + e.getMessage()); return false; } return true; } /** - * 多语言脚本验证 + * 只引入一种脚本语言时,可以不指定语言验证 + * + * @param script 脚本 + * @return boolean + */ + public static boolean validate(String script){ + return validateScript(script, null); + } + + /** + * 指定脚本语言验证 + * + * @param script 脚本 + * @param scriptType 脚本类型 + * @return boolean + */ + public static boolean validate(String script, ScriptTypeEnum scriptType){ + return validateScript(script, scriptType); + } + + /** + * 多语言脚本批量验证 * * @param scripts 脚本 * @return boolean */ - public static boolean validate(Map scripts){ - for(Map.Entry script : scripts.entrySet()){ - ScriptExecutor scriptExecutor = scriptExecutors.getOrDefault(script.getValue(), null); - if(scriptExecutor == null){ - LOG.error(StrUtil.format("Specified script language {} was not found.", script.getValue())); - return false; - } - try { - scriptExecutor.compile(script.getKey()); - } catch (Exception e) { - LOG.error(StrUtil.format("{} script component validate failure. ", script.getValue()) + e.getMessage()); + public static boolean validate(Map scripts){ + for(Map.Entry script : scripts.entrySet()){ + if(!validate(script.getValue(), script.getKey())){ return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java index 9a6b5553e..6f43ed8f5 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/validate/ValidateAviatorScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.aviator.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.aviator.AviatorScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -37,5 +38,10 @@ public class ValidateAviatorScriptComponentTest { " setData(defaultContext, \"s1\", a*b);"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.AVIATOR)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.PYTHON)); + + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java index 7a01031f6..7cea4b72b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/validate/ValidateGraaljsScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.graaljs.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.graaljs.GraalJavaScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -47,5 +48,8 @@ public class ValidateGraaljsScriptComponentTest { " defaultContext.setData(\"s1\",parseInt(result));"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.JS)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.AVIATOR)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java index 912590029..ff3a705f5 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/validate/ValidateGroovyScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.groovy.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.groovy.GroovyScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -75,5 +76,8 @@ public class ValidateGroovyScriptComponentTest { " defaultContext.setData(\"s1\", a * b)"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.GROOVY)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.JS)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java index 548d6d023..033ac15fa 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/validate/ValidateJavaScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.java.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.java.JavaExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -59,5 +60,8 @@ public class ValidateJavaScriptComponentTest { " }"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.JAVA)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.GROOVY)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java index 6c923ad34..29ef33af4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/validate/ValidateJavaScriptScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.javascript.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.javascript.JavaScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -47,5 +48,8 @@ public class ValidateJavaScriptScriptComponentTest { " defaultContext.setData(\"s1\",parseInt(result));"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.JS)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.JAVA)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java index f5983e785..01bd73487 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/validate/ValidateLuaScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.lua.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.lua.LuaScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -33,5 +34,8 @@ public class ValidateLuaScriptComponentTest { " defaultContext:setData(\"s2\",_meta:get(\"nodeId\"))"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.LUA)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.JS)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java index 31a9792ba..2bbee5dc0 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-multi-language-springboot/src/test/java/com/yomahub/liteflow/test/script/multi/language/validate/ValidateMultiLanguageScriptComponentTest.java @@ -46,17 +46,17 @@ public class ValidateMultiLanguageScriptComponentTest { Assertions.assertFalse(ScriptValidator.validate(correctGroovyScript)); // 多语言脚本验证 正确样例 - Map correctData = new HashMap<>(); - correctData.put(correctGroovyScript, ScriptTypeEnum.GROOVY); - correctData.put(correctJavascriptScript, ScriptTypeEnum.JS); - correctData.put(correctPythonScript, ScriptTypeEnum.PYTHON); + Map correctData = new HashMap<>(); + correctData.put(ScriptTypeEnum.GROOVY, correctGroovyScript); + correctData.put(ScriptTypeEnum.JS, correctJavascriptScript); + correctData.put(ScriptTypeEnum.PYTHON, correctPythonScript); Assertions.assertTrue(ScriptValidator.validate(correctData)); // 多语言脚本验证 错误样例 - Map wrongData = new HashMap<>(); - wrongData.put(correctGroovyScript, ScriptTypeEnum.GROOVY); - wrongData.put(correctJavascriptScript, ScriptTypeEnum.JS); - wrongData.put(wrongPythonScript, ScriptTypeEnum.PYTHON); + Map wrongData = new HashMap<>(); + wrongData.put(ScriptTypeEnum.GROOVY, correctGroovyScript); + wrongData.put(ScriptTypeEnum.JS, correctJavascriptScript); + wrongData.put(ScriptTypeEnum.PYTHON, wrongPythonScript); Assertions.assertFalse(ScriptValidator.validate(wrongData)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java index 27eb00eb2..77601e4f3 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/validate/ValidatePythonScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.python.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.python.PythonScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -49,5 +50,8 @@ public class ValidatePythonScriptComponentTest { " defaultContext.setData(\"td\", td.sayHi(\"jack\"))"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.PYTHON)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.LUA)); } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java index 44a5f63ab..34f449357 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/validate/ValidateQLExpressScriptComponentTest.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.test.script.qlexpress.validate; +import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.script.qlexpress.QLExpressScriptExecutor; import com.yomahub.liteflow.script.validator.ScriptValidator; import org.junit.jupiter.api.Assertions; @@ -27,5 +28,8 @@ public class ValidateQLExpressScriptComponentTest { " }"; Assertions.assertTrue(ScriptValidator.validate(correctScript)); Assertions.assertFalse(ScriptValidator.validate(wrongScript)); + + Assertions.assertTrue(ScriptValidator.validate(correctScript, ScriptTypeEnum.QLEXPRESS)); + Assertions.assertFalse(ScriptValidator.validate(correctScript, ScriptTypeEnum.PYTHON)); } } From 69b7fdf99176c3369ebda320e05c26e01c722f37 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 31 Jan 2024 13:57:37 +0800 Subject: [PATCH 26/49] =?UTF-8?q?future=20#I9050W=20=E4=B8=BA=E6=AF=8F?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E4=B8=8A=E4=B8=8B=E6=96=87=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=E5=90=8D=E5=AD=97=EF=BC=8C=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=97=B6=E5=8F=AF=E4=BB=A5=E6=A0=B9=E6=8D=AE=E5=90=8D=E5=AD=97?= =?UTF-8?q?=E6=9D=A5=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/core/NodeComponent.java | 4 ++ .../liteflow/flow/LiteflowResponse.java | 4 ++ .../liteflow/script/ScriptExecutor.java | 12 +----- .../com/yomahub/liteflow/slot/DataBus.java | 23 ++++++++--- .../java/com/yomahub/liteflow/slot/Slot.java | 25 ++++++++---- .../ContextBeanSpringbootTest.java | 38 +++++++++++++++++++ .../liteflow/test/contextBean/cmp/ACmp.java | 23 +++++++++++ .../liteflow/test/contextBean/cmp/BCmp.java | 21 ++++++++++ .../test/contextBean/context/TestContext.java | 32 ++++++++++++++++ .../contextBean/application.properties | 1 + .../src/test/resources/contextBean/flow.xml | 7 ++++ 11 files changed, 167 insertions(+), 23 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml 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 283de4216..2ed37eeee 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 @@ -280,6 +280,10 @@ public abstract class NodeComponent { return this.getSlot().getContextBean(contextBeanClazz); } + public T getContextBean(String contextName) { + return this.getSlot().getContextBean(contextName); + } + public String getNodeId() { return nodeId; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java index c2645a299..51e1ddc28 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/LiteflowResponse.java @@ -101,6 +101,10 @@ public class LiteflowResponse { return this.getSlot().getContextBean(contextBeanClazz); } + public T getContextBean(String contextName) { + return this.getSlot().getContextBean(contextName); + } + public Map> getExecuteSteps() { Map> map = new LinkedHashMap<>(); this.getSlot().getExecuteSteps().forEach(cmpStep -> { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java index 0f4be12dd..713a0e39e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java @@ -54,17 +54,7 @@ public abstract class ScriptExecutor { // key的规则为自定义上下文的simpleName // 比如你的自定义上下文为AbcContext,那么key就为:abcContext // 这里不统一放一个map的原因是考虑到有些用户会调用上下文里的方法,而不是参数,所以脚本语言的绑定表里也是放多个上下文 - DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(o -> { - ContextBean contextBean = AnnoUtil.getAnnotation(o.getClass(), ContextBean.class); - String key; - if (contextBean != null && contextBean.value().trim().length() > 0) { - key = contextBean.value(); - } - else { - key = StrUtil.lowerFirst(o.getClass().getSimpleName()); - } - putConsumer.accept(key, o); - }); + DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(tuple -> putConsumer.accept(tuple.get(0), tuple.get(1))); // 把wrap对象转换成元数据map Map metaMap = BeanUtil.beanToMap(wrap); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java index 3b2d6b1dd..00e3032e6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/DataBus.java @@ -7,10 +7,14 @@ */ package com.yomahub.liteflow.slot; +import cn.hutool.core.lang.Tuple; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.annotation.util.AnnoUtil; +import com.yomahub.liteflow.context.ContextBean; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.property.LiteflowConfig; @@ -74,13 +78,22 @@ public class DataBus { .map((Function, Object>) ReflectUtil::newInstanceIfPossible) .collect(Collectors.toList()); - Slot slot = new Slot(contextBeanList); - - return offerIndex(slot); + return offerSlotByBean(contextBeanList); } public static int offerSlotByBean(List contextList) { - Slot slot = new Slot(contextList); + List contextBeanList = contextList.stream().map(object -> { + ContextBean contextBean = AnnoUtil.getAnnotation(object.getClass(), ContextBean.class); + String contextKey; + if (contextBean != null && StrUtil.isNotBlank(contextBean.value())){ + contextKey = contextBean.value(); + }else{ + contextKey = StrUtil.lowerFirst(object.getClass().getSimpleName()); + } + return new Tuple(contextKey, object); + }).collect(Collectors.toList()); + + Slot slot = new Slot(contextBeanList); return offerIndex(slot); } @@ -128,7 +141,7 @@ public class DataBus { return SLOTS.get(slotIndex); } - public static List getContextBeanList(int slotIndex) { + public static List getContextBeanList(int slotIndex) { Slot slot = getSlot(slotIndex); return slot.getContextBeanList(); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java index e8cbb8cba..8bb39dafe 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/slot/Slot.java @@ -9,6 +9,7 @@ package com.yomahub.liteflow.slot; import cn.hutool.core.collection.ConcurrentHashSet; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.lang.Tuple; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; @@ -30,6 +31,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.function.Predicate; /** * Slot的抽象类实现 @@ -91,14 +93,14 @@ public class Slot { protected ConcurrentHashMap metaDataMap = new ConcurrentHashMap<>(); - private List contextBeanList; + private List contextBeanList; private static final TransmittableThreadLocal> conditionStack = TransmittableThreadLocal.withInitial(ConcurrentLinkedDeque::new); public Slot() { } - public Slot(List contextBeanList) { + public Slot(List contextBeanList) { this.contextBeanList = contextBeanList; } @@ -449,21 +451,30 @@ public class Slot { metaDataMap.remove(SUB_EXCEPTION_PREFIX + chainId); } - public List getContextBeanList() { + public List getContextBeanList() { return this.contextBeanList; } public T getContextBean(Class contextBeanClazz) { - T t = (T) contextBeanList.stream().filter(o -> o.getClass().getName().equals(contextBeanClazz.getName())).findFirst().orElse(null); - if (t == null) { + Tuple contextTuple = contextBeanList.stream().filter(tuple -> tuple.get(1).getClass().getName().equals(contextBeanClazz.getName())).findFirst().orElse(null); + if (contextTuple == null) { contextBeanList.forEach(o -> LOG.info("ChainId[{}], Context class:{},Request class:{}", this.getChainId(), o.getClass().getName(), contextBeanClazz.getName())); throw new NoSuchContextBeanException("this type is not in the context type passed in"); } - return t; + return contextTuple.get(1); + } + + public T getContextBean(String contextBeanKey) { + Tuple contextTuple = contextBeanList.stream().filter(tuple -> tuple.get(0).equals(contextBeanKey)).findFirst().orElse(null); + if (contextTuple == null) { + contextBeanList.forEach(o -> LOG.info("ChainId[{}], Context class:{},Request contextBeanKey:{}", this.getChainId(), o.getClass().getName(), contextBeanKey)); + throw new NoSuchContextBeanException("this context key is not defined"); + } + return contextTuple.get(1); } public T getFirstContextBean() { - Class firstContextBeanClazz = (Class) this.getContextBeanList().get(0).getClass(); + Class firstContextBeanClazz = (Class) this.getContextBeanList().get(0).get(1).getClass(); return this.getContextBean(firstContextBeanClazz); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java new file mode 100644 index 000000000..55567ea7e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/ContextBeanSpringbootTest.java @@ -0,0 +1,38 @@ +package com.yomahub.liteflow.test.contextBean; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import com.yomahub.liteflow.test.contextBean.context.TestContext; +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; + +/** + * ContextBean测试 + * + * @author Bryan.Zhang + */ +@TestPropertySource(value = "classpath:/contextBean/application.properties") +@SpringBootTest(classes = ContextBeanSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({ "com.yomahub.liteflow.test.contextBean.cmp" }) +public class ContextBeanSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 最简单的情况 + @Test + public void testContextBean1() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg", TestContext.class); + Assertions.assertTrue(response.isSuccess()); + TestContext context = response.getContextBean("skuContext"); + Assertions.assertEquals("J001", context.getSkuCode()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java new file mode 100644 index 000000000..45119e9d9 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/ACmp.java @@ -0,0 +1,23 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.contextBean.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.test.contextBean.context.TestContext; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + TestContext context = this.getContextBean("skuContext"); + context.setSkuCode("J001"); + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java new file mode 100644 index 000000000..1e8c6d1b1 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/cmp/BCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.contextBean.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java new file mode 100644 index 000000000..9f83e3b39 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/contextBean/context/TestContext.java @@ -0,0 +1,32 @@ +package com.yomahub.liteflow.test.contextBean.context; + +import com.yomahub.liteflow.context.ContextBean; + +@ContextBean("skuContext") +public class TestContext { + + private String skuCode; + + private String skuName; + + public TestContext(String skuCode, String skuName) { + this.skuCode = skuCode; + this.skuName = skuName; + } + + public String getSkuCode() { + return skuCode; + } + + public void setSkuCode(String skuCode) { + this.skuCode = skuCode; + } + + public String getSkuName() { + return skuName; + } + + public void setSkuName(String skuName) { + this.skuName = skuName; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties new file mode 100644 index 000000000..5b68813b3 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=contextBean/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml new file mode 100644 index 000000000..84d650db4 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/contextBean/flow.xml @@ -0,0 +1,7 @@ + + + + + THEN(a,b); + + \ No newline at end of file From f65d896a1e2cdd1d019c283e20998808a8e3b5e7 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 31 Jan 2024 13:59:01 +0800 Subject: [PATCH 27/49] =?UTF-8?q?enhancement=20#I905AD=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E6=B3=A8=E8=A7=A3=E7=9A=84=E8=8E=B7=E5=8F=96=E9=80=9F?= =?UTF-8?q?=E5=BA=A6=EF=BC=8C=E4=BC=98=E5=8C=96=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/annotation/util/AnnoUtil.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/util/AnnoUtil.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/util/AnnoUtil.java index ab86d02ea..3074c4bb2 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/util/AnnoUtil.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/util/AnnoUtil.java @@ -3,6 +3,7 @@ package com.yomahub.liteflow.annotation.util; import cn.hutool.core.annotation.AnnotationUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; +import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.annotation.LFAliasFor; import java.lang.annotation.Annotation; @@ -10,15 +11,25 @@ import java.lang.reflect.AnnotatedElement; import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; /** * 注解工具类 + * 此工具类带缓存 * * @author Bryan.Zhang */ public class AnnoUtil { + private static Map annoCacheMap = new ConcurrentHashMap<>(); + public static A getAnnotation(AnnotatedElement annotatedElement, Class annotationType) { + String cacheKey = StrUtil.format("{}-{}", annotatedElement, annotationType.getSimpleName()); + + if (annoCacheMap.containsKey(cacheKey)){ + return (A)annoCacheMap.get(cacheKey); + } + A annotation = AnnotationUtil.getAnnotation(annotatedElement, annotationType); if (ObjectUtil.isNull(annotation)) { return null; @@ -42,6 +53,8 @@ public class AnnoUtil { } }); + annoCacheMap.put(cacheKey, annotation); + return annotation; } @@ -53,5 +66,4 @@ public class AnnoUtil { return null; } } - } From a5ad3801dc7d9582da6e341fd4afa542d0fafe5d Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 31 Jan 2024 17:16:28 +0800 Subject: [PATCH 28/49] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/builder/el/operator/RetryOperator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java index a6c756b17..38f8c6b6c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/RetryOperator.java @@ -15,7 +15,7 @@ import com.yomahub.liteflow.flow.element.condition.RetryCondition; public class RetryOperator extends BaseOperator { @Override public Condition build(Object[] objects) throws Exception { - OperatorHelper.checkObjectSizeGtTwo(objects); + OperatorHelper.checkObjectSizeGteTwo(objects); Executable executable = OperatorHelper.convert(objects[0], Executable.class); Integer retryTimes = OperatorHelper.convert(objects[1], Integer.class); RetryCondition retryCondition = new RetryCondition(); From 366241a4ef37a84c6829ecf3bb0412640c9af38f Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 31 Jan 2024 22:06:02 +0800 Subject: [PATCH 29/49] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=8F=B7=E4=B8=BA2.12.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3e880236f..94426b9fa 100644 --- a/pom.xml +++ b/pom.xml @@ -39,7 +39,7 @@ - 2.11.4.2 + 2.12.0 UTF-8 UTF-8 8 From a79af2ba298894c6daa10e441cedb6e6ec2ae237 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 1 Feb 2024 19:11:22 +0800 Subject: [PATCH 30/49] =?UTF-8?q?enhancement=20#I90IRR=20=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=B6=85=E6=97=B6maxWaitSenconds=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E8=B6=85=E6=97=B6=E7=9A=84=E7=BB=84=E4=BB=B6=E4=BB=8D?= =?UTF-8?q?=E6=97=A7=E6=89=A7=E8=A1=8C=E4=BC=9A=E6=8A=A5=E5=87=BANPE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/element/condition/ThenCondition.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ThenCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ThenCondition.java index 5f41b9aec..7a7b99d5d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ThenCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/ThenCondition.java @@ -51,13 +51,17 @@ public class ThenCondition extends Condition { } catch (Exception e) { Slot slot = DataBus.getSlot(slotIndex); - String chainId = this.getCurrChainId(); - // 这里事先取到exception set到slot里,为了方便finally取到exception - if (slot.isSubChain(chainId)) { - slot.setSubException(chainId, e); - } - else { - slot.setException(e); + //正常情况下slot不可能为null + //当设置了超时后,还在运行的组件就有可能因为主流程已经结束释放slot而导致slot为null + if (slot != null){ + String chainId = this.getCurrChainId(); + // 这里事先取到exception set到slot里,为了方便finally取到exception + if (slot.isSubChain(chainId)) { + slot.setSubException(chainId, e); + } + else { + slot.setException(e); + } } throw e; } From 2d9c357d8feefa2c0a38fe1a1845377337656ffb Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 1 Feb 2024 19:22:37 +0800 Subject: [PATCH 31/49] =?UTF-8?q?enhancement=20#I90IRR=20=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=B6=85=E6=97=B6maxWaitSenconds=E4=B9=8B=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E8=B6=85=E6=97=B6=E7=9A=84=E7=BB=84=E4=BB=B6=E4=BB=8D?= =?UTF-8?q?=E6=97=A7=E6=89=A7=E8=A1=8C=E4=BC=9A=E6=8A=A5=E5=87=BANPE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MaxWaitSecondsELSpringbootTest.java | 10 ++++++++++ .../test/maxWaitSeconds/cmp/ECmp.java | 20 +++++++++++++++++++ .../test/resources/maxWaitSeconds/flow.el.xml | 4 ++++ 3 files changed, 34 insertions(+) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/ECmp.java diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsELSpringbootTest.java index a71ce42e4..611e39c17 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/MaxWaitSecondsELSpringbootTest.java @@ -182,6 +182,16 @@ public class MaxWaitSecondsELSpringbootTest extends BaseTest { assertNotTimeout("chain2"); } + // 测试超时情况下组件还在运行的场景是否会报错 + @Test + public void testChain3() { + DefaultContext context = new DefaultContext(); + context.setData("test", "123"); + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg", context); + Assertions.assertFalse(response.isSuccess()); + Assertions.assertEquals(TimeoutException.class, response.getCause().getClass()); + } + private void assertTimeout(String chainId) { LiteflowResponse response = flowExecutor.execute2Resp(chainId, "arg"); Assertions.assertFalse(response.isSuccess()); diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/ECmp.java new file mode 100644 index 000000000..a87f87d0f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/ECmp.java @@ -0,0 +1,20 @@ +package com.yomahub.liteflow.test.maxWaitSeconds.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; + +@LiteflowComponent("e") +public class ECmp extends NodeComponent { + @Override + public void process() throws Exception{ + DefaultContext context = this.getFirstContextBean(); + for (int i = 0; i < 10; i++) { + String str = context.getData("test"); + System.out.println(str); + Thread.sleep(1000); + } + + System.out.println("ECmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/maxWaitSeconds/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/maxWaitSeconds/flow.el.xml index 91869ae50..8fd19db05 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/maxWaitSeconds/flow.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/maxWaitSeconds/flow.el.xml @@ -107,4 +107,8 @@ testChain.maxWaitSeconds(3); + + + THEN(a, b, e).maxWaitSeconds(8); + \ No newline at end of file From d555a2ab43ed4ab3ffcf80c733397c9af59344ae Mon Sep 17 00:00:00 2001 From: DaleLee <1658850308@qq.com> Date: Fri, 2 Feb 2024 14:50:31 +0800 Subject: [PATCH 32/49] =?UTF-8?q?For=20#I8YNCB,=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 2 +- .../yomahub/liteflow/util/NodeScanner.java | 2 - .../LiteFlowScriptGetNodesGraaljsELTest.java | 139 ++++++++++++++++++ .../LiteFlowScriptGetNodesGraaljsTest.java | 44 ------ .../script/graaljs/getnodes/cmp/FCmp.java | 12 ++ .../script/graaljs/getnodes/cmp/SCmp.java | 12 ++ .../src/test/resources/getnodes/flow.xml | 28 +++- .../LiteFlowScriptGetNodesJsELTest.java | 139 ++++++++++++++++++ .../script/javascript/getnodes/cmp/ACmp.java | 21 +++ .../script/javascript/getnodes/cmp/BCmp.java | 21 +++ .../script/javascript/getnodes/cmp/CCmp.java | 21 +++ .../script/javascript/getnodes/cmp/FCmp.java | 12 ++ .../script/javascript/getnodes/cmp/SCmp.java | 12 ++ .../resources/getnodes/application.properties | 1 + .../src/test/resources/getnodes/flow.xml | 56 +++++++ 15 files changed, 474 insertions(+), 48 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsELTest.java delete mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/SCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/LiteFlowScriptGetNodesJsELTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/CCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/FCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/SCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/flow.xml diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 04841ef87..17e8a5ca8 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -243,7 +243,7 @@ public class FlowBus { } // 获取某一个 chainId 下的所有 nodeId - public static List getNodeByChainId(String chainId) { + public static List getNodesByChainId(String chainId) { Chain chain = getChain(chainId); return NodeScanner.getNodesInChain(chain); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java index c984ab722..95ce4d4e1 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java @@ -6,12 +6,10 @@ import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; import java.util.ArrayList; -import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Queue; -import java.util.Set; /** * 节点扫描器 diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsELTest.java new file mode 100644 index 000000000..e834f4f40 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsELTest.java @@ -0,0 +1,139 @@ +package com.yomahub.liteflow.test.script.graaljs.getnodes; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 根据 chainId 获取节点测试 + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/getnodes/application.properties") +@SpringBootTest(classes = LiteFlowScriptGetNodesGraaljsELTest.class) +@EnableAutoConfiguration +@ComponentScan("com.yomahub.liteflow.test.script.graaljs.getnodes.cmp") +public class LiteFlowScriptGetNodesGraaljsELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void getNodesTest1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain1"); + // 判断数量 + Assertions.assertEquals(5, nodes.size()); + // 判断 id + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + List targetIds = Arrays.asList("a", "b", "c", "s1", "s2"); + for (String id : targetIds) { + Assertions.assertTrue(nodeIds.contains(id)); + } + } + + @Test + public void getNodesTest2() { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain2"); + // 判断总数量 + Assertions.assertEquals(6, nodes.size()); + // 判断 id 与数量 + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + Map map = listToMap(nodeIds); + Map targetMap = new HashMap<>(); + targetMap.put("a", 3); + targetMap.put("b", 1); + targetMap.put("s1", 2); + Assertions.assertTrue(targetMap.equals(map)); + // 判断 tag + List nodeTags = nodes.stream().map(Node::getTag) + .collect(Collectors.toList()); + List targetTags = Arrays.asList("a1", "a2", "a3", "b1", "s11", "s12"); + for (String id : targetTags) { + Assertions.assertTrue(nodeTags.contains(id)); + } + } + + @Test + public void getNodesTest3() { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain3"); + // 判断总数量 + Assertions.assertEquals(8, nodes.size()); + // 判断 id 与数量 + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + Map map = listToMap(nodeIds); + Map targetMap = new HashMap<>(); + targetMap.put("a", 2); + targetMap.put("b", 2); + targetMap.put("c", 1); + targetMap.put("f", 1); + targetMap.put("s1", 1); + targetMap.put("s2", 1); + Assertions.assertTrue(targetMap.equals(map)); + } + + @Test + public void getNodesTest4() { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain4"); + // 判断数量 + Assertions.assertEquals(5, nodes.size()); + // 判断 id + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + List targetIds = Arrays.asList("a", "b", "c", "s"); + for (String id : targetIds) { + Assertions.assertTrue(nodeIds.contains(id)); + } + } + + @Test + public void getNodesTest5() { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain5"); + // 判断数量 + Assertions.assertEquals(3, nodes.size()); + // 判断 id + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + List targetIds = Arrays.asList("x", "y", "s1"); + for (String id : targetIds) { + Assertions.assertTrue(nodeIds.contains(id)); + } + } + + // 统计节点 id 出现的数量 + private Map listToMap(List list) { + Map map = new HashMap<>(); + for (String s : list) { + map.put(s, map.getOrDefault(s, 0) + 1); + } + return map; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java deleted file mode 100644 index fb3d6243f..000000000 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/LiteFlowScriptGetNodesGraaljsTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.yomahub.liteflow.test.script.graaljs.getnodes; - -import com.yomahub.liteflow.core.FlowExecutor; -import com.yomahub.liteflow.flow.FlowBus; -import com.yomahub.liteflow.flow.LiteflowResponse; -import com.yomahub.liteflow.flow.element.Node; -import com.yomahub.liteflow.test.BaseTest; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -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.junit.jupiter.SpringExtension; - -import javax.annotation.Resource; -import java.util.List; - -@ExtendWith(SpringExtension.class) -@TestPropertySource(value = "classpath:/getnodes/application.properties") -@SpringBootTest(classes = LiteFlowScriptGetNodesGraaljsTest.class) -@EnableAutoConfiguration -@ComponentScan("com.yomahub.liteflow.test.script.graaljs.getnodes.cmp") -public class LiteFlowScriptGetNodesGraaljsTest extends BaseTest { - - @Resource - private FlowExecutor flowExecutor; - - @Test - public void getNodesTest1() { - LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); - Assertions.assertTrue(response.isSuccess()); - List nodes = FlowBus.getNodeByChainId("chain1"); - Assertions.assertEquals(5, nodes.size()); - } - - @Test - public void getNodesTest2() { - List nodes = FlowBus.getNodeByChainId("chain2"); - Assertions.assertEquals(5, nodes.size()); - } - -} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java new file mode 100644 index 000000000..c975811c5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.script.graaljs.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeIfComponent; +import org.springframework.stereotype.Component; + +@Component("f") +public class FCmp extends NodeIfComponent { + @Override + public boolean processIf() throws Exception { + return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/SCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/SCmp.java new file mode 100644 index 000000000..a064993d4 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/SCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.script.graaljs.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeSwitchComponent; +import org.springframework.stereotype.Component; + +@Component("s") +public class SCmp extends NodeSwitchComponent { + @Override + public String processSwitch() throws Exception { + return "f1"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml index 717d756be..78a84de68 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml @@ -18,13 +18,39 @@ defaultContext.setData("s2",a*b+c); ]]> + + + + + + + + THEN(a, b, c, s1, s2); + - THEN(a, WHEN(b, c), WHEN(s1, s2)); + THEN(a.tag("a1"), a.tag("a2"), a.tag("a3"), b.tag("b1"), s1.tag("s11"), s1.tag("s12")); + + + + + THEN(WHEN(a, b), IF(f, WHEN(THEN(c, s2, WHEN(s1, b)), a))); + + + + SWITCH(s).to(FOR(3).DO(a).id("f1"), b, c); + + + + WHILE(x).DO(s1).BREAK(y); \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/LiteFlowScriptGetNodesJsELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/LiteFlowScriptGetNodesJsELTest.java new file mode 100644 index 000000000..1bbd41bae --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/LiteFlowScriptGetNodesJsELTest.java @@ -0,0 +1,139 @@ +package com.yomahub.liteflow.test.script.javascript.getnodes; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.flow.element.Node; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +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.junit.jupiter.SpringExtension; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * 根据 chainId 获取节点测试 + */ +@ExtendWith(SpringExtension.class) +@TestPropertySource(value = "classpath:/getnodes/application.properties") +@SpringBootTest(classes = LiteFlowScriptGetNodesJsELTest.class) +@EnableAutoConfiguration +@ComponentScan("com.yomahub.liteflow.test.script.javascript.getnodes.cmp") +public class LiteFlowScriptGetNodesJsELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + @Test + public void getNodesTest1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain1"); + // 判断数量 + Assertions.assertEquals(5, nodes.size()); + // 判断 id + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + List targetIds = Arrays.asList("a", "b", "c", "s1", "s2"); + for (String id : targetIds) { + Assertions.assertTrue(nodeIds.contains(id)); + } + } + + @Test + public void getNodesTest2() { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain2"); + // 判断总数量 + Assertions.assertEquals(6, nodes.size()); + // 判断 id 与数量 + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + Map map = listToMap(nodeIds); + Map targetMap = new HashMap<>(); + targetMap.put("a", 3); + targetMap.put("b", 1); + targetMap.put("s1", 2); + Assertions.assertTrue(targetMap.equals(map)); + // 判断 tag + List nodeTags = nodes.stream().map(Node::getTag) + .collect(Collectors.toList()); + List targetTags = Arrays.asList("a1", "a2", "a3", "b1", "s11", "s12"); + for (String id : targetTags) { + Assertions.assertTrue(nodeTags.contains(id)); + } + } + + @Test + public void getNodesTest3() { + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain3"); + // 判断总数量 + Assertions.assertEquals(8, nodes.size()); + // 判断 id 与数量 + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + Map map = listToMap(nodeIds); + Map targetMap = new HashMap<>(); + targetMap.put("a", 2); + targetMap.put("b", 2); + targetMap.put("c", 1); + targetMap.put("f", 1); + targetMap.put("s1", 1); + targetMap.put("s2", 1); + Assertions.assertTrue(targetMap.equals(map)); + } + + @Test + public void getNodesTest4() { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain4"); + // 判断数量 + Assertions.assertEquals(5, nodes.size()); + // 判断 id + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + List targetIds = Arrays.asList("a", "b", "c", "s"); + for (String id : targetIds) { + Assertions.assertTrue(nodeIds.contains(id)); + } + } + + @Test + public void getNodesTest5() { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assertions.assertTrue(response.isSuccess()); + List nodes = FlowBus.getNodesByChainId("chain5"); + // 判断数量 + Assertions.assertEquals(3, nodes.size()); + // 判断 id + List nodeIds = nodes.stream().map(Node::getId) + .collect(Collectors.toList()); + List targetIds = Arrays.asList("x", "y", "s1"); + for (String id : targetIds) { + Assertions.assertTrue(nodeIds.contains(id)); + } + } + + // 统计节点 id 出现的数量 + private Map listToMap(List list) { + Map map = new HashMap<>(); + for (String s : list) { + map.put(s, map.getOrDefault(s, 0) + 1); + } + return map; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/ACmp.java new file mode 100644 index 000000000..8deacaeb0 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/ACmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.javascript.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/BCmp.java new file mode 100644 index 000000000..0e634e36d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/BCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.javascript.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/CCmp.java new file mode 100644 index 000000000..ad7bffdee --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/CCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.javascript.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/FCmp.java new file mode 100644 index 000000000..2a3b7b09d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/FCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.script.javascript.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeIfComponent; +import org.springframework.stereotype.Component; + +@Component("f") +public class FCmp extends NodeIfComponent { + @Override + public boolean processIf() throws Exception { + return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/SCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/SCmp.java new file mode 100644 index 000000000..937a973d9 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/getnodes/cmp/SCmp.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.script.javascript.getnodes.cmp; + +import com.yomahub.liteflow.core.NodeSwitchComponent; +import org.springframework.stereotype.Component; + +@Component("s") +public class SCmp extends NodeSwitchComponent { + @Override + public String processSwitch() throws Exception { + return "f1"; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/application.properties new file mode 100644 index 000000000..4acf0f012 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=getnodes/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/flow.xml new file mode 100644 index 000000000..78a84de68 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/getnodes/flow.xml @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + THEN(a, b, c, s1, s2); + + + + + THEN(a.tag("a1"), a.tag("a2"), a.tag("a3"), b.tag("b1"), s1.tag("s11"), s1.tag("s12")); + + + + + THEN(WHEN(a, b), IF(f, WHEN(THEN(c, s2, WHEN(s1, b)), a))); + + + + SWITCH(s).to(FOR(3).DO(a).id("f1"), b, c); + + + + WHILE(x).DO(s1).BREAK(y); + + \ No newline at end of file From d5e3a22014441f74137ecaa1692ea49dbbcb0241 Mon Sep 17 00:00:00 2001 From: DaleLee <1658850308@qq.com> Date: Fri, 2 Feb 2024 16:15:17 +0800 Subject: [PATCH 33/49] =?UTF-8?q?For=20#I8MW6Q,=20=E5=AE=8C=E5=96=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/flow/FlowBus.java | 28 ++++++++++--------- .../LiteFlowAviatorScriptRemoveELTest.java | 2 +- .../remove/LiteFlowJsScriptRemoveELTest.java | 2 +- .../LiteFlowGroovyScriptRemoveELTest.java | 2 +- .../LiteFlowJavaScriptRemoveELTest.java | 2 +- .../remove/LiteFlowJsScriptRemoveELTest.java | 2 +- .../remove/LiteFlowLuaScriptRemoveELTest.java | 2 +- .../LiteFlowPythonScriptRemoveELTest.java | 2 +- .../LiteFlowQLExpressScriptRemoveELTest.java | 2 +- 9 files changed, 23 insertions(+), 21 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 17e8a5ca8..abf11c145 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -306,19 +306,7 @@ public class FlowBus { // 移除节点 public static boolean removeNode(String nodeId) { - Node node = getNode(nodeId); - if (node == null) { - // 节点不存在 - return false; - } - nodeMap.remove(nodeId); - // 如果是脚本节点,移除脚本 - if (node.getType().isScript()) { - ScriptExecutorFactory.loadInstance() - .getScriptExecutor(node.getLanguage()) - .unLoad(nodeId); - } - return true; + return nodeMap.remove(nodeId) != null; } // 判断是否是降级组件,如果是则添加到 fallbackNodeMap @@ -346,6 +334,20 @@ public class FlowBus { .load(nodeId, script); } + // 卸载脚本节点 + public static boolean unloadScriptNode(String nodeId) { + Node node = getNode(nodeId); + if (node == null || !node.getType().isScript()) { + return false; + } + // 卸载脚本 + ScriptExecutorFactory.loadInstance() + .getScriptExecutor(node.getLanguage()) + .unLoad(nodeId); + // 移除脚本 + return removeNode(nodeId); + } + public static void clearStat(){ initStat.set(false); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java index 738bd09e5..91dda522c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-aviator-springboot/src/test/java/com/yomahub/liteflow/test/script/aviator/remove/LiteFlowAviatorScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowAviatorScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Long.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java index 86db95027..f717aa0ac 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/remove/LiteFlowJsScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java index e1c0e6ad6..fe0d8ec21 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/remove/LiteFlowGroovyScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowGroovyScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java index 205ba5a36..1fea75100 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/java/com/yomahub/liteflow/test/script/java/remove/LiteFlowJavaScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowJavaScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java index a104fd333..fd1740dad 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/java/com/yomahub/liteflow/test/script/javascript/remove/LiteFlowJsScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowJsScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Double.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java index 951d0a94a..395cfbd1d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-lua-springboot/src/test/java/com/yomahub/liteflow/test/script/lua/remove/LiteFlowLuaScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowLuaScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java index fd06b7eaa..c4643525d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/remove/LiteFlowPythonScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowPythonScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java index c86d6a2d3..99d727048 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/remove/LiteFlowQLExpressScriptRemoveELTest.java @@ -79,7 +79,7 @@ public class LiteFlowQLExpressScriptRemoveELTest extends BaseTest { Assertions.assertEquals(Integer.valueOf(5), context.getData("s2")); // 卸载节点 - FlowBus.removeNode("s2"); + FlowBus.unloadScriptNode("s2"); // 旧 chain 报脚本加载错误 response = flowExecutor.execute2Resp("chain2", "arg"); From 0f752f97b42941a67bad81449ddddfb203e6a236 Mon Sep 17 00:00:00 2001 From: DaleLee <1658850308@qq.com> Date: Fri, 2 Feb 2024 22:52:16 +0800 Subject: [PATCH 34/49] =?UTF-8?q?=E5=AE=8C=E5=96=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/yomahub/liteflow/script/ScriptExecutor.java | 11 +++++++---- .../liteflow/script/jsr223/JSR223ScriptExecutor.java | 1 + .../script/graaljs/GraalJavaScriptExecutor.java | 2 -- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java index 4d66e2701..45702c7cb 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptExecutor.java @@ -2,15 +2,12 @@ package com.yomahub.liteflow.script; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.yomahub.liteflow.annotation.util.AnnoUtil; -import com.yomahub.liteflow.context.ContextBean; import com.yomahub.liteflow.enums.ScriptTypeEnum; import com.yomahub.liteflow.exception.LiteFlowException; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; -import javax.script.ScriptException; +import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -28,6 +25,12 @@ public abstract class ScriptExecutor { public abstract void load(String nodeId, String script); + // 卸载脚本(不包含 node) + public abstract void unLoad(String nodeId); + + // 获取该执行器下的所有 nodeId + public abstract List getNodeIds(); + public Object execute(ScriptExecuteWrap wrap) throws Exception{ try { return executeScript(wrap); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java index ecfc89daa..4fd1cf69f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -14,6 +14,7 @@ import javax.script.CompiledScript; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.SimpleBindings; +import javax.script.ScriptException; import java.util.ArrayList; import java.util.List; import java.util.Map; diff --git a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java index 86d6a1fe6..82f410bde 100644 --- a/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-graaljs/src/main/java/com/yomahub/liteflow/script/graaljs/GraalJavaScriptExecutor.java @@ -1,9 +1,7 @@ package com.yomahub.liteflow.script.graaljs; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ScriptTypeEnum; -import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutor; import com.yomahub.liteflow.script.exception.ScriptLoadException; From dd776b8c6290b627651b0ff09f90e753f5ec16ea Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 12 Feb 2024 16:47:42 +0800 Subject: [PATCH 35/49] =?UTF-8?q?=E4=B8=BA=E5=BC=82=E6=AD=A5=E8=B6=85?= =?UTF-8?q?=E6=97=B6=E6=8F=90=E4=BE=9B=E6=96=B0=E7=9A=84=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parallel/CompletableFutureExpand.java | 87 +++++++++++++++++++ .../parallel/CompletableFutureTimeout.java | 3 +- .../strategy/ParallelStrategyExecutor.java | 21 +++-- .../liteflow/test/whenTimeOut/cmp/BCmp.java | 2 +- .../liteflow/test/whenTimeOut/cmp/CCmp.java | 11 +-- 5 files changed, 107 insertions(+), 17 deletions(-) create mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureExpand.java diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureExpand.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureExpand.java new file mode 100644 index 000000000..37ba6dbb6 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureExpand.java @@ -0,0 +1,87 @@ +package com.yomahub.liteflow.flow.parallel; + +import java.util.concurrent.*; +import java.util.function.BiConsumer; + +public class CompletableFutureExpand { + + /** + * 如果在给定超时之前未完成,则异常完成此 CompletableFuture 并抛出 {@link TimeoutException} 。 + * + * @param timeout 在出现 TimeoutException 异常完成之前等待多长时间,以 {@code unit} 为单位 + * @param unit 一个 {@link TimeUnit},结合 {@code timeout} 参数,表示给定粒度单位的持续时间 + * @return 入参的 CompletableFuture + */ + public static CompletableFuture completeOnTimeout(CompletableFuture future, long timeout, TimeUnit unit, T timeoutDefaultObj) { + if (future.isDone()) { + return future; + } + + return future.whenComplete(new Canceller(Delayer.delay(new Timeout<>(future, timeoutDefaultObj), timeout, unit))); + } + + /** + * 超时时异常完成的操作 + */ + static final class Timeout implements Runnable { + final CompletableFuture future; + + final T timeoutDefaultObj; + + Timeout(CompletableFuture future, T timeoutDefaultObj) { + this.future = future; + this.timeoutDefaultObj = timeoutDefaultObj; + } + + public void run() { + if (null != future && !future.isDone()) { + future.complete(timeoutDefaultObj); + } + } + } + + /** + * 取消不需要的超时的操作 + */ + static final class Canceller implements BiConsumer { + final Future future; + + Canceller(Future future) { + this.future = future; + } + + public void accept(Object ignore, Throwable ex) { + if (null == ex && null != future && !future.isDone()) { + future.cancel(false); + } + } + } + + /** + * 单例延迟调度器,仅用于启动和取消任务,一个线程就足够 + */ + static final class Delayer { + + static final ScheduledThreadPoolExecutor delayer; + + static ScheduledFuture delay(Runnable command, long delay, TimeUnit unit) { + return delayer.schedule(command, delay, unit); + } + + static final class DaemonThreadFactory implements ThreadFactory { + + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setDaemon(true); + t.setName("CompletableFutureExpandUtilsDelayScheduler"); + return t; + } + } + + static { + delayer = new ScheduledThreadPoolExecutor(1, new DaemonThreadFactory()); + delayer.setRemoveOnCancelPolicy(true); + } + } +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureTimeout.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureTimeout.java index e73ec8c78..54e645ebc 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureTimeout.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/CompletableFutureTimeout.java @@ -63,8 +63,7 @@ public class CompletableFutureTimeout { } // 哪个先完成 就apply哪一个结果 这是一个关键的API,exceptionally出现异常后返回默认值 - public static CompletableFuture completeOnTimeout(T t, CompletableFuture future, long timeout, - TimeUnit unit) { + public static CompletableFuture completeOnTimeout(CompletableFuture future, long timeout, TimeUnit unit, T t) { final CompletableFuture timeoutFuture = timeoutAfter(timeout, unit); return future.applyToEither(timeoutFuture, Function.identity()).exceptionally((throwable) -> t); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java index 27a8f4892..c0cabd242 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java @@ -10,6 +10,7 @@ import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.condition.FinallyCondition; import com.yomahub.liteflow.flow.element.condition.PreCondition; import com.yomahub.liteflow.flow.element.condition.WhenCondition; +import com.yomahub.liteflow.flow.parallel.CompletableFutureExpand; import com.yomahub.liteflow.flow.parallel.CompletableFutureTimeout; import com.yomahub.liteflow.flow.parallel.ParallelSupplier; import com.yomahub.liteflow.flow.parallel.WhenFutureObj; @@ -53,11 +54,11 @@ public abstract class ParallelStrategyExecutor { WhenCondition whenCondition, String currChainName, Integer slotIndex) { // 套入 CompletableFutureTimeout 方法进行超时判断,如果超时则用 WhenFutureObj.timeOut 返回超时的对象 // 第 2 个参数是主要的本体 CompletableFuture,传入了 ParallelSupplier 和线程池对象 - return CompletableFutureTimeout.completeOnTimeout( - WhenFutureObj.timeOut(executable.getId()), + return CompletableFutureExpand.completeOnTimeout( CompletableFuture.supplyAsync(new ParallelSupplier(executable, currChainName, slotIndex), parallelExecutor), whenCondition.getMaxWaitTime(), - whenCondition.getMaxWaitTimeUnit()); + whenCondition.getMaxWaitTimeUnit(), + WhenFutureObj.timeOut(executable.getId())); } /** @@ -167,11 +168,11 @@ public abstract class ParallelStrategyExecutor { * 任务结果处理 * @param whenCondition 并行组件对象 * @param slotIndex 当前 slot 的 index - * @param whenAllTaskList 并行组件中所有任务列表 + * @param whenAllFutureList 并行组件中所有任务列表 * @param specifyTask 指定预先完成的任务,详见 {@link ParallelStrategyEnum} * @throws Exception */ - protected void handleTaskResult(WhenCondition whenCondition, Integer slotIndex, List> whenAllTaskList, + protected void handleTaskResult(WhenCondition whenCondition, Integer slotIndex, List> whenAllFutureList, CompletableFuture specifyTask) throws Exception { Slot slot = DataBus.getSlot(slotIndex); @@ -193,17 +194,23 @@ public abstract class ParallelStrategyExecutor { // 如果 any 为 true,那么这里拿到的是第一个完成的任务 // 如果为 must,那么这里获取到的就是指定的任务 // 这里过滤和转换一起用 lambda 做了 - List allCompletableWhenFutureObjList = whenAllTaskList.stream().filter(f -> { + List allCompletableWhenFutureObjList = whenAllFutureList.stream().filter(f -> { // 过滤出已经完成的,没完成的就直接终止 if (f.isDone()) { return true; } else { + //事实上CompletableFuture并不能cancel掉底层的线程 f.cancel(true); return false; } }).map(f -> { try { - return f.get(); + WhenFutureObj whenFutureObj = f.get(); + if (whenFutureObj.isTimeout()){ + //事实上CompletableFuture并不能cancel掉底层的线程 + f.cancel(true); + } + return whenFutureObj; } catch (InterruptedException | ExecutionException e) { interrupted[0] = true; return null; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/BCmp.java index f5778fcd9..9c3cb6bd0 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/BCmp.java @@ -16,7 +16,7 @@ public class BCmp extends NodeComponent { @Override public void process() { try { - Thread.sleep(4000); + Thread.sleep(2000); } catch (Exception ignored) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/CCmp.java index e50c9689e..abdb1f12e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/whenTimeOut/cmp/CCmp.java @@ -14,14 +14,11 @@ import org.springframework.stereotype.Component; public class CCmp extends NodeComponent { @Override - public void process() { - try { - Thread.sleep(3500); + public void process() throws Exception{ + for (int i = 0; i < 10; i++) { + System.out.println("executing cmp c"); + Thread.sleep(500); } - catch (Exception ignored) { - - } - System.out.println("CCmp executed!"); } } From 12c37cd4ea549b298b3cadc24c000156b7cb7255 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 15 Feb 2024 23:32:39 +0800 Subject: [PATCH 36/49] =?UTF-8?q?=E6=8A=8A=E7=BA=BF=E7=A8=8B=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E7=A7=BB=E5=88=B0Node=E7=B1=BB=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../el/operator/base/OperatorHelper.java | 2 +- .../yomahub/liteflow/core/NodeComponent.java | 47 ++++------------ .../liteflow/flow/element/FallbackNode.java | 4 +- .../yomahub/liteflow/flow/element/Node.java | 54 ++++++++++++++----- .../src/test/resources/base/flow.el.xml | 2 +- 5 files changed, 55 insertions(+), 54 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java index 07a163412..0de9cbf34 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java @@ -117,7 +117,7 @@ public class OperatorHelper { if (clazz.isAssignableFrom(object.getClass())) { if (object instanceof Node) { Node node = (Node) object; - return (T) node.copy(); + return (T) node.clone(); } else { return (T) object; 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 2ed37eeee..a0cbc7f06 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 @@ -7,13 +7,10 @@ */ package com.yomahub.liteflow.core; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.StopWatch; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; -import com.yomahub.liteflow.exception.ChainEndException; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.executor.NodeExecutor; @@ -23,28 +20,21 @@ import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; import com.yomahub.liteflow.spi.holder.CmpAroundAspectHolder; import com.yomahub.liteflow.util.JsonUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.yomahub.liteflow.flow.entity.CmpStep; import com.yomahub.liteflow.enums.CmpStepTypeEnum; import com.yomahub.liteflow.slot.DataBus; import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.monitor.CompStatistics; import com.yomahub.liteflow.monitor.MonitorBus; - import java.lang.reflect.Method; import java.util.Date; -import java.util.Deque; -import java.util.Map; -import java.util.function.Predicate; /** * 普通组件抽象类 * * @author Bryan.Zhang */ -public abstract class NodeComponent { +public abstract class NodeComponent{ private final LFLog LOG = LFLoggerManager.getLogger(this.getClass()); @@ -77,16 +67,11 @@ public abstract class NodeComponent { private final TransmittableThreadLocal refNodeTL = new TransmittableThreadLocal<>(); /** - ******************* 以下的属性为线程附加属性******************** 线程属性是指每一个request的值都是不一样的 + ******************* 以下的属性为线程附加属性******************** + * 线程属性是指每一个request的值都是不一样的 * 这里NodeComponent是单例,所以要用ThreadLocal来修饰 */ - // 当前slot的index - private final TransmittableThreadLocal slotIndexTL = new TransmittableThreadLocal<>(); - - // 是否结束整个流程,这个只对串行流程有效,并行流程无效 - private final TransmittableThreadLocal isEndTL = new TransmittableThreadLocal<>(); - public NodeComponent() { // 反射判断是否重写了rollback方法 Class clazz = this.getClass(); @@ -237,39 +222,25 @@ public abstract class NodeComponent { // 是否结束整个流程(不往下继续执行) public boolean isEnd() { - Boolean isEnd = isEndTL.get(); + Boolean isEnd = this.refNodeTL.get().getIsEnd(); if (ObjectUtil.isNull(isEnd)) { return false; - } - else { - return isEndTL.get(); + }else { + return isEnd; } } // 设置是否结束整个流程 public void setIsEnd(boolean isEnd) { - this.isEndTL.set(isEnd); - } - - public void removeIsEnd() { - this.isEndTL.remove(); - } - - public NodeComponent setSlotIndex(Integer slotIndex) { - this.slotIndexTL.set(slotIndex); - return this; + this.refNodeTL.get().setIsEnd(isEnd); } public Integer getSlotIndex() { - return this.slotIndexTL.get(); - } - - public void removeSlotIndex() { - this.slotIndexTL.remove(); + return this.refNodeTL.get().getSlotIndex(); } public Slot getSlot() { - return DataBus.getSlot(this.slotIndexTL.get()); + return DataBus.getSlot(this.getSlotIndex()); } public T getFirstContextBean() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java index 966f37a61..a3746cbd6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java @@ -64,7 +64,7 @@ public class FallbackNode extends Node { this.getCurrChainId())); } // 使用 node 的副本 - this.fallbackNode = node.copy(); + this.fallbackNode = node.clone(); } private Node findFallbackNode(Condition condition) { @@ -168,7 +168,7 @@ public class FallbackNode extends Node { } @Override - public Node copy() { + public Node clone() { // 代理节点不复制 return this; } 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 1a4588e7e..ee75d08d4 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 @@ -59,10 +59,18 @@ public class Node implements Executable, Cloneable, Rollbackable{ // node 的 isAccess 结果,主要用于 WhenCondition 的提前 isAccess 判断,避免 isAccess 方法重复执行 private TransmittableThreadLocal accessResult = new TransmittableThreadLocal<>(); + // 循环下标 private TransmittableThreadLocal loopIndexTL = new TransmittableThreadLocal<>(); + // 迭代对象 private TransmittableThreadLocal currLoopObject = new TransmittableThreadLocal<>(); + // 当前slot的index + private TransmittableThreadLocal slotIndexTL = new TransmittableThreadLocal<>(); + + // 是否结束整个流程,这个只对串行流程有效,并行流程无效 + private TransmittableThreadLocal isEndTL = new TransmittableThreadLocal<>(); + public Node() { } @@ -129,7 +137,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ try { // 把线程属性赋值给组件对象 - instance.setSlotIndex(slotIndex); + this.setSlotIndex(slotIndex); instance.setRefNode(this); // 判断是否可执行,所以isAccess经常作为一个组件进入的实际判断要素,用作检查slot里的参数的完备性 @@ -172,9 +180,9 @@ public class Node implements Executable, Cloneable, Rollbackable{ } finally { // 移除threadLocal里的信息 - instance.removeSlotIndex(); - instance.removeIsEnd(); instance.removeRefNode(); + removeSlotIndex(); + removeIsEnd(); removeLoopIndex(); removeAccessResult(); } @@ -187,7 +195,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ Slot slot = DataBus.getSlot(slotIndex); try { // 把线程属性赋值给组件对象 - instance.setSlotIndex(slotIndex); + this.setSlotIndex(slotIndex); instance.setRefNode(this); instance.doRollback(); } @@ -197,7 +205,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ } finally { // 移除threadLocal里的信息 - instance.removeSlotIndex(); + this.removeSlotIndex(); instance.removeRefNode(); } } @@ -209,7 +217,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ @Override public boolean isAccess(Integer slotIndex) throws Exception { // 把线程属性赋值给组件对象 - instance.setSlotIndex(slotIndex); + this.setSlotIndex(slotIndex); instance.setRefNode(this); return instance.isAccess(); } @@ -289,6 +297,30 @@ public class Node implements Executable, Cloneable, Rollbackable{ this.currLoopObject.remove(); } + public Integer getSlotIndex(){ + return this.slotIndexTL.get(); + } + + public void setSlotIndex(Integer slotIndex){ + this.slotIndexTL.set(slotIndex); + } + + public void removeSlotIndex(){ + this.slotIndexTL.remove(); + } + + public Boolean getIsEnd(){ + return this.isEndTL.get(); + } + + public void setIsEnd(Boolean isEnd){ + this.isEndTL.set(isEnd); + } + + public void removeIsEnd(){ + this.isEndTL.remove(); + } + public String getLanguage() { return language; } @@ -303,15 +335,13 @@ public class Node implements Executable, Cloneable, Rollbackable{ } @Override - protected Object clone() throws CloneNotSupportedException { - return super.clone(); - } - - public Node copy() throws Exception { - Node node = (Node)this.clone(); + public Node clone() throws CloneNotSupportedException { + Node node = (Node)super.clone(); node.loopIndexTL = new TransmittableThreadLocal<>(); node.currLoopObject = new TransmittableThreadLocal<>(); node.accessResult = new TransmittableThreadLocal<>(); + node.slotIndexTL = new TransmittableThreadLocal<>(); + node.isEndTL = new TransmittableThreadLocal<>(); return node; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/base/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/base/flow.el.xml index af69a1c64..aab117311 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/base/flow.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/base/flow.el.xml @@ -2,7 +2,7 @@ - THEN(a,b,WHEN(c,d)); + THEN(a,b,b,a); From 32f8c33589935af888ac0ac484483e4b38b4939e Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Sun, 18 Feb 2024 15:15:28 +0800 Subject: [PATCH 37/49] =?UTF-8?q?=E5=BA=95=E5=B1=82=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/core/NodeBreakComponent.java | 6 +- .../yomahub/liteflow/core/NodeComponent.java | 6 ++ .../liteflow/core/NodeForComponent.java | 6 +- .../liteflow/core/NodeIfComponent.java | 6 +- .../liteflow/core/NodeIteratorComponent.java | 6 +- .../liteflow/core/NodeSwitchComponent.java | 6 +- .../liteflow/core/NodeWhileComponent.java | 6 +- .../com/yomahub/liteflow/flow/FlowBus.java | 8 ++- .../liteflow/flow/element/Condition.java | 23 +++++++ .../liteflow/flow/element/FallbackNode.java | 9 +++ .../yomahub/liteflow/flow/element/Node.java | 2 +- .../yomahub/liteflow/util/NodeScanner.java | 69 ------------------- 12 files changed, 57 insertions(+), 96 deletions(-) delete mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java index a26bdb8cc..35d838b14 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java @@ -16,8 +16,7 @@ public abstract class NodeBreakComponent extends NodeComponent { public void process() throws Exception { boolean breakFlag = processBreak(); Slot slot = this.getSlot(); - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setBreakResult(originalClass.getName(), breakFlag); + slot.setBreakResult(this.getMetaValueKey(), breakFlag); } public abstract boolean processBreak() throws Exception; @@ -25,8 +24,7 @@ public abstract class NodeBreakComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Boolean getItemResultMetaValue(Integer slotIndex) { - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getBreakResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getBreakResult(this.getMetaValueKey()); } } 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 a0cbc7f06..9bf9feaca 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 @@ -11,6 +11,7 @@ import cn.hutool.core.date.StopWatch; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; +import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.executor.NodeExecutor; @@ -429,4 +430,9 @@ public abstract class NodeComponent{ public T getItemResultMetaValue(Integer slotIndex){ return null; } + + protected String getMetaValueKey(){ + Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); + return originalClass.getName(); + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java index 53675e614..7f65a57e4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeForComponent.java @@ -16,8 +16,7 @@ public abstract class NodeForComponent extends NodeComponent { public void process() throws Exception { int forCount = processFor(); Slot slot = this.getSlot(); - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setForResult(originalClass.getName(), forCount); + slot.setForResult(this.getMetaValueKey(), forCount); } public abstract int processFor() throws Exception; @@ -25,8 +24,7 @@ public abstract class NodeForComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Integer getItemResultMetaValue(Integer slotIndex) { - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getForResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getForResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java index 341051279..c8dc973f4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java @@ -14,8 +14,7 @@ public abstract class NodeIfComponent extends NodeComponent { @Override public void process() throws Exception { boolean result = this.processIf(); - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - this.getSlot().setIfResult(originalClass.getName(), result); + this.getSlot().setIfResult(this.getMetaValueKey(), result); } public abstract boolean processIf() throws Exception; @@ -23,7 +22,6 @@ public abstract class NodeIfComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Boolean getItemResultMetaValue(Integer slotIndex) { - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getIfResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getIfResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java index f8aec09ea..6f5068da7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIteratorComponent.java @@ -18,8 +18,7 @@ public abstract class NodeIteratorComponent extends NodeComponent { public void process() throws Exception { Iterator it = processIterator(); Slot slot = this.getSlot(); - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setIteratorResult(originalClass.getName(), it); + slot.setIteratorResult(this.getMetaValueKey(), it); } public abstract Iterator processIterator() throws Exception; @@ -27,8 +26,7 @@ public abstract class NodeIteratorComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Iterator getItemResultMetaValue(Integer slotIndex) { - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getIteratorResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getIteratorResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java index b24e32296..c4320a4e2 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeSwitchComponent.java @@ -20,8 +20,7 @@ public abstract class NodeSwitchComponent extends NodeComponent { @Override public void process() throws Exception { String nodeId = this.processSwitch(); - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - this.getSlot().setSwitchResult(originalClass.getName(), nodeId); + this.getSlot().setSwitchResult(this.getMetaValueKey(), nodeId); } // 用以返回路由节点的beanId @@ -30,8 +29,7 @@ public abstract class NodeSwitchComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public String getItemResultMetaValue(Integer slotIndex) { - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getSwitchResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getSwitchResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java index 446b6587a..07e66374a 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java @@ -16,8 +16,7 @@ public abstract class NodeWhileComponent extends NodeComponent { public void process() throws Exception { boolean whileFlag = processWhile(); Slot slot = this.getSlot(); - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - slot.setWhileResult(originalClass.getName(), whileFlag); + slot.setWhileResult(this.getMetaValueKey(), whileFlag); } public abstract boolean processWhile() throws Exception; @@ -25,8 +24,7 @@ public abstract class NodeWhileComponent extends NodeComponent { @Override @SuppressWarnings("unchecked") public Boolean getItemResultMetaValue(Integer slotIndex) { - Class originalClass = LiteFlowProxyUtil.getUserClass(this.getClass()); - return DataBus.getSlot(slotIndex).getWhileResult(originalClass.getName()); + return DataBus.getSlot(slotIndex).getWhileResult(this.getMetaValueKey()); } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index abf11c145..f39a0b219 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -21,6 +21,7 @@ import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.ComponentCannotRegisterException; import com.yomahub.liteflow.exception.NullNodeTypeException; import com.yomahub.liteflow.flow.element.Chain; +import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; @@ -37,11 +38,12 @@ import com.yomahub.liteflow.spi.holder.ContextAwareHolder; import com.yomahub.liteflow.spi.holder.DeclComponentParserHolder; import com.yomahub.liteflow.util.CopyOnWriteHashMap; import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; -import com.yomahub.liteflow.util.NodeScanner; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.function.Function; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 流程元数据类 @@ -245,7 +247,9 @@ public class FlowBus { // 获取某一个 chainId 下的所有 nodeId public static List getNodesByChainId(String chainId) { Chain chain = getChain(chainId); - return NodeScanner.getNodesInChain(chain); + return chain.getConditionList().stream().flatMap( + (Function>) condition -> condition.getAllNodeInCondition().stream() + ).collect(Collectors.toList()); } public static Map getNodeMap() { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java index 0d4eec6a7..667b78be8 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Condition.java @@ -22,6 +22,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * Condition的抽象类 @@ -103,6 +108,24 @@ public abstract class Condition implements Executable{ } } + public List getAllNodeInCondition(){ + List executableList = this.executableGroup.entrySet().stream().flatMap( + (Function>, Stream>) entry -> entry.getValue().stream() + ).collect(Collectors.toList()); + + List resultList = new ArrayList<>(); + + executableList.stream().forEach(executable -> { + if (executable instanceof Condition){ + resultList.addAll(((Condition)executable).getAllNodeInCondition()); + }else if(executable instanceof Node){ + resultList.add((Node)executable); + } + }); + + return resultList; + } + public void setExecutableList(List executableList) { this.executableGroup.put(ConditionKey.DEFAULT_KEY, executableList); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java index a3746cbd6..ea2007961 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java @@ -2,6 +2,7 @@ package com.yomahub.liteflow.flow.element; import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.ObjectUtil; +import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.FallbackCmpNotFoundException; @@ -162,6 +163,14 @@ public class FallbackNode extends Node { return this.fallbackNode.isAccess(slotIndex); } + @Override + public NodeComponent getInstance() { + if (fallbackNode == null){ + return null; + } + return fallbackNode.getInstance(); + } + @Override public String getId() { return this.fallbackNode == null ? null : this.fallbackNode.getId(); 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 ee75d08d4..e3c137d7f 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 @@ -180,7 +180,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ } finally { // 移除threadLocal里的信息 - instance.removeRefNode(); + this.getInstance().removeRefNode(); removeSlotIndex(); removeIsEnd(); removeLoopIndex(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java deleted file mode 100644 index 95ce4d4e1..000000000 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/NodeScanner.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.yomahub.liteflow.util; - -import com.yomahub.liteflow.flow.element.Chain; -import com.yomahub.liteflow.flow.element.Condition; -import com.yomahub.liteflow.flow.element.Executable; -import com.yomahub.liteflow.flow.element.Node; - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Queue; - -/** - * 节点扫描器 - * - * @author DaleLee - * @since 2.12.0 - */ -public class NodeScanner { - - /** - * 获取 Chain 中的所有 Node - * - * @param chain Chain - * @return Node 集合 - */ - public static List getNodesInChain(Chain chain) { - List result = new ArrayList<>(); - if (chain == null) { - return result; - } - for (Condition condition : chain.getConditionList()) { - result.addAll(getNodesInCondition(condition)); - } - return result; - } - - /** - * 获取 Condition 中的所有 Node - * - * @param condition Condition - * @return Node 集合 - */ - public static List getNodesInCondition(Condition condition) { - List result = new ArrayList<>(); - if (condition == null) { - return result; - } - - // 层序遍历 - Queue queue = new LinkedList<>(); - queue.offer(condition); - - while (!queue.isEmpty()) { - Executable cur = queue.poll(); - if (cur instanceof Condition) { - Map> executableGroup = ((Condition) cur).getExecutableGroup(); - for (List executables : executableGroup.values()) { - executables.forEach(queue::offer); - } - } else if (cur instanceof Node) { - result.add((Node) cur); - } - } - - return result; - } -} From e51c7c6052d775b439c6a88575811fc1a5dccb41 Mon Sep 17 00:00:00 2001 From: feiL Date: Sun, 18 Feb 2024 16:15:32 +0800 Subject: [PATCH 38/49] =?UTF-8?q?fix(issues#I8X0NW):=20=E5=A4=9A=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8A=A0=E8=BD=BD=E7=9B=91=E5=90=AC=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit com.yomahub.liteflow.spi.spring.SpringPathContentParser#getResources 97行判断逻辑抽出 --- .../yomahub/liteflow/spi/spring/SpringPathContentParser.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringPathContentParser.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringPathContentParser.java index 137208541..c77ef8443 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringPathContentParser.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/spi/spring/SpringPathContentParser.java @@ -29,6 +29,7 @@ public class SpringPathContentParser implements PathContentParser { public List parseContent(List pathList) throws Exception { List absolutePathList = PathMatchUtil.searchAbsolutePath(pathList); List allResource = getResources(absolutePathList); + verifyFileExtName(allResource); // 转换成内容List List contentList = new ArrayList<>(); @@ -90,14 +91,16 @@ public class SpringPathContentParser implements PathContentParser { allResource.addAll(ListUtil.toList(resources)); } } + return allResource; + } + private void verifyFileExtName(List allResource) { // 检查资源都是同一个类型,如果出现不同类型的配置,则抛出错误提示 Set fileTypeSet = new HashSet<>(); allResource.forEach(resource -> fileTypeSet.add(FileUtil.extName(resource.getFilename()))); if (fileTypeSet.size() > 1) { throw new ConfigErrorException("config error,please use the same type of configuration"); } - return allResource; } @Override From 15c72341186cbd8473b17a730a237e8d31349fc6 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 20 Feb 2024 19:28:40 +0800 Subject: [PATCH 39/49] =?UTF-8?q?=E8=B5=9E=E5=8A=A9=E5=95=86=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 ++++ README.zh-CN.md | 4 ++++ static/img/fb-banner.png | Bin 0 -> 297936 bytes 3 files changed, 8 insertions(+) create mode 100644 static/img/fb-banner.png diff --git a/README.md b/README.md index d523e5a25..dc7523213 100644 --- a/README.md +++ b/README.md @@ -101,6 +101,10 @@ To join the LF CLUB, please scan the QR code below or click on the image to go d +**FastBee物联网平台** + + + **WECHAT OFFICIAL ACCOUNT** Since the community group is over 200 people, you need to be invited to join the group. Follow the WECHAT OFFICIAL ACCOUNT and click `Personal WeChat` to add me, I can invite you into the group diff --git a/README.zh-CN.md b/README.zh-CN.md index fa636c339..d15e96de6 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -95,6 +95,10 @@ LF CLUB里能解决你在使用LiteFlow框架时碰到的所有问题,并有 +**FastBee物联网平台** + + + **微信公众号** 社区群需要邀请入群。关注公众号后点击`个人微信`加我,我可以拉你入群 diff --git a/static/img/fb-banner.png b/static/img/fb-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc188cda4c864c2dd1bacb9229601fc2010992e GIT binary patch literal 297936 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 E3%=cy Date: Tue, 20 Feb 2024 19:50:43 +0800 Subject: [PATCH 40/49] =?UTF-8?q?=E8=B5=9E=E5=8A=A9=E5=95=86=E6=9B=B4?= =?UTF-8?q?=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/img/fb-banner.png | Bin 297936 -> 335180 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/static/img/fb-banner.png b/static/img/fb-banner.png index 5cc188cda4c864c2dd1bacb9229601fc2010992e..12f4cdd599849d55748aec137a8ea0b7aedda70b 100644 GIT binary patch literal 335180 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 z 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 + *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.route.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/BCmp.java new file mode 100644 index 000000000..2f71f619d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/BCmp.java @@ -0,0 +1,21 @@ +/** + *

Title: liteflow

+ *

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

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.route.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R1.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R1.java new file mode 100644 index 000000000..e74b21ba7 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R1.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.route.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; + +@LiteflowComponent("r1") +public class R1 extends NodeBooleanComponent { + @Override + public boolean processBoolean() throws Exception { + return true; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R2.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R2.java new file mode 100644 index 000000000..2faee1887 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R2.java @@ -0,0 +1,12 @@ +package com.yomahub.liteflow.test.route.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; + +@LiteflowComponent("r2") +public class R2 extends NodeBooleanComponent { + @Override + public boolean processBoolean() throws Exception { + return false; + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/application.properties b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/application.properties new file mode 100644 index 000000000..0a81040f7 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=route/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/flow.el.xml new file mode 100644 index 000000000..f752f2f1f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/flow.el.xml @@ -0,0 +1,21 @@ + + + + + + r1 + + + THEN(a,b); + + + + + + OR(r1,r2) + + + THEN(a,b); + + + \ No newline at end of file From a036ae00ee7ab434044b2b596ff2703ed050e30a Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Fri, 8 Mar 2024 12:58:34 +0800 Subject: [PATCH 47/49] =?UTF-8?q?enhancement=20#I8YDGE=20=E5=9C=A8?= =?UTF-8?q?=E8=BF=AD=E4=BB=A3=E5=BE=AA=E7=8E=AF=E7=BB=84=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E6=97=A0=E6=B3=95=E8=8E=B7=E5=8F=96=E5=AD=90=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BC=A0=E9=80=92=E7=9A=84=E8=AF=B7=E6=B1=82=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../parallel/strategy/ParallelStrategyExecutor.java | 12 ++++++------ .../parallel/strategy/SpecifyParallelExecutor.java | 6 +++--- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java index e420876f2..4ca07a9d4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java @@ -45,16 +45,16 @@ public abstract class ParallelStrategyExecutor { * @param executable * @param parallelExecutor * @param whenCondition - * @param currChainName + * @param currChainId * @param slotIndex * @return */ protected CompletableFuture wrappedFutureObj(Executable executable, ExecutorService parallelExecutor, - WhenCondition whenCondition, String currChainName, Integer slotIndex) { + WhenCondition whenCondition, String currChainId, Integer slotIndex) { // 套入 CompletableFutureTimeout 方法进行超时判断,如果超时则用 WhenFutureObj.timeOut 返回超时的对象 // 第 2 个参数是主要的本体 CompletableFuture,传入了 ParallelSupplier 和线程池对象 return CompletableFutureExpand.completeOnTimeout( - CompletableFuture.supplyAsync(new ParallelSupplier(executable, currChainName, slotIndex), parallelExecutor), + CompletableFuture.supplyAsync(new ParallelSupplier(executable, currChainId, slotIndex), parallelExecutor), whenCondition.getMaxWaitTime(), whenCondition.getMaxWaitTimeUnit(), WhenFutureObj.timeOut(executable.getId())); @@ -149,7 +149,7 @@ public abstract class ParallelStrategyExecutor { */ protected List> getWhenAllTaskList(WhenCondition whenCondition, Integer slotIndex) { - String currChainName = whenCondition.getCurrChainId(); + String currChainId = whenCondition.getCurrChainId(); // 设置 whenCondition 参数 this.setWhenConditionParams(whenCondition); @@ -159,8 +159,8 @@ public abstract class ParallelStrategyExecutor { // 这里主要是做了封装 CompletableFuture 对象,用 lambda 表达式做了很多事情,这句代码要仔细理清 // 根据 condition.getNodeList() 的集合进行流处理,用 map 进行把 executable 对象转换成 List> - List> completableFutureList = filterWhenTaskList(whenCondition.getExecutableList(), slotIndex, currChainName) - .map(executable -> wrappedFutureObj(executable, parallelExecutor, whenCondition, currChainName, slotIndex)) + List> completableFutureList = filterWhenTaskList(whenCondition.getExecutableList(), slotIndex, currChainId) + .map(executable -> wrappedFutureObj(executable, parallelExecutor, whenCondition, currChainId, slotIndex)) .collect(Collectors.toList()); return completableFutureList; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java index 7f2aaf92d..bfa89cdc5 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java @@ -20,7 +20,7 @@ public class SpecifyParallelExecutor extends ParallelStrategyExecutor { @Override public void execute(WhenCondition whenCondition, Integer slotIndex) throws Exception { - String currChainName = whenCondition.getCurrChainId(); + String currChainId = whenCondition.getCurrChainId(); // 设置 whenCondition 参数 this.setWhenConditionParams(whenCondition); @@ -41,10 +41,10 @@ public class SpecifyParallelExecutor extends ParallelStrategyExecutor { List> allTaskList = new ArrayList<>(); // 遍历 when 所有 node,进行筛选及处理 - filterWhenTaskList(whenCondition.getExecutableList(), slotIndex, currChainName) + filterWhenTaskList(whenCondition.getExecutableList(), slotIndex, currChainId) .forEach(executable -> { // 处理 task,封装成 CompletableFuture 对象 - CompletableFuture completableFutureTask = wrappedFutureObj(executable, parallelExecutor, whenCondition, currChainName, slotIndex); + CompletableFuture completableFutureTask = wrappedFutureObj(executable, parallelExecutor, whenCondition, currChainId, slotIndex); // 存在 must 指定 ID 的 task,且该任务只会有一个或者没有 if (whenCondition.getSpecifyIdSet().contains(executable.getId())) { // 设置指定任务 future 对象 From 6bfc66c4ccd65e32248fad125be03a205aaac3d5 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 12 Mar 2024 19:16:17 +0800 Subject: [PATCH 48/49] =?UTF-8?q?=E5=8A=A0=E5=85=A5Scanner=E7=9A=84?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E5=AE=9E=E7=8E=B0=EF=BC=8C=E4=B8=BA=E4=BA=86?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8B=E8=80=81=E7=9A=84spring=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yomahub/liteflow/spring/ComponentScanner.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java index 52791bdd8..4a2a45dbf 100644 --- a/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java +++ b/liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java @@ -72,6 +72,11 @@ public class ComponentScanner implements BeanPostProcessor { } } + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + @SuppressWarnings("rawtypes") @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { From ec0358e3e80574e7fe557927b7f10e71df6f33ef Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Mon, 18 Mar 2024 00:12:55 +0800 Subject: [PATCH 49/49] =?UTF-8?q?enhancement=20#I98L0S=202.11.3=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E9=9C=80=E8=A6=81=E4=BE=9D=E8=B5=96jackson2.16?= =?UTF-8?q?=EF=BC=8C=E7=BC=BA=E5=B0=91toPrettyString=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/parser/helper/ParserHelper.java | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) 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 cf5f560be..c9f4d4f5e 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 @@ -134,7 +134,7 @@ public class ParserHelper { } } - public static void parseChainDocument(List documentList, Set chainNameSet, + public static void parseChainDocument(List documentList, Set chainIdSet, Consumer parseOneChainConsumer) { //用于存放抽象chain的map Map abstratChainMap = new HashMap<>(); @@ -152,24 +152,24 @@ public class ParserHelper { chainList.forEach(e -> { // 校验加载的 chainName 是否有重复的 // TODO 这里是否有个问题,当混合格式加载的时候,2个同名的Chain在不同的文件里,就不行了 - String chainName = Optional.ofNullable(e.attributeValue(ID)).orElse(e.attributeValue(NAME)); + String chainId = Optional.ofNullable(e.attributeValue(ID)).orElse(e.attributeValue(NAME)); // 检查 chainName - checkChainId(chainName, e.getText()); - if (!chainNameSet.add(chainName)) { - throw new ChainDuplicateException(StrUtil.format("[chain name duplicate] chainName={}", chainName)); + checkChainId(chainId, e.getText()); + if (!chainIdSet.add(chainId)) { + throw new ChainDuplicateException(StrUtil.format("[chain name duplicate] chainName={}", chainId)); } - FlowBus.addChain(chainName); + FlowBus.addChain(chainId); if(ElRegexUtil.isAbstractChain(e.getText())){ - abstratChainMap.put(chainName,e); + abstratChainMap.put(chainId,e); //如果是抽象chain,则向其中添加一个AbstractCondition,用于标记这个chain为抽象chain - Chain chain = FlowBus.getChain(chainName); + Chain chain = FlowBus.getChain(chainId); chain.getConditionList().add(new AbstractCondition()); } }); }); // 清空 - chainNameSet.clear(); + chainIdSet.clear(); // 解析每一个chain for (Document document : documentList) { @@ -217,7 +217,7 @@ public class ParserHelper { } } - public static void parseChainJson(List flowJsonObjectList, Set chainNameSet, + public static void parseChainJson(List flowJsonObjectList, Set chainIdSet, Consumer parseOneChainConsumer) { //用于存放抽象chain的map Map abstratChainMap = new HashMap<>(); @@ -237,24 +237,24 @@ public class ParserHelper { // TODO 这里是否有个问题,当混合格式加载的时候,2个同名的Chain在不同的文件里,就不行了 JsonNode chainNameJsonNode = Optional.ofNullable(innerJsonObject.get(ID)) .orElse(innerJsonObject.get(NAME)); - String chainName = Optional.ofNullable(chainNameJsonNode).map(JsonNode::textValue).orElse(null); + String chainId = Optional.ofNullable(chainNameJsonNode).map(JsonNode::textValue).orElse(null); // 检查 chainName - checkChainId(chainName, innerJsonObject.toPrettyString()); - if (!chainNameSet.add(chainName)) { - throw new ChainDuplicateException(String.format("[chain name duplicate] chainName=%s", chainName)); + checkChainId(chainId, innerJsonObject.toString()); + if (!chainIdSet.add(chainId)) { + throw new ChainDuplicateException(String.format("[chain id duplicate] chainId=%s", chainId)); } - FlowBus.addChain(chainName); + FlowBus.addChain(chainId); if(ElRegexUtil.isAbstractChain(innerJsonObject.get(VALUE).textValue())){ - abstratChainMap.put(chainName,innerJsonObject); + abstratChainMap.put(chainId,innerJsonObject); //如果是抽象chain,则向其中添加一个AbstractCondition,用于标记这个chain为抽象chain - Chain chain = FlowBus.getChain(chainName); + Chain chain = FlowBus.getChain(chainId); chain.getConditionList().add(new AbstractCondition()); } } }); // 清空 - chainNameSet.clear(); + chainIdSet.clear(); for (JsonNode flowJsonNode : flowJsonObjectList) { // 解析每一个chain @@ -265,8 +265,8 @@ public class ParserHelper { parseImplChain(abstratChainMap, implChainSet, chainNode); //如果一个chain不为抽象chain,则进行解析 JsonNode chainNameJsonNode = Optional.ofNullable(chainNode.get(ID)).orElse(chainNode.get(NAME)); - String chainName = Optional.ofNullable(chainNameJsonNode).map(JsonNode::textValue).orElse(null); - if(!abstratChainMap.containsKey(chainName)){ + String chainId = Optional.ofNullable(chainNameJsonNode).map(JsonNode::textValue).orElse(null); + if(!abstratChainMap.containsKey(chainId)){ parseOneChainConsumer.accept(chainNode); } }

_(per(Du6tP7~uKSzooXRMxIO=7!x;NCpI=P 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 literal 297936 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 E3%=cy Date: Wed, 21 Feb 2024 17:23:36 +0800 Subject: [PATCH 41/49] =?UTF-8?q?enhancement=20#I8SMQB=20BREAK=E3=80=81IF?= =?UTF-8?q?=E3=80=81WHILE=E7=BB=84=E4=BB=B6=E7=BB=9F=E4=B8=80=E5=8F=98?= =?UTF-8?q?=E6=88=90=E5=B8=83=E5=B0=94=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../liteflow/annotation/FallbackCmp.java | 3 ++ .../liteflow/builder/LiteFlowNodeBuilder.java | 24 ++------- .../el/operator/base/OperatorHelper.java | 8 +-- ...mponent.java => NodeBooleanComponent.java} | 11 ++-- .../liteflow/core/NodeBreakComponent.java | 30 ----------- .../liteflow/core/NodeWhileComponent.java | 30 ----------- ...onent.java => ScriptBooleanComponent.java} | 10 ++-- .../liteflow/core/ScriptBreakComponent.java | 29 ---------- .../liteflow/core/ScriptComponent.java | 4 +- .../liteflow/core/ScriptWhileComponent.java | 29 ---------- .../liteflow/enums/BooleanTypeEnum.java | 13 +++++ .../liteflow/enums/LiteFlowMethodEnum.java | 4 +- .../yomahub/liteflow/enums/NodeTypeEnum.java | 12 +---- .../com/yomahub/liteflow/flow/FlowBus.java | 13 +++-- .../liteflow/flow/element/FallbackNode.java | 10 ++-- ...java => NodeBooleanComponentOfMethod.java} | 8 +-- .../solon/NodeBreakComponentOfMethod.java | 53 ------------------- .../solon/NodeWhileComponentOfMethod.java | 53 ------------------- .../solon/integration/XPluginImpl.java | 10 +--- .../test/abstractChain/cmp/CmpConfig.java | 2 +- .../liteflow/test/ifelse/cmp/CmpConfig.java | 2 +- .../liteflow/test/iterator/cmp/CmpConfig.java | 2 +- .../liteflow/test/loop/cmp/CmpConfig.java | 4 +- .../maxWaitMilliseconds/cmp/CmpConfig.java | 4 +- .../test/maxWaitSeconds/cmp/CmpConfig.java | 4 +- .../test/parallelLoop/cmp/CmpConfig.java | 4 +- .../liteflow/test/retry/cmp/CmpConfig.java | 4 +- .../liteflow/test/rollback/cmp/CmpConfig.java | 12 ++--- .../liteflow/test/abstractChain/cmp/CCmp.java | 4 +- .../liteflow/test/fallback/cmp/BreakCmp.java | 7 +-- .../liteflow/test/fallback/cmp/IfCmp1.java | 4 +- .../liteflow/test/fallback/cmp/IfCmp2.java | 7 +-- .../liteflow/test/fallback/cmp/WhileCmp1.java | 4 +- .../liteflow/test/fallback/cmp/WhileCmp2.java | 7 +-- .../liteflow/test/ifelse/cmp/X1Cmp.java | 2 +- .../liteflow/test/iterator/cmp/BCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/YCmp.java | 2 +- .../yomahub/liteflow/test/loop/cmp/ZCmp.java | 2 +- .../test/maxWaitMilliseconds/cmp/FCmp.java | 4 +- .../test/maxWaitMilliseconds/cmp/WCmp.java | 4 +- .../test/maxWaitSeconds/cmp/FCmp.java | 4 +- .../test/maxWaitSeconds/cmp/WCmp.java | 4 +- .../liteflow/test/parallelLoop/cmp/YCmp.java | 2 +- .../liteflow/test/parallelLoop/cmp/ZCmp.java | 2 +- .../yomahub/liteflow/test/retry/cmp/FCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/NCmp.java | 6 +-- .../liteflow/test/rollback/cmp/HCmp.java | 6 +-- .../liteflow/test/rollback/cmp/WCmp.java | 6 +-- .../liteflow/test/rollback/cmp/XCmp.java | 6 +-- .../liteflow/test/abstractChain/cmp/CCmp.java | 6 +-- .../liteflow/test/fallback/cmp/BreakCmp.java | 9 ++-- .../liteflow/test/fallback/cmp/IfCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/IfCmp2.java | 9 ++-- .../liteflow/test/fallback/cmp/WhileCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/WhileCmp2.java | 9 ++-- .../liteflow/test/ifelse/cmp/X1Cmp.java | 6 +-- .../liteflow/test/iterator/cmp/BCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/YCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/ZCmp.java | 6 +-- .../test/maxWaitMilliseconds/cmp/FCmp.java | 6 +-- .../test/maxWaitMilliseconds/cmp/WCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/FCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/WCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/YCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/ZCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/FCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/NCmp.java | 6 +-- .../liteflow/test/rollback/cmp/HCmp.java | 6 +-- .../liteflow/test/rollback/cmp/WCmp.java | 6 +-- .../liteflow/test/rollback/cmp/XCmp.java | 6 +-- .../script/graaljs/getnodes/cmp/FCmp.java | 6 +-- .../src/test/resources/getnodes/flow.xml | 4 +- .../src/test/resources/ifelse/flow.xml | 4 +- .../src/test/resources/loop/flow.xml | 4 +- .../src/test/resources/ifelse/flow.el.xml | 4 +- .../src/test/resources/loop/flow.xml | 4 +- .../src/test/resources/scriptOrder/flow1.xml | 2 +- .../script/javascript/getnodes/cmp/FCmp.java | 6 +-- .../src/test/resources/getnodes/flow.xml | 4 +- .../src/test/resources/ifelse/flow.xml | 4 +- .../src/test/resources/loop/flow.xml | 4 +- .../src/test/resources/ifelse/flow.el.xml | 4 +- .../src/test/resources/loop/flow.xml | 4 +- .../liteflow/test/abstractChain/cmp/CCmp.java | 6 +-- .../liteflow/test/fallback/cmp/BreakCmp.java | 9 ++-- .../liteflow/test/fallback/cmp/IfCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/IfCmp2.java | 9 ++-- .../liteflow/test/fallback/cmp/WhileCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/WhileCmp2.java | 9 ++-- .../liteflow/test/ifelse/cmp/X1Cmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/YCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/ZCmp.java | 8 +-- .../test/maxWaitMilliseconds/cmp/FCmp.java | 6 +-- .../test/maxWaitMilliseconds/cmp/WCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/FCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/WCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/YCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/ZCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/FCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/NCmp.java | 6 +-- .../liteflow/test/rollback/cmp/HCmp.java | 6 +-- .../liteflow/test/rollback/cmp/WCmp.java | 6 +-- .../liteflow/test/rollback/cmp/XCmp.java | 6 +-- .../liteflow/test/abstractChain/cmp/CCmp.java | 6 +-- .../liteflow/test/booleanOpt/cmp/BK.java | 6 +-- .../liteflow/test/booleanOpt/cmp/W1.java | 6 +-- .../liteflow/test/booleanOpt/cmp/W2.java | 6 +-- .../liteflow/test/booleanOpt/cmp/X1.java | 6 +-- .../liteflow/test/booleanOpt/cmp/X2.java | 6 +-- .../liteflow/test/booleanOpt/cmp/X3.java | 6 +-- .../liteflow/test/booleanOpt/cmp/X4.java | 6 +-- .../liteflow/test/fallback/cmp/BreakCmp.java | 9 ++-- .../liteflow/test/fallback/cmp/IfCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/IfCmp2.java | 9 ++-- .../liteflow/test/fallback/cmp/WhileCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/WhileCmp2.java | 9 ++-- .../liteflow/test/ifelse/cmp/X1Cmp.java | 6 +-- .../liteflow/test/ifelse/cmp/X2Cmp.java | 6 +-- .../liteflow/test/iterator/cmp/BCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/YCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/ZCmp.java | 8 +-- .../test/maxWaitMilliseconds/cmp/FCmp.java | 6 +-- .../test/maxWaitMilliseconds/cmp/WCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/FCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/WCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/YCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/ZCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/FCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/NCmp.java | 6 +-- .../liteflow/test/rollback/cmp/HCmp.java | 6 +-- .../liteflow/test/rollback/cmp/WCmp.java | 6 +-- .../liteflow/test/rollback/cmp/XCmp.java | 6 +-- .../liteflow/test/abstractChain/cmp/CCmp.java | 6 +-- .../liteflow/test/fallback/cmp/BreakCmp.java | 9 ++-- .../liteflow/test/fallback/cmp/IfCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/IfCmp2.java | 9 ++-- .../liteflow/test/fallback/cmp/WhileCmp1.java | 6 +-- .../liteflow/test/fallback/cmp/WhileCmp2.java | 9 ++-- .../liteflow/test/ifelse/cmp/X1Cmp.java | 6 +-- .../liteflow/test/iterator/cmp/BCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/YCmp.java | 6 +-- .../yomahub/liteflow/test/loop/cmp/ZCmp.java | 6 +-- .../test/maxWaitMilliseconds/cmp/FCmp.java | 6 +-- .../test/maxWaitMilliseconds/cmp/WCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/FCmp.java | 6 +-- .../test/maxWaitSeconds/cmp/WCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/YCmp.java | 6 +-- .../liteflow/test/parallelLoop/cmp/ZCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/FCmp.java | 6 +-- .../yomahub/liteflow/test/retry/cmp/NCmp.java | 6 +-- .../liteflow/test/rollback/cmp/HCmp.java | 6 +-- .../liteflow/test/rollback/cmp/WCmp.java | 6 +-- .../liteflow/test/rollback/cmp/XCmp.java | 6 +-- .../src/test/resources/sql/data.sql | 6 +-- .../src/test/resources/sql/second/data.sql | 6 +-- .../src/test/resources/sql/data.sql | 6 +-- .../src/test/resources/sql/sql-lite/data.sql | 6 +-- 157 files changed, 463 insertions(+), 688 deletions(-) rename liteflow-core/src/main/java/com/yomahub/liteflow/core/{NodeIfComponent.java => NodeBooleanComponent.java} (62%) delete mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java delete mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java rename liteflow-core/src/main/java/com/yomahub/liteflow/core/{ScriptIfComponent.java => ScriptBooleanComponent.java} (74%) delete mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBreakComponent.java delete mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptWhileComponent.java create mode 100644 liteflow-core/src/main/java/com/yomahub/liteflow/enums/BooleanTypeEnum.java rename liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/{NodeIfComponentOfMethod.java => NodeBooleanComponentOfMethod.java} (80%) delete mode 100644 liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBreakComponentOfMethod.java delete mode 100644 liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeWhileComponentOfMethod.java diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/FallbackCmp.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/FallbackCmp.java index a1e9ae2bd..dbc1cf57f 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/FallbackCmp.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/FallbackCmp.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.annotation; +import com.yomahub.liteflow.enums.BooleanTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import java.lang.annotation.Documented; @@ -20,4 +21,6 @@ import java.lang.annotation.Target; @Documented @Inherited public @interface FallbackCmp { + + BooleanTypeEnum value() default BooleanTypeEnum.NOT_BOOL; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java index afb817c92..8832c23ec 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/LiteFlowNodeBuilder.java @@ -34,22 +34,14 @@ public class LiteFlowNodeBuilder { return new LiteFlowNodeBuilder(NodeTypeEnum.SWITCH); } - public static LiteFlowNodeBuilder createIfNode() { - return new LiteFlowNodeBuilder(NodeTypeEnum.IF); + public static LiteFlowNodeBuilder createBooleanNode() { + return new LiteFlowNodeBuilder(NodeTypeEnum.BOOLEAN); } public static LiteFlowNodeBuilder createForNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.FOR); } - public static LiteFlowNodeBuilder createWhileNode() { - return new LiteFlowNodeBuilder(NodeTypeEnum.WHILE); - } - - public static LiteFlowNodeBuilder createBreakNode() { - return new LiteFlowNodeBuilder(NodeTypeEnum.BREAK); - } - public static LiteFlowNodeBuilder createIteratorNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.ITERATOR); } @@ -62,22 +54,14 @@ public class LiteFlowNodeBuilder { return new LiteFlowNodeBuilder(NodeTypeEnum.SWITCH_SCRIPT); } - public static LiteFlowNodeBuilder createScriptIfNode() { - return new LiteFlowNodeBuilder(NodeTypeEnum.IF_SCRIPT); + public static LiteFlowNodeBuilder createScriptBooleanNode() { + return new LiteFlowNodeBuilder(NodeTypeEnum.BOOLEAN_SCRIPT); } public static LiteFlowNodeBuilder createScriptForNode() { return new LiteFlowNodeBuilder(NodeTypeEnum.FOR_SCRIPT); } - public static LiteFlowNodeBuilder createScriptWhileNode() { - return new LiteFlowNodeBuilder(NodeTypeEnum.WHILE_SCRIPT); - } - - public static LiteFlowNodeBuilder createScriptBreakNode() { - return new LiteFlowNodeBuilder(NodeTypeEnum.BREAK_SCRIPT); - } - public LiteFlowNodeBuilder() { this.node = new Node(); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java index 0de9cbf34..ee0be1f6c 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java @@ -167,12 +167,8 @@ public class OperatorHelper { Executable item = (Executable) object; if (item.getExecuteType().equals(ExecuteTypeEnum.NODE)){ Node node = (Node) item; - if (!ListUtil.toList(NodeTypeEnum.IF, - NodeTypeEnum.IF_SCRIPT, - NodeTypeEnum.WHILE, - NodeTypeEnum.WHILE_SCRIPT, - NodeTypeEnum.BREAK, - NodeTypeEnum.BREAK_SCRIPT, + if (!ListUtil.toList(NodeTypeEnum.BOOLEAN, + NodeTypeEnum.BOOLEAN_SCRIPT, NodeTypeEnum.FALLBACK).contains(node.getType())){ throw new QLException(StrUtil.format("The node[{}] must be boolean type Node.", node.getId())); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBooleanComponent.java similarity index 62% rename from liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java rename to liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBooleanComponent.java index c8dc973f4..5625fe780 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeIfComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBooleanComponent.java @@ -1,23 +1,22 @@ package com.yomahub.liteflow.core; import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; /** - * IF节点抽象类 + * BOOLEAN类型的抽象节点 * * @author Bryan.Zhang - * @since 2.8.5 + * @since 2.12.0 */ -public abstract class NodeIfComponent extends NodeComponent { +public abstract class NodeBooleanComponent extends NodeComponent { @Override public void process() throws Exception { - boolean result = this.processIf(); + boolean result = this.processBoolean(); this.getSlot().setIfResult(this.getMetaValueKey(), result); } - public abstract boolean processIf() throws Exception; + public abstract boolean processBoolean() throws Exception; @Override @SuppressWarnings("unchecked") diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java deleted file mode 100644 index 35d838b14..000000000 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeBreakComponent.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.yomahub.liteflow.core; - -import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; - -/** - * 循环跳出节点逻辑抽象类 - * - * @author Bryan.Zhang - * @since 2.9.0 - */ -public abstract class NodeBreakComponent extends NodeComponent { - - @Override - public void process() throws Exception { - boolean breakFlag = processBreak(); - Slot slot = this.getSlot(); - slot.setBreakResult(this.getMetaValueKey(), breakFlag); - } - - public abstract boolean processBreak() throws Exception; - - @Override - @SuppressWarnings("unchecked") - public Boolean getItemResultMetaValue(Integer slotIndex) { - return DataBus.getSlot(slotIndex).getBreakResult(this.getMetaValueKey()); - } - -} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java deleted file mode 100644 index 07e66374a..000000000 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeWhileComponent.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.yomahub.liteflow.core; - -import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; - -/** - * WHILE条件节点抽象类 - * - * @author Bryan.Zhang - * @since 2.9.0 - */ -public abstract class NodeWhileComponent extends NodeComponent { - - @Override - public void process() throws Exception { - boolean whileFlag = processWhile(); - Slot slot = this.getSlot(); - slot.setWhileResult(this.getMetaValueKey(), whileFlag); - } - - public abstract boolean processWhile() throws Exception; - - @Override - @SuppressWarnings("unchecked") - public Boolean getItemResultMetaValue(Integer slotIndex) { - return DataBus.getSlot(slotIndex).getWhileResult(this.getMetaValueKey()); - } - -} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptIfComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java similarity index 74% rename from liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptIfComponent.java rename to liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java index a55cb8ed3..995563531 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptIfComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBooleanComponent.java @@ -3,18 +3,16 @@ package com.yomahub.liteflow.core; import com.yomahub.liteflow.script.ScriptExecuteWrap; import com.yomahub.liteflow.script.ScriptExecutorFactory; -import java.util.Map; - /** - * 脚本IF节点 + * 脚本BOOLEAN节点 * * @author Bryan.Zhang - * @since 2.8.5 + * @since 2.12.0 */ -public class ScriptIfComponent extends NodeIfComponent implements ScriptComponent { +public class ScriptBooleanComponent extends NodeBooleanComponent implements ScriptComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { ScriptExecuteWrap wrap = this.buildWrap(this); return (boolean) ScriptExecutorFactory.loadInstance() .getScriptExecutor(this.getRefNode().getLanguage()) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBreakComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBreakComponent.java deleted file mode 100644 index 379993cb4..000000000 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptBreakComponent.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.yomahub.liteflow.core; - -import com.yomahub.liteflow.script.ScriptExecuteWrap; -import com.yomahub.liteflow.script.ScriptExecutorFactory; - -import java.util.Map; - -/** - * 脚本BREAK节点 - * - * @author Bryan.Zhang - * @since 2.9.0 - */ -public class ScriptBreakComponent extends NodeBreakComponent implements ScriptComponent { - - @Override - public boolean processBreak() throws Exception { - ScriptExecuteWrap wrap = this.buildWrap(this); - return (boolean) ScriptExecutorFactory.loadInstance() - .getScriptExecutor(this.getRefNode().getLanguage()) - .execute(wrap); - } - - @Override - public void loadScript(String script, String language) { - ScriptExecutorFactory.loadInstance().getScriptExecutor(language).load(getNodeId(), script); - } - -} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java index c6fe31637..77fa7ffe6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptComponent.java @@ -21,10 +21,8 @@ public interface ScriptComponent { { put(NodeTypeEnum.SCRIPT, ScriptCommonComponent.class); put(NodeTypeEnum.SWITCH_SCRIPT, ScriptSwitchComponent.class); - put(NodeTypeEnum.IF_SCRIPT, ScriptIfComponent.class); + put(NodeTypeEnum.BOOLEAN_SCRIPT, ScriptBooleanComponent.class); put(NodeTypeEnum.FOR_SCRIPT, ScriptForComponent.class); - put(NodeTypeEnum.WHILE_SCRIPT, ScriptWhileComponent.class); - put(NodeTypeEnum.BREAK_SCRIPT, ScriptBreakComponent.class); } }; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptWhileComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptWhileComponent.java deleted file mode 100644 index ef07d31e3..000000000 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/ScriptWhileComponent.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.yomahub.liteflow.core; - -import com.yomahub.liteflow.script.ScriptExecuteWrap; -import com.yomahub.liteflow.script.ScriptExecutorFactory; - -import java.util.Map; - -/** - * 脚本WHILE节点 - * - * @author Bryan.Zhang - * @since 2.9.0 - */ -public class ScriptWhileComponent extends NodeWhileComponent implements ScriptComponent { - - @Override - public boolean processWhile() throws Exception { - ScriptExecuteWrap wrap = this.buildWrap(this); - return (boolean) ScriptExecutorFactory.loadInstance() - .getScriptExecutor(this.getRefNode().getLanguage()) - .execute(wrap); - } - - @Override - public void loadScript(String script, String language) { - ScriptExecutorFactory.loadInstance().getScriptExecutor(language).load(getNodeId(), script); - } - -} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/BooleanTypeEnum.java b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/BooleanTypeEnum.java new file mode 100644 index 000000000..33ec35257 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/BooleanTypeEnum.java @@ -0,0 +1,13 @@ +package com.yomahub.liteflow.enums; + +/** + * 布尔节点的细分TYPE + * 主要用于组件降级 + * + * @author Bryan.Zhang + * @since 2.12.0 + */ +public enum BooleanTypeEnum { + + NOT_BOOL,IF,WHILE,BREAK +} diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/LiteFlowMethodEnum.java b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/LiteFlowMethodEnum.java index be015b2a0..5b6d0034e 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/LiteFlowMethodEnum.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/LiteFlowMethodEnum.java @@ -4,10 +4,8 @@ public enum LiteFlowMethodEnum { PROCESS("process", true), PROCESS_SWITCH("processSwitch", true), - PROCESS_IF("processIf", true), + PROCESS_BOOLEAN("processBoolean", true), PROCESS_FOR("processFor", true), - PROCESS_WHILE("processWhile", true), - PROCESS_BREAK("processBreak", true), PROCESS_ITERATOR("processIterator", true), diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/NodeTypeEnum.java b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/NodeTypeEnum.java index 7ca1efff7..a02ae6287 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/enums/NodeTypeEnum.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/enums/NodeTypeEnum.java @@ -25,28 +25,20 @@ public enum NodeTypeEnum { SWITCH("switch", "选择", false, NodeSwitchComponent.class), - IF("if", "条件", false, NodeIfComponent.class), + BOOLEAN("boolean", "布尔", false, NodeBooleanComponent.class), FOR("for", "循环次数", false, NodeForComponent.class), - WHILE("while", "循环条件", false, NodeWhileComponent.class), - - BREAK("break", "循环跳出", false, NodeBreakComponent.class), - ITERATOR("iterator", "循环迭代", false, NodeIteratorComponent.class), SCRIPT("script", "脚本", true, ScriptCommonComponent.class), SWITCH_SCRIPT("switch_script", "选择脚本", true, ScriptSwitchComponent.class), - IF_SCRIPT("if_script", "条件脚本", true, ScriptIfComponent.class), + BOOLEAN_SCRIPT("boolean_script", "布尔脚本", true, ScriptBooleanComponent.class), FOR_SCRIPT("for_script", "循环次数脚本", true, ScriptForComponent.class), - WHILE_SCRIPT("while_script", "循环条件脚本", true, ScriptWhileComponent.class), - - BREAK_SCRIPT("break_script", "循环跳出脚本", true, ScriptBreakComponent.class), - FALLBACK("fallback", "降级", false, null); private static final LFLog LOG = LFLoggerManager.getLogger(NodeTypeEnum.class); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index f39a0b219..34a11d3a7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -16,6 +16,7 @@ import com.yomahub.liteflow.core.ComponentInitializer; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.core.ScriptComponent; import com.yomahub.liteflow.core.proxy.DeclWarpBean; +import com.yomahub.liteflow.enums.BooleanTypeEnum; import com.yomahub.liteflow.enums.FlowParserTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.ComponentCannotRegisterException; @@ -59,7 +60,7 @@ public class FlowBus { private static final Map nodeMap; - private static final Map fallbackNodeMap; + private static final Map fallbackNodeMap; private static AtomicBoolean initStat = new AtomicBoolean(false); @@ -261,7 +262,12 @@ public class FlowBus { } public static Node getFallBackNode(NodeTypeEnum nodeType) { - return fallbackNodeMap.get(nodeType); + return getFallBackNode(nodeType, BooleanTypeEnum.NOT_BOOL); + } + + public static Node getFallBackNode(NodeTypeEnum nodeType, BooleanTypeEnum booleanTypeEnum){ + String key = StrUtil.format("{}_{}", nodeType.name(), booleanTypeEnum.name()); + return fallbackNodeMap.get(key); } public static void cleanCache() { @@ -322,7 +328,8 @@ public class FlowBus { } NodeTypeEnum nodeType = node.getType(); - fallbackNodeMap.put(nodeType, node); + String key = StrUtil.format("{}_{}", nodeType.name(), fallbackCmp.value().name()); + fallbackNodeMap.put(key, node); } // 重新加载脚本 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java index ea2007961..f6302b915 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/FallbackNode.java @@ -3,6 +3,7 @@ package com.yomahub.liteflow.flow.element; import cn.hutool.core.text.StrFormatter; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.FallbackCmpNotFoundException; @@ -89,7 +90,8 @@ public class FallbackNode extends Node { return findNodeInIterator((IteratorCondition) condition); case TYPE_NOT_OPT: case TYPE_AND_OR_OPT: - return FlowBus.getFallBackNode(NodeTypeEnum.IF); + //组件降级用在与并或中,只能用在IF表达式中 + return FlowBus.getFallBackNode(NodeTypeEnum.BOOLEAN, BooleanTypeEnum.IF); default: return null; } @@ -99,7 +101,7 @@ public class FallbackNode extends Node { Executable ifItem = ifCondition.getIfItem(); if (ifItem == this) { // 需要条件组件 - return FlowBus.getFallBackNode(NodeTypeEnum.IF); + return FlowBus.getFallBackNode(NodeTypeEnum.BOOLEAN, BooleanTypeEnum.IF); } // 需要普通组件 @@ -127,7 +129,7 @@ public class FallbackNode extends Node { private Node findNodeInWhile(WhileCondition whileCondition) { Executable whileItem = whileCondition.getWhileItem(); if (whileItem == this) { - return FlowBus.getFallBackNode(NodeTypeEnum.WHILE); + return FlowBus.getFallBackNode(NodeTypeEnum.BOOLEAN, BooleanTypeEnum.WHILE); } return findNodeInLoop(whileCondition); @@ -145,7 +147,7 @@ public class FallbackNode extends Node { private Node findNodeInLoop(LoopCondition loopCondition) { Executable breakItem = loopCondition.getExecutableOne(ConditionKey.BREAK_KEY); if (breakItem == this) { - return FlowBus.getFallBackNode(NodeTypeEnum.BREAK); + return FlowBus.getFallBackNode(NodeTypeEnum.BOOLEAN, BooleanTypeEnum.BREAK); } return FlowBus.getFallBackNode(NodeTypeEnum.COMMON); diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeIfComponentOfMethod.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBooleanComponentOfMethod.java similarity index 80% rename from liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeIfComponentOfMethod.java rename to liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBooleanComponentOfMethod.java index ac25d7c72..46f16025b 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeIfComponentOfMethod.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBooleanComponentOfMethod.java @@ -1,6 +1,6 @@ package com.yomahub.liteflow.solon; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.exception.LiteFlowException; import org.noear.solon.core.BeanWrap; @@ -11,7 +11,7 @@ import java.lang.reflect.Method; * @author noear * @since 1.11 */ -public class NodeIfComponentOfMethod extends NodeIfComponent { +public class NodeBooleanComponentOfMethod extends NodeBooleanComponent { final BeanWrap beanWrap; @@ -19,7 +19,7 @@ public class NodeIfComponentOfMethod extends NodeIfComponent { final LiteFlowMethodEnum methodEnum; - public NodeIfComponentOfMethod(BeanWrap beanWrap, Method method, LiteFlowMethodEnum methodEnum) { + public NodeBooleanComponentOfMethod(BeanWrap beanWrap, Method method, LiteFlowMethodEnum methodEnum) { this.beanWrap = beanWrap; this.method = method; this.methodEnum = methodEnum; @@ -45,7 +45,7 @@ public class NodeIfComponentOfMethod extends NodeIfComponent { } @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return (boolean) exec(); } diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBreakComponentOfMethod.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBreakComponentOfMethod.java deleted file mode 100644 index 9b16e8be7..000000000 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeBreakComponentOfMethod.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.yomahub.liteflow.solon; - -import com.yomahub.liteflow.core.NodeBreakComponent; -import com.yomahub.liteflow.enums.LiteFlowMethodEnum; -import com.yomahub.liteflow.exception.LiteFlowException; -import org.noear.solon.core.BeanWrap; - -import java.lang.reflect.Method; - -/** - * @author noear - * @since 1.11 - */ -public class NodeBreakComponentOfMethod extends NodeBreakComponent { - - final BeanWrap beanWrap; - - final Method method; - - final LiteFlowMethodEnum methodEnum; - - public NodeBreakComponentOfMethod(BeanWrap beanWrap, Method method, LiteFlowMethodEnum methodEnum) { - this.beanWrap = beanWrap; - this.method = method; - this.methodEnum = methodEnum; - - if (method.getParameterCount() > 1) { - String methodFullName = beanWrap.clz().getName() + "::" + method.getName(); - throw new LiteFlowException( - "NodeBreakComponent method parameter cannot be more than one: " + methodFullName); - } - - if (method.getReturnType() != Boolean.class && method.getReturnType() != boolean.class) { - String methodFullName = beanWrap.clz().getName() + "::" + method.getName(); - throw new LiteFlowException("NodeBreakComponent method returnType can only be boolean: " + methodFullName); - } - } - - private Object exec() throws Exception { - if (method.getParameterCount() == 0) { - return method.invoke(beanWrap.get()); - } - else { - return method.invoke(beanWrap.get(), this); - } - } - - @Override - public boolean processBreak() throws Exception { - return (boolean) exec(); - } - -} diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeWhileComponentOfMethod.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeWhileComponentOfMethod.java deleted file mode 100644 index cf99791ee..000000000 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/NodeWhileComponentOfMethod.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.yomahub.liteflow.solon; - -import com.yomahub.liteflow.core.NodeWhileComponent; -import com.yomahub.liteflow.enums.LiteFlowMethodEnum; -import com.yomahub.liteflow.exception.LiteFlowException; -import org.noear.solon.core.BeanWrap; - -import java.lang.reflect.Method; - -/** - * @author noear - * @since 1.11 - */ -public class NodeWhileComponentOfMethod extends NodeWhileComponent { - - final BeanWrap beanWrap; - - final Method method; - - final LiteFlowMethodEnum methodEnum; - - public NodeWhileComponentOfMethod(BeanWrap beanWrap, Method method, LiteFlowMethodEnum methodEnum) { - this.beanWrap = beanWrap; - this.method = method; - this.methodEnum = methodEnum; - - if (method.getParameterCount() > 1) { - String methodFullName = beanWrap.clz().getName() + "::" + method.getName(); - throw new LiteFlowException( - "NodeWhileComponent method parameter cannot be more than one: " + methodFullName); - } - - if (method.getReturnType() != Boolean.class && method.getReturnType() != boolean.class) { - String methodFullName = beanWrap.clz().getName() + "::" + method.getName(); - throw new LiteFlowException("NodeWhileComponent method returnType can only be boolean: " + methodFullName); - } - } - - private Object exec() throws Exception { - if (method.getParameterCount() == 0) { - return method.invoke(beanWrap.get()); - } - else { - return method.invoke(beanWrap.get(), this); - } - } - - @Override - public boolean processWhile() throws Exception { - return (boolean) exec(); - } - -} diff --git a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java index 0fbc1dfa0..9a3211110 100644 --- a/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java +++ b/liteflow-solon-plugin/src/main/java/com/yomahub/liteflow/solon/integration/XPluginImpl.java @@ -58,18 +58,12 @@ public class XPluginImpl implements Plugin { case PROCESS_SWITCH: node1 = new NodeSwitchComponentOfMethod(bw, method, anno.value()); break; - case PROCESS_IF: - node1 = new NodeIfComponentOfMethod(bw, method, anno.value()); + case PROCESS_BOOLEAN: + node1 = new NodeBooleanComponentOfMethod(bw, method, anno.value()); break; case PROCESS_FOR: node1 = new NodeForComponentOfMethod(bw, method, anno.value()); break; - case PROCESS_WHILE: - node1 = new NodeWhileComponentOfMethod(bw, method, anno.value()); - break; - case PROCESS_BREAK: - node1 = new NodeBreakComponentOfMethod(bw, method, anno.value()); - break; default: node1 = new NodeComponentOfMethod(bw, method, anno.value()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CmpConfig.java index 9c9f78502..bbbc5e41b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CmpConfig.java @@ -25,7 +25,7 @@ public class CmpConfig { System.out.println("BCmp executed!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "c", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "c", nodeType = NodeTypeEnum.BOOLEAN) public boolean processIfC(NodeComponent bindCmp) throws Exception{ return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CmpConfig.java index 4957712c9..28a3129da 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CmpConfig.java @@ -30,7 +30,7 @@ public class CmpConfig { System.out.println("DCmp executed!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "x1", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "x1", nodeType = NodeTypeEnum.BOOLEAN) public boolean processIfX1(NodeComponent bindCmp) throws Exception { return Boolean.parseBoolean(bindCmp.getTag()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/CmpConfig.java index fede383f1..f638ddfab 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/CmpConfig.java @@ -29,7 +29,7 @@ public class CmpConfig { } } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeId = "b", nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "b", nodeType = NodeTypeEnum.BOOLEAN) public boolean processB(NodeComponent bindCmp) { return bindCmp.getLoopIndex() == 1; } 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 52902d557..3d70742d5 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 @@ -59,14 +59,14 @@ public class CmpConfig { return 3; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeId = "y", nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "y", nodeType = NodeTypeEnum.BOOLEAN) public boolean processY(NodeComponent bindCmp) { DefaultContext context = bindCmp.getFirstContextBean(); int count = context.getData("test"); return count > 3; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "z", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "z", nodeType = NodeTypeEnum.BOOLEAN) public boolean processZ(NodeComponent bindCmp) { DefaultContext context = bindCmp.getFirstContextBean(); String key = "test"; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/CmpConfig.java index 2e2194dfc..efc87c7c4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/CmpConfig.java @@ -69,7 +69,7 @@ public class CmpConfig { System.out.println("DCmp executed!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "f", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "f", nodeType = NodeTypeEnum.BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return true; } @@ -79,7 +79,7 @@ public class CmpConfig { return "b"; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "w", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "w", nodeType = NodeTypeEnum.BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { // 判断是否切换了 chain if (!executedChain.contains(bindCmp.getCurrChainId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/CmpConfig.java index db6967be4..18f23a083 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/CmpConfig.java @@ -69,7 +69,7 @@ public class CmpConfig { System.out.println("DCmp executed!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "f", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "f", nodeType = NodeTypeEnum.BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return true; } @@ -79,7 +79,7 @@ public class CmpConfig { return "b"; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "w", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "w", nodeType = NodeTypeEnum.BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { // 判断是否切换了 chain if (!executedChain.contains(bindCmp.getCurrChainId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CmpConfig.java index 83fedcabf..91164fdd5 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/CmpConfig.java @@ -94,7 +94,7 @@ public class CmpConfig { return 3; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeId = "y", nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "y", nodeType = NodeTypeEnum.BOOLEAN) public boolean processY(NodeComponent bindCmp) { DefaultContext context = bindCmp.getFirstContextBean(); int count = 0; @@ -104,7 +104,7 @@ public class CmpConfig { return count > 3; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "z", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "z", nodeType = NodeTypeEnum.BOOLEAN) public boolean processZ(NodeComponent bindCmp) { DefaultContext context = bindCmp.getFirstContextBean(); String key = "test"; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java index 996ace9ee..9750a61d5 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/CmpConfig.java @@ -51,7 +51,7 @@ public class CmpConfig { else return "a"; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "f", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "f", nodeType = NodeTypeEnum.BOOLEAN) public boolean processF(NodeComponent bindCmp) { System.out.println("FCmp executed!"); flagf ++; @@ -77,7 +77,7 @@ public class CmpConfig { else flagm = 0; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "n", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "n", nodeType = NodeTypeEnum.BOOLEAN) public boolean processN(NodeComponent bindCmp) { flagn ++; System.out.println("NCmp executed!"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/CmpConfig.java b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/CmpConfig.java index b88545014..58941d993 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/CmpConfig.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-multi-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/CmpConfig.java @@ -102,13 +102,13 @@ public class CmpConfig { System.out.println("GCmp rollback!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeId = "h", nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "h", nodeType = NodeTypeEnum.BOOLEAN) public int processH(NodeComponent bindCmp) { System.out.println("HCmp executed!"); throw new RuntimeException(); } - @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "h", nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "h", nodeType = NodeTypeEnum.BOOLEAN) public void rollbackH() throws Exception { System.out.println("HCmp rollback!"); } @@ -124,24 +124,24 @@ public class CmpConfig { System.out.println("ICmp rollback!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeId = "w", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "w", nodeType = NodeTypeEnum.BOOLEAN) public boolean processW(NodeComponent bindCmp) { System.out.println("WCmp executed!"); return true; } - @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "w", nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "w", nodeType = NodeTypeEnum.BOOLEAN) public void rollbackW() throws Exception { System.out.println("WCmp rollback!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeId = "x", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeId = "x", nodeType = NodeTypeEnum.BOOLEAN) public boolean processX(NodeComponent bindCmp) { System.out.println("XCmp executed!"); return true; } - @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "x", nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.ROLLBACK, nodeId = "x", nodeType = NodeTypeEnum.BOOLEAN) public void rollbackX() throws Exception { System.out.println("XCmp rollback!"); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java index 9666e7141..15b2d01ac 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java @@ -8,9 +8,9 @@ import com.yomahub.liteflow.enums.NodeTypeEnum; import org.springframework.stereotype.Component; @Component("c") -@LiteflowCmpDefine(NodeTypeEnum.IF) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class CCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java index fcbd8e7eb..0fb9436fb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java @@ -5,15 +5,16 @@ import com.yomahub.liteflow.annotation.LiteflowCmpDefine; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @LiteflowComponent("bn1") -@LiteflowCmpDefine(NodeTypeEnum.BREAK) -@FallbackCmp +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) +@FallbackCmp(BooleanTypeEnum.BREAK) public class BreakCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN) public boolean processBreak(NodeComponent bindCmp) throws Exception { return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java index bd1c6f51e..5899ae0ee 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java @@ -8,10 +8,10 @@ import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @LiteflowComponent("ifn1") -@LiteflowCmpDefine(NodeTypeEnum.IF) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class IfCmp1 { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java index 5af938e89..88787398a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java @@ -5,15 +5,16 @@ import com.yomahub.liteflow.annotation.LiteflowCmpDefine; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @LiteflowComponent("ifn2") -@LiteflowCmpDefine(NodeTypeEnum.IF) -@FallbackCmp +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) +@FallbackCmp(BooleanTypeEnum.IF) public class IfCmp2 { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return false; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java index 0d65cfb12..8f030ec79 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java @@ -11,14 +11,14 @@ import java.util.HashSet; import java.util.Set; @LiteflowComponent("wn1") -@LiteflowCmpDefine(NodeTypeEnum.WHILE) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class WhileCmp1 { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { // 判断是否切换了 chain if (!executedChain.contains(bindCmp.getCurrChainId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java index a9bef49b7..31ff5d86b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java @@ -5,15 +5,16 @@ import com.yomahub.liteflow.annotation.LiteflowCmpDefine; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @LiteflowComponent("wn2") -@LiteflowCmpDefine(NodeTypeEnum.WHILE) -@FallbackCmp +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) +@FallbackCmp(BooleanTypeEnum.WHILE) public class WhileCmp2 { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { return false; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java index 79c6b3bb4..dccf513a1 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -16,7 +16,7 @@ import org.springframework.stereotype.Component; @Component("x1") public class X1Cmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return Boolean.parseBoolean(bindCmp.getTag()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java index 58181ba84..93aead7ca 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java @@ -3,17 +3,17 @@ package com.yomahub.liteflow.test.iterator.cmp; import com.yomahub.liteflow.annotation.LiteflowCmpDefine; import com.yomahub.liteflow.annotation.LiteflowMethod; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import org.springframework.stereotype.Component; @Component("b") -@LiteflowCmpDefine(NodeTypeEnum.BREAK) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class BCmp { - @LiteflowMethod(LiteFlowMethodEnum.PROCESS_BREAK) + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_BOOLEAN) public boolean processBreak(NodeComponent bindCmp) throws Exception { return bindCmp.getLoopIndex() == 1; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java index 34967f9f3..70ab241f6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java @@ -10,7 +10,7 @@ import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("y") public class YCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processBreak(NodeComponent bindCmp) throws Exception { DefaultContext context = bindCmp.getFirstContextBean(); int count = context.getData("test"); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java index ec4945110..0b2509c91 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java @@ -10,7 +10,7 @@ import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("z") public class ZCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { DefaultContext context = bindCmp.getFirstContextBean(); String key = "test"; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java index 652e2e682..6990eca9b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java @@ -8,10 +8,10 @@ import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @LiteflowComponent("f") -@LiteflowCmpDefine(NodeTypeEnum.IF) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class FCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java index 4809d114c..afd560a13 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java @@ -11,14 +11,14 @@ import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -@LiteflowCmpDefine(NodeTypeEnum.WHILE) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class WCmp { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { // 判断是否切换了 chain if (!executedChain.contains(bindCmp.getCurrChainId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java index f2b3bd1c3..43c16cf09 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java @@ -8,10 +8,10 @@ import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @LiteflowComponent("f") -@LiteflowCmpDefine(NodeTypeEnum.IF) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class FCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_IF, nodeType = NodeTypeEnum.IF) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processIf(NodeComponent bindCmp) throws Exception { return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java index 4085405c2..ee756d3e8 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java @@ -11,14 +11,14 @@ import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -@LiteflowCmpDefine(NodeTypeEnum.WHILE) +@LiteflowCmpDefine(NodeTypeEnum.BOOLEAN) public class WCmp { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { // 判断是否切换了 chain if (!executedChain.contains(bindCmp.getCurrChainId())) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java index 9e7713c34..b1311b010 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java @@ -10,7 +10,7 @@ import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("y") public class YCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BREAK, nodeType = NodeTypeEnum.BREAK) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processBreak(NodeComponent bindCmp) throws Exception { DefaultContext context = bindCmp.getFirstContextBean(); int count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java index 8f01b2c24..b89bf6c2f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java @@ -10,7 +10,7 @@ import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("z") public class ZCmp { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_WHILE, nodeType = NodeTypeEnum.WHILE) + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_BOOLEAN, nodeType = NodeTypeEnum.BOOLEAN) public boolean processWhile(NodeComponent bindCmp) throws Exception { DefaultContext context = bindCmp.getFirstContextBean(); String key = "test"; diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index 1bc95f542..81704f493 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("FCmp executed!"); flag ++; if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index ac0434c95..e72524abb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("n") -public class NCmp extends NodeWhileComponent { +public class NCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { flag ++; System.out.println("NCmp executed!"); if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java index 19ebef9b3..a2d3ebe5f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("h") -public class HCmp extends NodeBreakComponent { +public class HCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("HCmp executed!"); throw new RuntimeException(); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java index 3f0fd80d4..81233ca78 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("WCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java index 9928246c4..7d161a2d4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x") -public class XCmp extends NodeIfComponent { +public class XCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("XCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java index d24811911..f5b11e2b7 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java @@ -1,11 +1,11 @@ package com.yomahub.liteflow.test.abstractChain.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class CCmp extends NodeIfComponent { +public class CCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { //do your biz return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java index 155bdfae6..a3d1c7aff 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java @@ -1,13 +1,14 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; -@FallbackCmp -public class BreakCmp extends NodeBreakComponent { +@FallbackCmp(BooleanTypeEnum.BREAK) +public class BreakCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java index 5437cc8fe..bb607e5d9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java @@ -1,11 +1,11 @@ package com.yomahub.liteflow.test.fallback.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class IfCmp1 extends NodeIfComponent { +public class IfCmp1 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java index 67187c399..a83ac4e6f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java @@ -1,13 +1,14 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; -@FallbackCmp -public class IfCmp2 extends NodeIfComponent { +@FallbackCmp(BooleanTypeEnum.IF) +public class IfCmp2 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java index d525911ba..9d7f40f73 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java @@ -1,18 +1,18 @@ package com.yomahub.liteflow.test.fallback.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; -public class WhileCmp1 extends NodeWhileComponent { +public class WhileCmp1 extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java index 531a77d7e..5954a7683 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java @@ -1,13 +1,14 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; -@FallbackCmp -public class WhileCmp2 extends NodeWhileComponent { +@FallbackCmp(BooleanTypeEnum.WHILE) +public class WhileCmp2 extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java index 65e08778c..552f1efcf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -7,12 +7,12 @@ */ package com.yomahub.liteflow.test.ifelse.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class X1Cmp extends NodeIfComponent { +public class X1Cmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return Boolean.parseBoolean(this.getTag()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java index 2240c45d3..dfd877c73 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.iterator.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class BCmp extends NodeBreakComponent { +public class BCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return this.getLoopIndex() == 1; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java index c201f9ebb..42474f04d 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.loop.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = context.getData("test"); return count > 3; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java index 657bc890d..7638978fb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.loop.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java index 8b003e024..b1ec5b042 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java @@ -1,10 +1,10 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java index 3f0c50cc2..5b23a8ffb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java @@ -1,18 +1,18 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java index d22ecdf4f..4f4650aed 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java @@ -1,10 +1,10 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java index ecad318d1..c6641d235 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java @@ -1,18 +1,18 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java index 692bf6957..26292f825 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = 0; if(context.hasData("test")) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java index dc4bdfc50..7eccbcef1 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index 6135b9444..b09f5b290 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.retry.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("FCmp executed!"); flag ++; if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index 709dce3a0..bb28da952 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.retry.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class NCmp extends NodeWhileComponent { +public class NCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { flag ++; System.out.println("NCmp executed!"); if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java index 7f8378ce7..1ecfc3877 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java @@ -1,11 +1,11 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class HCmp extends NodeBreakComponent { +public class HCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("HCmp executed!"); throw new RuntimeException(); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java index 921e83e77..1d7c73337 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java @@ -1,11 +1,11 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("WCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java index 120006aca..c47313371 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java @@ -1,10 +1,10 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; -public class XCmp extends NodeIfComponent { +public class XCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("XCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java index c975811c5..35beaf2e6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/java/com/yomahub/liteflow/test/script/graaljs/getnodes/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.script.graaljs.getnodes.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml index 78a84de68..13e96568b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/getnodes/flow.xml @@ -19,13 +19,13 @@ ]]> - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/ifelse/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/ifelse/flow.xml index db5d0d591..f69385aaa 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/ifelse/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/ifelse/flow.xml @@ -1,13 +1,13 @@ - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/loop/flow.xml index 603cf721a..b960180d1 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-graaljs-springboot/src/test/resources/loop/flow.xml @@ -8,14 +8,14 @@ ]]> - + 3; ]]> - + - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/loop/flow.xml index a6ef34abb..850fdb0d9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/loop/flow.xml @@ -8,14 +8,14 @@ ]]> - + 3 ]]> - + - + - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/ifelse/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/ifelse/flow.xml index db5d0d591..f69385aaa 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/ifelse/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/ifelse/flow.xml @@ -1,13 +1,13 @@ - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/loop/flow.xml index 603cf721a..b960180d1 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-javascript-springboot/src/test/resources/loop/flow.xml @@ -8,14 +8,14 @@ ]]> - + 3; ]]> - + - + - + diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/loop/flow.xml index b775bb495..fd5cb0a6c 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/loop/flow.xml @@ -8,14 +8,14 @@ ]]> - + 3; ]]> - + executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java index b198faa0e..3f88484ee 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("wn2") -@FallbackCmp -public class WhileCmp2 extends NodeWhileComponent { +@FallbackCmp(BooleanTypeEnum.WHILE) +public class WhileCmp2 extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java index d8af1a880..66a5eaa8f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -7,14 +7,14 @@ */ package com.yomahub.liteflow.test.ifelse.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.noear.solon.annotation.Component; @Component("x1") -public class X1Cmp extends NodeIfComponent { +public class X1Cmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return Boolean.parseBoolean(this.getTag()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java index c4bb114c9..449f0dfac 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java @@ -1,15 +1,15 @@ package com.yomahub.liteflow.test.loop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.core.NodeForComponent; import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("y") -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = context.getData("test"); return count > 3; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java index c7bb40e7c..bba3dd601 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java @@ -1,15 +1,15 @@ package com.yomahub.liteflow.test.loop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("z") -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java index dbed32163..970fb121b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java index 433c8bec5..f881557df 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java index 89ef9f92d..7674a4f41 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java index 1db12e3de..ead8b1ae9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java index 0712fd95a..61df5c759 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; import org.noear.solon.annotation.Component; @Component("y") -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = 0; if(context.hasData("test")) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java index 332454777..edf604ba9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; import org.noear.solon.annotation.Component; @Component("z") -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index 54df152d5..fe2a07702 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.retry.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.noear.solon.annotation.Component; @Component("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("FCmp executed!"); flag ++; if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index 5605c729f..463bc84a1 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.retry.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.noear.solon.annotation.Component; @Component("n") -public class NCmp extends NodeWhileComponent { +public class NCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { flag ++; System.out.println("NCmp executed!"); if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java index f2935ff68..4918dccf6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.noear.solon.annotation.Component; @Component("h") -public class HCmp extends NodeBreakComponent { +public class HCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("HCmp executed!"); throw new RuntimeException(); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java index 6e72a9c86..b25b04ca9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.noear.solon.annotation.Component; @Component("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("WCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java index d165ba325..8a468e247 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-solon/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.noear.solon.annotation.Component;; @Component("x") -public class XCmp extends NodeIfComponent { +public class XCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("XCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java index e2c16b4ae..c89cb352a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.abstractChain.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("c") -public class CCmp extends NodeIfComponent { +public class CCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { //do your biz return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/BK.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/BK.java index 54353a351..dc0844ba2 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/BK.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/BK.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("bk") -public class BK extends NodeBreakComponent { +public class BK extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { int index = this.getLoopIndex(); return index > 2; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W1.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W1.java index 24e4d686d..e2cb66e2f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W1.java @@ -7,14 +7,14 @@ */ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("w1") -public class W1 extends NodeWhileComponent { +public class W1 extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W2.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W2.java index 07007d85d..7c9581d21 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/W2.java @@ -7,14 +7,14 @@ */ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("w2") -public class W2 extends NodeWhileComponent { +public class W2 extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X1.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X1.java index afa69979e..b6e2d7f20 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X1.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x1") -public class X1 extends NodeIfComponent { +public class X1 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X2.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X2.java index 266c7457a..1152e5c8a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X2.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x2") -public class X2 extends NodeIfComponent { +public class X2 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X3.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X3.java index dea18a14d..6df5c4b68 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X3.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X3.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x3") -public class X3 extends NodeIfComponent { +public class X3 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X4.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X4.java index 1de35a3b3..ecfe9f94b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X4.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/booleanOpt/cmp/X4.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.booleanOpt.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x4") -public class X4 extends NodeIfComponent { +public class X4 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java index 32813ffe3..f528524e0 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("bn1") -@FallbackCmp -public class BreakCmp extends NodeBreakComponent { +@FallbackCmp(BooleanTypeEnum.BREAK) +public class BreakCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java index 62b47dec1..6d999baac 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("ifn1") -public class IfCmp1 extends NodeIfComponent { +public class IfCmp1 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java index c5b20fcd8..5be4620bd 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("ifn2") -@FallbackCmp -public class IfCmp2 extends NodeIfComponent { +@FallbackCmp(BooleanTypeEnum.IF) +public class IfCmp2 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java index 6769480c6..f732ca792 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("wn1") -public class WhileCmp1 extends NodeWhileComponent { +public class WhileCmp1 extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java index b198faa0e..3f88484ee 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("wn2") -@FallbackCmp -public class WhileCmp2 extends NodeWhileComponent { +@FallbackCmp(BooleanTypeEnum.WHILE) +public class WhileCmp2 extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java index ad0f8158d..b707e2778 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -7,14 +7,14 @@ */ package com.yomahub.liteflow.test.ifelse.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x1") -public class X1Cmp extends NodeIfComponent { +public class X1Cmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return Boolean.parseBoolean(this.getTag()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X2Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X2Cmp.java index 704532893..d74b46fb4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X2Cmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X2Cmp.java @@ -7,14 +7,14 @@ */ package com.yomahub.liteflow.test.ifelse.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x2") -public class X2Cmp extends NodeIfComponent { +public class X2Cmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java index c0eccdb98..172d424cf 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java @@ -1,15 +1,15 @@ package com.yomahub.liteflow.test.iterator.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.core.NodeComponent; import org.springframework.stereotype.Component; @Component("b") -public class BCmp extends NodeBreakComponent { +public class BCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return this.getLoopIndex() == 1; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java index b70b16114..a4ad69cf6 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java @@ -1,15 +1,15 @@ package com.yomahub.liteflow.test.loop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.core.NodeForComponent; import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("y") -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return this.getLoopIndex() > 2; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java index 1d464cae7..d8baa25ad 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java @@ -1,15 +1,15 @@ package com.yomahub.liteflow.test.loop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("z") -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return this.getLoopIndex()<5; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java index dbed32163..970fb121b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java index 433c8bec5..f881557df 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java index 89ef9f92d..7674a4f41 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java index 1db12e3de..ead8b1ae9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java index 2ac455183..ea6a03591 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java @@ -2,7 +2,7 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @@ -10,10 +10,10 @@ import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; @Component("y") -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = 0; if(context.hasData("test")) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java index d1dfaf657..cd89c8059 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java @@ -3,17 +3,17 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; @Component("z") -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index 1bc95f542..81704f493 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("FCmp executed!"); flag ++; if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index ac0434c95..e72524abb 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.retry.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("n") -public class NCmp extends NodeWhileComponent { +public class NCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { flag ++; System.out.println("NCmp executed!"); if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java index 19ebef9b3..a2d3ebe5f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("h") -public class HCmp extends NodeBreakComponent { +public class HCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("HCmp executed!"); throw new RuntimeException(); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java index 3f0fd80d4..81233ca78 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("WCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java index 9928246c4..7d161a2d4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x") -public class XCmp extends NodeIfComponent { +public class XCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("XCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java index e2c16b4ae..c89cb352a 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/abstractChain/cmp/CCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.abstractChain.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("c") -public class CCmp extends NodeIfComponent { +public class CCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { //do your biz return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java index 32813ffe3..f528524e0 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/BreakCmp.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("bn1") -@FallbackCmp -public class BreakCmp extends NodeBreakComponent { +@FallbackCmp(BooleanTypeEnum.BREAK) +public class BreakCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java index 62b47dec1..6d999baac 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp1.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("ifn1") -public class IfCmp1 extends NodeIfComponent { +public class IfCmp1 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java index c5b20fcd8..5be4620bd 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/IfCmp2.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("ifn2") -@FallbackCmp -public class IfCmp2 extends NodeIfComponent { +@FallbackCmp(BooleanTypeEnum.IF) +public class IfCmp2 extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java index 6769480c6..f732ca792 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp1.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("wn1") -public class WhileCmp1 extends NodeWhileComponent { +public class WhileCmp1 extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java index b198faa0e..3f88484ee 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/fallback/cmp/WhileCmp2.java @@ -2,14 +2,15 @@ package com.yomahub.liteflow.test.fallback.cmp; import com.yomahub.liteflow.annotation.FallbackCmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.enums.BooleanTypeEnum; @LiteflowComponent("wn2") -@FallbackCmp -public class WhileCmp2 extends NodeWhileComponent { +@FallbackCmp(BooleanTypeEnum.WHILE) +public class WhileCmp2 extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { return false; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java index ad0f8158d..b707e2778 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -7,14 +7,14 @@ */ package com.yomahub.liteflow.test.ifelse.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x1") -public class X1Cmp extends NodeIfComponent { +public class X1Cmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return Boolean.parseBoolean(this.getTag()); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java index e6dcd45a7..e06262e86 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/iterator/cmp/BCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.iterator.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("b") -public class BCmp extends NodeBreakComponent { +public class BCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { return this.getLoopIndex() == 1; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java index 6a820a638..1ff92b000 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/YCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.loop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("y") -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = context.getData("test"); return count > 3; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java index 78c621f2b..209bcbb46 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/loop/cmp/ZCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.loop.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; @LiteflowComponent("z") -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java index dbed32163..970fb121b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java index 433c8bec5..f881557df 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitMilliseconds/cmp/WCmp.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.maxWaitMilliseconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java index 89ef9f92d..7674a4f41 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/FCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; @LiteflowComponent("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { return true; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java index 1db12e3de..ead8b1ae9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/maxWaitSeconds/cmp/WCmp.java @@ -1,20 +1,20 @@ package com.yomahub.liteflow.test.maxWaitSeconds.cmp; import com.yomahub.liteflow.annotation.LiteflowComponent; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import java.util.HashSet; import java.util.Set; @LiteflowComponent("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { private int count = 0; // 执行过的 chain Set executedChain = new HashSet<>(); @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { // 判断是否切换了 chain if (!executedChain.contains(this.getCurrChainId())) { count = 0; diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java index 8975f7f3b..dee9e1899 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/YCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; @Component("y") -public class YCmp extends NodeBreakComponent { +public class YCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); int count = 0; if(context.hasData("test")) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java index 844a6ff25..134489c62 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/parallelLoop/cmp/ZCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.parallelLoop.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import com.yomahub.liteflow.slot.DefaultContext; import org.springframework.stereotype.Component; @Component("z") -public class ZCmp extends NodeWhileComponent { +public class ZCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { DefaultContext context = this.getFirstContextBean(); String key = "test"; if (context.hasData(key)) { diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java index ee942ea6c..5172ab902 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/FCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.retry.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("f") -public class FCmp extends NodeIfComponent { +public class FCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("FCmp executed!"); flag ++; if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java index ff24b004d..5543be3b9 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/retry/cmp/NCmp.java @@ -1,14 +1,14 @@ package com.yomahub.liteflow.test.retry.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("n") -public class NCmp extends NodeWhileComponent { +public class NCmp extends NodeBooleanComponent { int flag = 0; @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { flag ++; System.out.println("NCmp executed!"); if(flag < 4) throw new RuntimeException(); diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java index 19ebef9b3..a2d3ebe5f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/HCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeBreakComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("h") -public class HCmp extends NodeBreakComponent { +public class HCmp extends NodeBooleanComponent { @Override - public boolean processBreak() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("HCmp executed!"); throw new RuntimeException(); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java index 3f0fd80d4..81233ca78 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/WCmp.java @@ -1,13 +1,13 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeWhileComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("w") -public class WCmp extends NodeWhileComponent { +public class WCmp extends NodeBooleanComponent { @Override - public boolean processWhile() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("WCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java index 9928246c4..7d161a2d4 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/rollback/cmp/XCmp.java @@ -1,12 +1,12 @@ package com.yomahub.liteflow.test.rollback.cmp; -import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.core.NodeBooleanComponent; import org.springframework.stereotype.Component; @Component("x") -public class XCmp extends NodeIfComponent { +public class XCmp extends NodeBooleanComponent { @Override - public boolean processIf() throws Exception { + public boolean processBoolean() throws Exception { System.out.println("XCmp executed!"); return true; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/data.sql index dda527ee6..f6875cc64 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/data.sql +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/data.sql @@ -8,7 +8,7 @@ INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain DELETE FROM SCRIPT_NODE_TABLE; -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','if_script','return true','groovy'); -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','if_script','return false','groovy'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','boolean_script','return true','groovy'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','boolean_script','return false','groovy'); -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','if_script','return true','js'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','boolean_script','return true','js'); diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/second/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/second/data.sql index 35412b6a8..2b83a0685 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/second/data.sql +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot-dynamic/src/test/resources/sql/second/data.sql @@ -17,11 +17,11 @@ FROM SCRIPT_NODE_TABLE; INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME, SCRIPT_NODE_ID, SCRIPT_NODE_NAME, SCRIPT_NODE_TYPE, SCRIPT_NODE_DATA, SCRIPT_LANGUAGE) -values ('demo', 'x01', 'if 脚本', 'if_script', 'return true', 'groovy'); +values ('demo', 'x01', 'if 脚本', 'boolean_script', 'return true', 'groovy'); INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME, SCRIPT_NODE_ID, SCRIPT_NODE_NAME, SCRIPT_NODE_TYPE, SCRIPT_NODE_DATA, SCRIPT_LANGUAGE) -values ('demo', 'x11', 'if 脚本', 'if_script', 'return false', 'groovy'); +values ('demo', 'x11', 'if 脚本', 'boolean_script', 'return false', 'groovy'); INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME, SCRIPT_NODE_ID, SCRIPT_NODE_NAME, SCRIPT_NODE_TYPE, SCRIPT_NODE_DATA, SCRIPT_LANGUAGE) -values ('demo', 'x21', 'python脚本', 'if_script', 'return true', 'js'); +values ('demo', 'x21', 'python脚本', 'boolean_script', 'return true', 'js'); diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql index 5900dfa0a..5453c149e 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/data.sql @@ -8,7 +8,7 @@ INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain DELETE FROM SCRIPT_NODE_TABLE; -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','if_script','return true','groovy'); -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','if_script','return true','groovy'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','boolean_script','return true','groovy'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','boolean_script','return true','groovy'); -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','if_script','return true','js'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','boolean_script','return true','js'); diff --git a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql index dda527ee6..f6875cc64 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql +++ b/liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/resources/sql/sql-lite/data.sql @@ -8,7 +8,7 @@ INSERT INTO EL_TABLE (APPLICATION_NAME,CHAIN_NAME,EL_DATA) values ('demo','chain DELETE FROM SCRIPT_NODE_TABLE; -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','if_script','return true','groovy'); -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','if_script','return false','groovy'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x0','if 脚本','boolean_script','return true','groovy'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x1','if 脚本','boolean_script','return false','groovy'); -INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','if_script','return true','js'); +INSERT INTO SCRIPT_NODE_TABLE (APPLICATION_NAME,SCRIPT_NODE_ID,SCRIPT_NODE_NAME,SCRIPT_NODE_TYPE,SCRIPT_NODE_DATA,SCRIPT_LANGUAGE) values ('demo','x2','python脚本','boolean_script','return true','js'); From d60d4ae8581a073170440106c09c156f67c24433 Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Fri, 23 Feb 2024 15:29:51 +0800 Subject: [PATCH 42/49] =?UTF-8?q?enhancement=20#I91AUT=20=E6=8F=90?= =?UTF-8?q?=E4=BE=9B=E5=9C=A8=E5=88=87=E9=9D=A2=E5=87=BA=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=20isContinueOnError=20=E5=8F=82=E6=95=B0=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/core/NodeComponent.java | 22 ++++--- .../yomahub/liteflow/flow/element/Node.java | 22 ++++++- .../CustomAOPELOperatorSpringbootTest.java | 58 ++++++++++++++++ .../GlobalAOPELOperatorSpringbootTest.java | 66 +++++++++++++++++++ .../test/aop/aspect/CmpOperatorAspect.java | 34 ++++++++++ .../test/aop/aspect/CustomOperatorAspect.java | 29 ++++++++ .../src/test/resources/aop/flow.el.xml | 9 +++ 7 files changed, 230 insertions(+), 10 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/CustomAOPELOperatorSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/GlobalAOPELOperatorSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CmpOperatorAspect.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CustomOperatorAspect.java 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 9bf9feaca..02140db44 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 @@ -12,21 +12,22 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.alibaba.ttl.TransmittableThreadLocal; import com.yomahub.liteflow.core.proxy.LiteFlowProxyUtil; +import com.yomahub.liteflow.enums.CmpStepTypeEnum; +import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.flow.LiteflowResponse; import com.yomahub.liteflow.flow.element.Node; -import com.yomahub.liteflow.flow.executor.NodeExecutor; +import com.yomahub.liteflow.flow.entity.CmpStep; import com.yomahub.liteflow.flow.executor.DefaultNodeExecutor; -import com.yomahub.liteflow.enums.NodeTypeEnum; +import com.yomahub.liteflow.flow.executor.NodeExecutor; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; -import com.yomahub.liteflow.spi.holder.CmpAroundAspectHolder; -import com.yomahub.liteflow.util.JsonUtil; -import com.yomahub.liteflow.flow.entity.CmpStep; -import com.yomahub.liteflow.enums.CmpStepTypeEnum; -import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.slot.Slot; import com.yomahub.liteflow.monitor.CompStatistics; import com.yomahub.liteflow.monitor.MonitorBus; +import com.yomahub.liteflow.slot.DataBus; +import com.yomahub.liteflow.slot.Slot; +import com.yomahub.liteflow.spi.holder.CmpAroundAspectHolder; +import com.yomahub.liteflow.util.JsonUtil; + import java.lang.reflect.Method; import java.util.Date; @@ -34,6 +35,7 @@ import java.util.Date; * 普通组件抽象类 * * @author Bryan.Zhang + * @author luo yi */ public abstract class NodeComponent{ @@ -236,6 +238,10 @@ public abstract class NodeComponent{ this.refNodeTL.get().setIsEnd(isEnd); } + public void setIsContinueOnError(boolean isContinueOnError) { + this.refNodeTL.get().setIsContinueOnErrorResult(isContinueOnError); + } + public Integer getSlotIndex() { return this.refNodeTL.get().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 e3c137d7f..683bfd8dd 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 @@ -71,6 +71,9 @@ public class Node implements Executable, Cloneable, Rollbackable{ // 是否结束整个流程,这个只对串行流程有效,并行流程无效 private TransmittableThreadLocal isEndTL = new TransmittableThreadLocal<>(); + // isContinueOnError 结果 + private TransmittableThreadLocal isContinueOnErrorResult = new TransmittableThreadLocal<>(); + public Node() { } @@ -168,7 +171,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ throw new ChainEndException(errorInfo); } // 如果组件覆盖了isContinueOnError方法,返回为true,那即便出了异常,也会继续流程 - else if (instance.isContinueOnError()) { + else if (getIsContinueOnErrorResult() || instance.isContinueOnError()) { String errorMsg = StrUtil.format("component[{}] cause error,but flow is still go on", id); LOG.error(errorMsg); } @@ -185,6 +188,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ removeIsEnd(); removeLoopIndex(); removeAccessResult(); + removeIsContinueOnErrorResult(); } } @@ -262,7 +266,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ public boolean getAccessResult() { Boolean result = this.accessResult.get(); - return result == null ? false : result; + return result != null && result; } public void setAccessResult(boolean accessResult) { @@ -273,6 +277,19 @@ public class Node implements Executable, Cloneable, Rollbackable{ this.accessResult.remove(); } + public boolean getIsContinueOnErrorResult() { + Boolean result = this.isContinueOnErrorResult.get(); + return result != null && result; + } + + public void setIsContinueOnErrorResult(boolean accessResult) { + this.isContinueOnErrorResult.set(accessResult); + } + + public void removeIsContinueOnErrorResult() { + this.isContinueOnErrorResult.remove(); + } + public void setLoopIndex(int index) { this.loopIndexTL.set(index); } @@ -342,6 +359,7 @@ public class Node implements Executable, Cloneable, Rollbackable{ node.accessResult = new TransmittableThreadLocal<>(); node.slotIndexTL = new TransmittableThreadLocal<>(); node.isEndTL = new TransmittableThreadLocal<>(); + node.isContinueOnErrorResult = new TransmittableThreadLocal<>(); return node; } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/CustomAOPELOperatorSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/CustomAOPELOperatorSpringbootTest.java new file mode 100644 index 000000000..d6ebc9587 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/CustomAOPELOperatorSpringbootTest.java @@ -0,0 +1,58 @@ +package com.yomahub.liteflow.test.aop; + +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 com.yomahub.liteflow.test.aop.aspect.CustomOperatorAspect; +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.context.annotation.Import; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * 切面场景单元测试 + * + * @author luo yi + */ +@TestPropertySource(value = "classpath:/aop/application.properties") +@SpringBootTest(classes = CustomAOPELOperatorSpringbootTest.class) +@EnableAutoConfiguration +@Import(CustomOperatorAspect.class) +@ComponentScan({ "com.yomahub.liteflow.test.aop.cmp1", "com.yomahub.liteflow.test.aop.cmp2" }) +public class CustomAOPELOperatorSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 设置 isContinueOnError 测试全局 AOP,串行场景 + @Test + public void testGlobalAopErrorWithContinueS() { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("before_after", context.getData("a")); + Assertions.assertEquals("before_after", context.getData("b")); + Assertions.assertEquals("before_after", context.getData("c")); + Assertions.assertEquals("before", context.getData("f")); + } + + // 设置 isContinueOnError 测试全局 AOP,并行场景 + @Test + public void testGlobalAopErrorWithContinueP() { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("before_after", context.getData("a")); + Assertions.assertEquals("before_after", context.getData("b")); + Assertions.assertEquals("before_after", context.getData("c")); + Assertions.assertEquals("before_after", context.getData("e")); + Assertions.assertEquals("before", context.getData("f")); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/GlobalAOPELOperatorSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/GlobalAOPELOperatorSpringbootTest.java new file mode 100644 index 000000000..8a3dd6cf1 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/GlobalAOPELOperatorSpringbootTest.java @@ -0,0 +1,66 @@ +package com.yomahub.liteflow.test.aop; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.slot.DefaultContext; +import com.yomahub.liteflow.spring.ComponentScanner; +import com.yomahub.liteflow.test.BaseTest; +import com.yomahub.liteflow.test.aop.aspect.CmpOperatorAspect; +import org.junit.jupiter.api.AfterAll; +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.context.annotation.Import; +import org.springframework.test.context.TestPropertySource; + +import javax.annotation.Resource; + +/** + * 切面场景单元测试 + * + * @author luo yi + */ +@TestPropertySource(value = "classpath:/aop/application.properties") +@SpringBootTest(classes = GlobalAOPELOperatorSpringbootTest.class) +@EnableAutoConfiguration +@Import(CmpOperatorAspect.class) +@ComponentScan({ "com.yomahub.liteflow.test.aop.cmp1", "com.yomahub.liteflow.test.aop.cmp2" }) +public class GlobalAOPELOperatorSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + // 设置 isContinueOnError 测试全局 AOP,串行场景 + @Test + public void testGlobalAopErrorWithContinueS() { + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("before_after", context.getData("a")); + Assertions.assertEquals("before_after", context.getData("b")); + Assertions.assertEquals("before_after", context.getData("c")); + Assertions.assertEquals("test error", context.getData("f_error")); + } + + // 设置 isContinueOnError 测试全局 AOP,并行场景 + @Test + public void testGlobalAopErrorWithContinueP() { + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "it's a request"); + DefaultContext context = response.getFirstContextBean(); + Assertions.assertTrue(response.isSuccess()); + Assertions.assertEquals("before_after", context.getData("a")); + Assertions.assertEquals("before_after", context.getData("b")); + Assertions.assertEquals("before_after", context.getData("c")); + Assertions.assertEquals("before_after", context.getData("e")); + Assertions.assertEquals("test error", context.getData("f_error")); + } + + @AfterAll + public static void cleanScanCache() { + BaseTest.cleanScanCache(); + ComponentScanner.cmpAroundAspect = null; + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CmpOperatorAspect.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CmpOperatorAspect.java new file mode 100644 index 000000000..783d92ce9 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CmpOperatorAspect.java @@ -0,0 +1,34 @@ +package com.yomahub.liteflow.test.aop.aspect; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.aop.ICmpAroundAspect; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; + +public class CmpOperatorAspect implements ICmpAroundAspect { + + @Override + public void beforeProcess(NodeComponent cmp) { + DefaultContext context = cmp.getFirstContextBean(); + context.setData(cmp.getNodeId(), "before"); + } + + @Override + public void afterProcess(NodeComponent cmp) { + DefaultContext context = cmp.getFirstContextBean(); + context.setData(cmp.getNodeId(), StrUtil.format("{}_{}", context.getData(cmp.getNodeId()), "after")); + } + + @Override + public void onSuccess(NodeComponent cmp) { + + } + + @Override + public void onError(NodeComponent cmp, Exception e) { + cmp.setIsContinueOnError(true); + DefaultContext context = cmp.getFirstContextBean(); + context.setData(cmp.getNodeId() + "_error", e.getMessage()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CustomOperatorAspect.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CustomOperatorAspect.java new file mode 100644 index 000000000..964546da2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/aop/aspect/CustomOperatorAspect.java @@ -0,0 +1,29 @@ +package com.yomahub.liteflow.test.aop.aspect; + +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; + +@Aspect +public class CustomOperatorAspect { + + @Pointcut("execution(* com.yomahub.liteflow.test.aop.*.*.process())") + public void cut() { + } + + @Around("cut()") + public Object around(ProceedingJoinPoint jp) throws Throwable { + NodeComponent cmp = (NodeComponent) jp.getThis(); + DefaultContext context = cmp.getFirstContextBean(); + cmp.setIsContinueOnError(true); + context.setData(cmp.getNodeId(), "before"); + Object returnObj = jp.proceed(); + context.setData(cmp.getNodeId(), StrUtil.format("{}_{}", context.getData(cmp.getNodeId()), "after")); + return returnObj; + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/aop/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/aop/flow.el.xml index 8b89951a2..4937d9e5b 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/aop/flow.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/aop/flow.el.xml @@ -11,4 +11,13 @@ THEN(a,b,c,f); + + + THEN(a, f, b, c); + + + + THEN(a, b, WHEN(f, e), c); + + \ No newline at end of file From 778cd5787e91598c280710262cb674f825059c27 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Sun, 25 Feb 2024 22:01:19 +0800 Subject: [PATCH 43/49] =?UTF-8?q?=E4=BC=98=E5=8C=96NotCondition=E4=B8=AD?= =?UTF-8?q?=EF=BC=8C=E8=AE=BE=E5=80=BC=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yomahub/liteflow/flow/element/condition/NotCondition.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/NotCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/NotCondition.java index 5e53f8434..3a8f3d9f9 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/NotCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/NotCondition.java @@ -26,7 +26,7 @@ public class NotCondition extends Condition { Slot slot = DataBus.getSlot(slotIndex); String resultKey = StrUtil.format("{}_{}",this.getClass().getName(),this.hashCode()); - slot.setAndOrResult(resultKey, !flag); + slot.setNotResult(resultKey, !flag); } @@ -35,7 +35,7 @@ public class NotCondition extends Condition { public Boolean getItemResultMetaValue(Integer slotIndex) { Slot slot = DataBus.getSlot(slotIndex); String resultKey = StrUtil.format("{}_{}",this.getClass().getName(),this.hashCode()); - return slot.getAndOrResult(resultKey); + return slot.getNotResult(resultKey); } @Override From 174bf830623353d5f7f617a95e0935bb22bbab4f Mon Sep 17 00:00:00 2001 From: luoyi <972849752@qq.com> Date: Tue, 27 Feb 2024 15:03:23 +0800 Subject: [PATCH 44/49] =?UTF-8?q?bug=20#I8YDGE=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E5=9C=A8=20isAccess=20=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E4=B8=AD=E6=AD=A3=E7=A1=AE=E8=8E=B7=E5=8F=96=E5=88=B0=20currCh?= =?UTF-8?q?ainId=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../flow/element/condition/ForCondition.java | 6 ++++-- .../flow/element/condition/IfCondition.java | 7 +++++-- .../flow/element/condition/IteratorCondition.java | 4 +++- .../flow/element/condition/SwitchCondition.java | 7 +++---- .../flow/element/condition/WhileCondition.java | 5 +++-- .../parallel/strategy/AllOfParallelExecutor.java | 2 +- .../strategy/ParallelStrategyExecutor.java | 14 ++++++++------ .../parallel/strategy/SpecifyParallelExecutor.java | 2 +- 8 files changed, 28 insertions(+), 19 deletions(-) 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 f3aeabaae..50f0a56e3 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 @@ -33,13 +33,15 @@ public class ForCondition extends LoopCondition { throw new NoForNodeException(errorInfo); } + // 提前设置 chainId,避免无法在 isAccess 方法中获取到 + forNode.setCurrChainId(this.getCurrChainId()); + // 先去判断isAccess方法,如果isAccess方法都返回false,整个FOR表达式不执行 - if (!this.getForNode().isAccess(slotIndex)) { + if (!forNode.isAccess(slotIndex)) { return; } // 执行forCount组件 - forNode.setCurrChainId(this.getCurrChainId()); forNode.execute(slotIndex); // 获得循环次数 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java index 5fa272a30..91f3a8e41 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java @@ -3,7 +3,8 @@ package com.yomahub.liteflow.flow.element.condition; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ConditionTypeEnum; -import com.yomahub.liteflow.exception.*; +import com.yomahub.liteflow.exception.IfTargetCannotBePreOrFinallyException; +import com.yomahub.liteflow.exception.NoIfTrueNodeException; import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.slot.DataBus; @@ -21,13 +22,15 @@ public class IfCondition extends Condition { public void executeCondition(Integer slotIndex) throws Exception { Executable ifItem = this.getIfItem(); + // 提前设置 chainId,避免无法在 isAccess 方法中获取到 + ifItem.setCurrChainId(this.getCurrChainId()); + // 先去判断isAccess方法,如果isAccess方法都返回false,整个IF表达式不执行 if (!ifItem.isAccess(slotIndex)) { return; } // 先执行IF节点 - ifItem.setCurrChainId(this.getCurrChainId()); ifItem.execute(slotIndex); // 拿到If执行过的结果 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java index f80ac43d7..2a2a640b0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IteratorCondition.java @@ -29,13 +29,15 @@ public class IteratorCondition extends LoopCondition { throw new NoIteratorNodeException(errorInfo); } + // 提前设置 chainId,避免无法在 isAccess 方法中获取到 + iteratorNode.setCurrChainId(this.getCurrChainId()); + // 先去判断isAccess方法,如果isAccess方法都返回false,整个ITERATOR表达式不执行 if (!iteratorNode.isAccess(slotIndex)) { return; } // 执行Iterator组件 - iteratorNode.setCurrChainId(this.getCurrChainId()); iteratorNode.execute(slotIndex); Iterator it = iteratorNode.getItemResultMetaValue(slotIndex); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/SwitchCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/SwitchCondition.java index 2a208d8ee..3c575f2f4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/SwitchCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/SwitchCondition.java @@ -1,13 +1,10 @@ package com.yomahub.liteflow.flow.element.condition; -import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ConditionTypeEnum; -import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.NoSwitchTargetNodeException; import com.yomahub.liteflow.exception.SwitchTargetCannotBePreOrFinallyException; -import com.yomahub.liteflow.exception.SwitchTypeErrorException; import com.yomahub.liteflow.flow.element.Condition; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; @@ -35,13 +32,15 @@ public class SwitchCondition extends Condition { // 获取target List List targetList = this.getTargetList(); + // 提前设置 chainId,避免无法在 isAccess 方法中获取到 + switchNode.setCurrChainId(this.getCurrChainId()); + // 先去判断isAccess方法,如果isAccess方法都返回false,整个SWITCH表达式不执行 if (!switchNode.isAccess(slotIndex)) { return; } // 先执行switch节点 - switchNode.setCurrChainId(this.getCurrChainId()); switchNode.execute(slotIndex); // 拿到switch节点的结果 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 df85bfe86..0e00e761f 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 @@ -3,7 +3,6 @@ package com.yomahub.liteflow.flow.element.condition; import cn.hutool.core.util.ObjectUtil; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.flow.element.Executable; -import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.parallel.LoopFutureObj; import com.yomahub.liteflow.thread.ExecutorHelper; @@ -24,6 +23,9 @@ public class WhileCondition extends LoopCondition { public void executeCondition(Integer slotIndex) throws Exception { Executable whileItem = this.getWhileItem(); + // 提前设置 chainId,避免无法在 isAccess 方法中获取到 + whileItem.setCurrChainId(this.getCurrChainId()); + // 先去判断isAccess方法,如果isAccess方法都返回false,整个WHILE表达式不执行 if (!whileItem.isAccess(slotIndex)) { return; @@ -84,7 +86,6 @@ public class WhileCondition extends LoopCondition { private boolean getWhileResult(Integer slotIndex, int loopIndex) throws Exception { Executable whileItem = this.getWhileItem(); // 执行while组件 - whileItem.setCurrChainId(this.getCurrChainId()); setLoopIndex(whileItem, loopIndex); whileItem.execute(slotIndex); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java index 2cb606f1e..6b637dbe4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/AllOfParallelExecutor.java @@ -33,7 +33,7 @@ public class AllOfParallelExecutor extends ParallelStrategyExecutor { // 在 allOf 这个场景中,不需要过滤 @Override - protected Stream filterAccess(Stream stream, Integer slotIndex) { + protected Stream filterAccess(Stream stream, Integer slotIndex, String currentChainId) { return stream; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java index c0cabd242..e420876f2 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/ParallelStrategyExecutor.java @@ -11,7 +11,6 @@ import com.yomahub.liteflow.flow.element.condition.FinallyCondition; import com.yomahub.liteflow.flow.element.condition.PreCondition; import com.yomahub.liteflow.flow.element.condition.WhenCondition; import com.yomahub.liteflow.flow.parallel.CompletableFutureExpand; -import com.yomahub.liteflow.flow.parallel.CompletableFutureTimeout; import com.yomahub.liteflow.flow.parallel.ParallelSupplier; import com.yomahub.liteflow.flow.parallel.WhenFutureObj; import com.yomahub.liteflow.log.LFLog; @@ -89,20 +88,23 @@ public abstract class ParallelStrategyExecutor { * 过滤 WHEN 待执行任务 * @param executableList 所有任务列表 * @param slotIndex + * @param currentChainId 当前执行的 chainId * @return */ - protected Stream filterWhenTaskList(List executableList, Integer slotIndex) { + protected Stream filterWhenTaskList(List executableList, Integer slotIndex, String currentChainId) { // 1.先进行过滤,前置和后置组件过滤掉,因为在 EL Chain 处理的时候已经提出来了 // 2.过滤 isAccess 为 false 的情况,因为不过滤这个的话,如果加上了 any,那么 isAccess 为 false 那就是最快的了 Stream stream = executableList.stream() .filter(executable -> !(executable instanceof PreCondition) && !(executable instanceof FinallyCondition)); - return filterAccess(stream, slotIndex); + return filterAccess(stream, slotIndex, currentChainId); } // 过滤 isAccess 的方法,默认实现,同时为避免同一个 node 的 isAccess 方法重复执行,给 node 设置 isAccess 方法执行结果 - protected Stream filterAccess(Stream stream, Integer slotIndex) { + protected Stream filterAccess(Stream stream, Integer slotIndex, String currentChainId) { return stream.filter(executable -> { try { + // 提前设置 chainId,避免无法在 isAccess 方法中获取到 + executable.setCurrChainId(currentChainId); boolean access = executable.isAccess(slotIndex); if (executable instanceof Node) { ((Node) executable).setAccessResult(access); @@ -150,14 +152,14 @@ public abstract class ParallelStrategyExecutor { String currChainName = whenCondition.getCurrChainId(); // 设置 whenCondition 参数 - setWhenConditionParams(whenCondition); + this.setWhenConditionParams(whenCondition); // 获取 WHEN 所需线程池 ExecutorService parallelExecutor = getWhenExecutorService(whenCondition); // 这里主要是做了封装 CompletableFuture 对象,用 lambda 表达式做了很多事情,这句代码要仔细理清 // 根据 condition.getNodeList() 的集合进行流处理,用 map 进行把 executable 对象转换成 List> - List> completableFutureList = filterWhenTaskList(whenCondition.getExecutableList(), slotIndex) + List> completableFutureList = filterWhenTaskList(whenCondition.getExecutableList(), slotIndex, currChainName) .map(executable -> wrappedFutureObj(executable, parallelExecutor, whenCondition, currChainName, slotIndex)) .collect(Collectors.toList()); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java index e9a78ef9a..7f2aaf92d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/parallel/strategy/SpecifyParallelExecutor.java @@ -41,7 +41,7 @@ public class SpecifyParallelExecutor extends ParallelStrategyExecutor { List> allTaskList = new ArrayList<>(); // 遍历 when 所有 node,进行筛选及处理 - filterWhenTaskList(whenCondition.getExecutableList(), slotIndex) + filterWhenTaskList(whenCondition.getExecutableList(), slotIndex, currChainName) .forEach(executable -> { // 处理 task,封装成 CompletableFuture 对象 CompletableFuture completableFutureTask = wrappedFutureObj(executable, parallelExecutor, whenCondition, currChainName, slotIndex); From 3d65d77730dab19fc9cdaa48d309ee9aa1310102 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Tue, 5 Mar 2024 14:57:03 +0800 Subject: [PATCH 45/49] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E7=94=A8=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../script/python/common/ScriptPythonCommonELTest.java | 6 ++++++ .../src/test/resources/common/flow.xml | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java index 36f360b5b..a29b63fbe 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java @@ -43,4 +43,10 @@ public class ScriptPythonCommonELTest extends BaseTest { Assertions.assertEquals("hi,jack", context.getData("td")); } + @Test + public void testCommon2() { + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assertions.assertTrue(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml index b43fdc9ba..b226abcd7 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml @@ -25,9 +25,19 @@ + + + + THEN(a, b, c, s1, s2); + + + SWITCH(s3).TO(a,b); + \ No newline at end of file From 9b8902c01cc5650c0262c5f03b605c3b9e98b271 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Wed, 6 Mar 2024 14:03:11 +0800 Subject: [PATCH 46/49] =?UTF-8?q?feature=20#I96A33=20=E4=B8=BALF=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=86=B3=E7=AD=96=E8=A1=A8=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 46 ++++++++++++ .../liteflow/common/ChainConstant.java | 4 + .../yomahub/liteflow/flow/element/Chain.java | 10 +++ .../liteflow/parser/helper/ParserHelper.java | 73 +++++++++++-------- .../src/main/resources/dtd/liteflow.dtd | 4 +- .../test/route/RouteSpringbootTest.java | 42 +++++++++++ .../yomahub/liteflow/test/route/cmp/ACmp.java | 20 +++++ .../yomahub/liteflow/test/route/cmp/BCmp.java | 21 ++++++ .../yomahub/liteflow/test/route/cmp/R1.java | 12 +++ .../yomahub/liteflow/test/route/cmp/R2.java | 12 +++ .../resources/route/application.properties | 1 + .../src/test/resources/route/flow.el.xml | 21 ++++++ 12 files changed, 236 insertions(+), 30 deletions(-) create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/RouteSpringbootTest.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/ACmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/BCmp.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R1.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/route/cmp/R2.java create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/application.properties create mode 100644 liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/route/flow.el.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 6de02fb00..91431715d 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 @@ -21,6 +21,7 @@ import com.yomahub.liteflow.exception.ParseException; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.Condition; +import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.log.LFLog; import com.yomahub.liteflow.log.LFLoggerManager; @@ -44,6 +45,11 @@ public class LiteFlowChainELBuilder { private Chain chain; + /** + * 这是route EL的文本 + */ + private Executable route; + /** * 这是主体的Condition //声明这个变量,而不是用chain.getConditionList的目的,是为了辅助平滑加载 * 虽然FlowBus里面的map都是CopyOnWrite类型的,但是在buildCondition的时候,为了平滑加载,所以不能事先把chain.getConditionList给设为空List @@ -130,6 +136,45 @@ public class LiteFlowChainELBuilder { return this; } + public LiteFlowChainELBuilder setRoute(String routeEl){ + if (StrUtil.isBlank(routeEl)) { + String errMsg = StrUtil.format("You have defined the label but there is no content in the chain[{}].", chain.getChainId()); + throw new FlowSystemException(errMsg); + } + List errorList = new ArrayList<>(); + try { + DefaultContext context = new DefaultContext<>(); + + // 往上下文里放入所有的node,使得el表达式可以直接引用到nodeId + FlowBus.getNodeMap().keySet().forEach(nodeId -> context.put(nodeId, FlowBus.getNode(nodeId))); + + // 解析route el成为一个executable + Executable routeExecutable = (Executable) EXPRESS_RUNNER.execute(routeEl, context, errorList, true, true); + + if (Objects.isNull(routeExecutable)){ + throw new QLException(StrUtil.format("parse route el fail,el:[{}]", routeEl)); + } + + // 把主要的condition加入 + this.route = routeExecutable; + return this; + } catch (QLException e) { + // EL 底层会包装异常,这里是曲线处理 + if (ObjectUtil.isNotNull(e.getCause()) && Objects.equals(e.getCause().getMessage(), DataNotFoundException.MSG)) { + // 构建错误信息 + String msg = buildDataNotFoundExceptionMsg(routeEl); + throw new ELParseException(msg); + }else if (ObjectUtil.isNotNull(e.getCause())){ + throw new ELParseException(e.getCause().getMessage()); + }else{ + throw new ELParseException(e.getMessage()); + } + } catch (Exception e) { + String errMsg = StrUtil.format("parse el fail in this chain[{}];\r\n", chain.getChainId()); + throw new ELParseException(errMsg + e.getMessage()); + } + } + public LiteFlowChainELBuilder setEL(String elStr) { if (StrUtil.isBlank(elStr)) { String errMsg = StrUtil.format("no content in this chain[{}]", chain.getChainId()); @@ -197,6 +242,7 @@ public class LiteFlowChainELBuilder { } public void build() { + this.chain.setRouteItem(this.route); this.chain.setConditionList(this.conditionList); //暂且去掉循环依赖检测,因为有发现循环依赖检测在对大的EL进行检测的时候,会导致CPU飙升,也或许是jackson低版本的问题 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java b/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java index c90600165..149aaa64d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/common/ChainConstant.java @@ -10,6 +10,10 @@ public interface ChainConstant { String CHAIN = "chain"; + String ROUTE = "route"; + + String BODY = "body"; + String FLOW = "flow"; String NODES = "nodes"; diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java index 16cc12546..04cada75d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/Chain.java @@ -30,6 +30,8 @@ public class Chain implements Executable{ private String chainId; + private Executable routeItem; + private List conditionList = new ArrayList<>(); public Chain(String chainName) { @@ -133,4 +135,12 @@ public class Chain implements Executable{ public String getTag() { return null; } + + public Executable getRouteItem() { + return routeItem; + } + + public void setRouteItem(Executable routeItem) { + this.routeItem = routeItem; + } } 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 49ab1bf63..cf5f560be 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 @@ -8,12 +8,7 @@ import com.yomahub.liteflow.builder.LiteFlowNodeBuilder; import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.exception.ChainDuplicateException; -import com.yomahub.liteflow.exception.ChainNotFoundException; -import com.yomahub.liteflow.exception.NodeClassNotFoundException; -import com.yomahub.liteflow.exception.NodeTypeCanNotGuessException; -import com.yomahub.liteflow.exception.NodeTypeNotSupportException; -import com.yomahub.liteflow.exception.ParseException; +import com.yomahub.liteflow.exception.*; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Chain; import com.yomahub.liteflow.flow.element.condition.AbstractCondition; @@ -30,18 +25,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Consumer; -import static com.yomahub.liteflow.common.ChainConstant.CHAIN; -import static com.yomahub.liteflow.common.ChainConstant.EXTENDS; -import static com.yomahub.liteflow.common.ChainConstant.FILE; -import static com.yomahub.liteflow.common.ChainConstant.FLOW; -import static com.yomahub.liteflow.common.ChainConstant.ID; -import static com.yomahub.liteflow.common.ChainConstant.LANGUAGE; -import static com.yomahub.liteflow.common.ChainConstant.NAME; -import static com.yomahub.liteflow.common.ChainConstant.NODE; -import static com.yomahub.liteflow.common.ChainConstant.NODES; -import static com.yomahub.liteflow.common.ChainConstant.TYPE; -import static com.yomahub.liteflow.common.ChainConstant.VALUE; -import static com.yomahub.liteflow.common.ChainConstant._CLASS; +import static com.yomahub.liteflow.common.ChainConstant.*; /** * Parser 通用 Helper @@ -296,11 +280,27 @@ public class ParserHelper { public static void parseOneChainEl(JsonNode chainNode) { // 构建chainBuilder String chainId = Optional.ofNullable(chainNode.get(ID)).orElse(chainNode.get(NAME)).textValue(); - String el = chainNode.get(VALUE).textValue(); - LiteFlowChainELBuilder.createChain() - .setChainId(chainId) - .setEL(el) - .build(); + + JsonNode routeJsonNode = chainNode.get(ROUTE); + + LiteFlowChainELBuilder builder = LiteFlowChainELBuilder.createChain().setChainId(chainId); + + // 如果有route这个标签,说明是决策表chain + // 决策表链路必须有route和body这两个标签 + if (routeJsonNode != null){ + builder.setRoute(routeJsonNode.textValue()); + + JsonNode bodyJsonNode = chainNode.get(BODY); + if (bodyJsonNode == null){ + String errMsg = StrUtil.format("If you have defined the field route, then you must define the field body in chain[{}]", chainId); + throw new FlowSystemException(errMsg); + } + builder.setEL(bodyJsonNode.textValue()); + }else{ + builder.setEL(chainNode.get(VALUE).textValue()); + } + + builder.build(); } /** @@ -310,12 +310,27 @@ public class ParserHelper { public static void parseOneChainEl(Element e) { // 构建chainBuilder String chainId = Optional.ofNullable(e.attributeValue(ID)).orElse(e.attributeValue(NAME)); - String text = e.getText(); - String el = ElRegexUtil.removeComments(text); - LiteFlowChainELBuilder.createChain() - .setChainId(chainId) - .setEL(el) - .build(); + + Element routeElement = e.element(ROUTE); + + LiteFlowChainELBuilder builder = LiteFlowChainELBuilder.createChain().setChainId(chainId); + + // 如果有route这个标签,说明是决策表chain + // 决策表链路必须有route和body这两个标签 + if (routeElement != null){ + builder.setRoute(ElRegexUtil.removeComments(routeElement.getText())); + + Element bodyElement = e.element(BODY); + if (bodyElement == null){ + String errMsg = StrUtil.format("If you have defined the tag , then you must define the tag in chain[{}]", chainId); + throw new FlowSystemException(errMsg); + } + builder.setEL(ElRegexUtil.removeComments(bodyElement.getText())); + }else{ + builder.setEL(ElRegexUtil.removeComments(e.getText())); + } + + builder.build(); } /** diff --git a/liteflow-core/src/main/resources/dtd/liteflow.dtd b/liteflow-core/src/main/resources/dtd/liteflow.dtd index 7312b9230..1e12d37e7 100644 --- a/liteflow-core/src/main/resources/dtd/liteflow.dtd +++ b/liteflow-core/src/main/resources/dtd/liteflow.dtd @@ -3,7 +3,9 @@ - + + + Title: liteflow