diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java index 23d0b5df4..c5909b0a4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/NodeComponent.java @@ -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 List getCmpDataList(Class clazz) { + String cmpData = getRefNode().getCmpData(); + if (StrUtil.isBlank(cmpData)) { + return null; + } + return JsonUtil.parseList(cmpData, clazz); + } + public Integer getLoopIndex() { return this.getRefNode().getLoopIndex(); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java index c3944948d..cb31cd848 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/JsonUtil.java +++ b/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 List parseList(String json, Class 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); + } + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java index 50bc3d6ed..105dd7687 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/CmpDataELSpringbootTest.java +++ b/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 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 empty = context.getData("empty"); + Assertions.assertEquals(0, empty.size()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/DCmp.java new file mode 100644 index 000000000..1fcd8fe0a --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/DCmp.java @@ -0,0 +1,26 @@ +/* + *

Title: liteflow

+ *

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

+ * @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 users = getCmpDataList(User.class); + DefaultContext context = getFirstContextBean(); + context.setData("users", users); + System.out.println("DCmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/ECmp.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/ECmp.java new file mode 100644 index 000000000..d145ab391 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/cmpData/cmp/ECmp.java @@ -0,0 +1,26 @@ +/* + *

Title: liteflow

+ *

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

+ * @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 empty = getCmpDataList(User.class); + DefaultContext context = getFirstContextBean(); + context.setData("empty", empty); + System.out.println("ECmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/cmpData/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/cmpData/flow.xml index 55f72881d..ea2616343 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/cmpData/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/cmpData/flow.xml @@ -23,4 +23,11 @@ c.data("8") ); + + + 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)); + \ No newline at end of file