脚本节点参考实现
package com.seeyon.ctp.workflow.devnode; import java.util.HashMap; import java.util.Map; import java.util.UUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import com.seeyon.ctp.common.script.ScriptEvaluator; import com.seeyon.ctp.workflow.devnode.manager.GroovyNodeManager; import com.seeyon.ctp.workflow.supernode.BaseSuperNodeAction; import com.seeyon.ctp.workflow.supernode.SuperNodeActionUrl; import com.seeyon.ctp.workflow.supernode.SuperNodeResponse; /** * 工作流脚本节点 * * @author wayne * */ public class GroovyScriptNodeAction extends BaseSuperNodeAction { private static final Log logger = LogFactory .getLog(GroovyScriptNodeAction.class); private GroovyNodeManager groovyNodeManager; public GroovyNodeManager getGroovyNodeManager() { return groovyNodeManager; } public void setGroovyNodeManager(GroovyNodeManager groovyNodeManager) { this.groovyNodeManager = groovyNodeManager; } public int getOrder() { return 2; } public String getNodeId() { return "dev_node_groovy"; } public String getNodeName() { return "脚本节点"; } public SuperNodeResponse executeAction(String token, String activityId, Map<String, Object> params) { SuperNodeResponse response = new SuperNodeResponse(); try { Map<String, Object> context = new HashMap<String, Object>(); context.putAll(params); StringBuilder script = new StringBuilder( "import static com.seeyon.ctp.common.constdef.ConstDefUtil.getConstDefValue as _;"); script.append(groovyNodeManager.getScript(activityId)); Object result = ScriptEvaluator.getInstance().eval( script.toString(), context); Thread.sleep(10000); response.setDataId(String.valueOf(UUID.randomUUID() .getMostSignificantBits())); response.setReturnCode(1); response.setReturnMsg("执行成功:" + result); } catch (Throwable e) { logger.error("脚本执行失败:" + e.getLocalizedMessage(), e); response.setReturnCode(0); response.setReturnMsg("脚本执行失败:" + e.getLocalizedMessage()); } return response; } public void cancelAction(String token, String arg1) { logger.info("撤销脚本执行!"); } public SuperNodeResponse confirmAction(String token, String activityId, Map<String, Object> params) { return this.executeAction(token, activityId, params); } /** * 动作配置信息查看页面,流转过程中查看节点信息。 */ public SuperNodeActionUrl getActionConfigDisplayUrl(String token, final String activityId) { // 偷懒了,管理员配置界面应该有别于普通用户的查看界面 // 这样做的后果就是流转过程中也可以改脚本 return new SuperNodeActionUrl() { @Override public String getUrl() { return "/workflow/groovyNodeController.do?method=edit&activityId=" + activityId; } @Override public int getWidth() { return 800; } @Override public int getHeight() { return 600; } @Override public String getTitle() { return "配置脚本节点"; } }; } /** * 动作配置信息编辑页面,表单管理员定义表单时可进行设置。 */ public SuperNodeActionUrl getActionConfigUrl(String activityId) { return this.getActionConfigDisplayUrl("", activityId); } }
配置页面的jsp
<%@ page contentType="text/html; charset=UTF-8" isELIgnored="false"%> <%@ include file="/WEB-INF/jsp/common/common.jsp"%> <html class="h100b"> <head> <title>Configuration</title> </head> <body class="h100b"> <form id="form" method="POST" action="groovyNodeController.do?method=save"> <label>节点名称:</label> <br /> <input id="name" name="name" value="${name}" /> <br /> <input type="hidden" name="activityId" value="${activityId}" /> <label>脚本:</label> <br /> <textarea name="script" rows="30" cols="120">${script}</textarea> </form> <script> function OK(){ var name = $('#name').val(); $('#form').submit(); return [name];} </script> </body> </html>
这个示例的Manager没有对脚本进行持久化,都是暂时保存在内存中,重启就得重新设置。