1.7.5.3.2. 节点动作代码

脚本节点参考实现

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];1
  }
  </script> 
 </body>
</html>

1

返回的数组中0号元素为节点的名称,就是在这里,把“脚本节点”改成了“创建人员”

这个示例的Manager没有对脚本进行持久化,都是暂时保存在内存中,重启就得重新设置。