/* 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.api.runtime;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.activiti.engine.impl.persistence.entity.VariableInstance;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
/**
* @author Daisuke Yoshimoto
*/
public class RuntimeVariablesTest extends PluggableActivitiTestCase {
@Deployment
public void testGetVariablesByExecutionIds(){
ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("oneTaskProcess");
ProcessInstance processInstance2 = runtimeService.startProcessInstanceByKey("oneTaskProcess");
Task task1 = taskService.createTaskQuery().processInstanceId(processInstance1.getId()).singleResult();
Task task2 = taskService.createTaskQuery().processInstanceId(processInstance2.getId()).singleResult();
// Task local variables
taskService.setVariableLocal(task1.getId(), "taskVar1", "sayHello1");
// Execution variables
taskService.setVariable(task1.getId(), "executionVar1", "helloWorld1");
// Task local variables
taskService.setVariableLocal(task2.getId(), "taskVar2", "sayHello2");
// Execution variables
taskService.setVariable(task2.getId(), "executionVar2", "helloWorld2");
// only 1 process
Set<String> executionIds = new HashSet<String>();
executionIds.add(task1.getExecutionId());
List<VariableInstance> variables = runtimeService.getVariableInstancesByExecutionIds(executionIds);
assertEquals(1, variables.size());
checkVariable(task1.getExecutionId(), "executionVar1", "helloWorld1", variables);
// 2 process
executionIds = new HashSet<String>();
executionIds.add(task1.getExecutionId());
executionIds.add(task2.getExecutionId());
variables = runtimeService.getVariableInstancesByExecutionIds(executionIds);
assertEquals(2, variables.size());
checkVariable(task1.getExecutionId(), "executionVar1", "helloWorld1", variables);
checkVariable(task2.getExecutionId(), "executionVar2", "helloWorld2", variables);
}
@Deployment(resources={
"org/activiti/engine/test/api/runtime/RuntimeVariablesTest.testGetVariablesByExecutionIds.bpmn20.xml"
})
public void testGetVariablesByExecutionIdsForSerializableType(){
ProcessInstance processInstance1 = runtimeService.startProcessInstanceByKey("oneTaskProcess");
Task task1 = taskService.createTaskQuery().processInstanceId(processInstance1.getId()).singleResult();
StringBuilder sb = new StringBuilder("a");
for(int i = 0; i < 4001; i++) {
sb.append("a");
}
String serializableTypeVar = sb.toString();
// Execution variables
taskService.setVariable(task1.getId(), "executionVar1", serializableTypeVar);
// only 1 process
Set<String> executionIds = new HashSet<String>();
executionIds.add(task1.getExecutionId());
List<VariableInstance> variables = runtimeService.getVariableInstancesByExecutionIds(executionIds);
assertEquals(serializableTypeVar, variables.get(0).getValue());
}
private void checkVariable(String executionId, String name, String value, List<VariableInstance> variables){
for (VariableInstance variable : variables){
if (executionId.equals(variable.getExecutionId())){
assertEquals(name, variable.getName());
assertEquals(value, variable.getValue());
return;
}
}
fail();
}
@Deployment(resources={
"org/activiti/engine/test/api/runtime/variableScope.bpmn20.xml"
})
public void testGetVariablesByExecutionIdsForScope(){
Map<String, Object> processVars = new HashMap<String, Object>();
processVars.put("processVar", "processVar");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("variableScopeProcess", processVars);
Set<String> executionIds = new HashSet<String>();
List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processInstance.getId()).list();
for (Execution execution : executions){
if (!processInstance.getId().equals(execution.getId())){
executionIds.add(execution.getId());
runtimeService.setVariableLocal(execution.getId(), "executionVar", "executionVar");
}
}
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
Set<String> taskIds = new HashSet<String>();
for (Task task : tasks){
taskService.setVariableLocal(task.getId(), "taskVar", "taskVar");
taskIds.add(task.getId());
}
List<VariableInstance> executionVariableInstances = runtimeService.getVariableInstancesByExecutionIds(executionIds);
assertEquals(executionVariableInstances.size(), 2);
assertEquals(executionVariableInstances.get(0).getName(), "executionVar");
assertEquals(executionVariableInstances.get(0).getValue() , "executionVar");
assertEquals(executionVariableInstances.get(1).getName(), "executionVar");
assertEquals(executionVariableInstances.get(1).getValue() , "executionVar");
executionIds = new HashSet<String>();
executionIds.add(processInstance.getId());
executionVariableInstances = runtimeService.getVariableInstancesByExecutionIds(executionIds);
assertEquals(executionVariableInstances.size(), 1);
assertEquals(executionVariableInstances.get(0).getName(), "processVar");
assertEquals(executionVariableInstances.get(0).getValue() , "processVar");
}
}