diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowMethod.java b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowMethod.java index 11b6fb6a0..4933ed6b0 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowMethod.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/annotation/LiteflowMethod.java @@ -1,5 +1,6 @@ package com.yomahub.liteflow.annotation; +import com.yomahub.liteflow.core.NodeComponent; import com.yomahub.liteflow.enums.LiteFlowMethodEnum; import java.lang.annotation.*; @@ -15,4 +16,10 @@ public @interface LiteflowMethod { // 节点ID,用于区分节点 // 默认为空 则按照Spring模式下BeanName为准。 String nodeId() default ""; + + /** + * cmp定义 + * + */ + Class cmpClass() default NodeComponent.class; } diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/core/proxy/ComponentProxy.java b/liteflow-core/src/main/java/com/yomahub/liteflow/core/proxy/ComponentProxy.java index c16148565..9ffc3e416 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/core/proxy/ComponentProxy.java +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/core/proxy/ComponentProxy.java @@ -54,14 +54,27 @@ public class ComponentProxy { m -> m.getAnnotation(LiteflowMethod.class) != null ).map(m -> m.getAnnotation(LiteflowMethod.class)).collect(Collectors.groupingBy(LiteflowMethod::nodeId)); return methodListMap.entrySet().stream().map(entry -> { - String activeNodeId = StrUtil.isEmpty(entry.getKey()) ? nodeId : entry.getKey(); + boolean isMethodCreate = !StrUtil.isEmpty(entry.getKey()); + String activeNodeId = isMethodCreate ? entry.getKey() : nodeId; List methodList = entry.getValue(); + // 一个节点只能有一个定义NodeCmp类 + List> classes = methodList.stream().map(LiteflowMethod::cmpClass).distinct().collect(Collectors.toList()); + boolean legal = classes.size() == 1; + if (!legal){ + throw new LiteFlowException("The cmpClass of the same nodeId must be the same,you declared nodeId:" + activeNodeId + ",cmpClass:" + classes); + } + Class cmpClass; + cmpClass = clazz; + // 判断是否是方法声明的组件 + if (isMethodCreate){ + cmpClass = methodList.iterator().next().cmpClass(); + } try { //创建对象 //这里package进行了重设,放到了被代理对象的所在目录 //生成的对象也加了上被代理对象拥有的注解 //被拦截的对象也根据被代理对象根据@LiteFlowMethod所标注的进行了动态判断 - Object instance = new ByteBuddy().subclass(clazz) + Object instance = new ByteBuddy().subclass(cmpClass) .name(StrUtil.format("{}.ByteBuddy${}${}", ClassUtil.getPackage(bean.getClass()), activeNodeId, 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 33c3c612d..513bcb31a 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 @@ -30,23 +30,6 @@ public class LiteFlowProxyUtil { //判断一个bean是否是声明式组件 public static boolean isDeclareCmp(Class clazz){ - //判断bean是否标记了@LiteflowCmpDefine,@LiteflowCondCmpDefine,LiteflowIfCmpDefine这3个标注之一 - boolean flag1 = clazz.getAnnotation(LiteflowCmpDefine.class) != null - || clazz.getAnnotation(LiteflowSwitchCmpDefine.class) != null - || clazz.getAnnotation(LiteflowIfCmpDefine.class) != null; - - if (!flag1){ - return false; - } - - //看超类是否是NodeComponent,NodeCondComponent,NodeIfComponent中的一个,如果不是,则说明满足条件。是的话,也不满足 - boolean flag2 = !ListUtil.toList(NodeComponent.class, NodeSwitchComponent.class, NodeIfComponent.class) - .contains(clazz.getSuperclass()); - - if (!flag2){ - return false; - } - //查看bean里的method是否有方法标记了@LiteflowMethod标注 //这里的bean有可能是cglib加强过的class,所以要先进行个判断 Class targetClass; @@ -55,11 +38,10 @@ public class LiteFlowProxyUtil { }else{ targetClass = clazz; } - boolean flag3 = Arrays.stream(targetClass.getMethods()).anyMatch( + // 判断是否有方法标记了@LiteflowMethod标注 + return Arrays.stream(targetClass.getMethods()).anyMatch( method -> method.getAnnotation(LiteflowMethod.class) != null ); - - return flag3; } //对一个满足声明式的bean进行代理,生成代理类数组 @@ -84,8 +66,7 @@ public class LiteFlowProxyUtil { proxy = new ComponentProxy(nodeId, bean, NodeIfComponent.class); return proxy.getProxyList(); } - - throw new RuntimeException(); + return new ComponentProxy(nodeId, bean, NodeIfComponent.class).getProxyList(); }catch (Exception e){ String errMsg = StrUtil.format("Error while proxying bean[{}]",bean.getClass().getName()); LOG.error(errMsg); diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/cmpMultiNode/cmp/MultiCmpConfiguration.java b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/cmpMultiNode/cmp/MultiCmpConfiguration.java index 2529b6c00..bb6aafae2 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/cmpMultiNode/cmp/MultiCmpConfiguration.java +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/java/com/yomahub/liteflow/test/cmpMultiNode/cmp/MultiCmpConfiguration.java @@ -1,8 +1,8 @@ package com.yomahub.liteflow.test.cmpMultiNode.cmp; -import com.yomahub.liteflow.annotation.LiteflowCmpDefine; 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.context.annotation.Configuration; @@ -12,21 +12,20 @@ import org.springframework.context.annotation.Configuration; * @author sorghum */ @Configuration -@LiteflowCmpDefine public class MultiCmpConfiguration { - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeId = "a") + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeId = "a",cmpClass = NodeComponent.class) public void processA(NodeComponent bindCmp) { System.out.println("ACmp executed!"); } - @LiteflowMethod(value = LiteFlowMethodEnum.IS_ACCESS,nodeId = "a") + @LiteflowMethod(value = LiteFlowMethodEnum.IS_ACCESS,nodeId = "a",cmpClass = NodeComponent.class) public boolean isAccessA(NodeComponent bindCmp) { System.out.println("ACmp isAccessA!"); return true; } - @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeId = "b") + @LiteflowMethod(value = LiteFlowMethodEnum.PROCESS,nodeId = "b",cmpClass = NodeIfComponent.class) public void processB(NodeComponent bindCmp) { System.out.println("BCmp executed!"); } diff --git a/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/cmpMulti/application.properties b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/cmpMulti/application.properties new file mode 100644 index 000000000..d2049052f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-declare-springboot/src/test/resources/cmpMulti/application.properties @@ -0,0 +1,2 @@ +liteflow.rule-source=cmpMulti/flow.el.xml +liteflow.slot-size=512 \ No newline at end of file