package org.jbpm.taskmgmt.exe;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.db.AbstractDbTestCase;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
public class TaskVariableAccessDbTest extends AbstractDbTestCase {
/**
* verifies task local variables.
*/
public void testVarUpdate() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition"
+ " name='panem et circenses'>"
+ " <start-state name='start'>"
+ " <transition to='f' />"
+ " </start-state>"
+ " <fork name='f'>"
+ " <transition name='left' to='panem' />"
+ " <transition name='right' to='circenses' />"
+ " </fork>"
+ " <task-node name='panem'>"
+ " <task name='bake bread'>"
+ " <controller>"
+ " <!-- empty access means this is a task-local variable -->"
+ " <!-- with no counterpart in the process variables -->"
+ " <variable name='hero' access='' />"
+ " </controller>"
+ " </task>"
+ " <transition to='j' />"
+ " </task-node>"
+ " <task-node name='circenses'>"
+ " <task name='play monopoly'>"
+ " <controller>"
+ " <variable name='hero' access='' />"
+ " </controller>"
+ " </task>"
+ " <transition to='j' />"
+ " </task-node>"
+ " <join name='j'>"
+ " <transition to='end' />"
+ " </join>"
+ " <end-state name='end' />"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("panem et circenses");
processInstance.signal();
newTransaction();
TaskInstance breadTaskInstance = findTask("bake bread");
breadTaskInstance.setVariable("hero", "asterix");
jbpmContext.save(breadTaskInstance);
long breadTokenId = breadTaskInstance.getToken().getId();
newTransaction();
Token breadToken = jbpmContext.loadToken(breadTokenId);
ContextInstance contextInstance = breadToken.getProcessInstance().getContextInstance();
assertNull(contextInstance.getVariable("hero", breadToken));
newTransaction();
breadTaskInstance = jbpmContext.loadTaskInstance(breadTaskInstance.getId());
assertEquals("asterix", breadTaskInstance.getVariable("hero"));
newTransaction();
TaskInstance monopolyTaskInstance = findTask("play monopoly");
monopolyTaskInstance.setVariable("hero", "obelix");
jbpmContext.save(monopolyTaskInstance);
long monopolyTokenId = monopolyTaskInstance.getToken().getId();
newTransaction();
monopolyTaskInstance = jbpmContext.loadTaskInstance(monopolyTaskInstance.getId());
assertEquals("obelix", monopolyTaskInstance.getVariable("hero"));
newTransaction();
Token monopolyToken = jbpmContext.loadToken(monopolyTokenId);
contextInstance = monopolyToken.getProcessInstance().getContextInstance();
assertNull(contextInstance.getVariable("hero", monopolyToken));
newTransaction();
breadTaskInstance = jbpmContext.loadTaskInstanceForUpdate(breadTaskInstance.getId());
breadTaskInstance.end();
newTransaction();
monopolyTaskInstance = jbpmContext.loadTaskInstanceForUpdate(monopolyTaskInstance.getId());
monopolyTaskInstance.end();
newTransaction();
breadToken = jbpmContext.loadToken(breadTokenId);
monopolyToken = jbpmContext.loadToken(monopolyTokenId);
contextInstance = breadToken.getProcessInstance().getContextInstance();
assertNull(contextInstance.getVariable("hero", breadToken));
assertNull(contextInstance.getVariable("hero", monopolyToken));
}
private TaskInstance findTask(String taskName) {
Session session = jbpmContext.getSession();
Criteria criteria = session.createCriteria(TaskInstance.class);
criteria.add(Restrictions.eq("name", taskName));
List taskInstances = criteria.list();
return (TaskInstance) taskInstances.get(0);
}
}