package
										
										com.sample;
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												import
										
										junit.framework.TestCase;
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												import
										
										org.jbpm.JbpmConfiguration;
								
						
				
				
						
								
										
												import
										
										org.jbpm.JbpmContext;
								
						
				
				
						
								
										
												import
										
										org.jbpm.context.exe.ContextInstance;
								
						
				
				
						
								
										
												import
										
										org.jbpm.graph.def.ProcessDefinition;
								
						
				
				
						
								
										
												import
										
										org.jbpm.graph.exe.ProcessInstance;
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												public
										
										
												
														class
												SimpleProcessTest extends TestCase {
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												    
												
														private
												JbpmConfiguration config = JbpmConfiguration.getInstance();
								
						
				
				
						
								
										
												    
												
														private
												JbpmContext ctx = config.createJbpmContext();
								
						
				
				
						
								
										
												    
												// helloworld
										
								
								对应于
								
										jbpm_processdefinition
								
								表的
								
										name
								
								字段值,也即
								
										processdefinition.xml
								
								的
								
										name
								
						
				
				
						
								
										
												    
												// 
										
								
								这个值得取比较耗时,实际项目里最好和“数据库的
								
										JDBC
								
								连接”一样,让它共享,不要频繁打开关闭。
						
				
				
						
								
										
												    
												
														private
												ProcessDefinition processDefinition = ctx.getGraphSession().findLatestProcessDefinition("helloworld");
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												    
												
														public
												
												
														void
												testNewRequest() {
								
						
				
				
						
								
										
												        
												
														long
												id = newRequest();
								
						
				
				
						
								
										
												        System.out.println("id=" + id);
								
						
				
				
						
								
										
												        checkNewRequest(id);
								
						
				
				
						
								
										
												        confirmRequest(id);
								
						
				
				
						
								
										
												        checkconfirmRequest(id);
								
						
				
				
						
								
										
												        
												ctx.close();// 
								
								关闭
								
										jbpm
								
								容器
						
				
				
						
								
										
												    }
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												    
												/**
										
								
						
				
				
						
								
										
												    
												 
												*
										
								
								创建一个请假单
						
				
				
						
								
										
												    
												 
												*
										
								
						
				
				
						
								
										
												    
												 
												*
												
														@return
												
										
								
						
				
				
						
								
										
												    
												 
												*/
										
								
						
				
				
						
								
										
												    
												
														private
												
												
														long
												newRequest() {
								
						
				
				
						
								
										
												        
												// 
										
								
								创建一个新流程
						
				
				
						
								
										
												        ProcessInstance pi = processDefinition.createProcessInstance();
								
						
				
				
						
								
										
												        
												// 
										
								
								取得流程的数据环境
						
				
				
						
								
										
												        ContextInstance ci = pi.getContextInstance();
								
						
				
				
						
								
										
												        
												// 
										
								
								创建一张请假单
						
				
				
						
								
										
												        ci.setVariable("name", "
								
								
								
										陈刚
								
								
										www.chengang.com.cn"
										);
								
						
				
				
						
								
										
												        ci.setVariable("day", 2);
								
						
				
				
						
								
										
												        
												assertEquals(null, ci.getVariable("note"));
								
						
				
				
						
								
										
												        
												// 
										
								
								请假申请结束,转到下一个流程结点
						
				
				
						
								
										
												        pi.signal();
								
						
				
				
						
								
										
												        
												
														return
												pi.getId();
								
						
				
				
						
								
										
												    }
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												    
												/**
										
								
						
				
				
						
								
										
												    
												 
												*
										
								
								检查请假单的数据
						
				
				
						
								
										
												    
												 
												*
										
								
						
				
				
						
								
										
												    
												 
												*
												
														@param
												
												id
										
								
						
				
				
						
								
										
												    
												 
												*/
										
								
						
				
				
						
								
										
												    
												
														private
												
												
														void
												checkNewRequest(long id) {
								
						
				
				
						
								
										
												        
												// 
										
								
								从数据库提取原流程
						
				
				
						
								
										
												        ProcessInstance pi = ctx.loadProcessInstance(id);
								
						
				
				
						
								
										
												        
												// 
										
								
								取得流程的数据环境
						
				
				
						
								
										
												        ContextInstance ci = pi.getContextInstance();
								
						
				
				
						
								
										
												        
												// 
										
								
								创建一张请假单
						
				
				
						
								
										
												        
												assertEquals("
								
								
										陈刚
								
								
										www.chengang.com.cn"
										, ci.getVariable("name"));
								
						
				
				
						
								
										
												        
												assertEquals(Integer.valueOf(2), ci.getVariable("day"));
								
						
				
				
						
								
										
												        
												assertEquals("
								
								我要请假
								
										"
										, ci.getVariable("note"));
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												        
												// 
										
								
								当前是结点为
								
										confirm
								
						
				
				
						
								
										
												        
												assertEquals(pi.getRootToken().getNode().getName(), "confirm");
								
						
				
				
						
								
										
												        
												// 
										
								
								流程还没结束
						
				
				
						
								
										
												        
												assertFalse(pi.hasEnded());
								
						
				
				
						
								
										
												    }
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												    
												/**
										
								
						
				
				
						
								
										
												    
												 
												*
										
								
						
						
								审批陈刚的请假申请
						
				
				
						
								
										
												    
												 
												*
										
								
						
				
				
						
								
										
												    
												 
												*
												
														@param
												
												id
										
								
						
				
				
						
								
										
												    
												 
												*/
										
								
						
				
				
						
								
										
												    
												
														private
												
												
														void
												confirmRequest(long id) {
								
						
				
				
						
								
										
												        ProcessInstance pi = ctx.loadProcessInstance(id);
								
						
				
				
						
								
										
												        ContextInstance ci = pi.getContextInstance();
								
						
				
				
						
								
										
												        
												// 
										
								
								不通过
						
				
				
						
								
										
												        ci.setVariable("note", "
								
								不准请假,继续加班
								
										"
										);
								
						
				
				
						
								
										
												        
												// 
										
								
								审批结束,到下一个流程结点
						
				
				
						
								
										
												        pi.signal();
								
						
				
				
						
								
										
												    }
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												    
												
														private
												
												
														void
												checkConfirmRequest(long id) {
								
						
				
				
						
								
										
												        ProcessInstance pi = ctx.loadProcessInstance(id);
								
						
				
				
						
								
										
												        ContextInstance ci = pi.getContextInstance();
								
						
				
				
						
								
										
												        
												// ConfirmAction
										
								
								类在
								
										signal
								
								后执行,所以覆盖了经理的审批意见
						
				
				
						
								
										
												        
												assertEquals("
								
								准假
								
										"
										, ci.getVariable("note"));
								
						
				
				
						
								
										 
								
						
				
				
						
								
										
												        
												// 
										
								
								当前是结点为
								
										end
								
						
				
				
						
								
										
												        
												assertEquals(pi.getRootToken().getNode().getName(), "end");
								
						
				
				
						
								
										
												        
												// 
										
								
								流程结束了
						
				
				
						
								
										
												        
												assertTrue(pi.hasEnded());
								
						
				
				
						
								
										
												    }
								
						
				
				
						
								
										 
								
						
				
				
						
								}