给任务实例添加附加名称

阅读更多

前段时间用jbpm做工作流,同事要求能根据实际的流程显示任务详细信息,自己就做了一个actionHandler,放入在task的task-assign事件中.

java 代码
  1. package com.guotai.wf.handler;   
  2.   
  3. import java.util.ArrayList;   
  4. import java.util.Iterator;   
  5. import java.util.List;   
  6.   
  7. import org.apache.commons.lang.StringUtils;   
  8. import org.apache.log4j.Logger;   
  9. import org.jbpm.context.exe.ContextInstance;   
  10. import org.jbpm.graph.def.ActionHandler;   
  11. import org.jbpm.graph.exe.ExecutionContext;   
  12. import org.jbpm.graph.exe.Token;   
  13. import org.jbpm.taskmgmt.exe.TaskInstance;   
  14. import org.springframework.beans.BeanWrapper;   
  15. import org.springframework.beans.BeanWrapperImpl;   
  16.   
  17. /**  
  18.  * 给任务实例添加名称  
  19.  * @author sp  
  20.  * @since 2006-11-13  
  21.  *  
  22.  */  
  23. public class TaskNameSetterHandler implements ActionHandler {   
  24.     /**  
  25.      * Logger for this class  
  26.      */  
  27.     private static final Logger logger = Logger.getLogger(TaskNameSetterHandler.class);   
  28.   
  29.     private String message;   
  30.        
  31.     public void execute(ExecutionContext executionContext) throws Exception {   
  32.         String[] arr = pickupMessage();   
  33.            
  34.         String msg = message;   
  35.         if(arr != null){   
  36.             for(int i=0;i
  37.                 Object o = getValue(executionContext.getContextInstance(), executionContext.getToken(), arr[i]);   
  38.                 msg = replaceMessage(msg,arr[i], o);   
  39.             }   
  40.         }   
  41.            
  42.         TaskInstance ti = executionContext.getTaskInstance();   
  43.         ti.setName(ti.getName() + ":" + msg);   
  44.            
  45.     }   
  46.        
  47.        
  48.     /**  
  49.      * 替换message  
  50.      * @param name  
  51.      * @param o  
  52.      */  
  53.     public String replaceMessage(String msg,String name,Object o){   
  54.         String name_find = "${" + name + "}";   
  55.         if(msg.indexOf("${" + name + "}") > -1){   
  56.             logger.debug("有其值!");   
  57.         }   
  58.         String str = msg.substring(0,msg.indexOf(name_find));   
  59.         if(o != null){   
  60.             str += o.toString();   
  61.         }else{   
  62.             str += " ";   
  63.         }   
  64.         str += msg.substring(msg.indexOf(name_find)+name_find.length(),msg.length());   
  65.         msg = str;   
  66.         return msg;   
  67.     }   
  68.     /**  
  69.      * 从ContextInstance中根据name得到其值  
  70.      * 如果name中间有".",说明是一个对象,取其对象的某个属性  
  71.      * @param contextInstance  
  72.      * @param token  
  73.      * @param name  
  74.      * @return  
  75.      */  
  76.     private Object getValue(ContextInstance contextInstance,Token token,String name){   
  77.         Object value = null;   
  78.         if (name.indexOf(".") > -1) {   
  79.             String prename = name.substring(0, name.indexOf("."));   
  80.             String postname = name.substring(name.indexOf(".") + 1,name.length());   
  81.             Object o = contextInstance.getVariable(prename, token);   
  82.             try {   
  83.                 value = o;   
  84.                 BeanWrapper bw = new BeanWrapperImpl(o);   
  85.                 String name_tmp = postname;   
  86.                 value = bw.getPropertyValue(postname);   
  87.             } catch (Exception e) {   
  88.                 logger.error(e);   
  89.                 throw new IllegalArgumentException("convert error");   
  90.             }   
  91.         } else {   
  92.             value = contextInstance.getVariable(name, token);   
  93.         }   
  94.         return value;   
  95.     }   
  96.        
  97.     /**  
  98.      * 从消息中提取${}包含的值  
  99.      * @return  
  100.      */  
  101.     public String[] pickupMessage(){   
  102.         if((this.message != null) && (this.message.indexOf("${") > -1)){   
  103.             List list = new ArrayList();   
  104.             String str = message;   
  105.             while(str.indexOf("${") > -1){   
  106.                 String str_sub = StringUtils.substringBetween(str, "${""}");   
  107.                 logger.debug("提取字符串:" + str_sub);   
  108.                 list.add(str_sub);   
  109.                 str = StringUtils.substring(str,str.indexOf("${")+2);   
  110.             }   
  111.             String[] arr = new String[list.size()];   
  112.             int i=0;   
  113.             for(Iterator it=list.iterator();it.hasNext();){   
  114.                 arr[i++] = (String) it.next();   
  115.             }   
  116.             return arr;   
  117.         }   
  118.         return null;   
  119.     }   
  120.        
  121.     public String getMessage() {   
  122.         return message;   
  123.     }   
  124.     public void setMessage(String message) {   
  125.         this.message = message;   
  126.     }   
  127.   
  128. }   

 

我用的springModule集成jbpm的,所在在参数在spring配置文件中设置,如下

xml 代码
  1. <bean name="taskNameSetterAction" class="com.guotai.wf.handler.TaskNameSetterHandler">  
  2.      <property name="message" value="名称为${sale.item}数目为${sale.quantity}"/>  
  3. bean>  

你可能感兴趣的:(JBPM,Bean,Spring,log4j,Apache)