/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jbpm.db;
import java.util.Iterator;
import java.util.List;
import org.jbpm.context.exe.ContextInstance;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
import org.jbpm.graph.exe.Token;
public class GraphSessionDbTest extends AbstractDbTestCase {
public void testProcessDefinitionSaveAndLoad() {
// create a process definition
ProcessDefinition processDefinition = new ProcessDefinition("auction");
// save it in the database
deployProcessDefinition(processDefinition);
// get the assigned id
long processDefinitionId = processDefinition.getId();
// start a new transaction
newTransaction();
// load the process definition by the id
processDefinition = graphSession.loadProcessDefinition(processDefinitionId);
// check the result
assertEquals("auction", processDefinition.getName());
}
public void testFindProcessDefinitionByNameAndVersion() {
// put 3 process definitions in the database with the same name,
// but different versions
ProcessDefinition processDefinitionOne = new ProcessDefinition("auction");
deployProcessDefinition(processDefinitionOne);
ProcessDefinition processDefinitionTwo = new ProcessDefinition("auction");
deployProcessDefinition(processDefinitionTwo);
// get the assigned id of the second version
long secondVersionProcessDefinitionId = processDefinitionTwo.getId();
ProcessDefinition processDefinitionThree = new ProcessDefinition("auction");
deployProcessDefinition(processDefinitionThree);
// load the process definition by name and version
processDefinitionTwo = graphSession.findProcessDefinition("auction", 2);
assertEquals(secondVersionProcessDefinitionId, processDefinitionTwo.getId());
assertEquals("auction", processDefinitionTwo.getName());
assertEquals(2, processDefinitionTwo.getVersion());
}
public void testFindLatestProcessDefinition() throws Exception {
// put 3 process definitions in the database with the same name,
// but different versions
ProcessDefinition processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
// get the assigned id of the last verions
long lastVersionProcessDefinitionId = processDefinition.getId();
processDefinition = graphSession.findLatestProcessDefinition("auction");
assertEquals(lastVersionProcessDefinitionId, processDefinition.getId());
assertEquals("auction", processDefinition.getName());
assertEquals(3, processDefinition.getVersion());
}
public void testFindAllProcessDefinitions() throws Exception {
// put 3 process definitions in the database with the same name,
// but different versions
ProcessDefinition processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("bake cake");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("bake cake");
deployProcessDefinition(processDefinition);
List allProcessDefinitions = graphSession.findAllProcessDefinitions();
assertEquals(5, allProcessDefinitions.size());
assertEquals(3, ((ProcessDefinition) allProcessDefinitions.get(0)).getVersion());
assertEquals("auction", ((ProcessDefinition) allProcessDefinitions.get(0)).getName());
assertEquals(2, ((ProcessDefinition) allProcessDefinitions.get(1)).getVersion());
assertEquals("auction", ((ProcessDefinition) allProcessDefinitions.get(1)).getName());
assertEquals(1, ((ProcessDefinition) allProcessDefinitions.get(2)).getVersion());
assertEquals("auction", ((ProcessDefinition) allProcessDefinitions.get(2)).getName());
assertEquals(2, ((ProcessDefinition) allProcessDefinitions.get(3)).getVersion());
assertEquals("bake cake", ((ProcessDefinition) allProcessDefinitions.get(3)).getName());
assertEquals(1, ((ProcessDefinition) allProcessDefinitions.get(4)).getVersion());
assertEquals("bake cake", ((ProcessDefinition) allProcessDefinitions.get(4)).getName());
}
public void testFindAllProcessDefinitionVersions() throws Exception {
// put 3 process definitions in the database with the same name,
// but different versions
ProcessDefinition processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("bake cake");
deployProcessDefinition(processDefinition);
processDefinition = new ProcessDefinition("bake cake");
deployProcessDefinition(processDefinition);
List allProcessDefinitionVersions = graphSession.findAllProcessDefinitionVersions("auction");
assertEquals(3, allProcessDefinitionVersions.size());
assertEquals(3, ((ProcessDefinition) allProcessDefinitionVersions.get(0)).getVersion());
assertEquals("auction", ((ProcessDefinition) allProcessDefinitionVersions.get(0)).getName());
assertEquals(2, ((ProcessDefinition) allProcessDefinitionVersions.get(1)).getVersion());
assertEquals("auction", ((ProcessDefinition) allProcessDefinitionVersions.get(1)).getName());
assertEquals(1, ((ProcessDefinition) allProcessDefinitionVersions.get(2)).getVersion());
assertEquals("auction", ((ProcessDefinition) allProcessDefinitionVersions.get(2)).getName());
allProcessDefinitionVersions = graphSession.findAllProcessDefinitionVersions("bake cake");
assertEquals(2, allProcessDefinitionVersions.size());
assertEquals(2, ((ProcessDefinition) allProcessDefinitionVersions.get(0)).getVersion());
assertEquals("bake cake",
((ProcessDefinition) allProcessDefinitionVersions.get(0)).getName());
assertEquals(1, ((ProcessDefinition) allProcessDefinitionVersions.get(1)).getVersion());
assertEquals("bake cake",
((ProcessDefinition) allProcessDefinitionVersions.get(1)).getName());
}
public void testSaveAndLoadProcessInstance() {
ProcessDefinition processDefinition = new ProcessDefinition("auction");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance = saveAndReload(processInstance);
assertNotNull(processInstance);
}
public void testUpdateProcessInstance() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='auction'>"
+ " <start-state name='s' />"
+ " <node name='n' />"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance = saveAndReload(processInstance);
long pid = processInstance.getId();
assertEquals("s", processInstance.getRootToken().getNode().getName());
processInstance.getRootToken().setNode(processInstance.getProcessDefinition().getNode("n"));
processInstance = saveAndReload(processInstance);
assertEquals("n", processInstance.getRootToken().getNode().getName());
assertEquals(pid, processInstance.getId());
}
public void testFindProcessInstancesByProcessDefinition() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='auction'>"
+ " <start-state name='s' />"
+ " <node name='n' />"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
jbpmContext.save(new ProcessInstance(processDefinition));
jbpmContext.save(new ProcessInstance(processDefinition));
jbpmContext.save(new ProcessInstance(processDefinition));
newTransaction();
List processInstances = graphSession.findProcessInstances(processDefinition.getId());
assertEquals(3, processInstances.size());
// process instances should be ordered from recent to old
long previousStart = System.currentTimeMillis();
for (Iterator iter = processInstances.iterator(); iter.hasNext();) {
ProcessInstance processInstance = (ProcessInstance) iter.next();
long processStart = processInstance.getStart().getTime();
assertTrue(previousStart >= processStart);
previousStart = processStart;
}
}
public void testDeleteProcessInstance() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='auction'>"
+ " <start-state name='s' />"
+ " <node name='n' />"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
jbpmContext.save(processInstance);
newTransaction();
graphSession.deleteProcessInstance(processInstance.getId());
newTransaction();
assertEquals(0, graphSession.findProcessInstances(processDefinition.getId()).size());
}
public void testDeleteProcessInstanceWithVariables() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='auction'>"
+ " <start-state name='start'>"
+ " <transition to='fork' />"
+ " </start-state>"
+ " <fork name='fork'>"
+ " <transition name='a' to='a' />"
+ " <transition name='b' to='b' />"
+ " </fork>"
+ " <state name='a' />"
+ " <state name='b' />"
+ "</process-definition>");
deployProcessDefinition(processDefinition);
ProcessInstance processInstance = new ProcessInstance(processDefinition);
processInstance.signal();
Token tokenA = processInstance.findToken("/a");
Token tokenB = processInstance.findToken("/b");
ContextInstance contextInstance = processInstance.getContextInstance();
contextInstance.setVariable("r", "rrrrrr");
contextInstance.createVariable("a", "aaaaaa", tokenA);
contextInstance.createVariable("b", "bbbbbb", tokenB);
processInstance = saveAndReload(processInstance);
graphSession.deleteProcessInstance(processInstance);
newTransaction();
List processInstances = graphSession.findProcessInstances(processDefinition.getId());
assertEquals(0, processInstances.size());
}
public void testDeleteProcessDefinition() {
ProcessDefinition processDefinition = ProcessDefinition.parseXmlString("<process-definition name='deleteme'>"
+ " <start-state name='s' />"
+ " <node name='n' />"
+ "</process-definition>");
jbpmContext.deployProcessDefinition(processDefinition);
newTransaction();
try {
jbpmContext.save(new ProcessInstance(processDefinition));
jbpmContext.save(new ProcessInstance(processDefinition));
jbpmContext.save(new ProcessInstance(processDefinition));
jbpmContext.save(new ProcessInstance(processDefinition));
}
finally {
graphSession.deleteProcessDefinition(processDefinition.getId());
}
newTransaction();
assertEquals(0, graphSession.findAllProcessDefinitionVersions(processDefinition.getName())
.size());
assertEquals(0, graphSession.findProcessInstances(processDefinition.getId()).size());
}
public void testLatestProcessDefinitions() {
deployProcessDefinition(new ProcessDefinition("websale"));
deployProcessDefinition(new ProcessDefinition("websale"));
deployProcessDefinition(new ProcessDefinition("websale"));
deployProcessDefinition(new ProcessDefinition("change nappy"));
deployProcessDefinition(new ProcessDefinition("change nappy"));
List latestProcessDefinitions = graphSession.findLatestProcessDefinitions();
assertEquals(2, latestProcessDefinitions.size());
assertEquals(3, getVersionOfProcess("websale", latestProcessDefinitions));
assertEquals(2, getVersionOfProcess("change nappy", latestProcessDefinitions));
}
private int getVersionOfProcess(String name, List latestProcessDefinitions) {
for (Iterator iter = latestProcessDefinitions.iterator(); iter.hasNext();) {
ProcessDefinition processDefinition = (ProcessDefinition) iter.next();
if (name.equals(processDefinition.getName())) return processDefinition.getVersion();
}
return -1;
}
}