Sfoglia il codice sorgente

#IB0SJ1 提供对instanceId解析的api

jay li 5 mesi fa
parent
commit
7969c913f0

+ 148 - 4
liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/BaseNodeInstanceIdManageSpi.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.flow.instanceId;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.crypto.digest.MD5;
+import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.flow.element.Chain;
 import com.yomahub.liteflow.flow.element.Condition;
 import com.yomahub.liteflow.flow.element.Executable;
@@ -20,9 +21,148 @@ import static com.yomahub.liteflow.util.SerialsUtil.generateShortUUID;
  */
 public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManageSpi {
 
-    // 根据实例id获取 节点实例定位
+
+    /**
+     * 根据chainId instanceId返回Node节点信息
+     */
+    @Override
+    public Node getNodeByIdAndInstanceId(String chainId, String instanceId) {
+        if (StringUtils.isBlank(chainId) || StringUtils.isBlank(instanceId)) {
+            return null;
+        }
+        Chain chain = FlowBus.getChain(chainId);
+        if (chain == null) {
+            return null;
+        }
+
+        List<Condition> conditionList = chain.getConditionList();
+
+        return getNodeFromConditions(conditionList, instanceId);
+    }
+
+
+    /**
+     * 根据nodeId和index返回Node节点信息
+     */
+    @Override
+    public Node getNodeByIdAndIndex(String chainId, String nodeId, Integer index) {
+        if (StringUtils.isBlank(chainId) || index == null) {
+            return null;
+        }
+        Chain chain = FlowBus.getChain(chainId);
+        if (chain == null) {
+            return null;
+        }
+
+        List<Condition> conditionList = chain.getConditionList();
+
+        return getNodeFromConditions(conditionList, nodeId, index, new HashMap<>());
+    }
+
+
+    /**
+     * 根据nodeId返回instanceId list
+     */
+    @Override
+    public List<String> getNodeInstanceIds(String chainId, String nodeId) {
+        if (StringUtils.isBlank(chainId) || StringUtils.isBlank(nodeId)) {
+            return Collections.emptyList();
+        }
+        // 第一行为elMd5 第二行为实例id json格式信息
+        List<String> instanceIdFile = readInstanceIdFile(chainId);
+
+        List<String> instanceIds = new ArrayList<>();
+        for (int i = 1; i < instanceIdFile.size(); i++) {
+            List<InstanceInfoDto> instanceInfos = parseList(instanceIdFile.get(i), InstanceInfoDto.class);
+
+            for (InstanceInfoDto dto : instanceInfos) {
+                if (Objects.equals(dto.getInstanceId(), nodeId)) {
+                    instanceIds.add(dto.getInstanceId());
+                }
+            }
+        }
+
+        return instanceIds;
+    }
+
+
+    /**
+     * 从conditions 根据instanceId获取node节点
+     */
+    private Node getNodeFromConditions(List<Condition> conditionList, String instanceId) {
+        if (CollUtil.isEmpty(conditionList)) {
+            return null;
+        }
+
+        for (Condition condition : conditionList) {
+            List<Executable> executableList = condition.getExecutableList();
+            for (Executable executable : executableList) {
+                if (executable instanceof Node) {
+                    Node node = (Node) executable;
+                    if (Objects.equals(node.getInstanceId(), instanceId)) {
+                        return node;
+                    }
+                } else if (executable instanceof Condition) {
+                    Condition conditionTmp = (Condition) executable;
+                    List<Node> allNodeInCondition = conditionTmp.getAllNodeInCondition();
+
+                    for (Node node : allNodeInCondition) {
+                        if (Objects.equals(node.getInstanceId(), instanceId)) {
+                            return node;
+                        }
+                    }
+                } else if (executable instanceof Chain) {
+                    Chain chainTmp = (Chain) executable;
+                    return getNodeFromConditions(chainTmp.getConditionList(), instanceId);
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 根据nodeId和index获取node节点
+     */
+    private Node getNodeFromConditions(List<Condition> conditionList, String nodeId,
+                                       Integer index, HashMap<String, Integer> idCntMap) {
+        if (CollUtil.isEmpty(conditionList)) {
+            return null;
+        }
+
+        for (Condition condition : conditionList) {
+            List<Executable> executableList = condition.getExecutableList();
+            for (Executable executable : executableList) {
+                if (executable instanceof Node) {
+                    Node node = (Node) executable;
+                    idCntMap.put(node.getId(), idCntMap.getOrDefault(node.getId(), -1) + 1);
+                    if (Objects.equals(node.getId(), nodeId) && Objects.equals(idCntMap.get(node.getId()), index)) {
+                        return node;
+                    }
+                } else if (executable instanceof Condition) {
+                    Condition conditionTmp = (Condition) executable;
+                    List<Node> allNodeInCondition = conditionTmp.getAllNodeInCondition();
+
+                    for (Node node : allNodeInCondition) {
+                        idCntMap.put(node.getId(), idCntMap.getOrDefault(node.getId(), -1) + 1);
+                        if (Objects.equals(node.getId(), nodeId) && Objects.equals(idCntMap.get(node.getId()), index)) {
+                            return node;
+                        }
+                    }
+                } else if (executable instanceof Chain) {
+                    Chain chainTmp = (Chain) executable;
+                    return getNodeFromConditions(chainTmp.getConditionList(), nodeId, index, new HashMap<>());
+                }
+            }
+        }
+        return null;
+    }
+
+
+    /**
+     * 根据实例id获取 节点实例定位
+     */
     @Override
-    public String getNodeInstanceLocationById(String chainId, String instanceId) {
+    public String getNodeLocationById(String chainId, String instanceId) {
         if (StringUtils.isBlank(chainId) || StringUtils.isBlank(instanceId)) {
             return "";
         }
@@ -42,7 +182,9 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
         return "";
     }
 
-    // 往condition里设置instanceId
+    /**
+     * 往condition里设置instanceId
+     */
     @Override
     public void setNodesInstanceId(Condition condition, Chain chain) {
         NodeInstanceIdManageSpi nodeInstanceIdManageSpi = NodeInstanceIdManageSpiHolder.getInstance().getNodeInstanceIdManageSpi();
@@ -67,7 +209,9 @@ public abstract class BaseNodeInstanceIdManageSpi implements NodeInstanceIdManag
         }
     }
 
-    // 从instanceIdFile里设置instanceId
+    /**
+     * 从instanceIdFile里设置instanceId
+     */
     private void setInstanceIdFromFile(List<InstanceInfoDto> finalInstanceInfos, String chainId,
                                        Map<String, List<Executable>> executableGroup, Map<String, Integer> idCntMap) {
         if (CollUtil.isEmpty(executableGroup)) {

+ 11 - 1
liteflow-core/src/main/java/com/yomahub/liteflow/flow/instanceId/NodeInstanceIdManageSpi.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.flow.instanceId;
 
 import com.yomahub.liteflow.flow.element.Chain;
 import com.yomahub.liteflow.flow.element.Condition;
+import com.yomahub.liteflow.flow.element.Node;
 import com.yomahub.liteflow.flow.entity.InstanceInfoDto;
 
 import java.util.List;
@@ -21,7 +22,16 @@ public interface NodeInstanceIdManageSpi {
     void writeInstanceIdFile(List<InstanceInfoDto> instanceIdList, String elMd5, String chainId);
 
     // 根据实例id获取 节点实例定位
-    String getNodeInstanceLocationById(String chainId, String instanceId);
+    String getNodeLocationById(String chainId, String instanceId);
+
+    // 根据chainId instanceId返回Node节点信息
+    Node getNodeByIdAndInstanceId(String chainId, String instanceId);
+
+    // 根据nodeId和index返回Node节点信息
+    Node getNodeByIdAndIndex(String chainId, String nodeId, Integer index);
+
+    // 根据nodeId返回instanceId list
+    List<String> getNodeInstanceIds(String chainId, String nodeId);
 
     // 设置node节点的实例id
     void setNodesInstanceId(Condition condition, Chain chain);

+ 1 - 1
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/instanceIds/InstanceIdELSpringTest.java

@@ -83,7 +83,7 @@ public class InstanceIdELSpringTest extends BaseTest {
 		NodeInstanceIdManageSpi nodeInstanceIdManageSpi = NodeInstanceIdManageSpiHolder.getInstance().getNodeInstanceIdManageSpi();
 
 		for (int i = 0; i < strings.size(); i++) {
-			Assertions.assertEquals(nodeInstanceIdManageSpi.getNodeInstanceLocationById("chain2", strings.get(i)), "a(" + i + ")");
+			Assertions.assertEquals(nodeInstanceIdManageSpi.getNodeLocationById("chain2", strings.get(i)), "a(" + i + ")");
 		}
 
 		System.out.println(executeStepStrWithInstanceId);

+ 1 - 2
liteflow-testcase-el/liteflow-testcase-el-sql-springboot/src/test/java/com/yomahub/liteflow/test/sqlInstanceId/SQLWithXmlELInstanceIdSpringbootTest.java

@@ -83,7 +83,7 @@ public class SQLWithXmlELInstanceIdSpringbootTest extends BaseTest {
 
         String[] nodes = new String[]{"c", "b", "a"};
         for (int i = 0; i < strings.size(); i++) {
-            Assertions.assertEquals(nodeInstanceIdManageSpi.getNodeInstanceLocationById("r_chain4", strings.get(i)), nodes[i] + "(0)");
+            Assertions.assertEquals(nodeInstanceIdManageSpi.getNodeLocationById("r_chain4", strings.get(i)), nodes[i] + "(0)");
         }
 
         HashSet<String> hashSet = Sets.newHashSet(strings);
@@ -113,7 +113,6 @@ public class SQLWithXmlELInstanceIdSpringbootTest extends BaseTest {
     // chain3 if 脚本 切换 if表达试
     @Test
     public void testSQLWithXmlChain4() throws SQLException {
-
         String chain4InstanceStr = queryInstanceStrByChainId("chain3");
         LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg");