From 0c82f482339333c52efac5bb5a96da9d34d2ca9b Mon Sep 17 00:00:00 2001 From: "everywhere.z" Date: Thu, 25 Aug 2022 18:06:23 +0800 Subject: [PATCH] =?UTF-8?q?enhancement=20#I5O22X=20=E5=A2=9E=E5=8A=A0EL?= =?UTF-8?q?=E8=A7=A3=E6=9E=90=E4=B8=AD=E7=9A=84=E6=8A=A5=E9=94=99=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/el/LiteFlowChainELBuilder.java | 2 +- .../builder/el/operator/AnyOperator.java | 28 +++---- .../builder/el/operator/ElseOperator.java | 52 ++++++++++++- .../builder/el/operator/FinallyOperator.java | 23 +++--- .../builder/el/operator/IdOperator.java | 27 +++---- .../builder/el/operator/IfOperator.java | 30 ++++---- .../el/operator/IgnoreErrorOperator.java | 28 +++---- .../builder/el/operator/NodeOperator.java | 76 ++++++++++--------- .../builder/el/operator/PreOperator.java | 23 +++--- .../builder/el/operator/SwitchOperator.java | 26 +++---- .../builder/el/operator/TagOperator.java | 28 +++---- .../builder/el/operator/ThenOperator.java | 23 +++--- .../el/operator/ThreadPoolOperator.java | 28 +++---- .../builder/el/operator/ToOperator.java | 26 +++---- .../builder/el/operator/WhenOperator.java | 20 ++--- .../test/ifelse/IfELSpringbootTest.java | 14 ++++ .../src/test/resources/ifelse/flow.el.xml | 10 +++ 17 files changed, 274 insertions(+), 190 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 65cb43bff..d5ab9e7d7 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 @@ -62,7 +62,7 @@ public class LiteFlowChainELBuilder { expressRunner.addFunction("PRE", new PreOperator()); expressRunner.addFunction("FINALLY", new FinallyOperator()); expressRunner.addFunction("IF", new IfOperator()); - expressRunner.addFunction("ELSE", new ElseOperator()); + expressRunner.addFunctionAndClassMethod("ELSE", Object.class, new ElseOperator()); expressRunner.addFunctionAndClassMethod("to", Object.class, new ToOperator()); expressRunner.addFunctionAndClassMethod("tag", Object.class, new TagOperator()); expressRunner.addFunctionAndClassMethod("any", Object.class, new AnyOperator()); 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 b78f333b9..2a085900f 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 @@ -2,6 +2,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.condition.WhenCondition; import org.slf4j.Logger; @@ -18,36 +19,35 @@ public class AnyOperator extends Operator { @Override public WhenCondition executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length != 2){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 2) { + throw new QLException("parameter error"); } WhenCondition whenCondition; - if (objects[0] instanceof WhenCondition){ + if (objects[0] instanceof WhenCondition) { whenCondition = (WhenCondition) objects[0]; - }else{ - LOG.error("The caller must be when condition item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be when condition item"); } boolean any = false; - if (objects[1] instanceof Boolean){ + if (objects[1] instanceof Boolean) { any = Boolean.parseBoolean(objects[1].toString()); - }else{ - LOG.error("the parameter must be boolean type!"); - throw new Exception(); + } else { + throw new QLException("the parameter must be boolean type"); } whenCondition.setAny(any); return whenCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 849c527da..24deb2b9f 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 @@ -1,4 +1,54 @@ package com.yomahub.liteflow.builder.el.operator; -public class ElseOperator { +import cn.hutool.core.util.ArrayUtil; +import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; +import com.yomahub.liteflow.exception.ELParseException; +import com.yomahub.liteflow.flow.element.Executable; +import com.yomahub.liteflow.flow.element.condition.IfCondition; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * EL规则中的ELSE的操作符 + * @author Bryan.Zhang + * @since 2.8.5 + */ +public class ElseOperator extends Operator { + + private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public IfCondition executeInner(Object[] objects) throws Exception { + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); + } + + //参数只能是1个,但这里为什么是2个呢?第一个是caller,第二个才是参数 + if (objects.length != 2) { + throw new QLException("parameter error"); + } + + IfCondition ifCondition; + if (objects[0] instanceof IfCondition) { + ifCondition = (IfCondition) objects[0]; + + if (ifCondition.getFalseCaseExecutableItem() != null) { + throw new QLException("The if caller already has else item"); + } + } else { + throw new QLException("The caller must be IfCondition item"); + } + + Executable elseExecutableItem = (Executable) objects[1]; + + ifCondition.setFalseCaseExecutableItem(elseExecutableItem); + + return ifCondition; + }catch (QLException e){ + throw e; + }catch (Exception e){ + throw new ELParseException("errors occurred in EL parsing"); + } + } } 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 74e35000b..36b103390 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 @@ -1,6 +1,7 @@ package com.yomahub.liteflow.builder.el.operator; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.FinallyCondition; @@ -18,23 +19,23 @@ public class FinallyOperator extends Operator { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @Override - public Object executeInner(Object[] objects) throws Exception { - try{ - if (objects.length <= 0){ - LOG.error("parameter error"); - throw new Exception(); + public FinallyCondition executeInner(Object[] objects) throws Exception { + try { + if (objects.length == 0) { + throw new QLException("parameter is empty"); } FinallyCondition finallyCondition = new FinallyCondition(); - for (Object obj : objects){ - if (obj instanceof Executable){ - finallyCondition.addExecutable((Executable)obj); - }else{ - LOG.error("parameter must be executable item!"); - throw new Exception(); + for (Object obj : objects) { + if (obj instanceof Executable) { + finallyCondition.addExecutable((Executable) obj); + } else { + throw new QLException("parameter must be executable item!"); } } return finallyCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 c7c68f535..5e54e3fc1 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 @@ -2,6 +2,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.condition.Condition; import org.slf4j.Logger; @@ -18,36 +19,36 @@ public class IdOperator extends Operator { @Override public Condition executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length != 2){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 2) { + throw new QLException("parameter error"); } Condition condition; - if (objects[0] instanceof Condition){ + if (objects[0] instanceof Condition) { condition = (Condition) objects[0]; - }else{ - LOG.error("The caller must be condition item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be condition item"); } String id; - if (objects[1] instanceof String){ + if (objects[1] instanceof String) { id = objects[1].toString(); - }else{ + } else { LOG.error("the parameter must be String type!"); - throw new Exception(); + throw new QLException("the parameter must be String type"); } condition.setId(id); return condition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 02a72ce0c..47623c6db 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 @@ -3,6 +3,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; @@ -21,30 +22,27 @@ public class IfOperator extends Operator { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @Override - public Object executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + public IfCondition executeInner(Object[] objects) throws Exception { + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } //参数只能是2个或者3个 - if (objects.length != 2 && objects.length != 3){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 2 && objects.length != 3) { + throw new QLException("parameter error"); } //解析第一个参数 Node ifNode; - if (objects[0] instanceof Node){ + if (objects[0] instanceof Node) { ifNode = (Node) objects[0]; - if(!ifNode.getType().equals(NodeTypeEnum.IF)){ - LOG.error("The first parameter must be If item!"); - throw new Exception(); + if (!ifNode.getType().equals(NodeTypeEnum.IF)) { + throw new QLException("The first parameter must be If item"); } - }else{ - LOG.error("The first parameter must be Node item!"); - throw new Exception(); + } else { + throw new QLException("The first parameter must be Node item"); } //解析第二个参数 @@ -52,7 +50,7 @@ public class IfOperator extends Operator { //解析第三个参数,如果有的话 Executable falseCaseExecutableItem = null; - if (objects.length == 3){ + if (objects.length == 3) { falseCaseExecutableItem = (Executable) objects[2]; } @@ -61,6 +59,8 @@ public class IfOperator extends Operator { ifCondition.setTrueCaseExecutableItem(trueCaseExecutableItem); ifCondition.setFalseCaseExecutableItem(falseCaseExecutableItem); return ifCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 ca87f384e..ec33306f9 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 @@ -2,6 +2,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.Condition; @@ -20,36 +21,35 @@ public class IgnoreErrorOperator extends Operator { @Override public Condition executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length != 2){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 2) { + throw new QLException("parameter error"); } WhenCondition condition; - if (objects[0] instanceof WhenCondition){ + if (objects[0] instanceof WhenCondition) { condition = (WhenCondition) objects[0]; - }else{ - LOG.error("The caller must be executable item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be executable item"); } boolean ignoreError = false; - if (objects[1] instanceof Boolean){ + if (objects[1] instanceof Boolean) { ignoreError = Boolean.parseBoolean(objects[1].toString()); - }else{ - LOG.error("the parameter must be boolean type!"); - throw new Exception(); + } else { + throw new QLException("The parameter must be boolean type"); } condition.setErrorResume(ignoreError); return condition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 88b61f073..9a7836577 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 @@ -4,6 +4,8 @@ import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; +import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.property.LiteflowConfig; @@ -23,43 +25,45 @@ public class NodeOperator extends Operator { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @Override - public Object executeInner(Object[] objects) throws Exception { - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); - } - - if (objects.length != 1){ - LOG.error("parameter error"); - throw new Exception(); - } - - String nodeId; - if (objects[0] instanceof String){ - nodeId = (String) objects[0]; - }else{ - LOG.error("The value must be Node item!"); - throw new Exception(); - } - - if (FlowBus.containNode(nodeId)){ - return FlowBus.getNode(nodeId); - }else{ - LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); - if (StrUtil.isNotBlank(liteflowConfig.getSubstituteCmpClass())){ - Node substituteNode = FlowBus.getNodeMap().values().stream().filter(node - -> node.getInstance().getClass().getName().equals(liteflowConfig.getSubstituteCmpClass())).findFirst().orElse(null); - if (ObjectUtil.isNotNull(substituteNode)){ - return substituteNode; - }else{ - String error = StrUtil.format("This node[{}] cannot be found", nodeId); - LOG.error(error); - throw new Exception(); - } - }else{ - String error = StrUtil.format("This node[{}] cannot be found, or you can configure an substitute node", nodeId); - LOG.error(error); - throw new Exception(); + public Node executeInner(Object[] objects) throws Exception { + try{ + if (ArrayUtil.isEmpty(objects)){ + throw new QLException("parameter is empty"); } + + if (objects.length != 1){ + throw new QLException("parameter error"); + } + + String nodeId; + if (objects[0] instanceof String){ + nodeId = (String) objects[0]; + }else{ + throw new QLException("The value must be Node item!"); + } + + if (FlowBus.containNode(nodeId)){ + return FlowBus.getNode(nodeId); + }else{ + LiteflowConfig liteflowConfig = LiteflowConfigGetter.get(); + if (StrUtil.isNotBlank(liteflowConfig.getSubstituteCmpClass())){ + Node substituteNode = FlowBus.getNodeMap().values().stream().filter(node + -> node.getInstance().getClass().getName().equals(liteflowConfig.getSubstituteCmpClass())).findFirst().orElse(null); + if (ObjectUtil.isNotNull(substituteNode)){ + return substituteNode; + }else{ + String error = StrUtil.format("This node[{}] cannot be found", nodeId); + throw new QLException(error); + } + }else{ + String error = StrUtil.format("This node[{}] cannot be found, or you can configure an substitute node", nodeId); + throw new QLException(error); + } + } + }catch (QLException e){ + throw e; + }catch (Exception e){ + throw new ELParseException("errors occurred in EL parsing"); } } } 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 977f2c70f..c3cd32f15 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 @@ -1,6 +1,7 @@ package com.yomahub.liteflow.builder.el.operator; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.PreCondition; @@ -18,23 +19,23 @@ public class PreOperator extends Operator { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @Override - public Object executeInner(Object[] objects) throws Exception { - try{ - if (objects.length <= 0){ - LOG.error("parameter error"); - throw new Exception(); + public PreCondition executeInner(Object[] objects) throws Exception { + try { + if (objects.length == 0) { + throw new QLException("parameter is empty"); } PreCondition preCondition = new PreCondition(); - for (Object obj : objects){ - if (obj instanceof Executable){ - preCondition.addExecutable((Executable)obj); - }else{ - LOG.error("parameter must be executable item!"); - throw new Exception(); + for (Object obj : objects) { + if (obj instanceof Executable) { + preCondition.addExecutable((Executable) obj); + } else { + throw new QLException("parameter must be executable item"); } } return preCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 99c5f42de..314a297be 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 @@ -3,6 +3,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.enums.NodeTypeEnum; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Node; @@ -22,33 +23,32 @@ public class SwitchOperator extends Operator { @Override public SwitchCondition executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length != 1){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 1) { + throw new QLException("parameter error"); } Node switchNode; - if (objects[0] instanceof Node){ + if (objects[0] instanceof Node) { switchNode = (Node) objects[0]; - if(!ListUtil.toList(NodeTypeEnum.SWITCH, NodeTypeEnum.SWITCH_SCRIPT).contains(switchNode.getType())){ - LOG.error("The caller must be Switch item!"); - throw new Exception(); + if (!ListUtil.toList(NodeTypeEnum.SWITCH, NodeTypeEnum.SWITCH_SCRIPT).contains(switchNode.getType())) { + throw new QLException("The caller must be Switch item"); } - }else{ - LOG.error("The caller must be Node item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be Switch item"); } SwitchCondition switchCondition = new SwitchCondition(); switchCondition.setSwitchNode(switchNode); return switchCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 17ea586ec..d166a50f6 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 @@ -2,6 +2,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.FlowBus; @@ -20,30 +21,27 @@ public class TagOperator extends Operator { @Override public Node executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length != 2){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 2) { + throw new QLException("parameter error"); } Node node; - if (objects[0] instanceof Node){ + if (objects[0] instanceof Node) { node = (Node) objects[0]; - }else{ - LOG.error("The caller must be Node item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be Node item"); } String tag = null; - if (objects[1] instanceof String){ + if (objects[1] instanceof String) { tag = objects[1].toString(); - }else{ - LOG.error("the parameter must be String type!"); - throw new Exception(); + } else { + throw new QLException("the parameter must be String type"); } //这里为什么要clone一个呢? @@ -54,6 +52,8 @@ public class TagOperator extends Operator { return copyNode; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 89dafb1e7..a0d7872b1 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 @@ -1,6 +1,7 @@ package com.yomahub.liteflow.builder.el.operator; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.ThenCondition; @@ -17,23 +18,23 @@ public class ThenOperator extends Operator { private final Logger LOG = LoggerFactory.getLogger(this.getClass()); @Override - public Object executeInner(Object[] objects) throws Exception { - try{ - if (objects.length <= 0){ - LOG.error("parameter error"); - throw new Exception(); + public ThenCondition executeInner(Object[] objects) throws Exception { + try { + if (objects.length == 0) { + throw new QLException("parameter is empty"); } ThenCondition thenCondition = new ThenCondition(); - for (Object obj : objects){ - if (obj instanceof Executable){ - thenCondition.addExecutable((Executable)obj); - }else{ - LOG.error("parameter must be executable item!"); - throw new Exception(); + for (Object obj : objects) { + if (obj instanceof Executable) { + thenCondition.addExecutable((Executable) obj); + } else { + throw new QLException("parameter must be executable item"); } } return thenCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 f64b0fb99..4a3db70dd 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 @@ -2,6 +2,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.condition.WhenCondition; import org.slf4j.Logger; @@ -18,36 +19,35 @@ public class ThreadPoolOperator extends Operator { @Override public WhenCondition executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length != 2){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length != 2) { + throw new QLException("parameter error"); } WhenCondition whenCondition; - if (objects[0] instanceof WhenCondition){ + if (objects[0] instanceof WhenCondition) { whenCondition = (WhenCondition) objects[0]; - }else{ - LOG.error("The caller must be when condition item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be when condition item"); } String threadPoolClazz = null; - if (objects[1] instanceof String){ + if (objects[1] instanceof String) { threadPoolClazz = objects[1].toString(); - }else{ - LOG.error("the parameter must be String type!"); - throw new Exception(); + } else { + throw new QLException("the parameter must be String type"); } whenCondition.setThreadExecutorClass(threadPoolClazz); return whenCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 8cc42d4e3..98896835f 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 @@ -2,6 +2,7 @@ package com.yomahub.liteflow.builder.el.operator; import cn.hutool.core.util.ArrayUtil; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.SwitchCondition; @@ -19,34 +20,33 @@ public class ToOperator extends Operator { @Override public SwitchCondition executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new Exception(); + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); } - if (objects.length <= 1){ - LOG.error("parameter error"); - throw new Exception(); + if (objects.length <= 1) { + throw new QLException("parameter error"); } SwitchCondition switchCondition; - if (objects[0] instanceof SwitchCondition){ + if (objects[0] instanceof SwitchCondition) { switchCondition = (SwitchCondition) objects[0]; - }else{ - LOG.error("The caller must be SwitchCondition item!"); - throw new Exception(); + } else { + throw new QLException("The caller must be SwitchCondition item"); } for (int i = 1; i < objects.length; i++) { if (objects[i] instanceof Executable) { Executable target = (Executable) objects[i]; switchCondition.addTargetItem(target); - }else { - LOG.error("The parameter must be Executable item!"); - throw new Exception(); + } else { + throw new QLException("The parameter must be Executable item"); } } return switchCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } 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 4a4c0f9fe..8c8b7938e 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 @@ -1,6 +1,7 @@ package com.yomahub.liteflow.builder.el.operator; import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.WhenCondition; @@ -18,21 +19,22 @@ public class WhenOperator extends Operator { @Override public WhenCondition executeInner(Object[] objects) throws Exception { - try{ - if (objects.length <= 0){ - LOG.error("parameter error"); - throw new Exception(); + try { + if (objects.length == 0) { + throw new QLException("parameter error"); } WhenCondition whenCondition = new WhenCondition(); - for (Object obj : objects){ - if (obj instanceof Executable){ - whenCondition.addExecutable((Executable)obj); - }else{ - throw new Exception(); + for (Object obj : objects) { + if (obj instanceof Executable) { + whenCondition.addExecutable((Executable) obj); + } else { + throw new QLException("parameter error"); } } return whenCondition; + }catch (QLException e){ + throw e; }catch (Exception e){ throw new ELParseException("errors occurred in EL parsing"); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java index afe480512..6f784304f 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfELSpringbootTest.java @@ -49,4 +49,18 @@ public class IfELSpringbootTest extends BaseTest { Assert.assertTrue(response.isSuccess()); } + //IF有2个参数,加上ELSE + @Test + public void testIf4() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assert.assertTrue(response.isSuccess()); + } + + //IF有2个参数,ELSE里再嵌套一个IF + @Test + public void testIf5() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assert.assertTrue(response.isSuccess()); + } + } diff --git a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/ifelse/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/ifelse/flow.el.xml index aee92b1e6..404be26dd 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/ifelse/flow.el.xml +++ b/liteflow-testcase-el/liteflow-testcase-el-springboot/src/test/resources/ifelse/flow.el.xml @@ -16,4 +16,14 @@ item ); + + + IF(x1.tag("false"), THEN(a, b)).ELSE(THEN(c, d)); + + + + item = IF(x1.tag("false"), a, THEN(c, c, b)); + + IF(x1.tag("false"), THEN(a, b)).ELSE(item); + \ No newline at end of file