前段时间用jbpm做工作流,同事要求能根据实际的流程显示任务详细信息,自己就做了一个actionHandler,放入在task的task-assign事件中.
java 代码
- package com.guotai.wf.handler;
- import java.util.ArrayList;
- import java.util.Iterator;
- import java.util.List;
- import org.apache.commons.lang.StringUtils;
- import org.apache.log4j.Logger;
- import org.jbpm.context.exe.ContextInstance;
- import org.jbpm.graph.def.ActionHandler;
- import org.jbpm.graph.exe.ExecutionContext;
- import org.jbpm.graph.exe.Token;
- import org.jbpm.taskmgmt.exe.TaskInstance;
- import org.springframework.beans.BeanWrapper;
- import org.springframework.beans.BeanWrapperImpl;
- /**
- * 给任务实例添加名称
- * @author sp
- * @since 2006-11-13
- *
- */
- public class TaskNameSetterHandler implements ActionHandler {
- /**
- * Logger for this class
- */
- private static final Logger logger = Logger.getLogger(TaskNameSetterHandler.class);
- private String message;
- public void execute(ExecutionContext executionContext) throws Exception {
- String[] arr = pickupMessage();
- String msg = message;
- if(arr != null){
- for(int i=0;i<arr.length;i++){
- Object o = getValue(executionContext.getContextInstance(), executionContext.getToken(), arr[i]);
- msg = replaceMessage(msg,arr[i], o);
- }
- }
- TaskInstance ti = executionContext.getTaskInstance();
- ti.setName(ti.getName() + ":" + msg);
- }
- /**
- * 替换message
- * @param name
- * @param o
- */
- public String replaceMessage(String msg,String name,Object o){
- String name_find = "${" + name + "}";
- if(msg.indexOf("${" + name + "}") > -1){
- logger.debug("有其值!");
- }
- String str = msg.substring(0,msg.indexOf(name_find));
- if(o != null){
- str += o.toString();
- }else{
- str += " ";
- }
- str += msg.substring(msg.indexOf(name_find)+name_find.length(),msg.length());
- msg = str;
- return msg;
- }
- /**
- * 从ContextInstance中根据name得到其值
- * 如果name中间有".",说明是一个对象,取其对象的某个属性
- * @param contextInstance
- * @param token
- * @param name
- * @return
- */
- private Object getValue(ContextInstance contextInstance,Token token,String name){
- Object value = null;
- if (name.indexOf(".") > -1) {
- String prename = name.substring(0, name.indexOf("."));
- String postname = name.substring(name.indexOf(".") + 1,name.length());
- Object o = contextInstance.getVariable(prename, token);
- try {
- value = o;
- BeanWrapper bw = new BeanWrapperImpl(o);
- String name_tmp = postname;
- value = bw.getPropertyValue(postname);
- } catch (Exception e) {
- logger.error(e);
- throw new IllegalArgumentException("convert error");
- }
- } else {
- value = contextInstance.getVariable(name, token);
- }
- return value;
- }
- /**
- * 从消息中提取${}包含的值
- * @return
- */
- public String[] pickupMessage(){
- if((this.message != null) && (this.message.indexOf("${") > -1)){
- List list = new ArrayList();
- String str = message;
- while(str.indexOf("${") > -1){
- String str_sub = StringUtils.substringBetween(str, "${", "}");
- logger.debug("提取字符串:" + str_sub);
- list.add(str_sub);
- str = StringUtils.substring(str,str.indexOf("${")+2);
- }
- String[] arr = new String[list.size()];
- int i=0;
- for(Iterator it=list.iterator();it.hasNext();){
- arr[i++] = (String) it.next();
- }
- return arr;
- }
- return null;
- }
- public String getMessage() {
- return message;
- }
- public void setMessage(String message) {
- this.message = message;
- }
- }
我用的springModule集成jbpm的,所在在参数在spring配置文件中设置,如下
xml 代码
- <bean name="taskNameSetterAction" class="com.guotai.wf.handler.TaskNameSetterHandler">
- <property name="message" value="名称为${sale.item}数目为${sale.quantity}"/>
- </bean>