53. } 54. /**
55. * 填写提交申请单 56. * @param money 57. */
58. protected void submitApplication(int money){ 59. System.out.println(\ation()==\
60. TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next() ;
61. System.out.println(\
62. ContextInstance ci = ti.getContextInstance(); 63. ci.setVariable(\64. ti.end(); 65. } 66. /**
67. * 部门经理审批 68. * @param pass 69. */
70. @SuppressWarnings(\
71. protected void approveByManager(boolean pass){ 72. System.out.println(\ager()==\
73. Iterator
74. for( ;it.hasNext(); ){
75. TaskInstance ti = it.next();
76. if(ti.getActorId().equals(\77. List
78. for(Transition t : transitions){
79. System.out.println(\Name());
80. }
81. assertEquals(\));
82. if(pass){
83. ti.end(\部门经理审批通过\84. }else{
85. ti.end(\部门经理驳回\86. }
87. return; 88. }
89. } 90. } 91. 92. /**
93. * 总经理审批 94. * @param pass 95. */
96. @SuppressWarnings(\
97. protected void approveByPresident(boolean pass){
98. System.out.println(\President()==\99.
100. Iterator
102. for( ;it.hasNext(); ){ 103.
104. TaskInstance ti = it.next(); 105.
106. if(ti.getActorId().equals(\
107. List
108. for(Transition t : transitions){ 109. System.out.println(\\
110. }
111. assertEquals(\());
112. if(pass){
113. ti.end(\总经理审批通过\114. }else{
115. ti.end(\总经理驳回\116. }
117. return; 118. } 119. } 120. } 121. /**
122. * 打印任务记录 123. */
124. @SuppressWarnings(\
125. protected void checkTasks(){
126. System.out.println(\sks()==\
127. Collection
128. System.out.println(\
129. for(TaskInstance ti : coll){
130. System.out.println(\
131. System.out.println(\\
132. System.out.println(\oString() +\133. }
134. System.out.println(\135. }
该案例是在没有数据库支持的情况下,对报销流程进行运行测试,测试逻辑如下:
1. 加载流程定义 Java代码
1. ProcessDefinition.parseXmlResource(\.xml\代码说明:
在没有数据库存储的情况下,流程定义通过ProcessDefinition类直接从processdefinition.xml文件中解析加载。
2. 实例化流程对象 Java代码
1. //生成实例
2. pi = pdf.createProcessInstance();
3. assertNotNull(\4. //设置流程发起人
5. pi.getContextInstance().createVariable(\6. //触发流程转向 7. pi.signal();
代码说明:
在获得流程定义的实例后,可以用它生成流程实例,使用如下的语句: pi = pdf.createProcessInstance();
流程实例拥有自己的ContextInstance环境变量对象。它实际上是一个HashMap,以key-value方式记录了流程的上下文变量值,代码中的
pi.getContextInstance().createVariable(\就是向环境变量中添加一个key为initiator的对象。
每个流程实例都拥有自己Token令牌对象,主流程有自己的RootToken,子流程也拥有自己的子Token。父流程的Token和子流程的Token相互关联,形成Token树。
Token对象表示流程运行的当前位置(运行到哪个节点了)。通过对Token对象的signal()方法调用,可以使流程向下运行。代码中的pi.signal();实际上是间接调用了pi.getRootToken().signal();它使得新建的流程继续向下个节点(即借款申请单填写)进发。
3. 员工发起借款申请 Java代码
1. /**
2. * 填写提交申请单 3. * @param money 4. */
5. protected void submitApplication(int money){
6. System.out.println(\cation()==\7.
8. TaskInstance ti = (TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()
9. System.out.println(\10. ContextInstance ci = ti.getContextInstance(); 11. ci.setVariable(\12. ti.end();
代码说明:
在借款流程发起后,流程进入了申请单填写阶段。这个阶段是个人工的任务,需要用户的介入。因此,对于要借款的用户而言,首先是获取填写申请单的任务实例:
TaskInstance ti =
(TaskInstance)pi.getTaskMgmtInstance().getTaskInstances().iterator() .next()
在这个测试类中,由于没有数据库。对流程实例的引用是依靠了类的全局标量pi。这里通过pi获取全部的任务列表。实际上有且仅有一个任务,就是我们刚刚发起的申请单填写任务。
接下来,我们获取流程的上下文变量,将申请借款的数额记录在上下文变量中ContextInstance ci = ti.getContextInstance(); ci.setVariable(\
最后,我们要结束当前任务,告诉流程继续下行,调用ti.end();这个方法的
本质依然是调用了token.signal(),它选择了一个默认的transition进行转向。这里要说明的是signal方法有多态的实现signal(Transition transition),是可以指定具体转向参数的。
4. 部门领导审批申请 Java代码
1. /**
2. * 部门经理审批 3. * @param pass 4. */
5. @SuppressWarnings(\
6. protected void approveByManager(boolean pass){ 7. System.out.println(\ager()==\
8. Iterator
9. for( ;it.hasNext(); ){
10. TaskInstance ti = it.next();
11. if(ti.getActorId().equals(\12. List
13. for(Transition t : transitions){
14. System.out.println(\Name());
15. }
16. assertEquals(\));
17. if(pass){
18. ti.end(\部门经理审批通过\19. }else{
20. ti.end(\部门经理驳回\21. }
22. return; 23. } 24. } 25.}
代码说明:
这里,流程进入了部门经理审批阶段。由于没有数据库支持,我们只能采取遍历任务列表,并比对委派者ID的方式来确定委派给部门经理的任务实例。(在后面的基于数据库的标准案例中,我们会看到如果根据用户的ID来获取分配给指定用户的任务)
ti.getActorId().equals(\比对任务的委派人。