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