jbpm工作流發佈封裝類

  1. public class WorkflowManagerImpl extends HibernateDaoSupport implements  
  2.         WorkflowManager {  
  3.   
  4.     private JbpmConfiguration jbpmConfiguration;  
  5.       
  6.     public long addProcessInstance(String workflowName, int documentId) {  
  7.            
  8.         JbpmContext context = getContext();  
  9.           
  10.         //從JBPM中加載流程定義  
  11.         ProcessDefinition definition = context.getGraphSession().findLatestProcessDefinition(workflowName);  
  12.           
  13.         ProcessInstance instance = new ProcessInstance(definition);  
  14.           
  15.         //將公文標識綁定到流程實例  
  16.         instance.getContextInstance().createVariable("document", documentId);  
  17.           
  18.         //存儲流程實例的信息  
  19.         context.save(instance);  
  20.           
  21.         return instance.getId();  
  22.     }  
  23.   
  24.     public void delProcessInstance(long processInstanceId) {  
  25.           
  26.         JbpmContext context = getContext();  
  27.           
  28.         //刪除流程實例  
  29.         context.getGraphSession().deleteProcessInstance(processInstanceId);  
  30.     }  
  31.   
  32.     public void delWorkflow(int workflowId) {  
  33.           
  34.         //在OA中刪除流程的定義  
  35.         Workflow workflow = (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);  
  36.         getHibernateTemplate().delete(workflow);  
  37.           
  38.         //在JBPM中刪除流程定義  
  39.         //JBPM對流程定義按版本進行管理,所以在同一個時刻,可能存在同一個流程定義的多個不同的版本  
  40.         //如果需要對其刪除,則應該刪除所有的版本  
  41.           
  42.         //查找對應流程定義的所有版本  
  43.         List defs = getContext().getGraphSession().findAllProcessDefinitionVersions(workflow.getName());  
  44.         for (Iterator iter = defs.iterator(); iter.hasNext();) {  
  45.             ProcessDefinition def = (ProcessDefinition) iter.next();  
  46.             getContext().getGraphSession().deleteProcessDefinition(def);  
  47.         }  
  48.     }  
  49.   
  50.     public void deployProcessDefinition(byte[] processDefinition,  
  51.             byte[] processImage) {  
  52.           
  53.         //通過byte[]創建ProcessDefinition對象  
  54.         ProcessDefinition def =   
  55.             ProcessDefinition.parseXmlInputStream(  
  56.                     new ByteArrayInputStream(processDefinition));   
  57.           
  58.         //將流程定義文件部署到JBPM  
  59.         getContext().deployProcessDefinition(def);  
  60.           
  61.         //首先查找一下Workflow對象是否已經存在  
  62.         Workflow workflow = (Workflow)getSession()  
  63.                 .createQuery("select w from Workflow w where w.name = ? ")  
  64.                 .setParameter(0, def.getName())  
  65.                 .uniqueResult();  
  66.           
  67.         //如果流程尚未存在,則創建  
  68.         if(workflow == null){  
  69.             workflow = new Workflow();  
  70.             workflow.setName(def.getName());  
  71.             workflow.setProcessDefinition(processDefinition);  
  72.             workflow.setProcessImage(processImage);  
  73.             getHibernateTemplate().save(workflow);  
  74.             return;  
  75.         }  
  76.           
  77.         //如果流程已經存在,則更新  
  78.         workflow.setName(def.getName());  
  79.         workflow.setProcessDefinition(processDefinition);  
  80.         workflow.setProcessImage(processImage);  
  81.         getHibernateTemplate().update(workflow);  
  82.     }  
  83.   
  84.     public Workflow findWorkflow(int workflowId) {  
  85.         return (Workflow)getHibernateTemplate().load(Workflow.class, workflowId);  
  86.     }  
  87.   
  88.     public String flowToNextStep(String username, long processInstanceId,  
  89.             String transitionName) {  
  90.           
  91.         JbpmContext context = getContext();  
  92.         String status = null;  
  93.           
  94.         ProcessInstance instance = context.getProcessInstance(processInstanceId);  
  95.           
  96.         //當前節點  
  97.         String currentNodeName = instance.getRootToken().getNode().getName();  
  98.           
  99.         //起始節點  
  100.         String startNodeName = instance.getProcessDefinition().getStartState().getName();  
  101.   
  102.         //如果是在起始節點,因爲起始節點不會跟任何人相關聯(即不會將任務分配給任何人)  
  103.         if(currentNodeName.equals(startNodeName)){  
  104.             //需要使用流程實例的signal()方法來觸發流程向下一步流動!  
  105.             instance.getRootToken().signal(transitionName);  
  106.         }else{  
  107.           
  108.             //首先找出用戶的當前任務  
  109.             List tasks = context.getTaskMgmtSession().findTaskInstances(username);  
  110.             for (Iterator iter = tasks.iterator(); iter.hasNext();) {  
  111.                 TaskInstance taskInstance = (TaskInstance) iter.next();  
  112.                 if(taskInstance.getProcessInstance().getId() == processInstanceId){  
  113.                       
  114.                     //這就是當前文檔對應的任務,需要結束這個任務,從而觸發流程向下一步驟移動!  
  115.                     taskInstance.end(transitionName);  
  116.                     break;  
  117.                 }  
  118.             }  
  119.         }  
  120.           
  121.         //將公文當前所處節點作爲狀態信息返回  
  122.         status = instance.getRootToken().getNode().getName();  
  123.           
  124.         //判斷當前的狀態是否已經結束!  
  125.         if(instance.hasEnded()){  
  126.             status = Document.STATUS_END;  
  127.         }  
  128.           
  129.         return status;  
  130.     }  
  131.   
  132.     public List searchAllWorkflows() {  
  133.         return getHibernateTemplate().find("from Workflow");  
  134.     }  
  135.   
  136.       
  137.     public List searchApprovingDocuments(String username) {  
  138.           
  139.         JbpmContext context = getContext();  
  140.           
  141.         List docIds = new ArrayList();  
  142.           
  143.         //首先獲得流轉到用戶的任務列表  
  144.         List tasks = context.getTaskMgmtSession().findTaskInstances(username);  
  145.         for (Iterator iter = tasks.iterator(); iter.hasNext();) {  
  146.             TaskInstance taskInstance = (TaskInstance) iter.next();  
  147.               
  148.             //任務實例是否正在等待審批,如果不是,則忽略(即不應該被列到待審批列表中!)  
  149.             if(!taskInstance.isSignalling()){  
  150.                 continue;  
  151.             }  
  152.               
  153.             //根據其對應的流程實例,獲得公文標識  
  154.             Integer docId = (Integer)taskInstance.getProcessInstance().getContextInstance().getVariable("document");  
  155.             docIds.add(docId);  
  156.         }  
  157.           
  158.         return docIds;  
  159.     }  
  160.   
  161.     //下一步都有哪些流向?  
  162.     public List searchNextTransitions(String username,long processInstanceId) {  
  163.           
  164.         JbpmContext context = getContext();  
  165.           
  166.         List transitions = new ArrayList();  
  167.           
  168.         //根據流程實例標識查找流程實例  
  169.         ProcessInstance instance = context.getProcessInstance(processInstanceId);  
  170.           
  171. //      //根據流程實例,獲得當前的節點,從而得到在當前節點下有哪些流向  
  172. //      List nextSteps = instance.getRootToken().getNode().getLeavingTransitions();  
  173.   
  174.           
  175.         //當前節點  
  176.         String currentNodeName = instance.getRootToken().getNode().getName();  
  177.           
  178.         //起始節點  
  179.         String startNodeName = instance.getProcessDefinition().getStartState().getName();  
  180.   
  181.         Collection nextSteps = null;  
  182.         //如果是在起始節點,因爲起始節點不會跟任何人相關聯(即不會將任務分配給任何人)  
  183.         if(currentNodeName.equals(startNodeName)){  
  184.             //需要使用流程實例的signal()方法來觸發流程向下一步流動!  
  185.             nextSteps = instance.getRootToken().getAvailableTransitions();  
  186.         }else{  
  187.           
  188.             //首先找出用戶的當前任務  
  189.             List tasks = context.getTaskMgmtSession().findTaskInstances(username);  
  190.             for (Iterator iter = tasks.iterator(); iter.hasNext();) {  
  191.                 TaskInstance taskInstance = (TaskInstance) iter.next();  
  192.                 if(taskInstance.getProcessInstance().getId() == processInstanceId){  
  193.                       
  194.                     nextSteps = taskInstance.getAvailableTransitions();  
  195.                     break;  
  196.                 }  
  197.             }  
  198.         }  
  199.           
  200.         for (Iterator iter = nextSteps.iterator(); iter.hasNext();) {  
  201.             Transition transition = (Transition) iter.next();  
  202.             transitions.add(transition.getName());  
  203.         }  
  204.           
  205.         return transitions;  
  206.     }  
  207.       
  208.     /** 
  209.      * 獲取JbpmContext對象,需要將JbpmContext的session設置爲當前的session對象 
  210.      * @return 
  211.      */  
  212.     private JbpmContext getContext(){  
  213.         JbpmContext context = jbpmConfiguration.createJbpmContext();  
  214.         context.setSession(getSession());  
  215.         return context;  
  216.     }  
  217.   
  218.     public void setJbpmConfiguration(JbpmConfiguration jbpmConfiguration) {  
  219.         this.jbpmConfiguration = jbpmConfiguration;  
  220.     }  
  221.   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章