[jbpm-commits] JBoss JBPM SVN: r1938 - in jbpm3/trunk/modules/jpdl/core/src: main/java/org/jbpm/graph/def and 7 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Wed Aug 20 07:24:43 EDT 2008


Author: alex.guizar at jboss.com
Date: 2008-08-20 07:24:43 -0400 (Wed, 20 Aug 2008)
New Revision: 1938

Modified:
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java
   jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java
   jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
   jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java
   jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java
   jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml
Log:
eliminated stale state exception by excluding locked jobs from query "JobSession.getTimersByName": JBPM-1135
rewrote timer test in terms of monitors instead of thread sleeps
improved toString() for Timer, TaskInstance and ProcessInstance
extracted "timer" event type constant from CreateTimerAction to Event

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/db/JobSession.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -165,14 +165,14 @@
         Iterator iter = results.iterator();
         while (iter.hasNext()) {
           Timer timer = (Timer) iter.next();
-          log.debug("deleting timer "+timer+" by name "+name);
+          log.debug("deleting "+timer+" for '"+token+"'");
           session.delete(timer);
         }
       }
 
     } catch (Exception e) {
       log.error(e);
-      throw new JbpmException("couldn't cancel timers '"+name+"' for '"+token+"'", e);
+      throw new JbpmException("couldn't cancel timers by name '"+name+"' for '"+token+"'", e);
     }
   }
 
@@ -189,22 +189,22 @@
     public void save(ProcessInstance processInstance, JbpmContext jbpmContext) {
       // avoid deleting jobs for process instances that did not request job deletion
       if (!targetProcessInstance.equals(processInstance)) {
-        log.debug("forgiving " + processInstance + ", it isn't the target of this operation");
+        log.debug("forgiving " + processInstance + ", it is not the target of this operation");
         return;
       }
 
-      log.debug("deleting timers for process instance "+processInstance);
+      log.debug("deleting timers for "+processInstance);
       Session session = jbpmContext.getSession();
       Query query = session.getNamedQuery("JobSession.deleteTimersForProcessInstance");
       query.setParameter("processInstance", processInstance);
       int entityCount = query.executeUpdate();
-      log.debug(entityCount+" remaining timers for '"+processInstance+"' were deleted");
+      log.debug(entityCount+" remaining timers for "+processInstance+" were deleted");
 
-      log.debug("deleting execute-node-jobs for process instance "+processInstance);
+      log.debug("deleting execute-node-jobs for "+processInstance);
       query = session.getNamedQuery("JobSession.deleteExecuteNodeJobsForProcessInstance");
       query.setParameter("processInstance", processInstance);
       entityCount = query.executeUpdate();
-      log.debug(entityCount+" remaining execute-node-jobs for '"+processInstance+"' are deleted");
+      log.debug(entityCount+" remaining execute-node-jobs for "+processInstance+" were deleted");
     }
     
   }

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/Event.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -46,6 +46,7 @@
   public static final String EVENTTYPE_TASK_ASSIGN = "task-assign";
   public static final String EVENTTYPE_TASK_START = "task-start";
   public static final String EVENTTYPE_TASK_END = "task-end";
+  public static final String EVENTTYPE_TIMER_CREATE = "timer-create";
   public static final String EVENTTYPE_TIMER = "timer";
 
   long id = 0;

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/def/GraphElement.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -160,10 +160,7 @@
   // event handling ///////////////////////////////////////////////////////////
 
   public void fireEvent(String eventType, ExecutionContext executionContext) {
-    Token token = executionContext.getToken();
-
-    log.debug( "event '"+eventType+"' on '"+this+"' for '"+token+"'" );
-
+    log.debug( "event '"+eventType+"' on '"+this+"' for '"+executionContext.getToken()+"'" );
     try {
       executionContext.setEventSource(this);
       fireAndPropagateEvent(eventType, executionContext);

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -448,6 +448,10 @@
     return EqualsUtil.equals(this, o);
   }
   
+  public String toString() {
+    return "ProcessInstance" + (key != null ? '(' + key + ')' : "@" + Integer.toHexString(hashCode()));
+  }
+  
   // getters and setters //////////////////////////////////////////////////////
 
   public long getId() {

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/job/Timer.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -120,11 +120,11 @@
         buffer.append(formatDueDate(dueDate)).append(",");
       }
       if (taskInstance!=null)
-        buffer.append("TaskInstance: ").append(taskInstance.getId()).append(",");
+        buffer.append(taskInstance).append(",");
       if (token!=null)
-        buffer.append("Token: ").append(token.getId());
+        buffer.append(token);
       else if (processInstance!=null)
-        buffer.append("ProcessInstance: ").append(processInstance.getId());
+        buffer.append(processInstance);
 
       buffer.append(")");
     }

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/scheduler/def/CreateTimerAction.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -29,6 +29,7 @@
 import org.jbpm.calendar.BusinessCalendar;
 import org.jbpm.calendar.Duration;
 import org.jbpm.graph.def.Action;
+import org.jbpm.graph.def.Event;
 import org.jbpm.graph.def.GraphElement;
 import org.jbpm.graph.exe.ExecutionContext;
 import org.jbpm.job.Timer;
@@ -133,7 +134,7 @@
       try {
         executionContext.setTimer(timer);
         // fire the create timer event on the same graph element
-        graphElement.fireEvent("timer-create", executionContext);
+        graphElement.fireEvent(Event.EVENTTYPE_TIMER_CREATE, executionContext);
       } finally {
         executionContext.setTimer(null);
       }

Modified: jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/java/org/jbpm/taskmgmt/exe/TaskInstance.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -41,7 +41,6 @@
 import org.jbpm.graph.exe.ExecutionContext;
 import org.jbpm.graph.exe.ProcessInstance;
 import org.jbpm.graph.exe.Token;
-import org.jbpm.graph.node.TaskNode;
 import org.jbpm.security.SecurityHelper;
 import org.jbpm.taskmgmt.def.Swimlane;
 import org.jbpm.taskmgmt.def.Task;
@@ -555,7 +554,7 @@
   }
   
   public String toString() {
-    return "TaskInstance"+(name!=null ? "["+name+"]" : Integer.toHexString(System.identityHashCode(this)));
+    return "TaskInstance"+(name!=null ? "("+name+")" : "@"+Integer.toHexString(hashCode()));
   }
 
   // private //////////////////////////////////////////////////////////////////

Modified: jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/main/resources/org/jbpm/db/hibernate.queries.hbm.xml	2008-08-20 11:24:43 UTC (rev 1938)
@@ -311,6 +311,7 @@
       from org.jbpm.job.Timer timer
       where timer.token = :token
         and timer.name = :name
+        and timer.lockOwner is null
     ]]>
   </query>
 

Modified: jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/NoJobExecutorDbTest.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -37,24 +37,24 @@
   private JbpmContext jbpmContext;
 
   private static JbpmConfiguration jbpmConfiguration = JbpmConfiguration.parseXmlString(
-	  "<jbpm-configuration>" +
-	  "  <null name='jbpm.job.executor' />" +
-	  "</jbpm-configuration>");
+      "<jbpm-configuration>" +
+      "  <null name='jbpm.job.executor' />" +
+      "</jbpm-configuration>");
 
   public void setUp() throws Exception {
-	jbpmContext = jbpmConfiguration.createJbpmContext();
+    jbpmContext = jbpmConfiguration.createJbpmContext();
   }
 
   public void tearDown() throws Exception {
-	jbpmContext.close();
+    jbpmContext.close();
   }
 
   public void testJobExecutorDoesNotExist() {
-	// check the job executor is properly nullified
+    // check the job executor is properly nullified
     assertNull(jbpmContext.getObjectFactory().createObject("jbpm.job.executor"));
     // start and end a process instance, confirm no exception gets thrown
-	jbpmContext.deployProcessDefinition(new ProcessDefinition("Audit"));
-	ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("Audit");
-	processInstance.end();
+    jbpmContext.deployProcessDefinition(new ProcessDefinition("Audit"));
+    ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("Audit");
+    processInstance.end();
   }
 }

Modified: jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/test/java/org/jbpm/job/executor/TimerOnTimerDbTest.java	2008-08-20 11:24:43 UTC (rev 1938)
@@ -23,9 +23,8 @@
 
 import java.io.Serializable;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.jbpm.db.AbstractDbTestCase;
+import org.jbpm.graph.def.Event;
 import org.jbpm.graph.def.ProcessDefinition;
 import org.jbpm.graph.exe.ProcessInstance;
 
@@ -35,71 +34,99 @@
  */
 public class TimerOnTimerDbTest extends AbstractDbTestCase {
 
-  private static final Log log = LogFactory.getLog(TimerOnTimerDbTest.class);
-
   public void testTimerOnTimer() {
     ProcessDefinition processDefinition = ProcessDefinition.parseXmlResource("org/jbpm/job/executor/timerOnTimer.jpdl.xml");
     jbpmContext.deployProcessDefinition(processDefinition);
 
     ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("timerTest");
-    processInstance.getContextInstance().setVariable("timerTestWorkflow", new WorkflowLogger());
+    processInstance.getContextInstance().setVariable("testCallback", new TestCallback());
     processInstance.signal();
+    long tokenId = processInstance.getRootToken().getId();
     commitAndCloseSession();
-    long tokenId = processInstance.getRootToken().getId();
 
     startJobExecutor();
     try {
-      sleep(500);
+      TestCallback.waitForEvent(Event.EVENTTYPE_NODE_ENTER);
       beginSessionTransaction();
-      assertEquals("timerTest", jbpmContext.loadToken(tokenId).getNode().getName());
+      assertEquals("firstNode", jbpmContext.loadToken(tokenId).getNode().getName());
       commitAndCloseSession();
 
-      sleep(1000);
+      TestCallback.waitForEvent(Event.EVENTTYPE_NODE_ENTER);
       beginSessionTransaction();
-      assertEquals("secondTimerTest", jbpmContext.loadToken(tokenId).getNode().getName());
+      assertEquals("secondNode", jbpmContext.loadToken(tokenId).getNode().getName());
       commitAndCloseSession();
 
-      sleep(1000);
+      TestCallback.waitForEvent(Event.EVENTTYPE_PROCESS_END);
       beginSessionTransaction();
-      assertTrue(jbpmContext.loadToken(tokenId).getProcessInstance().hasEnded());
+      assertTrue(jbpmContext.loadToken(tokenId).hasEnded());
     }
     finally {
       stopJobExecutor();
     }
   }
 
-  private void sleep(long millis) {
-    try {
-      Thread.sleep(millis);
-    }
-    catch (InterruptedException e) {
-      // reassert interruption
-      Thread.currentThread().interrupt();
-    }    
-  }
+  public static class TestCallback implements Serializable {
 
-  public static final class WorkflowLogger implements Serializable {
-  
     private static final long serialVersionUID = 1L;
-  
-    public void logNodeEnter() {
-      log.info("entered node");
+
+    public void processStart() {
+      synchronized (Event.EVENTTYPE_PROCESS_START) {
+        Event.EVENTTYPE_PROCESS_START.notify();
+      }
     }
-  
-    public void logNodeLeave() {
-      log.info("left node");
+
+    public void processEnd() {
+      synchronized (Event.EVENTTYPE_PROCESS_END) {
+        Event.EVENTTYPE_PROCESS_END.notify();
+      }
     }
-  
-    public void logTaskCreate() {
-      log.info("created task");
+
+    public void nodeEnter() {
+      synchronized (Event.EVENTTYPE_NODE_ENTER) {
+        Event.EVENTTYPE_NODE_ENTER.notify();
+      }
     }
-  
-    public void logTimerCreate() {
-      log.info("created timer");
+
+    public void nodeLeave() {
+      synchronized (Event.EVENTTYPE_NODE_LEAVE) {
+        Event.EVENTTYPE_NODE_LEAVE.notify();
+      }
     }
-  
-    public void logTimerFired() {
-      log.info("fired timer");
+
+    public void taskCreate() {
+      synchronized (Event.EVENTTYPE_TASK_CREATE) {
+        Event.EVENTTYPE_TASK_CREATE.notify();
+      }
     }
+
+    public void taskEnd() {
+      synchronized (Event.EVENTTYPE_TASK_END) {
+        Event.EVENTTYPE_TASK_END.notify();
+      }
+    }
+
+    public void timerCreate() {
+      synchronized (Event.EVENTTYPE_TIMER_CREATE) {
+        Event.EVENTTYPE_TIMER_CREATE.notify();
+      }
+    }
+
+    public void timer() {
+      synchronized (Event.EVENTTYPE_TIMER) {
+        Event.EVENTTYPE_TIMER.notify();
+      }
+    }
+
+    public static void waitForEvent(String event) {
+      synchronized (event) {
+        try {
+          event.wait(60000);
+        }
+        catch (InterruptedException e) {
+          // reassert interruption
+          Thread.currentThread().interrupt();
+        }
+      }
+    }
   }
 }

Modified: jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml
===================================================================
--- jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml	2008-08-20 00:20:43 UTC (rev 1937)
+++ jbpm3/trunk/modules/jpdl/core/src/test/resources/org/jbpm/job/executor/timerOnTimer.jpdl.xml	2008-08-20 11:24:43 UTC (rev 1938)
@@ -3,44 +3,47 @@
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="urn:jbpm.org:jpdl-3.2 http://jbpm.org/xsd/jpdl-3.2.xsd">
 
+  <event type="process-start">
+    <action expression="#{testCallback.processStart}"/>
+  </event>
+  <event type="process-end">
+    <action expression="#{testCallback.processEnd}"/>
+  </event>
+  <event type="node-enter">
+    <action expression="#{testCallback.nodeEnter}" />
+  </event>
+  <event type="node-leave">
+    <action expression="#{testCallback.nodeLeave}" />
+  </event>
+  <event type="task-create">
+    <action expression="#{testCallback.taskCreate}" />
+  </event>
+  <event type="task-end">
+    <action expression="#{testCallback.taskEnd}" />
+  </event>
+  <event type="timer-create">
+    <action expression="#{testCallback.timerCreate}" />
+  </event>
+  <event type="timer">
+    <action expression="#{testCallback.timer}"/>
+  </event>
+
   <start-state name="start">
-    <transition name="" to="timerTest" />
+    <transition name="doneStart" to="firstNode" />
   </start-state>
 
-  <task-node name="timerTest" end-tasks="true">
-    <event type="node-enter">
-      <action expression="#{timerTestWorkflow.logNodeEnter}" />
-    </event>
-    <event type="node-leave">
-      <action expression="#{timerTestWorkflow.logNodeLeave}" />
-    </event>
-    <transition name="doneFirst" to="secondTimerTest" />
-    <task name="timerTestTask" description="TimerTestTask">
+  <task-node name="firstNode" end-tasks="yes">
+    <task name="firstTask">
       <assignment actor-id="admin" />
-      <event type="task-create">
-        <action expression="#{timerTestWorkflow.logTaskCreate}" />
-      </event>
-      <event type="timer-create">
-        <action expression="#{timerTestWorkflow.logTimerCreate}" />
-      </event>
-      <timer duedate="1 second" transition="doneFirst">
-        <action expression="#{timerTestWorkflow.logTimerFired}" />
-      </timer>
+      <timer duedate="1 second" transition="doneFirst" />
     </task>
+    <transition name="doneFirst" to="secondNode" />
   </task-node>
 
-  <task-node name="secondTimerTest">
-    <task name="secondTimerTestTask" description="SecondTimerTestTask">
+  <task-node name="secondNode" end-tasks="yes">
+    <task name="secondTask">
       <assignment actor-id="admin" />
-      <event type="task-create">
-        <action expression="#{timerTestWorkflow.logTaskCreate}" />
-      </event>
-      <event type="timer-create">
-        <action expression="#{timerTestWorkflow.logTimerCreate}" />
-      </event>
-      <timer duedate="1 second" transition="doneSecond">
-        <action expression="#{timerTestWorkflow.logTimerFired}" />
-      </timer>
+      <timer duedate="1 second" transition="doneSecond" />
     </task>
     <transition name="doneSecond" to="end" />
   </task-node>




More information about the jbpm-commits mailing list