diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowIfCmpDefine.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowIfCmpDefine.java new file mode 100644 index 000000000..0d02e08cf --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowIfCmpDefine.java @@ -0,0 +1,10 @@ +package com.yomahub.liteflow.annotation; + +import java.lang.annotation.*; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +public @interface LiteflowIfCmpDefine { +} 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 d5ab9e7d7..52c554cbb 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 @@ -63,6 +63,7 @@ public class LiteFlowChainELBuilder { expressRunner.addFunction("FINALLY", new FinallyOperator()); expressRunner.addFunction("IF", new IfOperator()); expressRunner.addFunctionAndClassMethod("ELSE", Object.class, new ElseOperator()); + expressRunner.addFunctionAndClassMethod("ELIF", Object.class, new ElifOperator()); 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/ElifOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElifOperator.java new file mode 100644 index 000000000..359cb6527 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElifOperator.java @@ -0,0 +1,81 @@ +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; +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 { + + @Override + public Object executeInner(Object[] objects) throws Exception { + try { + if (ArrayUtil.isEmpty(objects)) { + throw new QLException("parameter is empty"); + } + + //参数只能是3个,第一个是caller,后面只能跟2个参数 + if (objects.length != 3) { + throw new QLException("parameter error"); + } + + //解析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]; + + 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]; + + //构建一个内部的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(); + } + } + + 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/ElseOperator.java b/liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/operator/ElseOperator.java index 24deb2b9f..870415f16 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 @@ -32,17 +32,24 @@ public class ElseOperator extends Operator { 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); + //因为当中可能会有多个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){ 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 47623c6db..b4ce4192a 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 @@ -38,7 +38,7 @@ public class IfOperator extends Operator { if (objects[0] instanceof Node) { ifNode = (Node) objects[0]; - if (!ifNode.getType().equals(NodeTypeEnum.IF)) { + if (!ListUtil.toList(NodeTypeEnum.IF, NodeTypeEnum.IF_SCRIPT).contains(ifNode.getType())) { throw new QLException("The first parameter must be If item"); } } else { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java index 56c74ce21..ebf5b53c8 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/FlowBus.java @@ -149,7 +149,7 @@ public class FlowBus { } public static void addIfScriptNode(String nodeId, String name, String script){ - addNode(nodeId, name, NodeTypeEnum.IF_SCRIPT, ScriptSwitchComponent.class, script); + addNode(nodeId, name, NodeTypeEnum.IF_SCRIPT, ScriptIfComponent.class, script); } private static void addNode(String nodeId, String name, NodeTypeEnum type, Class> cmpClazz, String script) { diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java index 8929f3f89..edcdbba18 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/flow/element/condition/IfCondition.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.flow.element.condition; +import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.enums.ConditionTypeEnum; @@ -25,7 +26,7 @@ public class IfCondition extends Condition { @Override public void execute(Integer slotIndex) throws Exception { - if (getIfNode().getType().equals(NodeTypeEnum.IF)) { + if (ListUtil.toList(NodeTypeEnum.IF, NodeTypeEnum.IF_SCRIPT).contains(getIfNode().getType())){ //先执行IF节点 this.getIfNode().setCurrChainName(this.getCurrChainName()); this.getIfNode().execute(slotIndex); diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java index 146904e1d..43fd55c61 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/parser/helper/ParserHelper.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.JsonNode; import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowIfCmpDefine; import com.yomahub.liteflow.annotation.LiteflowSwitchCmpDefine; import com.yomahub.liteflow.builder.LiteFlowChainBuilder; import com.yomahub.liteflow.builder.LiteFlowConditionBuilder; @@ -15,6 +16,7 @@ import com.yomahub.liteflow.builder.el.LiteFlowChainELBuilder; import com.yomahub.liteflow.builder.prop.ChainPropBean; import com.yomahub.liteflow.builder.prop.NodePropBean; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.core.NodeIfComponent; import com.yomahub.liteflow.core.NodeSwitchComponent; import com.yomahub.liteflow.enums.ConditionTypeEnum; import com.yomahub.liteflow.enums.NodeTypeEnum; @@ -67,7 +69,9 @@ public class ParserHelper { Object o = ReflectUtil.newInstanceIfPossible(c); if (o instanceof NodeSwitchComponent) { type = NodeTypeEnum.SWITCH.getCode(); - } else if (o instanceof NodeComponent) { + }else if(o instanceof NodeIfComponent){ + type = NodeTypeEnum.IF.getCode(); + }else if (o instanceof NodeComponent) { type = NodeTypeEnum.COMMON.getCode(); } @@ -85,6 +89,13 @@ public class ParserHelper { type = NodeTypeEnum.SWITCH.getCode(); } } + + if (type == null) { + LiteflowIfCmpDefine liteflowIfCmpDefine = AnnotationUtil.getAnnotation(c, LiteflowIfCmpDefine.class); + if (liteflowIfCmpDefine != null) { + type = NodeTypeEnum.IF.getCode(); + } + } } catch (Exception e) { throw new NodeClassNotFoundException(StrUtil.format("cannot find the node[{}]", clazz)); } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/util/LiteFlowProxyUtil.java b/liteflow-core/src/main/java/com/yomahub/liteflow/util/LiteFlowProxyUtil.java index 41492ae4b..e5cb56873 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/util/LiteFlowProxyUtil.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/util/LiteFlowProxyUtil.java @@ -4,9 +4,11 @@ import cn.hutool.core.collection.ListUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowIfCmpDefine; import com.yomahub.liteflow.annotation.LiteflowSwitchCmpDefine; import com.yomahub.liteflow.annotation.LiteflowMethod; import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.core.NodeIfComponent; import com.yomahub.liteflow.core.NodeSwitchComponent; import com.yomahub.liteflow.core.proxy.ComponentProxy; import com.yomahub.liteflow.exception.ComponentProxyErrorException; @@ -27,16 +29,18 @@ public class LiteFlowProxyUtil { //判断一个bean是否是声明式组件 public static boolean isDeclareCmp(Class> clazz){ - //判断bean是否标记了@LiteflowCmpDefine或者@LiteflowCondCmpDefine这2个标注之一 + //判断bean是否标记了@LiteflowCmpDefine,@LiteflowCondCmpDefine,LiteflowIfCmpDefine这3个标注之一 boolean flag1 = clazz.getAnnotation(LiteflowCmpDefine.class) != null - || clazz.getAnnotation(LiteflowSwitchCmpDefine.class) != null; + || clazz.getAnnotation(LiteflowSwitchCmpDefine.class) != null + || clazz.getAnnotation(LiteflowIfCmpDefine.class) != null; if (!flag1){ return false; } - //看超类是否是NodeComponent和NodeCondComponent中的一个,如果不是,则说明满足条件。是的话,也不满足 - boolean flag2 = !ListUtil.toList(NodeComponent.class, NodeSwitchComponent.class).contains(clazz.getSuperclass()); + //看超类是否是NodeComponent,NodeCondComponent,NodeIfComponent中的一个,如果不是,则说明满足条件。是的话,也不满足 + boolean flag2 = !ListUtil.toList(NodeComponent.class, NodeSwitchComponent.class, NodeIfComponent.class) + .contains(clazz.getSuperclass()); if (!flag2){ return false; @@ -62,6 +66,7 @@ public class LiteFlowProxyUtil { try{ LiteflowCmpDefine liteflowCmpDefine = bean.getClass().getAnnotation(LiteflowCmpDefine.class); LiteflowSwitchCmpDefine liteflowSwitchCmpDefine = bean.getClass().getAnnotation(LiteflowSwitchCmpDefine.class); + LiteflowIfCmpDefine liteflowIfCmpDefine = bean.getClass().getAnnotation(LiteflowIfCmpDefine.class); ComponentProxy proxy; if (ObjectUtil.isNotNull(liteflowCmpDefine)){ @@ -74,6 +79,11 @@ public class LiteFlowProxyUtil { return (NodeSwitchComponent) proxy.getProxy(); } + if (ObjectUtil.isNotNull(liteflowIfCmpDefine)){ + proxy = new ComponentProxy(nodeId, bean, NodeIfComponent.class); + return (NodeIfComponent) proxy.getProxy(); + } + throw new RuntimeException(); }catch (Exception e){ String errMsg = StrUtil.format("Error while proxying bean[{}]",bean.getClass().getName()); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfElseELDeclSpringbootTest.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfElseELDeclSpringbootTest.java new file mode 100644 index 000000000..2b7bcab33 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/IfElseELDeclSpringbootTest.java @@ -0,0 +1,88 @@ +package com.yomahub.liteflow.test.ifelse; + +import com.yomahub.liteflow.core.FlowExecutor; +import com.yomahub.liteflow.flow.LiteflowResponse; +import com.yomahub.liteflow.test.BaseTest; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; + +/** + * springboot环境最普通的例子测试 + * @author Bryan.Zhang + * @since 2.6.4 + */ +@RunWith(SpringRunner.class) +@TestPropertySource(value = "classpath:/ifelse/application.properties") +@SpringBootTest(classes = IfElseELDeclSpringbootTest.class) +@EnableAutoConfiguration +@ComponentScan({"com.yomahub.liteflow.test.ifelse.cmp"}) +public class IfElseELDeclSpringbootTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + //IF只有2个参数 + @Test + public void testIf1() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>a==>b", response.getExecuteStepStrWithoutTime()); + } + + //IF只有3个参数 + @Test + public void testIf2() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>c==>d", response.getExecuteStepStrWithoutTime()); + } + + //IF有3个参数,进行嵌套 + @Test + public void testIf3() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain3", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>x1==>c==>c==>b", response.getExecuteStepStrWithoutTime()); + } + + //IF有2个参数,加上ELSE + @Test + public void testIf4() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>c==>d", response.getExecuteStepStrWithoutTime()); + } + + //IF有2个参数,ELSE里再嵌套一个IF + @Test + public void testIf5() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>x1==>c==>c==>b", response.getExecuteStepStrWithoutTime()); + } + + //标准的IF ELIF ELSE + @Test + public void testIf6() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain6", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>x1==>c==>c", response.getExecuteStepStrWithoutTime()); + } + + //IF ELIF... ELSE 的形式 + @Test + public void testIf7() throws Exception{ + LiteflowResponse response = flowExecutor.execute2Resp("chain7", "arg"); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals("x1==>x1==>x1==>x1==>d==>b==>a", response.getExecuteStepStrWithoutTime()); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/ACmp.java new file mode 100644 index 000000000..6f52e2d0d --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/ACmp.java @@ -0,0 +1,25 @@ +/** + *
Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("a") +@LiteflowCmpDefine +public class ACmp{ + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("ACmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java new file mode 100644 index 000000000..19fcaef93 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java @@ -0,0 +1,25 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("b") +@LiteflowCmpDefine +public class BCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java new file mode 100644 index 000000000..26fe47074 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java @@ -0,0 +1,25 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("c") +@LiteflowCmpDefine +public class CCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java new file mode 100644 index 000000000..151b1b3fe --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java @@ -0,0 +1,25 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.annotation.LiteflowCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("d") +@LiteflowCmpDefine +public class DCmp { + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS) + public void process(NodeComponent bindCmp) { + System.out.println("DCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java new file mode 100644 index 000000000..73053d4e8 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -0,0 +1,25 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.annotation.LiteflowIfCmpDefine; +import com.yomahub.liteflow.annotation.LiteflowMethod; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.core.NodeIfComponent; +import com.yomahub.liteflow.enums.LiteFlowMethodEnum; +import org.springframework.stereotype.Component; + +@Component("x1") +@LiteflowIfCmpDefine +public class X1Cmp{ + + @LiteflowMethod(LiteFlowMethodEnum.PROCESS_IF) + public boolean processIf(NodeComponent bindCmp) throws Exception { + return Boolean.parseBoolean(bindCmp.getTag()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/ifelse/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/ifelse/application.properties new file mode 100644 index 000000000..efbbddb30 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/ifelse/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=ifelse/flow.el.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/ifelse/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/ifelse/flow.el.xml new file mode 100644 index 000000000..5cc964a0e --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/ifelse/flow.el.xml @@ -0,0 +1,40 @@ + +Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java new file mode 100644 index 000000000..6a57d2bb2 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java @@ -0,0 +1,19 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java new file mode 100644 index 000000000..35abee7e5 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java @@ -0,0 +1,19 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java new file mode 100644 index 000000000..39f14ae89 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java @@ -0,0 +1,19 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; + +public class DCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("DCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java new file mode 100644 index 000000000..9d209f974 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -0,0 +1,17 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeIfComponent; + +public class X1Cmp extends NodeIfComponent { + @Override + public boolean processIf() throws Exception { + return Boolean.parseBoolean(this.getTag()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/ifelse/flow.el.xml b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/ifelse/flow.el.xml new file mode 100644 index 000000000..076987886 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-nospring/src/test/resources/ifelse/flow.el.xml @@ -0,0 +1,48 @@ + +Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java new file mode 100644 index 000000000..e3dc20b8b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/BCmp.java @@ -0,0 +1,21 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java new file mode 100644 index 000000000..5a37a20d7 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/CCmp.java @@ -0,0 +1,21 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java new file mode 100644 index 000000000..be5eb921c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/DCmp.java @@ -0,0 +1,21 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeComponent; +import org.springframework.stereotype.Component; + +@Component("d") +public class DCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("DCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java new file mode 100644 index 000000000..5508800f6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/java/com/yomahub/liteflow/test/ifelse/cmp/X1Cmp.java @@ -0,0 +1,19 @@ +/** + *Title: liteflow
+ *Description: 轻量级的组件式流程框架
+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.ifelse.cmp; + +import com.yomahub.liteflow.core.NodeIfComponent; +import org.springframework.stereotype.Component; + +@Component("x1") +public class X1Cmp extends NodeIfComponent { + @Override + public boolean processIf() throws Exception { + return Boolean.parseBoolean(this.getTag()); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/ifelse/application.xml b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/ifelse/application.xml new file mode 100644 index 000000000..2cb2e6e52 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-springnative/src/test/resources/ifelse/application.xml @@ -0,0 +1,23 @@ + +