`
lovevirus
  • 浏览: 20119 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

给任务实例添加附加名称

    博客分类:
  • jbpm
阅读更多

前段时间用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<arr.length;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>  
分享到:
评论

相关推荐

    批量附加SQL数据库工具

    - **自定义设置**:用户可以指定目标SQL服务器实例、数据库名称、文件路径等参数,以满足特定需求。 - **错误处理**:在附加过程中遇到问题时,工具通常会提供错误报告,帮助用户快速定位和解决问题。 2. **使用...

    Server2000批量附加工具OK

    这个工具简化了将这些数据库文件添加到SQL Server实例的过程,特别是对于需要一次性处理大量数据库的情况,如数据迁移、备份恢复或环境设置。 描述进一步解释了工具的使用方法。首先,你需要将所有.MDF和.LDF数据库...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例150 修改文件及目录的名称 5.6 文件的读取与保存 实例151 顺序读取文件 实例152 制作日志文件 5.7 文件管理 实例153 分类整理磁盘文件 实例154 计算机磁盘空间报警程序 实例155 批量改变指定文件的属性 ...

    SQLServer2000中如何附加数据库

    在 SQL Server 2000 中,附加数据库是一项常用的操作,主要用于将已经存在的 `.MDF` 文件(主数据文件)添加到当前 SQL Server 实例中,使其成为该实例的一部分。这对于数据库迁移、备份恢复等场景非常有用。下面将...

    C#示例(配套光盘源码)第五部分

    实例093 对数据库进行分离、附加、备份及还原操作 331 实例094 综合查询职工详细信息 338 实例095 使用二进制存取用户头像 342 实例096 使用交叉表实现商品销售统计 345 实例097 通过视图修改职工信息 347...

    明日科技《C#示例源代码》(13-16)

    实例093 对数据库进行分离、附加、备份及还原操作 331 实例094 综合查询职工详细信息 338 实例095 使用二进制存取用户头像 342 实例096 使用交叉表实现商品销售统计 345 实例097 通过视图修改职工信息...

    明日科技C#示例源码.part03

    实例093 对数据库进行分离、附加、备份及还原操作 331 实例094 综合查询职工详细信息 338 实例095 使用二进制存取用户头像 342 实例096 使用交叉表实现商品销售统计 345 实例097 通过视图修改职工信息...

    C#程序开发范例宝典(第2版).part13

    实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏...

    C#程序开发范例宝典(第2版).part08

    实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏...

    C#程序开发范例宝典(第2版).part02

    实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏...

    C#程序开发范例宝典(第2版).part12

    实例004 任务栏托盘菜单 4 实例005 可以拉伸的菜单界面 5 实例006 级联菜单 6 1.2 工具栏设计 6 实例007 带背景的工具栏 7 实例008 浮动工具栏 7 实例009 带下拉菜单的工具栏 8 实例010 具有提示功能的工具栏...

Global site tag (gtag.js) - Google Analytics