jbpm4的流程监控程序[2] 获得流程实例的相关节点信息

jbpm4的流程监控程序[2] 获得流程实例的相关节点信息

<<jbpm4的流程监控程序[3] 流程图监控展示,基于mootools >>

其实实现流程监控并不难,因为在jbpm4已经可以得到流程图和节点的坐标信息了.

在这个jbpm4的监控程序中,比较难的是对于流程已经结束的不太好获得相关的信息,试了好多方法才实现.
/**
 * CopyRight (C) 2006-2009 yy
 * @author yy
 * @project jbpm
 * @version 1.0
 * @mail yy629_86 at 163 dot com
 * @date 2009-9-22 上午10:39:01
 * @description 
 */
package sofocus.bpm.jbpm.model;

import java.util.List;

import org.jbpm.api.history.HistoryActivityInstance;
import org.jbpm.api.model.ActivityCoordinates;

/**
 * 流程实例的节点信息,包括的活动结点和处理过的节点信息
 * @author yeyong
 */
public class ProcessInstaticeActivityInfo {

  private List<ActivityInfo> activeActivityInfos; // 处于活动的节点信息
  private List<ActivityInfo> processedActivityInfos; // 已经处理过的节点信息

  /**
   * @param activeActivityInfos
   * @param processedActivityInfos
   */
  public ProcessInstaticeActivityInfo(List<ActivityInfo> activeActivityInfos,
      List<ActivityInfo> processedActivityInfos) {
    this.activeActivityInfos = activeActivityInfos;
    this.processedActivityInfos = processedActivityInfos;
  }

  public static class ActivityInfo {
    private ActivityCoordinates coordinates;
    private HistoryActivityInstance activityInstance;

    /**
     * @param coordinates
     */
    public ActivityInfo(ActivityCoordinates coordinates) {
      this.coordinates = coordinates;
    }

    /**
     * @param coordinates
     * @param activityInstance
     */
    public ActivityInfo(ActivityCoordinates coordinates, HistoryActivityInstance activityInstance) {
      this.coordinates = coordinates;
      this.activityInstance = activityInstance;
    }

    /**
     * @return the coordinates
     */
    public ActivityCoordinates getCoordinates() {
      return coordinates;
    }

    /**
     * @param coordinates
     *          the coordinates to set
     */
    public void setCoordinates(ActivityCoordinates coordinates) {
      this.coordinates = coordinates;
    }

    /**
     * @return the activityInstance
     */
    public HistoryActivityInstance getActivityInstance() {
      return activityInstance;
    }

    /**
     * @param activityInstance
     *          the activityInstance to set
     */
    public void setActivityInstance(HistoryActivityInstance activityInstance) {
      this.activityInstance = activityInstance;
    }
  }

  /**
   * @return the activeActivityInfos
   */
  public List<ActivityInfo> getActiveActivityInfos() {
    return activeActivityInfos;
  }

  /**
   * @return the processedActivityInfos
   */
  public List<ActivityInfo> getProcessedActivityInfos() {
    return processedActivityInfos;
  }
}


/**
 * CopyRight (C) 2006-2009 yy
 * @author yy
 * @project jbpm
 * @version 1.0
 * @mail yy629_86 at 163 dot com
 * @date 2009-9-5 下午04:43:09
 * @description
 */
package sofocus.bpm.jbpm.support;

import java.io.InputStream;
import java.util.*;
import java.util.zip.ZipInputStream;

import javax.sql.DataSource;

import org.hibernate.Session;
import org.jbpm.api.*;
import org.jbpm.api.history.*;
import org.jbpm.api.job.Job;
import org.jbpm.api.model.ActivityCoordinates;
import org.jbpm.api.task.Task;
import org.jbpm.pvm.internal.env.Environment;
import org.jbpm.pvm.internal.env.EnvironmentFactory;
import org.jbpm.pvm.internal.history.model.HistoryProcessInstanceImpl;
import org.jbpm.pvm.internal.history.model.HistoryTaskInstanceImpl;
import org.jbpm.pvm.internal.model.ExecutionImpl;
import org.jbpm.pvm.internal.model.ProcessDefinitionImpl;
import org.jbpm.pvm.internal.model.Transition;
import org.jbpm.pvm.internal.svc.TaskServiceImpl;

import sofocus.bpm.jbpm.model.PageInfo;
import sofocus.bpm.jbpm.model.ProcessInstaticeActivityInfo;
import sofocus.bpm.jbpm.model.ProcessInstaticeActivityInfo.ActivityInfo;
import sofocus.bpm.jbpm.service.PagingQueryService;

/**
 * jbpm template
 * 
 * @author yeyong
 */
public class JbpmTemplate {
  public static String PROCESS_IMAGE = ".png";
  public static String PROCESS_DEFINITION_XML = ".jpdl.xml";

  protected ProcessEngine processEngine;
  protected RepositoryService repositoryService;
  protected ExecutionService executionService;
  protected ManagementService managementService;
  protected TaskService taskService;
  protected HistoryService historyService;
  protected IdentityService identityService;
  protected PagingQueryService pagingQueryService;
  
  // ...... 
  
  /**
   * 获得指定流程实例id的相关的资源
   * 
   * @param processInstanceId
   * @param resourceName
   * @return
   */
  public InputStream getResourceFromProcessInstance(String processInstanceId, String resourceName) {
    ProcessDefinition pd = getProcessDefinitionByProcessInstanceId(processInstanceId);
    if (pd != null) {
      if (PROCESS_DEFINITION_XML.equals(resourceName)) {
        resourceName = pd.getName() + resourceName;
      } else if (PROCESS_IMAGE.equals(resourceName)) {
        resourceName = pd.getImageResourceName();
      }
      return repositoryService.getResourceAsStream(pd.getDeploymentId(), resourceName);
    } else {
      return null;
    }
  }
  
  /**
   * 获得指定流程id的流程相关的坐标信息
   * 
   * @param processInstanceId
   * @return
   */
  public ProcessInstaticeActivityInfo getActivityCoordinatesInfo(String processInstanceId) {
    ProcessDefinitionImpl processDefinition = (ProcessDefinitionImpl) this
        .getProcessDefinitionByProcessInstanceId(processInstanceId);
    String pdId = processDefinition.getId();
    List<ActivityInfo> activeCoordinates = new ArrayList<ActivityInfo>(); // 处于活动状态的节点

    List<ActivityInfo> coordinateList = new ArrayList<ActivityInfo>(); // 已经流过的节点
    {
      ActivityInfo activityInfo = new ActivityInfo(processDefinition.getInitial().getCoordinates());
      coordinateList.add(activityInfo);
      List<HistoryActivityInstance> activities = historyService.createHistoryActivityInstanceQuery()
          .executionId(processInstanceId).list();
      for (HistoryActivityInstance activity : activities) {
        String activityName = activity.getActivityName();
        activityInfo = new ActivityInfo(repositoryService.getActivityCoordinates(pdId, activityName));
        activityInfo.setActivityInstance(activity);
        coordinateList.add(activityInfo);
      }
    }

    HistoryProcessInstance hpi = getHistoryProcessInstancByProcessInstanceId(processInstanceId);
    String endActivityName = ((HistoryProcessInstanceImpl) hpi).getEndActivityName();

    if (endActivityName != null) { // 流程实例已经结束了
      ActivityCoordinates coordinates = repositoryService.getActivityCoordinates(pdId, endActivityName);
      activeCoordinates.add(new ActivityInfo(coordinates)); //这里把结束节点也作为处于活动状态的节点
    } else { // 流程实例未结束
      Set<String> activityNames = executionService.findExecutionById(processInstanceId)
          .findActiveActivityNames();
      for (String activityName : activityNames) {
        ActivityCoordinates coordinates = repositoryService.getActivityCoordinates(pdId, activityName);
        activeCoordinates.add(new ActivityInfo(coordinates));
      }
    }
    return new ProcessInstaticeActivityInfo(activeCoordinates, coordinateList);
  }
}

你可能感兴趣的:(spring,活动,jbpm,OS,mootools)