/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.test.bpmn.subprocess;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.ActivitiException;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricActivityInstanceQuery;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.history.HistoricVariableInstanceQuery;
import org.activiti.engine.impl.test.ResourceActivitiTestCase;
import org.activiti.engine.impl.util.io.InputStreamSource;
import org.activiti.engine.impl.util.io.StreamSource;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
public class CallActivityTest extends ResourceActivitiTestCase {
private static String MAIN_PROCESS_RESOURCE = "org/activiti/engine/test/bpmn/subprocess/SubProcessTest.testSuspendedProcessCallActivity_mainProcess.bpmn.xml";
private static String CHILD_PROCESS_RESOURCE = "org/activiti/engine/test/bpmn/subprocess/SubProcessTest.testSuspendedProcessCallActivity_childProcess.bpmn.xml";
private static String MESSAGE_TRIGGERED_PROCESS_RESOURCE = "org/activiti/engine/test/bpmn/subprocess/SubProcessTest.testSuspendedProcessCallActivity_messageTriggeredProcess.bpmn.xml";
private static String INHERIT_VARIABLES_MAIN_PROCESS_RESOURCE = "org/activiti/engine/test/bpmn/subprocess/SubProcessTest.testInheritVariablesCallActivity_mainProcess.bpmn20.xml";
private static String INHERIT_VARIABLES_CHILD_PROCESS_RESOURCE = "org/activiti/engine/test/bpmn/subprocess/SubProcessTest.testInheritVariablesCallActivity_childProcess.bpmn20.xml";
private static String NOT_INHERIT_VARIABLES_MAIN_PROCESS_RESOURCE = "org/activiti/engine/test/bpmn/subprocess/SubProcessTest.testNotInheritVariablesCallActivity_mainProcess.bpmn20.xml";
public CallActivityTest() {
super("org/activiti/standalone/parsing/encoding.activiti.cfg.xml");
}
public void testInstantiateProcessByMessage() throws Exception {
BpmnModel messageTriggeredBpmnModel = loadBPMNModel(MESSAGE_TRIGGERED_PROCESS_RESOURCE);
Deployment messageTriggeredBpmnDeployment = processEngine.getRepositoryService()
.createDeployment()
.name("messageTriggeredProcessDeployment")
.addBpmnModel("messageTriggered.bpmn20.xml", messageTriggeredBpmnModel).deploy();
ProcessInstance childProcessInstance = runtimeService.startProcessInstanceByMessage("TRIGGER_PROCESS_MESSAGE");
assertNotNull(childProcessInstance);
}
public void testInstantiateSuspendedProcessByMessage() throws Exception {
BpmnModel messageTriggeredBpmnModel = loadBPMNModel(MESSAGE_TRIGGERED_PROCESS_RESOURCE);
Deployment messageTriggeredBpmnDeployment = processEngine.getRepositoryService()
.createDeployment()
.name("messageTriggeredProcessDeployment")
.addBpmnModel("messageTriggered.bpmn20.xml", messageTriggeredBpmnModel).deploy();
suspendProcessDefinitions(messageTriggeredBpmnDeployment);
try {
ProcessInstance childProcessInstance = runtimeService.startProcessInstanceByMessage("TRIGGER_PROCESS_MESSAGE");
fail("Exception expected");
} catch (ActivitiException ae) {
assertTextPresent("Cannot start process instance. Process definition Message Triggered Process", ae.getMessage());
}
}
public void testInstantiateChildProcess() throws Exception {
BpmnModel childBpmnModel = loadBPMNModel(CHILD_PROCESS_RESOURCE);
Deployment childDeployment = processEngine.getRepositoryService()
.createDeployment()
.name("childProcessDeployment")
.addBpmnModel("childProcess.bpmn20.xml", childBpmnModel).deploy();
ProcessInstance childProcessInstance = runtimeService.startProcessInstanceByKey("childProcess");
assertNotNull(childProcessInstance);
}
public void testInstantiateSuspendedChildProcess() throws Exception {
BpmnModel childBpmnModel = loadBPMNModel(CHILD_PROCESS_RESOURCE);
Deployment childDeployment = processEngine.getRepositoryService()
.createDeployment()
.name("childProcessDeployment")
.addBpmnModel("childProcess.bpmn20.xml", childBpmnModel).deploy();
suspendProcessDefinitions(childDeployment);
try {
ProcessInstance childProcessInstance = runtimeService.startProcessInstanceByKey("childProcess");
fail("Exception expected");
} catch (ActivitiException ae) {
assertTextPresent("Cannot start process instance. Process definition Child Process", ae.getMessage());
}
}
public void testInstantiateSubprocess() throws Exception {
BpmnModel mainBpmnModel = loadBPMNModel(MAIN_PROCESS_RESOURCE);
BpmnModel childBpmnModel = loadBPMNModel(CHILD_PROCESS_RESOURCE);
Deployment childDeployment = processEngine.getRepositoryService()
.createDeployment()
.name("childProcessDeployment")
.addBpmnModel("childProcess.bpmn20.xml", childBpmnModel).deploy();
Deployment masterDeployment = processEngine.getRepositoryService()
.createDeployment()
.name("masterProcessDeployment")
.addBpmnModel("masterProcess.bpmn20.xml", mainBpmnModel).deploy();
suspendProcessDefinitions(childDeployment);
try {
ProcessInstance masterProcessInstance = runtimeService.startProcessInstanceByKey("masterProcess");
fail("Exception expected");
} catch (ActivitiException ae) {
assertTextPresent("Cannot start process instance. Process definition Child Process", ae.getMessage());
}
}
public void testInheritVariablesSubprocess() throws Exception {
BpmnModel mainBpmnModel = loadBPMNModel(INHERIT_VARIABLES_MAIN_PROCESS_RESOURCE);
BpmnModel childBpmnModel = loadBPMNModel(INHERIT_VARIABLES_CHILD_PROCESS_RESOURCE);
processEngine.getRepositoryService()
.createDeployment()
.name("mainProcessDeployment")
.addBpmnModel("mainProcess.bpmn20.xml", mainBpmnModel).deploy();
processEngine.getRepositoryService()
.createDeployment()
.name("childProcessDeployment")
.addBpmnModel("childProcess.bpmn20.xml", childBpmnModel).deploy();
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("var1", "String test value");
variables.put("var2", true);
variables.put("var3", 12345);
variables.put("var4", 67890);
ProcessInstance mainProcessInstance = runtimeService.startProcessInstanceByKey("mainProcess", variables);
HistoricActivityInstanceQuery activityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
activityInstanceQuery.processInstanceId(mainProcessInstance.getId());
activityInstanceQuery.activityId("childProcessCall");
HistoricActivityInstance activityInstance = activityInstanceQuery.singleResult();
String calledInstanceId = activityInstance.getCalledProcessInstanceId();
HistoricVariableInstanceQuery variableInstanceQuery = historyService.createHistoricVariableInstanceQuery();
List<HistoricVariableInstance> variableInstances = variableInstanceQuery.processInstanceId(calledInstanceId).list();
assertEquals(4, variableInstances.size());
for (HistoricVariableInstance variable : variableInstances) {
assertEquals(variables.get(variable.getVariableName()), variable.getValue());
}
}
public void testNotInheritVariablesSubprocess() throws Exception {
BpmnModel mainBpmnModel = loadBPMNModel(NOT_INHERIT_VARIABLES_MAIN_PROCESS_RESOURCE);
BpmnModel childBpmnModel = loadBPMNModel(INHERIT_VARIABLES_CHILD_PROCESS_RESOURCE);
processEngine.getRepositoryService()
.createDeployment()
.name("childProcessDeployment")
.addBpmnModel("childProcess.bpmn20.xml", childBpmnModel).deploy();
processEngine.getRepositoryService()
.createDeployment()
.name("mainProcessDeployment")
.addBpmnModel("mainProcess.bpmn20.xml", mainBpmnModel).deploy();
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("var1", "String test value");
variables.put("var2", true);
variables.put("var3", 12345);
variables.put("var4", 67890);
ProcessInstance mainProcessInstance = runtimeService.startProcessInstanceByKey("mainProcess", variables);
HistoricActivityInstanceQuery activityInstanceQuery = historyService.createHistoricActivityInstanceQuery();
activityInstanceQuery.processInstanceId(mainProcessInstance.getId());
activityInstanceQuery.activityId("childProcessCall");
HistoricActivityInstance activityInstance = activityInstanceQuery.singleResult();
String calledInstanceId = activityInstance.getCalledProcessInstanceId();
HistoricVariableInstanceQuery variableInstanceQuery = historyService.createHistoricVariableInstanceQuery();
variableInstanceQuery.processInstanceId(calledInstanceId);
List<HistoricVariableInstance> variableInstances = variableInstanceQuery.list();
assertEquals(0, variableInstances.size());
}
private void suspendProcessDefinitions(Deployment childDeployment) {
List<ProcessDefinition> childProcessDefinitionList = repositoryService.createProcessDefinitionQuery().deploymentId(childDeployment.getId()).list();
for (ProcessDefinition processDefinition : childProcessDefinitionList) {
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
}
}
protected void tearDown() throws Exception {
for (Deployment deployment : repositoryService.createDeploymentQuery().list()) {
repositoryService.deleteDeployment(deployment.getId(), true);
}
super.tearDown();
}
protected BpmnModel loadBPMNModel(String bpmnModelFilePath) throws Exception {
InputStream xmlStream = this.getClass().getClassLoader().getResourceAsStream(bpmnModelFilePath);
StreamSource xmlSource = new InputStreamSource(xmlStream);
BpmnModel bpmnModel = new BpmnXMLConverter().convertToBpmnModel(xmlSource, false, false, processEngineConfiguration.getXmlEncoding());
return bpmnModel;
}
}