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/10] =?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/10] =?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/10] =?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 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 04/10] =?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 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 05/10] =?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 06/10] =?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 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 07/10] =?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 d555a2ab43ed4ab3ffcf80c733397c9af59344ae Mon Sep 17 00:00:00 2001 From: DaleLee <1658850308@qq.com> Date: Fri, 2 Feb 2024 14:50:31 +0800 Subject: [PATCH 08/10] =?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 09/10] =?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 10/10] =?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;