`
上杉t
  • 浏览: 32311 次
文章分类
社区版块
存档分类
最新评论

有关动态创建两节点之间转向的测试

阅读更多

       又有客户提出自由流需求,真晕,自由流不就等于没流程吗?还是劝他定个流程吧,上系统了不就是规范公司的流程吗?呵呵

       虽然客户赞同我们的说法,不过私下来还是讨论尝试了对自由流的控制.最早的一个想法是建立几个孤立的没有联系的节点.让客户选择下一步要去的节点,(相当于选择转向).程序根据选择,创建这个节点上的任务.客户操作完任务,程序在负责关上这个任务.

        这样是可以达到效果的.不过就是太不 'jbpm' 了.因为把流程的流转环境被去掉了.所以又想了个'jbpm'点的方法.要想从一个节点到另一个节点.必然要有'转向'连接两个节点.自由流不能在流程没跑起来前知道每个节点的下 一步到哪.只能在运行过程中知道,那我们就当知道的时候在创建两个节点间的转向呗.看看下面的测试代码

 

package org.jbpm.tutorial.action;

import junit.framework.TestCase;

import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.def.Transition;
import org.jbpm.graph.exe.ProcessInstance;

public class FreeProcessTest extends TestCase {
      public void testTransitionAction() {
        ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(
          "<process-definition>" +
          "  <start-state>" +
          "    <transition to='a' />" +
          "  </start-state>" +
          "  <state name='a'>" +
          "  </state>" +
          "  <state name='b'>" +
          "    <transition to='c'/>" +
          "  </state>" +
          "  <state name='c'>" +
          "  </state>" +
          "  <end-state name='end' />" +
          "</process-definition>"
        );
        
        // 创建流程实例
        ProcessInstance processInstance = 
          new ProcessInstance(processDefinition);
               
        // 流转一步到节点a
        processInstance.signal();
        assertSame(processDefinition.getNode("a"), 
                processInstance.getRootToken().getNode());
        
        //假定客户要从a到c,动态创建a到c的转向
        Transition leavingTransition=new Transition("a to c");//构建一个a到c的转向
	//指定该转向的目的节点是c
        leavingTransition.setTo(processInstance.getProcessDefinition().getNode("c"));
	//为当前节点添加这个转向.
        processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
	//调用这个转向流转流程
        processInstance.signal("a to c");
	//删除这个临时创建的转向
        processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);
        
        //测试是否到达c节点了
        assertSame(processDefinition.getNode("c"), 
                processInstance.getRootToken().getNode());
        
//      假定客户要从c到b,动态创建c到b的转向
        leavingTransition=new Transition("c to b");
        leavingTransition.setTo(processInstance.getProcessDefinition().getNode("b"));
        processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
        processInstance.signal("c to b");
        processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);
        
        assertSame(processDefinition.getNode("b"), 
                processInstance.getRootToken().getNode());
        
//      假定客户要从b到c,不用动态创建,已经定义了
        processInstance.signal();
        assertSame(processDefinition.getNode("c"), 
                processInstance.getRootToken().getNode());
        
//      假定客户要从c到end,动态创建c到end的转向
        leavingTransition=new Transition("c to end");
        leavingTransition.setTo(processInstance.getProcessDefinition().getNode("end"));
        processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);
        processInstance.signal("c to end");
        processInstance.getRootToken().getNode().removeLeavingTransition(leavingTransition);

        assertSame(processDefinition.getNode("end"), 
                   processInstance.getRootToken().getNode());
        
       
      }

}

测试通过!这个够'jbpm'了吧.
 

 

分享到:
评论
4 楼 zhang1210 2011-07-04  
为什么我运行的时候 processInstance.getRootToken().getNode().addLeavingTransition(leavingTransition);  

老报错:
null index column for collection: org.jbpm.graph.def.Node.leavingTransitions
很着急,求解!!!
3 楼 hanyou 2009-07-01  
做一个自己指向自己的节点就行了
2 楼 Snow_Young 2008-11-06  
哈哈,自由流,挺有意思~这是谁想出来的?
1 楼 wqwqvic 2008-07-28  

相关推荐

Global site tag (gtag.js) - Google Analytics