diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/exception/ScriptLoadException.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/exception/ScriptLoadException.java index 033c80cfc..d720e5070 100644 --- a/liteflow-core/src/main/java/com/yomahub/liteflow/script/exception/ScriptLoadException.java +++ b/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; } diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoBreakScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoBreakScriptBody.java new file mode 100644 index 000000000..a4e108dca --- /dev/null +++ b/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{ + +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoCommonScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoCommonScriptBody.java new file mode 100644 index 000000000..091f3d58e --- /dev/null +++ b/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{ + +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoForScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoForScriptBody.java new file mode 100644 index 000000000..13aaaea96 --- /dev/null +++ b/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{ + +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoIfScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoIfScriptBody.java new file mode 100644 index 000000000..595ecccc4 --- /dev/null +++ b/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{ + +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoScriptBody.java new file mode 100644 index 000000000..aed333dfa --- /dev/null +++ b/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 body(ScriptExecuteWrap wrap); +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoSwitchScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoSwitchScriptBody.java new file mode 100644 index 000000000..99119fefd --- /dev/null +++ b/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{ + +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoWhileScriptBody.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/body/JaninoWhileScriptBody.java new file mode 100644 index 000000000..48bb9cef7 --- /dev/null +++ b/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{ + +} diff --git a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java b/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java index 0133203f9..cdec58a2e 100644 --- a/liteflow-script-plugin/liteflow-script-java/src/main/java/com/yomahub/liteflow/script/java/JavaExecutor.java +++ b/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 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);}"; + } } diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/common/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/common/flow.xml index a64ec0c2d..82001bffe 100644 --- a/liteflow-testcase-el/liteflow-testcase-el-script-java-springboot/src/test/resources/common/flow.xml +++ b/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; + } + } + ]]> + + + + - THEN(a, b, c, s1); + FOR(s2).DO(THEN(a, b, c, s1)); \ No newline at end of file