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