Przeglądaj źródła

!306 在NodeComponent中添加getCmpList方法
Merge pull request !306 from 徐乔伦/dev

铂赛东 8 miesięcy temu
rodzic
commit
99efe39761

+ 9 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java

@@ -29,6 +29,7 @@ import com.yomahub.liteflow.util.JsonUtil;
 
 import java.lang.reflect.Method;
 import java.util.Date;
+import java.util.List;
 import java.util.Stack;
 
 /**
@@ -414,6 +415,14 @@ public abstract class NodeComponent{
 		return JsonUtil.parseObject(cmpData, clazz);
 	}
 
+	public <T> List<T> getCmpDataList(Class<T> clazz) {
+		String cmpData = getRefNode().getCmpData();
+		if (StrUtil.isBlank(cmpData)) {
+			return null;
+		}
+		return JsonUtil.parseList(cmpData, clazz);
+	}
+
 	public Integer getLoopIndex() {
 		return this.getRefNode().getLoopIndex();
 	}

+ 18 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java

@@ -3,13 +3,17 @@ package com.yomahub.liteflow.util;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.DeserializationFeature;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.CollectionType;
 import com.yomahub.liteflow.exception.JsonProcessException;
 import com.yomahub.liteflow.log.LFLog;
 import com.yomahub.liteflow.log.LFLoggerManager;
 import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.TimeZone;
 
 /**
@@ -73,4 +77,18 @@ public class JsonUtil {
 			throw new JsonProcessException(errMsg);
 		}
 	}
+
+	public static <T> List<T> parseList(String json, Class<T> clazz) {
+		if (StrUtil.isEmpty(json)) {
+			return null;
+		}
+		try {
+			CollectionType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz);
+			return objectMapper.readValue(json, listType);
+		} catch (IOException e) {
+			String errMsg = StrUtil.format("Error while parsing text [{}],reason: {}", json, e.getMessage());
+			LOG.error(e.getMessage(), e);
+			throw new JsonProcessException(errMsg);
+		}
+	}
 }

+ 27 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java

@@ -13,6 +13,7 @@ import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.test.context.TestPropertySource;
 import javax.annotation.Resource;
+import java.util.List;
 import java.util.stream.Collectors;
 
 /**
@@ -51,4 +52,30 @@ public class CmpDataELSpringbootTest extends BaseTest {
 		Assertions.assertEquals("12345678", result);
 	}
 
+	@Test
+	public void testCmpDataList() throws Exception {
+		LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg");
+		Assertions.assertTrue(response.isSuccess());
+		DefaultContext context = response.getFirstContextBean();
+		List<User> users = context.getData("users");
+		Assertions.assertEquals(3, users.size());
+        Assertions.assertNotNull(users.get(0));
+		Assertions.assertEquals("jack", users.get(0).getName());
+		Assertions.assertEquals(27, users.get(0).getAge());
+		Assertions.assertEquals(0, users.get(0).getBirth().compareTo(DateUtil.parseDate("1995-10-01").toJdkDate()));
+
+		Assertions.assertNotNull(users.get(1));
+		Assertions.assertEquals("mike", users.get(1).getName());
+		Assertions.assertEquals(32, users.get(1).getAge());
+		Assertions.assertEquals(0, users.get(1).getBirth().compareTo(DateUtil.parseDate("1992-08-16").toJdkDate()));
+
+		Assertions.assertNotNull(users.get(2));
+		Assertions.assertEquals("david", users.get(2).getName());
+		Assertions.assertEquals(11, users.get(2).getAge());
+		Assertions.assertEquals(0, users.get(2).getBirth().compareTo(DateUtil.parseDate("2013-09-27").toJdkDate()));
+
+		List<User> empty = context.getData("empty");
+        Assertions.assertEquals(0, empty.size());
+	}
+
 }

+ 26 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/DCmp.java

@@ -0,0 +1,26 @@
+/*
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Xu Qiaolun
+ * @email jamesxql@gmail.com
+ * @Date 2024/9/5
+ */
+package com.yomahub.liteflow.test.cmpData.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import com.yomahub.liteflow.slot.DefaultContext;
+import com.yomahub.liteflow.test.cmpData.vo.User;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("d")
+public class DCmp extends NodeComponent {
+    @Override
+    public void process() throws Exception {
+        List<User> users = getCmpDataList(User.class);
+        DefaultContext context = getFirstContextBean();
+        context.setData("users", users);
+        System.out.println("DCmp executed!");
+    }
+}

+ 26 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/ECmp.java

@@ -0,0 +1,26 @@
+/*
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Xu Qiaolun
+ * @email jamesxql@gmail.com
+ * @Date 2024/9/5
+ */
+package com.yomahub.liteflow.test.cmpData.cmp;
+
+import com.yomahub.liteflow.core.NodeComponent;
+import com.yomahub.liteflow.slot.DefaultContext;
+import com.yomahub.liteflow.test.cmpData.vo.User;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component("e")
+public class ECmp extends NodeComponent {
+    @Override
+    public void process() throws Exception {
+        List<User> empty = getCmpDataList(User.class);
+        DefaultContext context = getFirstContextBean();
+        context.setData("empty", empty);
+        System.out.println("ECmp executed!");
+    }
+}

+ 7 - 0
liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/cmpData/flow.xml

@@ -23,4 +23,11 @@
             c.data("8")
         );
     </chain>
+
+    <chain name="chain3">
+        cmpDataList = '[{"name":"jack","age":27,"birth":"1995-10-01"}, {"name":"mike","age":32,"birth":"1992-08-16"}, {"name":"david","age":11,"birth":"2013-09-27"}]';
+        cmpDataEmptyList = '[]';
+
+        THEN(d.data(cmpDataList), e.data(cmpDataEmptyList));
+    </chain>
 </flow>