From 36be15327ade68b6a95613deac655533a5361161 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Sun, 12 Oct 2025 14:29:13 +0800 Subject: [PATCH] =?UTF-8?q?enhancement=20#ID1GUK=20=E4=BD=BFWHILE=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E6=94=AF=E6=8C=81WHILE(true)=E8=BF=99?= =?UTF-8?q?=E7=A7=8D=E8=A1=A8=E8=BE=BE=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/operator/WhileOperator.java | 32 ++++++++++++++++--- .../test/loop/LoopELSpringbootTest.java | 7 ++++ .../src/test/resources/loop/flow.xml | 4 +++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhileOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhileOperator.java index 19425064c..c34eee4b7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhileOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhileOperator.java @@ -1,8 +1,13 @@ package com.yomahub.liteflow.builder.el.operator; +import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.builder.el.operator.base.BaseOperator; import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; +import com.yomahub.liteflow.core.NodeBooleanComponent; +import com.yomahub.liteflow.core.NodeForComponent; +import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.flow.element.Executable; +import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.condition.WhileCondition; /** @@ -17,11 +22,30 @@ public class WhileOperator extends BaseOperator { public WhileCondition build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeEqOne(objects); - OperatorHelper.checkObjMustBeBooleanTypeItem(objects[0]); - Executable whileItem = OperatorHelper.convert(objects[0], Executable.class); + Object param = objects[0]; - WhileCondition whileCondition = new WhileCondition(); - whileCondition.setWhileItem(whileItem); + WhileCondition whileCondition = new WhileCondition(); + if (param instanceof Boolean) { + boolean booleanParam = OperatorHelper.convert(objects[0], Boolean.class); + Node node = new Node(); + node.setType(NodeTypeEnum.BOOLEAN); + NodeBooleanComponent nodeBooleanComponent = new NodeBooleanComponent() { + @Override + public boolean processBoolean() { + return booleanParam; + } + }; + nodeBooleanComponent.setSelf(nodeBooleanComponent); + nodeBooleanComponent.setNodeId(StrUtil.format("LOOP_{}", booleanParam)); + nodeBooleanComponent.setType(NodeTypeEnum.BOOLEAN); + node.setInstance(nodeBooleanComponent); + node.setId(nodeBooleanComponent.getNodeId()); + whileCondition.setWhileItem(node); + }else{ + OperatorHelper.checkObjMustBeBooleanTypeItem(param); + Executable whileItem = OperatorHelper.convert(param, Executable.class); + whileCondition.setWhileItem(whileItem); + } return whileCondition; } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java index afa0fb8fc..c1d74a982 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/loop/LoopELSpringbootTest.java @@ -118,4 +118,11 @@ public class LoopELSpringbootTest extends BaseTest { Assertions.assertTrue(response.isSuccess()); Assertions.assertEquals("[000][001][010][011][020][021][100][101][110][111][120][121][200][201][210][211][220][221][300][301][310][311][320][321]", assertStr); } + + // WHILE(true)表达式的可行性验证 + @Test + public void testLoop11() throws Exception { + LiteflowResponse response = flowExecutor.execute2Resp("chain11", "arg"); + Assertions.assertTrue(response.isSuccess()); + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml index f21788640..336d59b24 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/loop/flow.xml @@ -56,4 +56,8 @@ FOR(4).DO(FOR(3).DO(FOR(2).DO(c))); + + + WHILE(true).DO(a).BREAK(y); + \ No newline at end of file