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 2a085900f..f4353c87b 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 @@ -1,55 +1,33 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.condition.WhenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的any的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class AnyOperator extends Operator { +public class AnyOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEqTwo(objects); - @Override - public WhenCondition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + WhenCondition whenCondition = OperatorHelper.convert(objects[0], WhenCondition.class); - if (objects.length != 2) { - throw new QLException("parameter error"); - } + boolean any = false; + if (objects[1] instanceof Boolean) { + any = Boolean.parseBoolean(objects[1].toString().toLowerCase()); + } else { + throw new QLException("the parameter must be boolean type"); + } - WhenCondition whenCondition; - if (objects[0] instanceof WhenCondition) { - whenCondition = (WhenCondition) objects[0]; - } else { - throw new QLException("The caller must be when condition item"); - } + whenCondition.setAny(any); - boolean any = false; - if (objects[1] instanceof Boolean) { - any = Boolean.parseBoolean(objects[1].toString()); - } 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"); - } - } + return whenCondition; + } } 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 359cb6527..7b77e238b 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 @@ -1,81 +1,61 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.condition.IfCondition; -import java.util.List; - /** * EL规则中的ELIF的操作符 + * * @author Bryan.Zhang * @since 2.8.5 */ -public class ElifOperator extends Operator { +public class ElifOperator extends BaseOperator { - @Override - public Object executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEqThree(objects); - //参数只能是3个,第一个是caller,后面只能跟2个参数 - if (objects.length != 3) { - throw new QLException("parameter error"); - } + //解析caller + IfCondition ifCondition = OperatorHelper.convert(objects[0], IfCondition.class); - //解析caller - IfCondition ifCondition; - if (objects[0] instanceof IfCondition){ - ifCondition = (IfCondition) objects[0]; - }else{ - throw new QLException("elif caller must be IfCondition"); - } + //解析第一个参数 + Node ifNode; + if (objects[1] instanceof Node) { + ifNode = (Node) objects[1]; - //解析第一个参数 - 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"); + } - 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"); - } + //解析第二个参数 + Executable trueCaseExecutableItem = (Executable) objects[2]; - //解析第二个参数 - Executable trueCaseExecutableItem = (Executable) objects[2]; + //构建一个内部的IfCondition + IfCondition ifConditionItem = new IfCondition(); + ifConditionItem.setExecutableList(ListUtil.toList(ifNode)); + ifConditionItem.setTrueCaseExecutableItem(trueCaseExecutableItem); - //构建一个内部的IfCondition - IfCondition ifConditionItem = new IfCondition(); - ifConditionItem.setExecutableList(ListUtil.toList(ifNode)); - ifConditionItem.setTrueCaseExecutableItem(trueCaseExecutableItem); + //因为可能会有多个ELIF,所以每一次拿到的caller总是最开始大的if,需要遍历到没有falseCaseExecutable的地方。 + //塞进去是一个新的IfCondition + IfCondition loopIfCondition = ifCondition; + while (true) { + if (loopIfCondition.getFalseCaseExecutableItem() == null) { + loopIfCondition.setFalseCaseExecutableItem(ifConditionItem); + break; + } else { + loopIfCondition = (IfCondition) loopIfCondition.getFalseCaseExecutableItem(); + } + } - //因为可能会有多个ELIF,所以每一次拿到的caller总是最开始大的if,需要遍历到没有falseCaseExecutable的地方。 - //塞进去是一个新的IfCondition - IfCondition loopIfCondition = ifCondition; - while (true){ - if (loopIfCondition.getFalseCaseExecutableItem() == null){ - loopIfCondition.setFalseCaseExecutableItem(ifConditionItem); - break; - }else{ - loopIfCondition = (IfCondition) loopIfCondition.getFalseCaseExecutableItem(); - } - } - - return ifCondition; - }catch (QLException e){ - throw e; - }catch (Exception e){ - throw new ELParseException("errors occurred in EL parsing"); - } - } + return 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 870415f16..8fa763828 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,61 +1,40 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; 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 { +public class ElseOperator extends BaseOperator { - 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"); - } + @Override + public Object buildCondition(Object[] objects) throws Exception { + // 参数只能是1个,但这里为什么是2个呢?第一个是caller,第二个才是参数 + OperatorHelper.checkObjectSizeEqTwo(objects); - //参数只能是1个,但这里为什么是2个呢?第一个是caller,第二个才是参数 - if (objects.length != 2) { - throw new QLException("parameter error"); - } + IfCondition ifCondition = OperatorHelper.convert(objects[0], IfCondition.class); - IfCondition ifCondition; - if (objects[0] instanceof IfCondition) { - ifCondition = (IfCondition) objects[0]; - } else { - throw new QLException("The caller must be IfCondition item"); - } + Executable elseExecutableItem = (Executable) objects[1]; - Executable elseExecutableItem = (Executable) objects[1]; + // 因为当中可能会有多个ELIF,所以并不知道这个ELSE前面有没有ELIF, + // 每一次拿到的caller总是最开始大的if,需要遍历到没有falseCaseExecutable的地方。 + // 塞进去是一个elseExecutableItem + IfCondition loopIfCondition = ifCondition; + while (true) { + if (loopIfCondition.getFalseCaseExecutableItem() == null) { + loopIfCondition.setFalseCaseExecutableItem(elseExecutableItem); + break; + } else { + loopIfCondition = (IfCondition) loopIfCondition.getFalseCaseExecutableItem(); + } + } - //因为当中可能会有多个ELIF,所以并不知道这个ELSE前面有没有ELIF, - //每一次拿到的caller总是最开始大的if,需要遍历到没有falseCaseExecutable的地方。 - //塞进去是一个elseExecutableItem - IfCondition loopIfCondition = ifCondition; - while (true){ - if (loopIfCondition.getFalseCaseExecutableItem() == null){ - loopIfCondition.setFalseCaseExecutableItem(elseExecutableItem); - break; - }else{ - loopIfCondition = (IfCondition) loopIfCondition.getFalseCaseExecutableItem(); - } - } - - return ifCondition; - }catch (QLException e){ - throw e; - }catch (Exception e){ - throw new ELParseException("errors occurred in EL parsing"); - } - } + return ifCondition; + } } 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 36b103390..445f6f3e3 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,43 +1,31 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.FinallyCondition; -import com.yomahub.liteflow.flow.element.condition.PreCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的THEN的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class FinallyOperator extends Operator { +public class FinallyOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeGtZero(objects); - @Override - 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 { - 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"); - } - } + 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!"); + } + } + return finallyCondition; + } } 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 5e54e3fc1..17e45dff9 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 @@ -1,56 +1,38 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.condition.Condition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * EL规则中的id的操作符,只有condition可加id + * * @author Bryan.Zhang * @since 2.8.0 */ -public class IdOperator extends Operator { +public class IdOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + private final Logger LOG = LoggerFactory.getLogger(this.getClass()); - @Override - public Condition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEqTwo(objects); - if (objects.length != 2) { - throw new QLException("parameter error"); - } + Condition condition = OperatorHelper.convert(objects[0], Condition.class); - Condition condition; - if (objects[0] instanceof Condition) { - condition = (Condition) objects[0]; - } else { - throw new QLException("The caller must be condition item"); - } + String id; + if (objects[1] instanceof String) { + id = objects[1].toString(); + } else { + LOG.error("the parameter must be String type!"); + throw new QLException("the parameter must be String type"); + } - String id; - if (objects[1] instanceof String) { - id = objects[1].toString(); - } else { - LOG.error("the parameter must be String type!"); - throw new QLException("the parameter must be String type"); - } + condition.setId(id); - condition.setId(id); - - return condition; - - }catch (QLException e){ - throw e; - }catch (Exception e){ - throw new ELParseException("errors occurred in EL parsing"); - } - } + 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 b4ce4192a..e9522a140 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 @@ -1,68 +1,51 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.condition.IfCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的IF的操作符 + * * @author Bryan.Zhang * @since 2.8.5 */ -public class IfOperator extends Operator { +public class IfOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEq(objects, 2, 3); - @Override - public IfCondition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + //解析第一个参数 + Node ifNode; + if (objects[0] instanceof Node) { + ifNode = (Node) objects[0]; - //参数只能是2个或者3个 - if (objects.length != 2 && objects.length != 3) { - throw new QLException("parameter error"); - } + 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; - if (objects[0] instanceof Node) { - ifNode = (Node) objects[0]; + //解析第二个参数 + Executable trueCaseExecutableItem = (Executable) 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"); - } + //解析第三个参数,如果有的话 + Executable falseCaseExecutableItem = null; + if (objects.length == 3) { + falseCaseExecutableItem = (Executable) objects[2]; + } - //解析第二个参数 - Executable trueCaseExecutableItem = (Executable) objects[1]; - - //解析第三个参数,如果有的话 - Executable falseCaseExecutableItem = null; - if (objects.length == 3) { - falseCaseExecutableItem = (Executable) objects[2]; - } - - IfCondition ifCondition = new IfCondition(); - ifCondition.setExecutableList(ListUtil.toList(ifNode)); - ifCondition.setTrueCaseExecutableItem(trueCaseExecutableItem); - ifCondition.setFalseCaseExecutableItem(falseCaseExecutableItem); - return ifCondition; - }catch (QLException e){ - throw e; - }catch (Exception e){ - throw new ELParseException("errors occurred in EL parsing"); - } - } + IfCondition ifCondition = new IfCondition(); + ifCondition.setExecutableList(ListUtil.toList(ifNode)); + ifCondition.setTrueCaseExecutableItem(trueCaseExecutableItem); + ifCondition.setFalseCaseExecutableItem(falseCaseExecutableItem); + return 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 ec33306f9..a7059f0f3 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 @@ -1,57 +1,33 @@ 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; +import com.yomahub.liteflow.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.condition.WhenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的ignoreError的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class IgnoreErrorOperator extends Operator { +public class IgnoreErrorOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEqTwo(objects); - @Override - public Condition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + WhenCondition condition = OperatorHelper.convert(objects[0], WhenCondition.class); - if (objects.length != 2) { - throw new QLException("parameter error"); - } + boolean ignoreError = false; + if (objects[1] instanceof Boolean) { + ignoreError = Boolean.parseBoolean(objects[1].toString().toLowerCase()); + } else { + throw new QLException("The parameter must be boolean type"); + } - WhenCondition condition; - if (objects[0] instanceof WhenCondition) { - condition = (WhenCondition) objects[0]; - } else { - throw new QLException("The caller must be executable item"); - } + condition.setErrorResume(ignoreError); - boolean ignoreError = false; - if (objects[1] instanceof Boolean) { - ignoreError = Boolean.parseBoolean(objects[1].toString()); - } 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"); - } - } + 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 9a7836577..db07bd690 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 @@ -1,69 +1,51 @@ package com.yomahub.liteflow.builder.el.operator; -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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.property.LiteflowConfig; import com.yomahub.liteflow.property.LiteflowConfigGetter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.function.Predicate; /** * EL规则中的node的操作符 + * * @author Bryan.Zhang * @since 2.8.3 */ -public class NodeOperator extends Operator { +public class NodeOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeNeqOne(objects); - @Override - public Node executeInner(Object[] objects) throws Exception { - try{ - if (ArrayUtil.isEmpty(objects)){ - throw new QLException("parameter is empty"); - } + String nodeId; + if (objects[0] instanceof String) { + nodeId = (String) objects[0]; + } else { + throw new QLException("The value must be Node item!"); + } - 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"); - } - } + 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); + } + } + } } 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 c3cd32f15..d5c1e0158 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,43 +1,31 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.PreCondition; -import com.yomahub.liteflow.flow.element.condition.ThenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的THEN的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class PreOperator extends Operator { +public class PreOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeGtZero(objects); - @Override - 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 { - 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"); - } - } + 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"); + } + } + 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 314a297be..a9827e1ba 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 @@ -1,56 +1,39 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.enums.NodeTypeEnum; -import com.yomahub.liteflow.exception.ELParseException; import com.yomahub.liteflow.flow.element.Node; import com.yomahub.liteflow.flow.element.condition.SwitchCondition; -import com.yomahub.liteflow.flow.element.condition.WhenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的SWITCH的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class SwitchOperator extends Operator { +public class SwitchOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeNeqOne(objects); - @Override - public SwitchCondition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + Node switchNode; + if (objects[0] instanceof Node) { + switchNode = (Node) objects[0]; - if (objects.length != 1) { - throw new QLException("parameter error"); - } + if (!ListUtil.toList(NodeTypeEnum.SWITCH, NodeTypeEnum.SWITCH_SCRIPT).contains(switchNode.getType())) { + throw new QLException("The caller must be Switch item"); + } + } else { + throw new QLException("The caller must be Switch item"); + } - Node switchNode; - if (objects[0] instanceof Node) { - switchNode = (Node) objects[0]; + SwitchCondition switchCondition = new SwitchCondition(); + switchCondition.setSwitchNode(switchNode); - if (!ListUtil.toList(NodeTypeEnum.SWITCH, NodeTypeEnum.SWITCH_SCRIPT).contains(switchNode.getType())) { - throw new QLException("The caller must be Switch item"); - } - } 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"); - } - } + return switchCondition; + } } 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 d166a50f6..0b0ae70cb 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 @@ -1,61 +1,38 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.FlowBus; import com.yomahub.liteflow.flow.element.Node; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的tag的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class TagOperator extends Operator { +public class TagOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEqTwo(objects); - @Override - public Node executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + Node node = OperatorHelper.convert(objects[0], Node.class); - if (objects.length != 2) { - throw new QLException("parameter error"); - } + String tag = null; + if (objects[1] instanceof String) { + tag = objects[1].toString(); + } else { + throw new QLException("the parameter must be String type"); + } - Node node; - if (objects[0] instanceof Node) { - node = (Node) objects[0]; - } else { - throw new QLException("The caller must be Node item"); - } + //这里为什么要clone一个呢? + //因为tag是跟着chain走的。而在el上下文里的放的都是同一个node,如果多个同样的node tag不同,则这里必须copy + Node copyNode = FlowBus.copyNode(node.getId()); - String tag = null; - if (objects[1] instanceof String) { - tag = objects[1].toString(); - } else { - throw new QLException("the parameter must be String type"); - } + copyNode.setTag(tag); - //这里为什么要clone一个呢? - //因为tag是跟着chain走的。而在el上下文里的放的都是同一个node,如果多个同样的node tag不同,则这里必须copy - Node copyNode = FlowBus.copyNode(node.getId()); - - copyNode.setTag(tag); - - return copyNode; - - }catch (QLException e){ - throw e; - }catch (Exception e){ - throw new ELParseException("errors occurred in EL parsing"); - } - } + return copyNode; + } } 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 a0d7872b1..7a1618f2d 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,42 +1,31 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.ThenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的THEN的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class ThenOperator extends Operator { +public class ThenOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeGtZero(objects); - @Override - 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 { - 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"); - } - } + 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"); + } + } + 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 4a3db70dd..acb161749 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 @@ -1,55 +1,33 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.condition.WhenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的threadPool的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class ThreadPoolOperator extends Operator { +public class ThreadPoolOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeEqTwo(objects); - @Override - public WhenCondition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + WhenCondition whenCondition = OperatorHelper.convert(objects[0], WhenCondition.class); - if (objects.length != 2) { - throw new QLException("parameter error"); - } + String threadPoolClazz = null; + if (objects[1] instanceof String) { + threadPoolClazz = objects[1].toString(); + } else { + throw new QLException("the parameter must be String type"); + } - WhenCondition whenCondition; - if (objects[0] instanceof WhenCondition) { - whenCondition = (WhenCondition) objects[0]; - } else { - throw new QLException("The caller must be when condition item"); - } + whenCondition.setThreadExecutorClass(threadPoolClazz); - String threadPoolClazz = null; - if (objects[1] instanceof String) { - threadPoolClazz = objects[1].toString(); - } 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"); - } - } + 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 98896835f..d41a92602 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 @@ -1,54 +1,33 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.SwitchCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的TO的操作符,用法须和SWITCH联合使用 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class ToOperator extends Operator { +public class ToOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeGtTwo(objects); - @Override - public SwitchCondition executeInner(Object[] objects) throws Exception { - try { - if (ArrayUtil.isEmpty(objects)) { - throw new QLException("parameter is empty"); - } + SwitchCondition switchCondition = OperatorHelper.convert(objects[0], SwitchCondition.class); - if (objects.length <= 1) { - throw new QLException("parameter error"); - } - - SwitchCondition switchCondition; - if (objects[0] instanceof SwitchCondition) { - switchCondition = (SwitchCondition) objects[0]; - } 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 { - 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"); - } - } + 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"); + } + } + 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 8c8b7938e..cd2c584fa 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,42 +1,31 @@ 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.builder.el.operator.base.BaseOperator; +import com.yomahub.liteflow.builder.el.operator.base.OperatorHelper; import com.yomahub.liteflow.flow.element.Executable; import com.yomahub.liteflow.flow.element.condition.WhenCondition; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; /** * EL规则中的WHEN的操作符 + * * @author Bryan.Zhang * @since 2.8.0 */ -public class WhenOperator extends Operator { +public class WhenOperator extends BaseOperator { - private final Logger LOG = LoggerFactory.getLogger(this.getClass()); + @Override + public Object buildCondition(Object[] objects) throws Exception { + OperatorHelper.checkObjectSizeGtZero(objects); - @Override - public WhenCondition executeInner(Object[] objects) throws 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 QLException("parameter error"); - } - } - return whenCondition; - }catch (QLException e){ - throw e; - }catch (Exception e){ - throw new ELParseException("errors occurred in EL parsing"); - } - } + WhenCondition whenCondition = new WhenCondition(); + for (Object obj : objects) { + if (obj instanceof Executable) { + whenCondition.addExecutable((Executable) obj); + } else { + throw new QLException("parameter error"); + } + } + return whenCondition; + } } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/BaseOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/BaseOperator.java new file mode 100644 index 000000000..049e584f8 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/BaseOperator.java @@ -0,0 +1,34 @@ +package com.yomahub.liteflow.builder.el.operator.base; + +import com.ql.util.express.Operator; +import com.ql.util.express.exception.QLException; +import com.yomahub.liteflow.exception.ELParseException; + +/** + * BaseOperator 为了强化 executeInner 方法,会捕获抛出的 QLException 错误,输出友好的错误提示 + * + * @author gaibu + * @date 2022/8/28 14:32 + */ +public abstract class BaseOperator extends Operator { + + @Override + public Object executeInner(Object[] objects) throws Exception { + try { + return buildCondition(objects); + } catch (QLException e) { + throw e; + } catch (Exception e) { + throw new ELParseException("errors occurred in EL parsing"); + } + } + + /** + * 构建 EL 条件 + * + * @param objects objects + * @return Condition + * @throws Exception Exception + */ + public abstract Object buildCondition(Object[] objects) throws Exception; +} 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 new file mode 100644 index 000000000..0af7cb399 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/base/OperatorHelper.java @@ -0,0 +1,130 @@ +package com.yomahub.liteflow.builder.el.operator.base; + +import com.ql.util.express.exception.QLException; + +/** + * Operator 常用工具类 + * + * @author gaibu + * @ate 2022/8/28 12:58 + */ +public class OperatorHelper { + + /** + * 检查参数数量,不等于1 + * + * @param objects objects + * @throws QLException QLException + */ + public static void checkObjectSizeNeqOne(Object[] objects) throws QLException { + checkObjectSizeNeq(objects, 1); + } + + /** + * 检查参数数量,不等于 size + * + * @param objects objects + * @param size 参数数量 + * @throws QLException QLException + */ + public static void checkObjectSizeNeq(Object[] objects, int size) throws QLException { + checkObjectSizeGtZero(objects); + if (objects.length != size) { + throw new QLException("parameter error"); + } + } + + /** + * 检查参数数量,大于 0 + * + * @param objects objects + * @throws QLException QLException + */ + public static void checkObjectSizeGtZero(Object[] objects) throws QLException { + if (objects.length == 0) { + throw new QLException("parameter is empty"); + } + } + + /** + * 检查参数数量,大于 2 + * + * @param objects objects + * @throws QLException QLException + */ + public static void checkObjectSizeGtTwo(Object[] objects) throws QLException { + checkObjectSizeGtZero(objects); + if (objects.length <= 1) { + throw new QLException("parameter error"); + } + } + + /** + * 检查参数数量,等于 2 + * + * @param objects objects + * @throws QLException QLException + */ + public static void checkObjectSizeEqTwo(Object[] objects) throws QLException { + checkObjectSizeEq(objects, 2); + } + + /** + * 检查参数数量,等于 3 + * + * @param objects objects + * @throws QLException QLException + */ + public static void checkObjectSizeEqThree(Object[] objects) throws QLException { + checkObjectSizeEq(objects, 3); + } + + /** + * 检查参数数量,等于 size + * + * @param objects objects + * @param size 参数数量 + * @throws QLException QLException + */ + public static void checkObjectSizeEq(Object[] objects, int size) throws QLException { + checkObjectSizeGtZero(objects); + + if (objects.length != size) { + throw new QLException("parameter error"); + } + } + + /** + * 检查参数数量,等于 size1 或 size2 + * + * @param objects objects + * @param size1 参数数量1 + * @param size2 参数数量2 + * @throws QLException QLException + */ + public static void checkObjectSizeEq(Object[] objects, int size1, int size2) throws QLException { + checkObjectSizeGtZero(objects); + + if (objects.length != size1 && objects.length != size2) { + throw new QLException("parameter error"); + } + } + + /** + * 转换 object 为指定的类型 + * + * @param object object + * @param tClass 指定类型 + * @param 返回类型 + * @return T + * @throws QLException QLException + */ + public static T convert(Object object, Class tClass) throws QLException { + if (tClass.isInstance(object)) { + return (T) object; + } + + throw new QLException("The caller must be " + tClass.getName() + " item"); + } + +}