[jbpm-commits] JBoss JBPM SVN: r4061 - in jbpm3/trunk/modules/core/src: test/java/org/jbpm/command and 1 other directory.
do-not-reply at jboss.org
do-not-reply at jboss.org
Fri Feb 27 06:55:39 EST 2009
Author: camunda
Date: 2009-02-27 06:55:39 -0500 (Fri, 27 Feb 2009)
New Revision: 4061
Modified:
jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractProcessInstanceBaseCommand.java
jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractTokenBaseCommand.java
jbpm3/trunk/modules/core/src/test/java/org/jbpm/command/TokenCommandTest.java
Log:
Fixed AbstractProcessInstanceCommand not returning changed processInstances in result list
Improved Query possibilities in AbstractTokenBaseCommand
Added Test for Suspend/ResumeToken using queries
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractProcessInstanceBaseCommand.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractProcessInstanceBaseCommand.java 2009-02-27 10:10:32 UTC (rev 4060)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractProcessInstanceBaseCommand.java 2009-02-27 11:55:39 UTC (rev 4061)
@@ -31,6 +31,9 @@
private int processVersion = 0;
private boolean onlyRunning = true;
+ /**
+ * indicator if exactly one token is targeted with the command
+ */
private boolean operateOnSingleObject;
private transient JbpmContext jbpmContext;
@@ -73,24 +76,14 @@
cmd.setOnlyRunning(onlyRunning);
if (processVersion > 0) cmd.setVersion(String.valueOf(processVersion));
- // Query query = null;
- // if (processVersion>0) {
- // query =
- // jbpmContext.getSession().getNamedQuery("GraphSession.findProcessDefinitionByNameAndVersion");
- // query.setInteger("version", processVersion);
- // }
- // else {
- // query =
- // jbpmContext.getSession().getNamedQuery("GraphSession.findTokensForProcessInNode");
- // }
- // query.setString("name", processName);
List processInstanceList = (List) cmd.execute(jbpmContext);
Iterator iter = processInstanceList.iterator();
while (iter.hasNext())
{
ProcessInstance pi = (ProcessInstance) iter.next();
- execute(pi);
+ result.add(
+ execute(pi));
}
}
@@ -238,4 +231,9 @@
setOnlyRunning(onlyRunning);
return this;
}
+
+ public boolean isOperateOnSingleObject()
+ {
+ return operateOnSingleObject;
+ }
}
\ No newline at end of file
Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractTokenBaseCommand.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractTokenBaseCommand.java 2009-02-27 10:10:32 UTC (rev 4060)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/command/AbstractTokenBaseCommand.java 2009-02-27 11:55:39 UTC (rev 4061)
@@ -3,13 +3,17 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
+import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
+import org.hibernate.Criteria;
import org.hibernate.Query;
+import org.hibernate.criterion.Restrictions;
import org.jbpm.JbpmContext;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.Token;
+import org.jbpm.util.CollectionUtil;
/**
* Abstract base class for commands working on Tokens. The {@link Token} can either be specified by
@@ -17,6 +21,10 @@
* node name and version. In this case <b>all</b> found {@link Token}s are processed. If no version
* is specified, <b>all</b> versions are taken into account.
*
+ * <b>Attention:</b> The result of the command is either a List of {@link Token}s
+ * or one single {@link Token}, depending if this command operates on one single instance
+ * (indicated by "operateOnSingleObject").
+ *
* @author bernd.ruecker at camunda.com
*/
public abstract class AbstractTokenBaseCommand implements Command
@@ -27,7 +35,10 @@
private String processName = null;
private String stateName = null;
private int processVersion = 0;
-
+
+ /**
+ * indicator if exactly one token is targeted with the command
+ */
private boolean operateOnSingleObject;
private transient JbpmContext jbpmContext;
@@ -61,30 +72,36 @@
result.add(execute(token));
}
}
-
- // search for tokens in process/state
- if (processName != null && stateName != null)
+ else
{
+ // search for tokens depending on query parameters
this.operateOnSingleObject = false;
-
- Query query = null;
- if (processVersion > 0)
+
+ Criteria criteria = jbpmContext.getSession().createCriteria(Token.class);
+
+ if (processName != null)
{
- query = jbpmContext.getSession().getNamedQuery(
- "GraphSession.findTokensForProcessVersionInNode");
- query.setInteger("processDefinitionVersion", processVersion);
+ criteria.createCriteria("processInstance")
+ .createCriteria("processDefinition")
+ .add(Restrictions.eq("name", processName));
}
- else
+ if (processVersion>0)
{
- query = jbpmContext.getSession().getNamedQuery("GraphSession.findTokensForProcessInNode");
+ criteria.createCriteria("processInstance")
+ .createCriteria("processDefinition")
+ .add(Restrictions.eq("version", processVersion));
}
- query.setString("processDefinitionName", processName);
- query.setString("nodeName", stateName);
-
- Iterator iter = query.list().iterator();
- while (iter.hasNext())
+ if (stateName != null)
{
- Token token = (Token) iter.next();
+ criteria.createCriteria("node")
+ .add(Restrictions.eq("name", stateName));
+ }
+
+ List<?> queryResult = criteria.list();
+ CollectionUtil.checkList(queryResult, Token.class);
+
+ for (Token token : (List<Token>)queryResult)
+ {
result.add(execute(token));
}
}
@@ -237,4 +254,9 @@
setStateName(stateName);
return this;
}
+
+ public boolean isOperateOnSingleObject()
+ {
+ return operateOnSingleObject;
+ }
}
\ No newline at end of file
Modified: jbpm3/trunk/modules/core/src/test/java/org/jbpm/command/TokenCommandTest.java
===================================================================
--- jbpm3/trunk/modules/core/src/test/java/org/jbpm/command/TokenCommandTest.java 2009-02-27 10:10:32 UTC (rev 4060)
+++ jbpm3/trunk/modules/core/src/test/java/org/jbpm/command/TokenCommandTest.java 2009-02-27 11:55:39 UTC (rev 4061)
@@ -73,6 +73,52 @@
jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
}
}
+
+ /**
+ * Test case which sends a Command for a whole process definition to
+ * check if queries are working
+ */
+ public void testSuspendTokenWithQueryCommand() throws Exception {
+ String xml = //
+ "<process-definition name='TestToken'>" //
+ +" <start-state name='start'>" //
+ +" <transition to='wait' />" //
+ +" </start-state>" //
+ +" <state name='wait'>" //
+ +" <transition to='end' />" //
+ +" </state>" //
+ +" <end-state name='end' />" //
+ +"</process-definition>";
+
+ ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(xml);
+ jbpmContext.deployProcessDefinition(processDefinition);
+ try {
+ ProcessInstance processInstance1 = jbpmContext.newProcessInstanceForUpdate("TestToken");
+ processInstance1.getRootToken().signal();
+ ProcessInstance processInstance2 = jbpmContext.newProcessInstanceForUpdate("TestToken");
+
+ new SuspendTokenCommand().processName("TestToken").execute(jbpmContext);
+ newTransaction();
+ processInstance1 = graphSession.loadProcessInstance(processInstance1.getId());
+ processInstance2 = graphSession.loadProcessInstance(processInstance2.getId());
+
+ assertTrue("process instance 1 is suspended", processInstance1.getRootToken().isSuspended());
+ assertTrue("process instance 2 is suspended", processInstance2.getRootToken().isSuspended());
+ // only resume process instance 1 (which was signaled and is in state 'wait')
+ new ResumeTokenCommand().processName("TestToken").stateName("wait").execute(jbpmContext);
+
+ newTransaction();
+ processInstance1 = graphSession.loadProcessInstance(processInstance1.getId());
+ processInstance2 = graphSession.loadProcessInstance(processInstance2.getId());
+
+ assertFalse("process instance 1 was resumed", processInstance1.getRootToken().isSuspended());
+ assertTrue("process instance 2 is suspended", processInstance2.getRootToken().isSuspended());
+ }
+ finally {
+ newTransaction();
+ jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+ }
+ }
}
More information about the jbpm-commits
mailing list