/* 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.examples.variables;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.engine.impl.persistence.entity.VariableInstance;
import org.activiti.engine.impl.test.PluggableActivitiTestCase;
import org.activiti.engine.impl.variable.ValueFields;
import org.activiti.engine.impl.variable.VariableType;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.test.Deployment;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.ObjectUtils;
import com.fasterxml.jackson.databind.node.ObjectNode;
/**
* @author Tom Baeyens
*/
public class VariablesTest extends PluggableActivitiTestCase {
@Deployment
public void testBasicVariableOperations() {
processEngineConfiguration.getVariableTypes().addType(CustomVariableType.instance);
Date now = new Date();
List<String> serializable = new ArrayList<String>();
serializable.add("one");
serializable.add("two");
serializable.add("three");
byte[] bytes1 = "somebytes1".getBytes();
byte[] bytes2 = "somebytes2".getBytes();
// 2000 characters * 2 bytes = 4000 bytes
StringBuilder long2000StringBuilder = new StringBuilder();
for (int i = 0; i < 2000; i++) {
long2000StringBuilder.append("z");
}
// 2001 characters * 2 bytes = 4002 bytes
StringBuilder long2001StringBuilder = new StringBuilder();
for (int i = 0; i < 2000; i++) {
long2001StringBuilder.append("a");
}
long2001StringBuilder.append("a");
// 4002 characters
StringBuilder long4001StringBuilder = new StringBuilder();
for (int i = 0; i < 4000; i++) {
long4001StringBuilder.append("a");
}
long4001StringBuilder.append("a");
// Start process instance with different types of variables
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("longVar", 928374L);
variables.put("shortVar", (short) 123);
variables.put("integerVar", 1234);
variables.put("longString2000chars", long2000StringBuilder.toString());
variables.put("stringVar", "coca-cola");
variables.put("dateVar", now);
variables.put("nullVar", null);
variables.put("serializableVar", serializable);
variables.put("bytesVar", bytes1);
variables.put("customVar1", new CustomType(bytes2));
variables.put("customVar2", null);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeProcess", variables);
variables = runtimeService.getVariables(processInstance.getId());
assertEquals(928374L, variables.get("longVar"));
assertEquals((short) 123, variables.get("shortVar"));
assertEquals(1234, variables.get("integerVar"));
assertEquals("coca-cola", variables.get("stringVar"));
assertEquals(long2000StringBuilder.toString(), variables.get("longString2000chars"));
assertEquals(now, variables.get("dateVar"));
assertEquals(null, variables.get("nullVar"));
assertEquals(serializable, variables.get("serializableVar"));
assertTrue(Arrays.equals(bytes1, (byte[]) variables.get("bytesVar")));
assertEquals(new CustomType(bytes2), variables.get("customVar1"));
assertEquals(null, variables.get("customVar2"));
assertEquals(11, variables.size());
// Set all existing variables values to null
runtimeService.setVariable(processInstance.getId(), "longVar", null);
runtimeService.setVariable(processInstance.getId(), "shortVar", null);
runtimeService.setVariable(processInstance.getId(), "integerVar", null);
runtimeService.setVariable(processInstance.getId(), "stringVar", null);
runtimeService.setVariable(processInstance.getId(), "longString2000chars", null);
runtimeService.setVariable(processInstance.getId(), "longString4000chars", null);
runtimeService.setVariable(processInstance.getId(), "dateVar", null);
runtimeService.setVariable(processInstance.getId(), "nullVar", null);
runtimeService.setVariable(processInstance.getId(), "serializableVar", null);
runtimeService.setVariable(processInstance.getId(), "bytesVar", null);
runtimeService.setVariable(processInstance.getId(), "customVar1", null);
runtimeService.setVariable(processInstance.getId(), "customVar2", null);
variables = runtimeService.getVariables(processInstance.getId());
assertEquals(null, variables.get("longVar"));
assertEquals(null, variables.get("shortVar"));
assertEquals(null, variables.get("integerVar"));
assertEquals(null, variables.get("stringVar"));
assertEquals(null, variables.get("longString2000chars"));
assertEquals(null, variables.get("longString4000chars"));
assertEquals(null, variables.get("dateVar"));
assertEquals(null, variables.get("nullVar"));
assertEquals(null, variables.get("serializableVar"));
assertEquals(null, variables.get("bytesVar"));
assertEquals(null, variables.get("customVar1"));
assertEquals(null, variables.get("customVar2"));
assertEquals(12, variables.size());
// Update existing variable values again, and add a new variable
runtimeService.setVariable(processInstance.getId(), "new var", "hi");
runtimeService.setVariable(processInstance.getId(), "longVar", 9987L);
runtimeService.setVariable(processInstance.getId(), "shortVar", (short) 456);
runtimeService.setVariable(processInstance.getId(), "integerVar", 4567);
runtimeService.setVariable(processInstance.getId(), "stringVar", "colgate");
runtimeService.setVariable(processInstance.getId(), "longString2000chars", long2001StringBuilder.toString());
runtimeService.setVariable(processInstance.getId(), "longString4000chars", long4001StringBuilder.toString());
runtimeService.setVariable(processInstance.getId(), "dateVar", now);
runtimeService.setVariable(processInstance.getId(), "serializableVar", serializable);
runtimeService.setVariable(processInstance.getId(), "bytesVar", bytes1);
runtimeService.setVariable(processInstance.getId(), "customVar1", new CustomType(bytes2));
runtimeService.setVariable(processInstance.getId(), "customVar2", new CustomType(bytes1));
variables = runtimeService.getVariables(processInstance.getId());
assertEquals("hi", variables.get("new var"));
assertEquals(9987L, variables.get("longVar"));
assertEquals((short) 456, variables.get("shortVar"));
assertEquals(4567, variables.get("integerVar"));
assertEquals("colgate", variables.get("stringVar"));
assertEquals(long2001StringBuilder.toString(), variables.get("longString2000chars"));
assertEquals(long4001StringBuilder.toString(), variables.get("longString4000chars"));
assertEquals(now, variables.get("dateVar"));
assertEquals(null, variables.get("nullVar"));
assertEquals(serializable, variables.get("serializableVar"));
assertTrue(Arrays.equals(bytes1, (byte[]) variables.get("bytesVar")));
assertEquals(new CustomType(bytes2), variables.get("customVar1"));
assertEquals(new CustomType(bytes1), variables.get("customVar2"));
assertEquals(13, variables.size());
Collection<String> varFilter = new ArrayList<String>(2);
varFilter.add("stringVar");
varFilter.add("integerVar");
Map<String, Object> filteredVariables = runtimeService.getVariables(processInstance.getId(), varFilter);
assertEquals(2, filteredVariables.size());
assertTrue(filteredVariables.containsKey("stringVar"));
assertTrue(filteredVariables.containsKey("integerVar"));
// Try setting the value of the variable that was initially created with value 'null'
runtimeService.setVariable(processInstance.getId(), "nullVar", "a value");
Object newValue = runtimeService.getVariable(processInstance.getId(), "nullVar");
assertNotNull(newValue);
assertEquals("a value", newValue);
Task task = taskService.createTaskQuery().executionId(processInstance.getId()).singleResult();
taskService.complete(task.getId());
}
@Deployment
public void testLocalizeVariables() {
// Start process instance with different types of variables
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("stringVar", "coca-cola");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("localizeVariables", variables);
ObjectNode infoNode = dynamicBpmnService.getProcessDefinitionInfo(processInstance.getProcessDefinitionId());
dynamicBpmnService.changeLocalizationName("en-US", "stringVar", "stringVar 'en-US' Name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-US", "stringVar", "stringVar 'en-US' Description", infoNode);
dynamicBpmnService.changeLocalizationName("en-AU", "stringVar", "stringVar 'en-AU' Name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en-AU", "stringVar", "stringVar 'en-AU' Description", infoNode);
dynamicBpmnService.changeLocalizationName("en", "stringVar", "stringVar 'en' Name", infoNode);
dynamicBpmnService.changeLocalizationDescription("en", "stringVar", "stringVar 'en' Description", infoNode);
dynamicBpmnService.saveProcessDefinitionInfo(processInstance.getProcessDefinitionId(), infoNode);
Map<String, VariableInstance> variableInstances = runtimeService.getVariableInstances(processInstance.getId(), "es", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'es' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'es' Description", variableInstances.get("stringVar").getLocalizedDescription());
// getVariableInstances
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), "en-US", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-US' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-US' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), "en-AU", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-AU' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-AU' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), "en-GB", true);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), "en-GB", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals(null, variableInstances.get("stringVar").getLocalizedName());
assertEquals(null, variableInstances.get("stringVar").getLocalizedDescription());
List<String> variableNames = new ArrayList<String>();
variableNames.add("stringVar");
// getVariablesInstances via names
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), variableNames, "en-US", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-US' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-US' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), variableNames, "en-AU", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-AU' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-AU' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), variableNames, "en-GB", true);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstances(processInstance.getId(), variableNames, "en-GB", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals(null, variableInstances.get("stringVar").getLocalizedName());
assertEquals(null, variableInstances.get("stringVar").getLocalizedDescription());
// getVariableInstancesLocal
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), "en-US", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-US' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-US' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), "en-AU", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-AU' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-AU' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), "en-GB", true);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), "en-GB", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals(null, variableInstances.get("stringVar").getLocalizedName());
assertEquals(null, variableInstances.get("stringVar").getLocalizedDescription());
// getVariableInstancesLocal via names
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), variableNames, "en-US", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-US' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-US' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), variableNames, "en-AU", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en-AU' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en-AU' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), variableNames, "en-GB", true);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals("stringVar 'en' Name", variableInstances.get("stringVar").getLocalizedName());
assertEquals("stringVar 'en' Description", variableInstances.get("stringVar").getLocalizedDescription());
variableInstances = runtimeService.getVariableInstancesLocal(processInstance.getId(), variableNames, "en-GB", false);
assertEquals(1, variableInstances.size());
assertEquals("stringVar", variableInstances.get("stringVar").getName());
assertEquals("coca-cola", variableInstances.get("stringVar").getValue());
assertEquals(null, variableInstances.get("stringVar").getLocalizedName());
assertEquals(null, variableInstances.get("stringVar").getLocalizedDescription());
// getVariableInstance
VariableInstance variableInstance = runtimeService.getVariableInstance(processInstance.getId(), "stringVar", "en-GB", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals(null, variableInstance.getLocalizedName());
assertEquals(null, variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstance(processInstance.getId(), "stringVar","en-US", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals("stringVar 'en-US' Name", variableInstance.getLocalizedName());
assertEquals("stringVar 'en-US' Description", variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstance(processInstance.getId(), "stringVar", "en-AU", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals("stringVar 'en-AU' Name", variableInstance.getLocalizedName());
assertEquals("stringVar 'en-AU' Description", variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstance(processInstance.getId(), "stringVar", "en-GB", true);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals("stringVar 'en' Name", variableInstance.getLocalizedName());
assertEquals("stringVar 'en' Description", variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstance(processInstance.getId(), "stringVar", "en-GB", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals(null, variableInstance.getLocalizedName());
assertEquals(null, variableInstance.getLocalizedDescription());
// getVariableInstanceLocal
variableInstance = runtimeService.getVariableInstanceLocal(processInstance.getId(), "stringVar", "en-US", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals("stringVar 'en-US' Name", variableInstance.getLocalizedName());
assertEquals("stringVar 'en-US' Description", variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstanceLocal(processInstance.getId(), "stringVar", "en-AU", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals("stringVar 'en-AU' Name", variableInstance.getLocalizedName());
assertEquals("stringVar 'en-AU' Description", variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstanceLocal(processInstance.getId(), "stringVar", "en-GB", true);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals("stringVar 'en' Name", variableInstance.getLocalizedName());
assertEquals("stringVar 'en' Description", variableInstance.getLocalizedDescription());
variableInstance = runtimeService.getVariableInstanceLocal(processInstance.getId(), "stringVar", "en-GB", false);
assertNotNull(variableInstance);
assertEquals("stringVar", variableInstance.getName());
assertEquals("coca-cola", variableInstance.getValue());
assertEquals(null, variableInstance.getLocalizedName());
assertEquals(null, variableInstance.getLocalizedDescription());
}
// Test case for ACT-1839
@Deployment(resources = { "org/activiti/examples/variables/VariablesTest.testChangeTypeSerializable.bpmn20.xml" })
public void testChangeTypeSerializable() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("variable-type-change-test");
assertNotNull(processInstance);
Task task = taskService.createTaskQuery().singleResult();
assertEquals("Activiti is awesome!", task.getName());
SomeSerializable myVar = (SomeSerializable) runtimeService.getVariable(processInstance.getId(), "myVar");
assertEquals("someValue", myVar.getValue());
}
public String getVariableInstanceId(String executionId, String name) {
HistoricVariableInstance variable = historyService.createHistoricVariableInstanceQuery().processInstanceId(executionId).variableName(name).singleResult();
return variable.getId();
}
// test case for ACT-1082
@Deployment(resources = { "org/activiti/examples/variables/VariablesTest.testBasicVariableOperations.bpmn20.xml" })
public void testChangeVariableType() {
Date now = new Date();
List<String> serializable = new ArrayList<String>();
serializable.add("one");
serializable.add("two");
serializable.add("three");
byte[] bytes = "somebytes".getBytes();
// Start process instance with different types of variables
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("longVar", 928374L);
variables.put("shortVar", (short) 123);
variables.put("integerVar", 1234);
variables.put("stringVar", "coca-cola");
variables.put("dateVar", now);
variables.put("nullVar", null);
variables.put("serializableVar", serializable);
variables.put("bytesVar", bytes);
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeProcess", variables);
variables = runtimeService.getVariables(processInstance.getId());
assertEquals(928374L, variables.get("longVar"));
assertEquals((short) 123, variables.get("shortVar"));
assertEquals(1234, variables.get("integerVar"));
assertEquals("coca-cola", variables.get("stringVar"));
assertEquals(now, variables.get("dateVar"));
assertEquals(null, variables.get("nullVar"));
assertEquals(serializable, variables.get("serializableVar"));
assertTrue(Arrays.equals(bytes, (byte[]) variables.get("bytesVar")));
assertEquals(8, variables.size());
// check if the id of the variable is the same or not
if (processEngineConfiguration.getHistoryLevel().isAtLeast(HistoryLevel.AUDIT)) {
String oldSerializableVarId = getVariableInstanceId(processInstance.getId(), "serializableVar");
String oldLongVar = getVariableInstanceId(processInstance.getId(), "longVar");
// Change type of serializableVar from serializable to Short
Map<String, Object> newVariables = new HashMap<String, Object>();
newVariables.put("serializableVar", (short) 222);
runtimeService.setVariables(processInstance.getId(), newVariables);
variables = runtimeService.getVariables(processInstance.getId());
assertEquals((short) 222, variables.get("serializableVar"));
String newSerializableVarId = getVariableInstanceId(processInstance.getId(), "serializableVar");
assertEquals(oldSerializableVarId, newSerializableVarId);
// Change type of a longVar from Long to Short
newVariables = new HashMap<String, Object>();
newVariables.put("longVar", (short) 123);
runtimeService.setVariables(processInstance.getId(), newVariables);
variables = runtimeService.getVariables(processInstance.getId());
assertEquals((short) 123, variables.get("longVar"));
String newLongVar = getVariableInstanceId(processInstance.getId(), "longVar");
assertEquals(oldLongVar, newLongVar);
}
}
// test case for ACT-1428
@Deployment
public void testNullVariable() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeProcess");
Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
Map<String, String> variables = new HashMap<String, String>();
variables.put("testProperty", "434");
formService.submitTaskFormData(task.getId(), variables);
String resultVar = (String) runtimeService.getVariable(processInstance.getId(), "testProperty");
assertEquals("434", resultVar);
task = taskService.createTaskQuery().executionId(processInstance.getId()).singleResult();
taskService.complete(task.getId());
// If no variable is given, no variable should be set and script test should throw exception
processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeProcess");
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
variables = new HashMap<String, String>();
try {
formService.submitTaskFormData(task.getId(), variables);
fail("Should throw exception as testProperty is not defined and used in Script task");
} catch (Exception e) {
runtimeService.deleteProcessInstance(processInstance.getId(), "intentional exception in script task");
assertEquals("class org.activiti.engine.ActivitiException", e.getClass().toString());
}
// No we put null property, This should be put into the variable. We do not expect exceptions
processInstance = runtimeService.startProcessInstanceByKey("taskAssigneeProcess");
task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
variables = new HashMap<String, String>();
variables.put("testProperty", null);
try {
formService.submitTaskFormData(task.getId(), variables);
} catch (Exception e) {
fail("Should not throw exception as the testProperty is defined, although null");
}
resultVar = (String) runtimeService.getVariable(processInstance.getId(), "testProperty");
assertNull(resultVar);
runtimeService.deleteProcessInstance(processInstance.getId(), "intentional exception in script task");
}
/**
* Test added to validate UUID variable type + querying (ACT-1665)
*/
@Deployment
public void testUUIDVariableAndQuery() {
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("oneTaskProcess");
assertNotNull(processInstance);
// Check UUID variable type query on task
Task task = taskService.createTaskQuery().singleResult();
assertNotNull(task);
UUID randomUUID = UUID.randomUUID();
taskService.setVariableLocal(task.getId(), "conversationId", randomUUID);
Task resultingTask = taskService.createTaskQuery().taskVariableValueEquals("conversationId", randomUUID).singleResult();
assertNotNull(resultingTask);
assertEquals(task.getId(), resultingTask.getId());
randomUUID = UUID.randomUUID();
// Check UUID variable type query on process
runtimeService.setVariable(processInstance.getId(), "uuidVar", randomUUID);
ProcessInstance result = runtimeService.createProcessInstanceQuery().variableValueEquals("uuidVar", randomUUID).singleResult();
assertNotNull(result);
assertEquals(processInstance.getId(), result.getId());
}
}
class CustomType {
private byte[] value;
public CustomType(byte[] value) {
if (value == null) {
throw new NullPointerException();
}
this.value = value;
}
public byte[] getValue() {
return value;
}
@Override
public int hashCode() {
return ObjectUtils.hashCode(value);
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CustomType))
return false;
CustomType other = (CustomType) obj;
return ArrayUtils.isEquals(this.value, other.value);
}
}
/**
* A custom variable type for testing byte array value handling.
*
* @author Marcus Klimstra (CGI)
*/
class CustomVariableType implements VariableType {
public static final CustomVariableType instance = new CustomVariableType();
@Override
public String getTypeName() {
return "CustomVariableType";
}
@Override
public boolean isCachable() {
return true;
}
@Override
public boolean isAbleToStore(Object value) {
return value == null || value instanceof CustomType;
}
@Override
public void setValue(Object o, ValueFields valueFields) {
// ensure calling setBytes multiple times no longer causes any problems
valueFields.setBytes(new byte[] { 1, 2, 3 });
valueFields.setBytes(null);
valueFields.setBytes(new byte[] { 4, 5, 6 });
byte[] value = (o == null ? null : ((CustomType) o).getValue());
valueFields.setBytes(value);
}
@Override
public Object getValue(ValueFields valueFields) {
byte[] bytes = valueFields.getBytes();
return bytes == null ? null : new CustomType(bytes);
}
}