From 73512044d0e12745cdd602ea01d3360f748a4c14 Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 29 Sep 2022 18:31:59 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Operator=E4=B8=AD=E7=9A=84?= =?UTF-8?q?=E5=80=BC=E8=BD=AC=E6=8D=A2=E9=97=AE=E9=A2=98=EF=BC=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BA=86=E6=89=80=E6=9C=89=E7=9A=84Node=E7=9A=84copy?= =?UTF-8?q?=E6=9C=BA=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 4 +- .../builder/el/operator/AnyOperator.java | 9 +---- .../builder/el/operator/BreakOperator.java | 27 ++++--------- .../builder/el/operator/DoOperator.java | 23 +++-------- .../builder/el/operator/ElifOperator.java | 14 ++----- .../builder/el/operator/ElseOperator.java | 2 +- .../builder/el/operator/FinallyOperator.java | 6 +-- .../builder/el/operator/ForOperator.java | 4 +- .../builder/el/operator/IdOperator.java | 10 ++--- .../builder/el/operator/IfOperator.java | 16 +++----- .../el/operator/IgnoreErrorOperator.java | 8 +--- .../builder/el/operator/NodeOperator.java | 7 +--- .../builder/el/operator/PreOperator.java | 6 +-- .../builder/el/operator/SwitchOperator.java | 10 +---- .../builder/el/operator/TagOperator.java | 17 ++------ .../builder/el/operator/ThenOperator.java | 6 +-- .../el/operator/ThreadPoolOperator.java | 7 +--- .../builder/el/operator/ToOperator.java | 8 +--- .../builder/el/operator/WhenOperator.java | 6 +-- .../builder/el/operator/WhileOperator.java | 11 ++---- .../el/operator/base/OperatorHelper.java | 39 ++++++++++++++----- 21 files changed, 79 insertions(+), 161 deletions(-) diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java index c0bd0c650..4d27255a1 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java @@ -54,15 +54,17 @@ public class LiteFlowChainELBuilder { EXPRESS_RUNNER.addFunction("IF", new IfOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("ELSE", Object.class, new ElseOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("ELIF", Object.class, new ElifOperator()); + EXPRESS_RUNNER.addFunctionAndClassMethod("TO", Object.class, new ToOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("to", Object.class, new ToOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("tag", Object.class, new TagOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("any", Object.class, new AnyOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("id", Object.class, new IdOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("ignoreError", Object.class, new IgnoreErrorOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("threadPool", Object.class, new ThreadPoolOperator()); + EXPRESS_RUNNER.addFunction("NODE", new NodeOperator()); EXPRESS_RUNNER.addFunction("node", new NodeOperator()); EXPRESS_RUNNER.addFunction("FOR", new ForOperator()); - + EXPRESS_RUNNER.addFunction("WHILE", new WhileOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("DO", Object.class, new DoOperator()); EXPRESS_RUNNER.addFunctionAndClassMethod("BREAK", Object.class, new BreakOperator()); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AnyOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AnyOperator.java index 4e676fae1..22083cd7a 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AnyOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/AnyOperator.java @@ -19,13 +19,8 @@ public class AnyOperator extends BaseOperator { WhenCondition whenCondition = OperatorHelper.convert(objects[0], WhenCondition.class); - if (objects[1] instanceof Boolean) { - // any - whenCondition.setAny(Boolean.parseBoolean(objects[1].toString().toLowerCase())); - } else { - throw new QLException("the parameter must be boolean type"); - } - + Boolean any = OperatorHelper.convert(objects[1], Boolean.class); + whenCondition.setAny(any); return whenCondition; } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/BreakOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/BreakOperator.java index 1165a73c1..f9e9c3821 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/BreakOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/BreakOperator.java @@ -25,29 +25,16 @@ public class BreakOperator extends BaseOperator { public LoopCondition build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeEqTwo(objects); - //由于BREAK关键字有可能用在FOR后面,也有可能用于WHILE后面,所以这里要进行判断 - LoopCondition condition; - if (objects[0] instanceof ForCondition){ - //获得caller,也就是ForCondition - condition = OperatorHelper.convert(objects[0], ForCondition.class); - }else if(objects[0] instanceof WhileCondition){ - //获得caller,也就是WhileCondition - condition = OperatorHelper.convert(objects[0], WhileCondition.class); - }else{ - throw new QLException("The caller must be ForCondition or WhileCondition item"); - } + //DO关键字有可能用在FOR后面,也有可能用于WHILE后面,所以这里要进行判断是不是这两种类型的超类LoopCondition + String errorMsg = "The caller must be ForCondition or WhileCondition item"; + LoopCondition condition = OperatorHelper.convert(objects[0], LoopCondition.class, errorMsg); //获得需要执行的可执行表达式 - if (objects[1] instanceof Node){ - Node breakNode = OperatorHelper.convert(objects[1], Node.class); - - if (ListUtil.toList(NodeTypeEnum.BREAK, NodeTypeEnum.BREAK_SCRIPT).contains(breakNode.getType())){ - condition.setBreakNode(breakNode); - }else{ - throw new QLException("The parameter must be node-break item"); - } + Node breakNode = OperatorHelper.convert(objects[1], Node.class); + if (ListUtil.toList(NodeTypeEnum.BREAK, NodeTypeEnum.BREAK_SCRIPT).contains(breakNode.getType())){ + condition.setBreakNode(breakNode); }else{ - throw new QLException("The parameter must be Node item"); + throw new QLException("The parameter must be node-break item"); } return condition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/DoOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/DoOperator.java index 2f368cf8c..0749f3310 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/DoOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/DoOperator.java @@ -24,26 +24,13 @@ public class DoOperator extends BaseOperator { public LoopCondition build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeEqTwo(objects); - //由于DO关键字有可能用在FOR后面,也有可能用于WHILE后面,所以这里要进行判断 - LoopCondition condition; - if (objects[0] instanceof ForCondition){ - //获得caller,也就是ForCondition - condition = OperatorHelper.convert(objects[0], ForCondition.class); - }else if(objects[0] instanceof WhileCondition){ - //获得caller,也就是WhileCondition - condition = OperatorHelper.convert(objects[0], WhileCondition.class); - }else{ - throw new QLException("The caller must be ForCondition or WhileCondition item"); - } + //DO关键字有可能用在FOR后面,也有可能用于WHILE后面,所以这里要进行判断是不是这两种类型的超类LoopCondition + String errorMsg = "The caller must be ForCondition or WhileCondition item"; + LoopCondition condition = OperatorHelper.convert(objects[0], LoopCondition.class, errorMsg); //获得需要执行的可执行表达式 - if (objects[1] instanceof Executable){ - Executable doExecutableItem = OperatorHelper.convert(objects[1], Executable.class); - - condition.setExecutableList(ListUtil.toList(doExecutableItem)); - }else{ - throw new QLException("The parameter must be Executable item"); - } + Executable doExecutableItem = OperatorHelper.convert(objects[1], Executable.class); + condition.setExecutableList(ListUtil.toList(doExecutableItem)); return condition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElifOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElifOperator.java index 273bf750f..324b60a54 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElifOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElifOperator.java @@ -25,19 +25,13 @@ public class ElifOperator extends BaseOperator { IfCondition ifCondition = OperatorHelper.convert(objects[0], IfCondition.class); //解析第一个参数 - Node ifNode; - if (objects[1] instanceof Node) { - ifNode = (Node) objects[1]; - - if (!ListUtil.toList(NodeTypeEnum.IF, NodeTypeEnum.IF_SCRIPT).contains(ifNode.getType())) { - throw new QLException("The first parameter must be If item"); - } - } else { - throw new QLException("The first parameter must be Node item"); + Node ifNode = OperatorHelper.convert(objects[1], Node.class); + if (!ListUtil.toList(NodeTypeEnum.IF, NodeTypeEnum.IF_SCRIPT).contains(ifNode.getType())) { + throw new QLException("The first parameter must be If item"); } //解析第二个参数 - Executable trueCaseExecutableItem = (Executable) objects[2]; + Executable trueCaseExecutableItem = OperatorHelper.convert(objects[2], Executable.class); //构建一个内部的IfCondition IfCondition ifConditionItem = new IfCondition(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElseOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElseOperator.java index 80db05b40..0221ba2f1 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElseOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElseOperator.java @@ -20,7 +20,7 @@ public class ElseOperator extends BaseOperator { IfCondition ifCondition = OperatorHelper.convert(objects[0], IfCondition.class); - Executable elseExecutableItem = (Executable) objects[1]; + Executable elseExecutableItem = OperatorHelper.convert(objects[1], Executable.class); // 因为当中可能会有多个ELIF,所以并不知道这个ELSE前面有没有ELIF, // 每一次拿到的caller总是最开始大的if,需要遍历到没有falseCaseExecutable的地方。 diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/FinallyOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/FinallyOperator.java index c9c5c171d..0b92594a7 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/FinallyOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/FinallyOperator.java @@ -20,11 +20,7 @@ public class FinallyOperator extends BaseOperator { FinallyCondition finallyCondition = new FinallyCondition(); for (Object obj : objects) { - if (obj instanceof Executable) { - finallyCondition.addExecutable((Executable) obj); - } else { - throw new QLException("parameter must be executable item!"); - } + finallyCondition.addExecutable(OperatorHelper.convert(obj, Executable.class)); } return finallyCondition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java index ea937cb3d..191b6bdd4 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ForOperator.java @@ -22,12 +22,12 @@ public class ForOperator extends BaseOperator { Node node; if (objects[0] instanceof Node) { - node = (Node) objects[0]; + node = OperatorHelper.convert(objects[0], Node.class); if (!ListUtil.toList(NodeTypeEnum.FOR, NodeTypeEnum.FOR_SCRIPT).contains(node.getType())) { throw new QLException("The parameter must be for-node item"); } }else if(objects[0] instanceof Integer){ - Integer forCount = (Integer) objects[0]; + Integer forCount = OperatorHelper.convert(objects[0], Integer.class); node = new Node(); node.setInstance(new NodeForComponent() { @Override diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IdOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IdOperator.java index 490e1cdb1..f8cde7c7a 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IdOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IdOperator.java @@ -23,13 +23,9 @@ public class IdOperator extends BaseOperator { Condition condition = OperatorHelper.convert(objects[0], Condition.class); - if (objects[1] instanceof String) { - // id - condition.setId(objects[1].toString()); - } else { - LOG.error("the parameter must be String type!"); - throw new QLException("the parameter must be String type"); - } + String id = OperatorHelper.convert(objects[1], String.class); + + condition.setId(id); return condition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IfOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IfOperator.java index 18814819b..10ad49987 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IfOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IfOperator.java @@ -22,24 +22,18 @@ public class IfOperator extends BaseOperator { OperatorHelper.checkObjectSizeEq(objects, 2, 3); //解析第一个参数 - Node ifNode; - if (objects[0] instanceof Node) { - ifNode = (Node) objects[0]; - - if (!ListUtil.toList(NodeTypeEnum.IF, NodeTypeEnum.IF_SCRIPT).contains(ifNode.getType())) { - throw new QLException("The first parameter must be If item"); - } - } else { - throw new QLException("The first parameter must be Node item"); + Node ifNode = OperatorHelper.convert(objects[0], Node.class); + if (!ListUtil.toList(NodeTypeEnum.IF, NodeTypeEnum.IF_SCRIPT).contains(ifNode.getType())) { + throw new QLException("The first parameter must be If item"); } //解析第二个参数 - Executable trueCaseExecutableItem = (Executable) objects[1]; + Executable trueCaseExecutableItem = OperatorHelper.convert(objects[1], Executable.class); //解析第三个参数,如果有的话 Executable falseCaseExecutableItem = null; if (objects.length == 3) { - falseCaseExecutableItem = (Executable) objects[2]; + falseCaseExecutableItem = OperatorHelper.convert(objects[2], Executable.class); } IfCondition ifCondition = new IfCondition(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IgnoreErrorOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IgnoreErrorOperator.java index 7deb530b5..e6990f6ce 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IgnoreErrorOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/IgnoreErrorOperator.java @@ -19,12 +19,8 @@ public class IgnoreErrorOperator extends BaseOperator { WhenCondition condition = OperatorHelper.convert(objects[0], WhenCondition.class); - if (objects[1] instanceof Boolean) { - // ignoreError - condition.setErrorResume(Boolean.parseBoolean(objects[1].toString().toLowerCase())); - } else { - throw new QLException("The parameter must be boolean type"); - } + Boolean ignoreError = OperatorHelper.convert(objects[1], Boolean.class); + condition.setErrorResume(ignoreError); return condition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/NodeOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/NodeOperator.java index d179f9cc3..7343ff391 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/NodeOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/NodeOperator.java @@ -22,12 +22,7 @@ public class NodeOperator extends BaseOperator { public Node build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeNeqOne(objects); - String nodeId; - if (objects[0] instanceof String) { - nodeId = (String) objects[0]; - } else { - throw new QLException("The value must be Node item!"); - } + String nodeId = OperatorHelper.convert(objects[0], String.class); if (FlowBus.containNode(nodeId)) { return FlowBus.getNode(nodeId); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/PreOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/PreOperator.java index 66183d35d..0a0022a2d 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/PreOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/PreOperator.java @@ -20,11 +20,7 @@ public class PreOperator extends BaseOperator { PreCondition preCondition = new PreCondition(); for (Object obj : objects) { - if (obj instanceof Executable) { - preCondition.addExecutable((Executable) obj); - } else { - throw new QLException("parameter must be executable item"); - } + preCondition.addExecutable(OperatorHelper.convert(obj, Executable.class)); } return preCondition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/SwitchOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/SwitchOperator.java index 95aa0f76b..b05dd5886 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/SwitchOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/SwitchOperator.java @@ -20,14 +20,8 @@ public class SwitchOperator extends BaseOperator { public SwitchCondition build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeNeqOne(objects); - Node switchNode; - if (objects[0] instanceof Node) { - switchNode = (Node) objects[0]; - - if (!ListUtil.toList(NodeTypeEnum.SWITCH, NodeTypeEnum.SWITCH_SCRIPT).contains(switchNode.getType())) { - throw new QLException("The caller must be Switch item"); - } - } else { + Node switchNode = OperatorHelper.convert(objects[0], Node.class); + if (!ListUtil.toList(NodeTypeEnum.SWITCH, NodeTypeEnum.SWITCH_SCRIPT).contains(switchNode.getType())) { throw new QLException("The caller must be Switch item"); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/TagOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/TagOperator.java index 652f45e68..e9a1c87e0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/TagOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/TagOperator.java @@ -20,21 +20,10 @@ public class TagOperator extends BaseOperator { Node node = OperatorHelper.convert(objects[0], Node.class); - String tag ; - if (objects[1] instanceof String) { - tag = objects[1].toString(); - } else { - throw new QLException("the parameter must be String type"); - } + String tag = OperatorHelper.convert(objects[1], String.class); - //这里为什么要clone一个呢? - //因为tag是跟着chain走的。而在el上下文里的放的都是同一个node,如果多个同样的node tag不同,则这里必须copy - Node copyNode = FlowBus.copyNode(node.getId()); - if (null == copyNode){ - throw new QLException("The Node must be not null"); - } - copyNode.setTag(tag); + node.setTag(tag); - return copyNode; + return node; } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThenOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThenOperator.java index 77bd8459d..5b33bf894 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThenOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThenOperator.java @@ -20,11 +20,7 @@ public class ThenOperator extends BaseOperator { ThenCondition thenCondition = new ThenCondition(); for (Object obj : objects) { - if (obj instanceof Executable) { - thenCondition.addExecutable((Executable) obj); - } else { - throw new QLException("parameter must be executable item"); - } + thenCondition.addExecutable(OperatorHelper.convert(obj, Executable.class)); } return thenCondition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThreadPoolOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThreadPoolOperator.java index 265c2ed6c..4034e9848 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThreadPoolOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ThreadPoolOperator.java @@ -19,12 +19,7 @@ public class ThreadPoolOperator extends BaseOperator { WhenCondition whenCondition = OperatorHelper.convert(objects[0], WhenCondition.class); - if (objects[1] instanceof String) { - // threadPoolClazz - whenCondition.setThreadExecutorClass(objects[1].toString()); - } else { - throw new QLException("the parameter must be String type"); - } + whenCondition.setThreadExecutorClass(OperatorHelper.convert(objects[1], String.class)); return whenCondition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java index 254213970..0ba6216c6 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ToOperator.java @@ -21,12 +21,8 @@ public class ToOperator extends BaseOperator { SwitchCondition switchCondition = OperatorHelper.convert(objects[0], SwitchCondition.class); for (int i = 1; i < objects.length; i++) { - if (objects[i] instanceof Executable) { - Executable target = (Executable) objects[i]; - switchCondition.addTargetItem(target); - } else { - throw new QLException("The parameter must be Executable item"); - } + Executable target = OperatorHelper.convert(objects[i], Executable.class); + switchCondition.addTargetItem(target); } return switchCondition; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhenOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhenOperator.java index 974c50e25..b68a989d0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhenOperator.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/WhenOperator.java @@ -19,11 +19,7 @@ public class WhenOperator extends BaseOperator { WhenCondition whenCondition = new WhenCondition(); for (Object obj : objects) { - if (obj instanceof Executable) { - whenCondition.addExecutable((Executable) obj); - } else { - throw new QLException("parameter must be executable item"); - } + whenCondition.addExecutable(OperatorHelper.convert(obj, Executable.class)); } return whenCondition; } 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 bc61dd551..55a9c8237 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 @@ -19,14 +19,9 @@ public class WhileOperator extends BaseOperator { public WhileCondition build(Object[] objects) throws Exception { OperatorHelper.checkObjectSizeEq(objects, 1); - Node node; - if (objects[0] instanceof Node){ - node = (Node) objects[0]; - if (!ListUtil.toList(NodeTypeEnum.WHILE, NodeTypeEnum.WHILE_SCRIPT).contains(node.getType())) { - throw new QLException("The parameter must be while-node item"); - } - }else{ - throw new QLException("The parameter must be Node item"); + Node node = OperatorHelper.convert(objects[0], Node.class); + if (!ListUtil.toList(NodeTypeEnum.WHILE, NodeTypeEnum.WHILE_SCRIPT).contains(node.getType())) { + throw new QLException("The parameter must be while-node item"); } WhileCondition whileCondition = new WhileCondition(); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java index e38af4d28..b3a3139d3 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java @@ -1,7 +1,10 @@ package com.yomahub.liteflow.builder.el.operator.base; +import cn.hutool.core.util.StrUtil; import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.DataNofFoundException; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.flow.element.Node; import java.util.Objects; @@ -114,19 +117,35 @@ public class OperatorHelper { /** * 转换 object 为指定的类型 - * - * @param object object - * @param tClass 指定类型 - * @param 返回类型 - * @return T - * @throws QLException QLException + * 如果是Node类型的则进行copy + * 为什么要进行copy呢?因为原先的Node都是存放在FlowBus的NodeMap中的。有些属性在EL中不是全局的,属于当前这个chain的。 + * 所以要进行copy动作 */ - public static T convert(Object object, Class tClass) throws QLException { - if (tClass.isInstance(object)) { - return (T) object; + public static T convert(Object object, Class clazz) throws QLException { + String errorMsg = StrUtil.format("The parameter must be {} item", clazz.getSimpleName()); + return convert(object, clazz, errorMsg); + } + + /** + * 转换 object 为指定的类型,自定义错误信息 + * 如果是Node类型的则进行copy + */ + public static T convert(Object object, Class clazz, String errorMsg) throws QLException { + try{ + if (clazz.isAssignableFrom(object.getClass())) { + + if(clazz.equals(Node.class)){ + Node node = (Node) object; + return (T) node.copy(); + }else{ + return (T) object; + } + } + }catch (Exception e){ + throw new QLException("An error occurred while copying an object"); } - throw new QLException("The parameter must be " + tClass.getName() + " item"); + throw new QLException(errorMsg); } /**