Browse Source

feature #I5RV4W 加强脚本和java之间的互动

everywhere.z 2 years ago
parent
commit
ff60fb06b1
22 changed files with 393 additions and 0 deletions
  1. 2 0
      liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java
  2. 17 0
      liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptBean.java
  3. 22 0
      liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptBeanManager.java
  4. 4 0
      liteflow-script-plugin/liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java
  5. 4 0
      liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java
  6. 10 0
      liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java
  7. 44 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/LiteFlowScriptScriptbeanGroovyELTest.java
  8. 22 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/bean/DemoBean1.java
  9. 11 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/bean/DemoBean2.java
  10. 20 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/cmp/ACmp.java
  11. 21 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/cmp/BCmp.java
  12. 21 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/cmp/CCmp.java
  13. 1 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptbean/application.properties
  14. 27 0
      liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptbean/flow.xml
  15. 44 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/LiteFlowScriptScriptbeanQLExpressELTest.java
  16. 22 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/bean/DemoBean1.java
  17. 11 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/bean/DemoBean2.java
  18. 20 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/cmp/ACmp.java
  19. 21 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/cmp/BCmp.java
  20. 21 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/cmp/CCmp.java
  21. 1 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/scriptbean/application.properties
  22. 27 0
      liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/scriptbean/flow.xml

+ 2 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/builder/el/LiteFlowChainELBuilder.java

@@ -13,10 +13,12 @@ import com.yomahub.liteflow.flow.FlowBus;
 import com.yomahub.liteflow.flow.element.Chain;
 import com.yomahub.liteflow.flow.element.Executable;
 import com.yomahub.liteflow.flow.element.condition.*;
+import com.yomahub.liteflow.script.ScriptBeanManager;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+import java.util.function.BiConsumer;
 
 /**
  * Chain基于代码形式的组装器

+ 17 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptBean.java

@@ -0,0 +1,17 @@
+package com.yomahub.liteflow.script;
+
+import java.lang.annotation.*;
+
+/**
+ * 用于标注在Script中可使用的java bean
+ * @author Bryan.Zhang
+ * @since 2.9.0
+ */
+@Target({ElementType.TYPE})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface ScriptBean {
+
+    String value() default "";
+}

+ 22 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/script/ScriptBeanManager.java

@@ -0,0 +1,22 @@
+package com.yomahub.liteflow.script;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Script中可使用的java bean管理类
+ * @author Bryan.Zhang
+ * @since 2.9.0
+ */
+public class ScriptBeanManager {
+
+    private static final Map<String, Object> scriptBeanMap = new HashMap<>();
+
+    public static void addScriptBean(String key, Object bean){
+        scriptBeanMap.put(key, bean);
+    }
+
+    public static Map<String, Object> getScriptBeanMap(){
+        return scriptBeanMap;
+    }
+}

+ 4 - 0
liteflow-script-plugin/liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java

@@ -2,6 +2,7 @@ package com.yomahub.liteflow.script.groovy;
 
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import com.yomahub.liteflow.script.ScriptBeanManager;
 import com.yomahub.liteflow.slot.DataBus;
 import com.yomahub.liteflow.slot.Slot;
 import com.yomahub.liteflow.script.ScriptExecutor;
@@ -77,6 +78,9 @@ public class GroovyScriptExecutor implements ScriptExecutor {
                 bindings.put("subRequestData", subRequestData);
             }
 
+            //放入用户自己定义的bean
+            bindings.putAll(ScriptBeanManager.getScriptBeanMap());
+
             return compiledScript.eval(bindings);
         }catch (Exception e){
             log.error(e.getMessage(), e);

+ 4 - 0
liteflow-script-plugin/liteflow-script-qlexpress/src/main/java/com/yomahub/liteflow/script/qlexpress/QLExpressScriptExecutor.java

@@ -7,6 +7,7 @@ import com.ql.util.express.DefaultContext;
 import com.ql.util.express.ExpressLoader;
 import com.ql.util.express.ExpressRunner;
 import com.ql.util.express.InstructionSet;
+import com.yomahub.liteflow.script.ScriptBeanManager;
 import com.yomahub.liteflow.slot.DataBus;
 import com.yomahub.liteflow.slot.Slot;
 import com.yomahub.liteflow.script.ScriptExecutor;
@@ -81,6 +82,9 @@ public class QLExpressScriptExecutor implements ScriptExecutor {
                 context.put("subRequestData", subRequestData);
             }
 
+            //放入用户自己定义的bean
+            context.putAll(ScriptBeanManager.getScriptBeanMap());
+
             return expressRunner.execute(instructionSet, context, errorList, true, false, null);
         }catch (Exception e){
             for (String scriptErrorMsg : errorList){

+ 10 - 0
liteflow-spring/src/main/java/com/yomahub/liteflow/spring/ComponentScanner.java

@@ -8,10 +8,14 @@
  */
 package com.yomahub.liteflow.spring;
 
+import cn.hutool.core.annotation.AnnotationUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.yomahub.liteflow.aop.ICmpAroundAspect;
 import com.yomahub.liteflow.core.NodeComponent;
 import com.yomahub.liteflow.property.LiteflowConfig;
+import com.yomahub.liteflow.script.ScriptBean;
+import com.yomahub.liteflow.script.ScriptBeanManager;
 import com.yomahub.liteflow.util.LOGOPrinter;
 import com.yomahub.liteflow.util.LiteFlowProxyUtil;
 import org.slf4j.Logger;
@@ -93,6 +97,12 @@ public class ComponentScanner implements BeanPostProcessor {
             return cmpAroundAspect;
         }
 
+        //扫描@ScriptBean修饰的类
+        ScriptBean scriptBean = AnnotationUtil.getAnnotation(bean.getClass(), ScriptBean.class);
+        if (ObjectUtil.isNotNull(scriptBean)){
+            ScriptBeanManager.addScriptBean(scriptBean.value(), bean);
+        }
+
         return bean;
     }
 

+ 44 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/LiteFlowScriptScriptbeanGroovyELTest.java

@@ -0,0 +1,44 @@
+package com.yomahub.liteflow.test.script.groovy.scriptbean;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.slot.DefaultContext;
+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;
+
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/scriptbean/application.properties")
+@SpringBootTest(classes = LiteFlowScriptScriptbeanGroovyELTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.script.groovy.scriptbean.cmp","com.yomahub.liteflow.test.script.groovy.scriptbean.bean"})
+public class LiteFlowScriptScriptbeanGroovyELTest extends BaseTest {
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    @Test
+    public void testScriptBean1() throws Exception{
+        LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+        Assert.assertTrue(response.isSuccess());
+        DefaultContext context = response.getFirstContextBean();
+        Assert.assertEquals("hello", context.getData("demo"));
+    }
+
+    @Test
+    public void testScriptBean2() throws Exception{
+        LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(response.isSuccess());
+        DefaultContext context = response.getFirstContextBean();
+        Assert.assertEquals("hello,kobe", context.getData("demo"));
+    }
+
+}

+ 22 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/bean/DemoBean1.java

@@ -0,0 +1,22 @@
+package com.yomahub.liteflow.test.script.groovy.scriptbean.bean;
+
+import com.yomahub.liteflow.script.ScriptBean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@ScriptBean("demo")
+public class DemoBean1 {
+
+    @Resource
+    private DemoBean2 demoBean2;
+
+    public String getDemoStr1(){
+        return "hello";
+    }
+
+    public String getDemoStr2(String name){
+        return demoBean2.getDemoStr2(name);
+    }
+}

+ 11 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/bean/DemoBean2.java

@@ -0,0 +1,11 @@
+package com.yomahub.liteflow.test.script.groovy.scriptbean.bean;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class DemoBean2 {
+
+    public String getDemoStr2(String name){
+        return "hello,"+name;
+    }
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/cmp/ACmp.java

@@ -0,0 +1,20 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.script.groovy.scriptbean.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!");
+	}
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/cmp/BCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.script.groovy.scriptbean.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!");
+	}
+
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/java/com/yomahub/liteflow/test/script/groovy/scriptbean/cmp/CCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.script.groovy.scriptbean.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!");
+	}
+
+}

+ 1 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptbean/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=scriptbean/flow.xml

+ 27 - 0
liteflow-testcase-el/liteflow-testcase-el-script-groovy-springboot/src/test/resources/scriptbean/flow.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+
+    <nodes>
+        <node id="d" type="script">
+            <![CDATA[
+                def str = demo.getDemoStr1();
+                defaultContext.setData("demo", str);
+            ]]>
+        </node>
+
+        <node id="e" type="script">
+            <![CDATA[
+                def str = demo.getDemoStr2("kobe");
+                defaultContext.setData("demo", str);
+            ]]>
+        </node>
+    </nodes>
+
+    <chain name="chain1">
+        THEN(a,b,c,d)
+    </chain>
+
+    <chain name="chain2">
+        THEN(a,b,c,e)
+    </chain>
+</flow>

+ 44 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/LiteFlowScriptScriptbeanQLExpressELTest.java

@@ -0,0 +1,44 @@
+package com.yomahub.liteflow.test.script.qlexpress.scriptbean;
+
+import com.yomahub.liteflow.core.FlowExecutor;
+import com.yomahub.liteflow.flow.LiteflowResponse;
+import com.yomahub.liteflow.slot.DefaultContext;
+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;
+
+@RunWith(SpringRunner.class)
+@TestPropertySource(value = "classpath:/scriptbean/application.properties")
+@SpringBootTest(classes = LiteFlowScriptScriptbeanQLExpressELTest.class)
+@EnableAutoConfiguration
+@ComponentScan({"com.yomahub.liteflow.test.script.qlexpress.scriptbean.cmp","com.yomahub.liteflow.test.script.qlexpress.scriptbean.bean"})
+public class LiteFlowScriptScriptbeanQLExpressELTest extends BaseTest {
+
+    @Resource
+    private FlowExecutor flowExecutor;
+
+    @Test
+    public void testScriptBean1() throws Exception{
+        LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
+        Assert.assertTrue(response.isSuccess());
+        DefaultContext context = response.getFirstContextBean();
+        Assert.assertEquals("hello", context.getData("demo"));
+    }
+
+    @Test
+    public void testScriptBean2() throws Exception{
+        LiteflowResponse response = flowExecutor.execute2Resp("chain2", "arg");
+        Assert.assertTrue(response.isSuccess());
+        DefaultContext context = response.getFirstContextBean();
+        Assert.assertEquals("hello,kobe", context.getData("demo"));
+    }
+
+}

+ 22 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/bean/DemoBean1.java

@@ -0,0 +1,22 @@
+package com.yomahub.liteflow.test.script.qlexpress.scriptbean.bean;
+
+import com.yomahub.liteflow.script.ScriptBean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@ScriptBean("demo")
+public class DemoBean1 {
+
+    @Resource
+    private DemoBean2 demoBean2;
+
+    public String getDemoStr1(){
+        return "hello";
+    }
+
+    public String getDemoStr2(String name){
+        return demoBean2.getDemoStr2(name);
+    }
+}

+ 11 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/bean/DemoBean2.java

@@ -0,0 +1,11 @@
+package com.yomahub.liteflow.test.script.qlexpress.scriptbean.bean;
+
+import org.springframework.stereotype.Component;
+
+@Component
+public class DemoBean2 {
+
+    public String getDemoStr2(String name){
+        return "hello,"+name;
+    }
+}

+ 20 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/cmp/ACmp.java

@@ -0,0 +1,20 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.script.qlexpress.scriptbean.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!");
+	}
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/cmp/BCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.script.qlexpress.scriptbean.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!");
+	}
+
+}

+ 21 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/java/com/yomahub/liteflow/test/script/qlexpress/scriptbean/cmp/CCmp.java

@@ -0,0 +1,21 @@
+/**
+ * <p>Title: liteflow</p>
+ * <p>Description: 轻量级的组件式流程框架</p>
+ * @author Bryan.Zhang
+ * @email weenyc31@163.com
+ * @Date 2020/4/1
+ */
+package com.yomahub.liteflow.test.script.qlexpress.scriptbean.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!");
+	}
+
+}

+ 1 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/scriptbean/application.properties

@@ -0,0 +1 @@
+liteflow.rule-source=scriptbean/flow.xml

+ 27 - 0
liteflow-testcase-el/liteflow-testcase-el-script-qlexpress-springboot/src/test/resources/scriptbean/flow.xml

@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<flow>
+
+    <nodes>
+        <node id="d" type="script">
+            <![CDATA[
+                str = demo.getDemoStr1();
+                defaultContext.setData("demo", str);
+            ]]>
+        </node>
+
+        <node id="e" type="script">
+            <![CDATA[
+                str = demo.getDemoStr2("kobe");
+                defaultContext.setData("demo", str);
+            ]]>
+        </node>
+    </nodes>
+
+    <chain name="chain1">
+        THEN(a,b,c,d)
+    </chain>
+
+    <chain name="chain2">
+        THEN(a,b,c,e)
+    </chain>
+</flow>