Переглянути джерело

feature #I7V6VB 建议增加Janino插件,支持java脚本的书写

everywhere.z 1 рік тому
батько
коміт
304a2d1096

+ 1 - 0
liteflow-core/src/main/java/com/yomahub/liteflow/script/exception/ScriptLoadException.java

@@ -18,6 +18,7 @@ public class ScriptLoadException extends RuntimeException {
 		this.message = message;
 	}
 
+	@Override
 	public String getMessage() {
 		return message;
 	}

+ 5 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoBreakScriptBody.java

@@ -0,0 +1,5 @@
+package com.yomahub.liteflow.script.body;
+
+public interface JaninoBreakScriptBody extends JaninoScriptBody<Boolean>{
+
+}

+ 5 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoCommonScriptBody.java

@@ -0,0 +1,5 @@
+package com.yomahub.liteflow.script.body;
+
+public interface JaninoCommonScriptBody extends JaninoScriptBody<Void>{
+
+}

+ 6 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoForScriptBody.java

@@ -0,0 +1,6 @@
+package com.yomahub.liteflow.script.body;
+
+
+public interface JaninoForScriptBody extends JaninoScriptBody<Integer>{
+
+}

+ 6 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoIfScriptBody.java

@@ -0,0 +1,6 @@
+package com.yomahub.liteflow.script.body;
+
+
+public interface JaninoIfScriptBody extends JaninoScriptBody<Boolean>{
+
+}

+ 7 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoScriptBody.java

@@ -0,0 +1,7 @@
+package com.yomahub.liteflow.script.body;
+
+import com.yomahub.liteflow.script.ScriptExecuteWrap;
+
+public interface JaninoScriptBody<T> {
+    T body(ScriptExecuteWrap wrap);
+}

+ 6 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoSwitchScriptBody.java

@@ -0,0 +1,6 @@
+package com.yomahub.liteflow.script.body;
+
+
+public interface JaninoSwitchScriptBody extends JaninoScriptBody<String>{
+
+}

+ 6 - 0
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoWhileScriptBody.java

@@ -0,0 +1,6 @@
+package com.yomahub.liteflow.script.body;
+
+
+public interface JaninoWhileScriptBody extends JaninoScriptBody<Boolean>{
+
+}

+ 24 - 1
liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java

@@ -1,9 +1,11 @@
 package com.yomahub.liteflow.script.java;
 
+import cn.hutool.core.util.ReUtil;
 import cn.hutool.core.util.StrUtil;
 import com.yomahub.liteflow.enums.ScriptTypeEnum;
 import com.yomahub.liteflow.script.ScriptExecuteWrap;
 import com.yomahub.liteflow.script.ScriptExecutor;
+import com.yomahub.liteflow.script.body.JaninoCommonScriptBody;
 import com.yomahub.liteflow.script.exception.ScriptLoadException;
 import com.yomahub.liteflow.util.CopyOnWriteHashMap;
 import org.codehaus.commons.compiler.CompilerFactoryFactory;
@@ -14,13 +16,15 @@ public class JavaExecutor extends ScriptExecutor {
 
     private final Map<String, IScriptEvaluator> compiledScriptMap = new CopyOnWriteHashMap<>();
 
+
+
     @Override
     public void load(String nodeId, String script) {
         try{
             IScriptEvaluator se = CompilerFactoryFactory.getDefaultCompilerFactory(this.getClass().getClassLoader()).newScriptEvaluator();
             se.setReturnType(Object.class);
             se.setParameters(new String[] {"_meta"}, new Class[] {ScriptExecuteWrap.class});
-            se.cook(script);
+            se.cook(convertScript(script));
             compiledScriptMap.put(nodeId, se);
         }catch (Exception e){
             String errorMsg = StrUtil.format("script loading error for node[{}],error msg:{}", nodeId, e.getMessage());
@@ -48,4 +52,23 @@ public class JavaExecutor extends ScriptExecutor {
     public ScriptTypeEnum scriptType() {
         return ScriptTypeEnum.JAVA;
     }
+
+    private String convertScript(String script){
+        //替换掉public,private,protected等修饰词
+        String script1 = script.replaceAll("public class", "class")
+                .replaceAll("private class", "class")
+                .replaceAll("protected class", "class");
+
+        //分析出class的具体名称
+        String className = ReUtil.getGroup1("class\\s+(\\w+)\\s+implements", script1);
+
+        if (StrUtil.isBlank(className)){
+            throw new RuntimeException("cannot find class defined");
+        }
+
+        return "import com.yomahub.liteflow.script.body.JaninoCommonScriptBody;\n" +
+                script1 + "\n" +
+                StrUtil.format("{} item = new {}();\n", className, className) +
+                "if (item instanceof JaninoCommonScriptBody){item.body(_meta);return null;}else{return item.body(_meta);}";
+    }
 }

+ 29 - 10
liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/common/flow.xml

@@ -7,23 +7,42 @@
             import com.yomahub.liteflow.slot.DefaultContext;
             import com.yomahub.liteflow.spi.holder.ContextAwareHolder;
             import com.yomahub.liteflow.test.script.java.common.cmp.TestDomain;
+            import com.yomahub.liteflow.script.body.JaninoCommonScriptBody;
+            import com.yomahub.liteflow.script.ScriptExecuteWrap;
 
-            int v1 = 2;
-            int v2 = 3;
-            System.out.println(_meta.cmp);
-            DefaultContext ctx = (DefaultContext) _meta.cmp.getFirstContextBean();
-            ctx.setData("s1", v1 * v2);
+            public class Demo implements JaninoCommonScriptBody{
+                public Void body(ScriptExecuteWrap wrap){
+                    int v1 = 2;
+                    int v2 = 3;
+                    DefaultContext ctx = (DefaultContext)wrap.cmp.getFirstContextBean();
+                    ctx.setData("s1", v1 * v2);
 
-            TestDomain domain = (TestDomain)ContextAwareHolder.loadContextAware().getBean(TestDomain.class);
+                    TestDomain domain = (TestDomain)ContextAwareHolder.loadContextAware().getBean(TestDomain.class);
 
-            String str = domain.sayHello("jack");
-            ctx.setData("hi", str);
-            return null;
+                    String str = domain.sayHello("jack");
+                    ctx.setData("hi", str);
+
+                    return null;
+                }
+            }
+            ]]>
+        </node>
+
+        <node id="s2" name="普通脚本2" type="for_script" language="java">
+            <![CDATA[
+            import com.yomahub.liteflow.script.body.JaninoForScriptBody;
+            import com.yomahub.liteflow.script.ScriptExecuteWrap;
+
+            public class Demo implements JaninoForScriptBody{
+                public Integer body(ScriptExecuteWrap wrap){
+                    return 2;
+                }
+            }
             ]]>
         </node>
     </nodes>
 
     <chain name="chain1">
-        THEN(a, b, c, s1);
+        FOR(s2).DO(THEN(a, b, c, s1));
     </chain>
 </flow>