diff --git a/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java new file mode 100644 index 000000000..4bd5c6b53 --- /dev/null +++ b/liteflow-core/src/main/java/com/yomahub/liteflow/script/jsr223/JSR223ScriptExecutor.java @@ -0,0 +1,111 @@ +package com.yomahub.liteflow.script.jsr223; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.exception.LiteFlowException; +import com.yomahub.liteflow.script.ScriptBeanManager; +import com.yomahub.liteflow.script.ScriptExecuteWrap; +import com.yomahub.liteflow.script.ScriptExecutor; +import com.yomahub.liteflow.script.exception.ScriptLoadException; +import com.yomahub.liteflow.slot.DataBus; +import com.yomahub.liteflow.slot.Slot; +import com.yomahub.liteflow.util.CopyOnWriteHashMap; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.script.*; +import java.util.Map; + +/** + * JSR223 script engine的统一实现抽象类 + * @author Bryan.Zhang + * @since 2.9.5 + */ +public abstract class JSR223ScriptExecutor implements ScriptExecutor { + + protected final Logger log = LoggerFactory.getLogger(this.getClass()); + + private ScriptEngine scriptEngine; + + private final Map compiledScriptMap = new CopyOnWriteHashMap<>(); + + @Override + public ScriptExecutor init() { + ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); + scriptEngine = scriptEngineManager.getEngineByName(scriptEngineName()); + return this; + } + + protected abstract String scriptEngineName(); + + protected String convertScript(String script){ + return script; + } + + @Override + public void load(String nodeId, String script) { + try{ + CompiledScript compiledScript = ((Compilable) scriptEngine).compile(convertScript(script)); + compiledScriptMap.put(nodeId, compiledScript); + }catch (Exception e){ + String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); + throw new ScriptLoadException(errorMsg); + } + + } + + @Override + public Object execute(ScriptExecuteWrap wrap) throws Exception{ + try{ + if (!compiledScriptMap.containsKey(wrap.getNodeId())){ + String errorMsg = StrUtil.format("script for node[{}] is not loaded", wrap.getNodeId()); + throw new ScriptLoadException(errorMsg); + } + + CompiledScript compiledScript = compiledScriptMap.get(wrap.getNodeId()); + Bindings bindings = new SimpleBindings(); + + //往脚本语言绑定表里循环增加绑定上下文的key + //key的规则为自定义上下文的simpleName + //比如你的自定义上下文为AbcContext,那么key就为:abcContext + //这里不统一放一个map的原因是考虑到有些用户会调用上下文里的方法,而不是参数,所以脚本语言的绑定表里也是放多个上下文 + DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(o -> { + String key = StrUtil.lowerFirst(o.getClass().getSimpleName()); + bindings.put(key, o); + }); + + //把wrap对象转换成元数据map + Map metaMap = BeanUtil.beanToMap(wrap); + + //在元数据里放入主Chain的流程参数 + Slot slot = DataBus.getSlot(wrap.getSlotIndex()); + metaMap.put("requestData", slot.getRequestData()); + + //如果有隐式流程,则放入隐式流程的流程参数 + Object subRequestData = slot.getChainReqData(wrap.getCurrChainId()); + if (ObjectUtil.isNotNull(subRequestData)){ + metaMap.put("subRequestData", subRequestData); + } + + //往脚本上下文里放入元数据 + bindings.put("_meta", metaMap); + + //放入用户自己定义的bean + ScriptBeanManager.getScriptBeanMap().forEach(bindings::putIfAbsent); + + return compiledScript.eval(bindings); + }catch (Exception e){ + if (ObjectUtil.isNotNull(e.getCause()) && e.getCause() instanceof LiteFlowException){ + throw (LiteFlowException)e.getCause(); + }else{ + throw e; + } + } + } + + @Override + public void cleanCache() { + compiledScriptMap.clear(); + } +} diff --git a/liteflow-script-plugin/liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java b/liteflow-script-plugin/liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java index 2db3cd873..c4654629b 100644 --- a/liteflow-script-plugin/liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-groovy/src/main/java/com/yomahub/liteflow/script/groovy/GroovyScriptExecutor.java @@ -1,104 +1,16 @@ package com.yomahub.liteflow.script.groovy; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.yomahub.liteflow.exception.LiteFlowException; -import com.yomahub.liteflow.script.ScriptBeanManager; -import com.yomahub.liteflow.script.ScriptExecuteWrap; -import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.script.ScriptExecutor; -import com.yomahub.liteflow.script.exception.ScriptLoadException; -import com.yomahub.liteflow.util.CopyOnWriteHashMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import javax.script.*; -import java.util.Map; +import com.yomahub.liteflow.script.jsr223.JSR223ScriptExecutor; /** * Groovy脚本语言的执行器实现 * @author Bryan.Zhang * @since 2.6.0 */ -public class GroovyScriptExecutor implements ScriptExecutor { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - private ScriptEngine scriptEngine; - - private final Map compiledScriptMap = new CopyOnWriteHashMap<>(); +public class GroovyScriptExecutor extends JSR223ScriptExecutor { @Override - public ScriptExecutor init() { - ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); - scriptEngine = scriptEngineManager.getEngineByName("groovy"); - return this; - } - - @Override - public void load(String nodeId, String script) { - try{ - CompiledScript compiledScript = ((Compilable) scriptEngine).compile(script); - compiledScriptMap.put(nodeId, compiledScript); - }catch (Exception e){ - String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); - throw new ScriptLoadException(errorMsg); - } - - } - - @Override - public Object execute(ScriptExecuteWrap wrap) throws Exception{ - try{ - if (!compiledScriptMap.containsKey(wrap.getNodeId())){ - String errorMsg = StrUtil.format("script for node[{}] is not loaded", wrap.getNodeId()); - throw new ScriptLoadException(errorMsg); - } - - CompiledScript compiledScript = compiledScriptMap.get(wrap.getNodeId()); - Bindings bindings = new SimpleBindings(); - - //往脚本语言绑定表里循环增加绑定上下文的key - //key的规则为自定义上下文的simpleName - //比如你的自定义上下文为AbcContext,那么key就为:abcContext - //这里不统一放一个map的原因是考虑到有些用户会调用上下文里的方法,而不是参数,所以脚本语言的绑定表里也是放多个上下文 - DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(o -> { - String key = StrUtil.lowerFirst(o.getClass().getSimpleName()); - bindings.put(key, o); - }); - - //把wrap对象转换成元数据map - Map metaMap = BeanUtil.beanToMap(wrap); - - //在元数据里放入主Chain的流程参数 - Slot slot = DataBus.getSlot(wrap.getSlotIndex()); - metaMap.put("requestData", slot.getRequestData()); - - //如果有隐式流程,则放入隐式流程的流程参数 - Object subRequestData = slot.getChainReqData(wrap.getCurrChainId()); - if (ObjectUtil.isNotNull(subRequestData)){ - metaMap.put("subRequestData", subRequestData); - } - - //往脚本上下文里放入元数据 - bindings.put("_meta", metaMap); - - //放入用户自己定义的bean - ScriptBeanManager.getScriptBeanMap().forEach(bindings::putIfAbsent); - - return compiledScript.eval(bindings); - }catch (Exception e){ - if (ObjectUtil.isNotNull(e.getCause()) && e.getCause() instanceof LiteFlowException){ - throw (LiteFlowException)e.getCause(); - }else{ - throw e; - } - } - } - - @Override - public void cleanCache() { - compiledScriptMap.clear(); + protected String scriptEngineName() { + return "groovy"; } } diff --git a/liteflow-script-plugin/liteflow-script-javascript/src/main/java/com/yomahub/liteflow/script/javascript/JavaScriptExecutor.java b/liteflow-script-plugin/liteflow-script-javascript/src/main/java/com/yomahub/liteflow/script/javascript/JavaScriptExecutor.java index a9503c7d3..9af7a2fd5 100644 --- a/liteflow-script-plugin/liteflow-script-javascript/src/main/java/com/yomahub/liteflow/script/javascript/JavaScriptExecutor.java +++ b/liteflow-script-plugin/liteflow-script-javascript/src/main/java/com/yomahub/liteflow/script/javascript/JavaScriptExecutor.java @@ -1,101 +1,21 @@ package com.yomahub.liteflow.script.javascript; -import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.yomahub.liteflow.script.ScriptBeanManager; -import com.yomahub.liteflow.script.ScriptExecuteWrap; -import com.yomahub.liteflow.slot.DataBus; -import com.yomahub.liteflow.slot.Slot; -import com.yomahub.liteflow.script.ScriptExecutor; -import com.yomahub.liteflow.script.exception.ScriptLoadException; -import com.yomahub.liteflow.util.CopyOnWriteHashMap; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.script.*; -import java.util.Map; - +import com.yomahub.liteflow.script.jsr223.JSR223ScriptExecutor; /** * JavaScript脚本语言的执行器实现 * @author Bryan.Zhang * @since 2.9.1 */ -public class JavaScriptExecutor implements ScriptExecutor { - - private final Logger log = LoggerFactory.getLogger(this.getClass()); - - private ScriptEngine scriptEngine; - - private final Map compiledScriptMap = new CopyOnWriteHashMap<>(); +public class JavaScriptExecutor extends JSR223ScriptExecutor { @Override - public ScriptExecutor init() { - ScriptEngineManager scriptEngineManager = new ScriptEngineManager(); - scriptEngine = scriptEngineManager.getEngineByName("javascript"); - return this; + protected String scriptEngineName() { + return "javascript"; } @Override - public void load(String nodeId, String script) { - try{ - String wrapScript = StrUtil.format("function process(){{}} process();",script); - CompiledScript compiledScript = ((Compilable) scriptEngine).compile(wrapScript); - compiledScriptMap.put(nodeId, compiledScript); - }catch (Exception e){ - String errorMsg = StrUtil.format("script loading error for node[{}], error msg:{}", nodeId, e.getMessage()); - throw new ScriptLoadException(errorMsg); - } - - } - - @Override - public Object execute(ScriptExecuteWrap wrap) throws Exception{ - try{ - if (!compiledScriptMap.containsKey(wrap.getNodeId())){ - String errorMsg = StrUtil.format("script for node[{}] is not loaded", wrap.getNodeId()); - throw new ScriptLoadException(errorMsg); - } - - CompiledScript compiledScript = compiledScriptMap.get(wrap.getNodeId()); - Bindings bindings = new SimpleBindings(); - - //往脚本语言绑定表里循环增加绑定上下文的key - //key的规则为自定义上下文的simpleName - //比如你的自定义上下文为AbcContext,那么key就为:abcContext - //这里不统一放一个map的原因是考虑到有些用户会调用上下文里的方法,而不是参数,所以脚本语言的绑定表里也是放多个上下文 - DataBus.getContextBeanList(wrap.getSlotIndex()).forEach(o -> { - String key = StrUtil.lowerFirst(o.getClass().getSimpleName()); - bindings.put(key, o); - }); - - //把wrap对象转换成元数据map - Map metaMap = BeanUtil.beanToMap(wrap); - - //在元数据里放入主Chain的流程参数 - Slot slot = DataBus.getSlot(wrap.getSlotIndex()); - metaMap.put("requestData", slot.getRequestData()); - - //如果有隐式流程,则放入隐式流程的流程参数 - Object subRequestData = slot.getChainReqData(wrap.getCurrChainName()); - if (ObjectUtil.isNotNull(subRequestData)){ - metaMap.put("subRequestData", subRequestData); - } - - //往脚本上下文里放入元数据 - bindings.put("_meta", metaMap); - - //放入用户自己定义的bean - ScriptBeanManager.getScriptBeanMap().forEach(bindings::putIfAbsent); - - return compiledScript.eval(bindings); - }catch (Exception e){ - throw e; - } - } - - @Override - public void cleanCache() { - compiledScriptMap.clear(); + protected String convertScript(String script) { + return StrUtil.format("function process(){{}} process();",script); } } diff --git a/liteflow-script-plugin/liteflow-script-python/pom.xml b/liteflow-script-plugin/liteflow-script-python/pom.xml new file mode 100644 index 000000000..87766dfe5 --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-python/pom.xml @@ -0,0 +1,27 @@ + + + 4.0.0 + + com.yomahub + liteflow-script-plugin + 2.9.5 + + + liteflow-script-python + + + + com.yomahub + liteflow-core + ${revision} + provided + + + org.python + jython-standalone + + + + \ No newline at end of file diff --git a/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java b/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java new file mode 100644 index 000000000..47ca8b296 --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-python/src/main/java/com/yomahub/liteflow/script/python/PythonScriptExecutor.java @@ -0,0 +1,50 @@ +package com.yomahub.liteflow.script.python; + +import cn.hutool.core.util.CharUtil; +import cn.hutool.core.util.CreditCodeUtil; +import cn.hutool.core.util.ReUtil; +import cn.hutool.core.util.StrUtil; +import com.yomahub.liteflow.script.jsr223.JSR223ScriptExecutor; +import org.python.antlr.PythonParser; +import org.python.util.CodegenUtils; +import org.python.util.JycompileAntTask; + +import java.util.Arrays; +import java.util.List; +import java.util.Scanner; +import java.util.function.Consumer; +import java.util.function.Predicate; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +/** + * Python脚本语言的执行器实现 + * @author Bryan.Zhang + * @since 2.9.5 + */ +public class PythonScriptExecutor extends JSR223ScriptExecutor { + + @Override + protected String scriptEngineName() { + return "python"; + } + + @Override + protected String convertScript(String script) { + String[] lineArray = script.split("\\n"); + List noBlankLineList = Arrays.stream(lineArray).filter( + s -> !StrUtil.isBlank(s) + ).collect(Collectors.toList()); + + //用第一行的缩进的空格数作为整个代码的缩进量 + String blankStr = ReUtil.getGroup0("^[ ]*", noBlankLineList.get(0)); + + //重新构建python脚本 + StringBuilder scriptSB = new StringBuilder(); + noBlankLineList.forEach(s + -> scriptSB.append(StrUtil.format("{}\n", s.replaceFirst(blankStr, StrUtil.EMPTY)))); + + return scriptSB.toString(); + } +} diff --git a/liteflow-script-plugin/liteflow-script-python/src/main/resources/META-INF/services/com.yomahub.liteflow.script.ScriptExecutor b/liteflow-script-plugin/liteflow-script-python/src/main/resources/META-INF/services/com.yomahub.liteflow.script.ScriptExecutor new file mode 100644 index 000000000..35bb2a4a5 --- /dev/null +++ b/liteflow-script-plugin/liteflow-script-python/src/main/resources/META-INF/services/com.yomahub.liteflow.script.ScriptExecutor @@ -0,0 +1,2 @@ +# Python的实现 +com.yomahub.liteflow.script.python.PythonScriptExecutor \ No newline at end of file diff --git a/liteflow-script-plugin/pom.xml b/liteflow-script-plugin/pom.xml index 9377c8b40..f7d602f27 100644 --- a/liteflow-script-plugin/pom.xml +++ b/liteflow-script-plugin/pom.xml @@ -19,6 +19,7 @@ liteflow-script-groovy liteflow-script-javascript liteflow-script-graaljs + liteflow-script-python \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/pom.xml b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/pom.xml new file mode 100644 index 000000000..427a6a43f --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + + liteflow-testcase-el + com.yomahub + ${revision} + ../pom.xml + + + liteflow-testcase-el-script-python-springboot + + + + com.yomahub + liteflow-spring-boot-starter + ${revision} + + + com.yomahub + liteflow-script-python + ${revision} + test + + + org.springframework.boot + spring-boot-starter-test + + + + \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java new file mode 100644 index 000000000..02e76f923 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/BaseTest.java @@ -0,0 +1,22 @@ +package com.yomahub.liteflow.test; + +import com.yomahub.liteflow.core.FlowInitHook; +import com.yomahub.liteflow.flow.FlowBus; +import com.yomahub.liteflow.property.LiteflowConfigGetter; +import com.yomahub.liteflow.spi.holder.SpiFactoryCleaner; +import com.yomahub.liteflow.spring.ComponentScanner; +import com.yomahub.liteflow.thread.ExecutorHelper; +import org.junit.AfterClass; + +public class BaseTest { + + @AfterClass + public static void cleanScanCache(){ + ComponentScanner.cleanCache(); + FlowBus.cleanCache(); + ExecutorHelper.loadInstance().clearExecutorServiceMap(); + SpiFactoryCleaner.clean(); + LiteflowConfigGetter.clean(); + FlowInitHook.cleanHook(); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java new file mode 100644 index 000000000..335f70e4b --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/ScriptPythonCommonELTest.java @@ -0,0 +1,42 @@ +package com.yomahub.liteflow.test.script.python.common; + +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; + + +/** + * 测试springboot下的groovy脚本组件,基于xml配置 + * @author Bryan.Zhang + * @since 2.6.0 + */ +@RunWith(SpringRunner.class) +@TestPropertySource(value = "classpath:/common/application.properties") +@SpringBootTest(classes = ScriptPythonCommonELTest.class) +@EnableAutoConfiguration +@ComponentScan({"com.yomahub.liteflow.test.script.python.common.cmp"}) +public class ScriptPythonCommonELTest extends BaseTest { + + @Resource + private FlowExecutor flowExecutor; + + //测试普通脚本节点 + @Test + public void testCommon1() { + LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); + DefaultContext context = response.getFirstContextBean(); + Assert.assertTrue(response.isSuccess()); + Assert.assertEquals(Integer.valueOf(30), context.getData("s1")); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/ACmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/ACmp.java new file mode 100644 index 000000000..32f84b007 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/ACmp.java @@ -0,0 +1,20 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.python.common.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("a") +public class ACmp extends NodeComponent { + + @Override + public void process() { + System.out.println("ACmp executed!"); + } +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/BCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/BCmp.java new file mode 100644 index 000000000..636543e8c --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/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.script.python.common.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("b") +public class BCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("BCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/CCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/CCmp.java new file mode 100644 index 000000000..ac7ac0522 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/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.script.python.common.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; + +@LiteflowComponent("c") +public class CCmp extends NodeComponent { + + @Override + public void process() { + System.out.println("CCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/DCmp.java b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/DCmp.java new file mode 100644 index 000000000..2bb84daa7 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/java/com/yomahub/liteflow/test/script/python/common/cmp/DCmp.java @@ -0,0 +1,24 @@ +/** + *

Title: liteflow

+ *

Description: 轻量级的组件式流程框架

+ * @author Bryan.Zhang + * @email weenyc31@163.com + * @Date 2020/4/1 + */ +package com.yomahub.liteflow.test.script.python.common.cmp; + +import com.yomahub.liteflow.annotation.LiteflowComponent; +import com.yomahub.liteflow.core.NodeComponent; +import com.yomahub.liteflow.slot.DefaultContext; + +@LiteflowComponent("d") +public class DCmp extends NodeComponent { + + @Override + public void process() { + DefaultContext context = this.getFirstContextBean(); + context.setData("count",198); + System.out.println("DCmp executed!"); + } + +} diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/application.properties b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/application.properties new file mode 100644 index 000000000..4c9c216b6 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/application.properties @@ -0,0 +1 @@ +liteflow.rule-source=common/flow.xml \ No newline at end of file diff --git a/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml new file mode 100644 index 000000000..3990c03e7 --- /dev/null +++ b/liteflow-testcase-el/liteflow-testcase-el-script-python-springboot/src/test/resources/common/flow.xml @@ -0,0 +1,21 @@ + + + + + 5: + b=5 + print 'hello' + else: + print 'hi' + defaultContext.setData("s1",a*b) + ]]> + + + + + THEN(a, b, c, s1); + + \ No newline at end of file diff --git a/liteflow-testcase-el/pom.xml b/liteflow-testcase-el/pom.xml index 32610be3c..dc98cf542 100644 --- a/liteflow-testcase-el/pom.xml +++ b/liteflow-testcase-el/pom.xml @@ -29,6 +29,7 @@ liteflow-testcase-el-nacos-springboot liteflow-testcase-el-etcd-springboot liteflow-testcase-el-apollo-springboot + liteflow-testcase-el-script-python-springboot diff --git a/pom.xml b/pom.xml index 43abdcad6..f9605de37 100644 --- a/pom.xml +++ b/pom.xml @@ -69,6 +69,7 @@ 4.5.13 1.9.4 1.7.0 + 2.7.3 @@ -265,7 +266,11 @@ apollo-client ${apollo.version} - + + org.python + jython-standalone + ${jython.version} +