[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