/
MyProcess.java
160 lines (142 loc) · 8.97 KB
/
MyProcess.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
package com.snail.exam;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.lang3.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyProcess {
private static final Logger log = LoggerFactory.getLogger(MyProcess.class);
public static void main(String[] args) {
try {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// ----- 4.3.1. Deploying the process
log.info("--- #1. Deploying the process");
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.createDeployment()
.addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml")
.deploy();
log.info("Number of process definitions {}", repositoryService.createProcessDefinitionQuery().count());
for (ProcessDefinition p : repositoryService.createProcessDefinitionQuery().list()) {
log.info("PROCESS DEF [id={},name={},key={}]", p.getId(), p.getName(), p.getKey());
}
// ----- 4.3.2. Starting a process instance
log.info("--- #2. Starting a process instance");
// VacationRequest.bpmn20.xml L3-10
// --------------------------------------------------------------------------
// <process id="vacationRequest" name="Vacation request" isExecutable="true">
// ^^^^^^^^^^^^^^^
// <startEvent id="request" activiti:initiator="employeeName">
// ^^^^^^^*1 ^^^^^^^^^^^^ $employeeName = the user name
// <extensionElements>
// <activiti:formProperty id="numberOfDays" name="Number of days" type="long" required="true">
// ^^^^^^^^^^^^ ^^^^
// </activiti:formProperty>
// <activiti:formProperty id="startDate" name="First day of holiday (dd-MM-yyy)" type="date"
// ^^^^^^^^^ ^^^^
// datePattern="dd-MM-yyyy hh:mm" required="true"></activiti:formProperty>
// <activiti:formProperty id="vacationMotivation" name="Motivation" type="string">
// ^^^^^^^^^^^^^^^^^^ ^^^^^^
// </activiti:formProperty>
// </extensionElements>
// </startEvent>
// <activiti:formProperty>
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("employeeName", "Kermit");
variables.put("numberOfDays", new Integer(4));
variables.put("startDate", DateUtils.parseDate("1999-12-31", "yyyy-MM-dd"));
variables.put("vacationMotivation", "I'm really tired!");
// the process to run
// id : <process id="vacationRequest">
// arguments : <activiti:formProperty>
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables);
log.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count());
for (ProcessInstance p : runtimeService.createProcessInstanceQuery().list()) {
log.info("PROCESS INSTANCE [id={},pid={},pname={},pkey={}]"
, p.getId()
, p.getProcessDefinitionId()
, p.getProcessDefinitionName()
, p.getProcessDefinitionKey());
}
// ----- 4.3.3. Completing tasks (Reject Request)
// VacationRequest.bpmn20.xml L11-21
// --------------------------------------------------------------------------
// <sequenceFlow id="flow1" sourceRef="request" targetRef="handleRequest"></sequenceFlow>
// ^^^^^^^*1 ^^^^^^^^^^^^^*2
// <userTask id="handleRequest" name="Handle vacation request" activiti:candidateGroups="management">
// ^^^^^^^^^^^^^*2 ^^^^^^^^^^
// <documentation>${employeeName} would like to take ${numberOfDays} day(s) of vacation
// (Motivation: ${vacationMotivation}).</documentation>
// <extensionElements>
// <activiti:formProperty id="vacationApproved" name="Do you approve this vacation" type="enum"
// ^^^^^^^^^^^^^^^^
// required="true">
// <activiti:value id="true" name="Approve"></activiti:value>
// <activiti:value id="false" name="Reject"></activiti:value>
// </activiti:formProperty>
// <activiti:formProperty id="managerMotivation" name="Motivation" type="string"></activiti:formProperty>
// ^^^^^^^^^^^^^^^^^
// </extensionElements>
// </userTask>
log.info("--- #3. Completing tasks (Reject Request)");
// Fetch all tasks for the management group
TaskService taskService = processEngine.getTaskService();
List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("management").list();
for (Task task : tasks) {
if (task.getProcessDefinitionId().startsWith("vacationRequest")){
if (task.getTaskDefinitionKey().equals("handleRequest")) {
// Description is <documentation>.
log.info("TASK REJECT REQ [{}]", task.getDescription());
// Do task (reject application)
Map<String, Object> taskVariables = new HashMap<String, Object>();
taskVariables.put("vacationApproved", "false");
taskVariables.put("managerMotivation", "We have a tight deadline!");
taskService.complete(task.getId(), taskVariables);
}
}
}
// ----- 4.3.3. Completing tasks (Adjust rejected request)
// VacationRequest.bpmn20.xml L22-23
// --------------------------------------------------------------------------
// <sequenceFlow id="flow2" sourceRef="handleRequest" targetRef="requestApprovedDecision"></sequenceFlow>
// ^^^^^^^^^^^^^*2 ^^^^^^^^^^^^^^^^^^^^^^^*3
// <exclusiveGateway id="requestApprovedDecision" name="Request approved?"></exclusiveGateway>
// ^^^^^^^^^^^^^^^^^^^^^^^*3
//
// VacationRequest.bpmn20.xml L30-35
// --------------------------------------------------------------------------
// <sequenceFlow id="flow5" name="denied" sourceRef="requestApprovedDecision" targetRef="adjustVacationRequestTask">
// ^^^^^^^^^^^^^^^^^^^^^^^*3 ^^^^^^^^^^^^^^^^^^^^^^^^^*4
// <conditionExpression xsi:type="tFormalExpression"><![CDATA[${vacationApproved == 'false'}]]>
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// </conditionExpression>
// </sequenceFlow>
// <userTask id="adjustVacationRequestTask" name="Adjust vacation request" activiti:assignee="${employeeName}">
// ^^^^^^^^^^^^^^^^^^^^^^^^^*4
// <documentation>Your manager has disapproved your vacation request for ${numberOfDays} days.
// Reason: ${managerMotivation}</documentation>
log.info("--- #4. Completing tasks (Adjust rejected request)");
taskService = processEngine.getTaskService();
tasks = taskService.createTaskQuery().active().list();
for (Task task : tasks) {
if (task.getProcessDefinitionId().startsWith("vacationRequest")){
if (task.getTaskDefinitionKey().equals("adjustVacationRequestTask")) {
// Description is <documentation>.
log.info("ADJUST REJECT REQ [{}]", task.getDescription());
}
}
}
} catch (Throwable th) {
log.error("ERROR", th);
}
}
}