[jbpm-commits] JBoss JBPM SVN: r2453 - in projects/spec/trunk/modules: api/src/main/java/org/jbpm/api/test and 12 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Tue Sep 30 16:13:46 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-09-30 16:13:45 -0400 (Tue, 30 Sep 2008)
New Revision: 2453

Added:
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessServiceTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/signal/SignalMultithreadTest.java
Removed:
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/processmanager/ProcessManagerTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/signalmanager/SignalManagerTest.java
Modified:
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessService.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/test/CTSTestCase.java
   projects/spec/trunk/modules/cts/pom.xml
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java
Log:
More tests pass

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessService.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessService.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessService.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -79,28 +79,29 @@
     if (proc == null)
       throw new IllegalStateException("Cannot obtain process from: " + dep);
     
-    registerProcess(proc);
-    return proc.getKey();
+    ObjectName procID = registerProcess(proc);
+    return procID;
   }
   
   /**
    * Register a Process.
    */
-  public void registerProcess(Process proc)
+  public ObjectName registerProcess(Process proc)
   {
     log.debug("registerProcess: " + proc);
     
     // Save the process through the PersistenceService
     PersistenceService dbService = getProcessEngine().getService(PersistenceService.class);
-    dbService.saveProcess(proc);
+    ObjectName procID = dbService.saveProcess(proc);
     
-    registeredProcs.put(proc.getKey(), proc);
+    registeredProcs.put(procID, proc);
+    return procID;
   }
 
   /**
    * Unregister a Process.
    */
-  public void unregisterProcess(Process proc)
+  public boolean unregisterProcess(Process proc)
   {
     log.debug("unregisterProcess: " + proc);
     
@@ -108,7 +109,7 @@
     PersistenceService dbService = getProcessEngine().getService(PersistenceService.class);
     dbService.deleteProcess(proc);
     
-    registeredProcs.remove(proc.getKey());
+    return registeredProcs.remove(proc.getKey()) != null;
   }
 
   /**

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/test/CTSTestCase.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/test/CTSTestCase.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/test/CTSTestCase.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -67,7 +67,9 @@
   private MessageListener messageListener;
   // The messages caught by this test case
   private List<Message> messages = new ArrayList<Message>();
-
+  // The last fatal tear down error
+  private static String fatalTearDownError;
+  
   protected ProcessEngine getProcessEngine()
   {
     return ProcessEngine.getProcessEngine();
@@ -81,6 +83,10 @@
     
     ProcessEngine engine = getProcessEngine();
     
+    // Stop the test run if there are fatal tear down errors
+    if (fatalTearDownError != null)
+      System.exit(1);
+    
     // Setup the SignalListener
     clearAllSignalListeners();
     SignalService sigService = engine.getService(SignalService.class);
@@ -95,7 +101,7 @@
     MessageService msgService = engine.getService(MessageService.class);
     msgService.addMessageListener(getMessageListener());
   }
-
+  
   @Override
   protected void tearDown() throws Exception
   {
@@ -114,27 +120,27 @@
     Set<Process> procs = procManager.getProcesses();
     if (procs.size() > 0)
     {
-      String logMsg = "Registered processes on tear down of " + getName() + ": " + procs;
-      System.out.println(logMsg);
-      System.exit(1);
+      fatalTearDownError = "Registered processes on tear down of " + getName() + ": " + procs;
+      System.out.println(fatalTearDownError);
+      log.error(fatalTearDownError);
     }
 
     // Check that there are no registered signal listeners left
     Set<SignalListener> sigListeners = sigService.getSignalListeners();
     if (sigListeners.size() > 0)
     {
-      String logMsg = "Registered signal listeners on tear down of " + getName() + ": " + sigListeners;
-      System.out.println(logMsg);
-      System.exit(1);
+      fatalTearDownError = "Registered signal listeners on tear down of " + getName() + ": " + sigListeners;
+      System.out.println(fatalTearDownError);
+      log.error(fatalTearDownError);
     }
     
     // Check that there are no registered message listeners left
     Set<MessageListener> msgListeners = msgService.getMessageListeners();
     if (msgListeners.size() > 0)
     {
-      String logMsg = "Registered message listeners on tear down of " + getName() + ": " + msgListeners;
-      System.out.println(logMsg);
-      System.exit(1);
+      fatalTearDownError = "Registered message listeners on tear down of " + getName() + ": " + msgListeners;
+      System.out.println(fatalTearDownError);
+      log.error(fatalTearDownError);
     }
 
     super.tearDown();

Modified: projects/spec/trunk/modules/cts/pom.xml
===================================================================
--- projects/spec/trunk/modules/cts/pom.xml	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/cts/pom.xml	2008-09-30 20:13:45 UTC (rev 2453)
@@ -70,7 +70,6 @@
         <artifactId>maven-surefire-plugin</artifactId>
         <configuration>
           <excludes>
-            <exclude>org/jbpm/test/cts/executioncontext/ExecutionContextTest.java</exclude>
             <exclude>org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java</exclude>
             <exclude>org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewaySplitTest.java</exclude>
             <exclude>org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java</exclude>
@@ -79,9 +78,6 @@
             <exclude>org/jbpm/test/cts/gateway/parallel/ParallelGatewaySplitTest.java</exclude>
             <exclude>org/jbpm/test/cts/node/NodeInputSetTest.java</exclude>
             <exclude>org/jbpm/test/cts/node/NodeOutputSetTest.java</exclude>
-            <exclude>org/jbpm/test/cts/processmanager/ProcessManagerTest.java</exclude>
-            <exclude>org/jbpm/test/cts/signalmanager/SignalManagerTest.java</exclude>
-            <exclude>org/jbpm/test/cts/startevent/StartEventSignalTest.java</exclude>
             <exclude>org/jbpm/test/cts/task/ReceiveTaskTest.java</exclude>
             <exclude>org/jbpm/test/cts/task/SendTaskTest.java</exclude>
             <exclude>org/jbpm/test/cts/task/TaskExecutionHandlerTest.java</exclude>
@@ -90,8 +86,6 @@
             <exclude>org/jbpm/test/pattern/control/parallelsplit/ParallelSplitTest.java</exclude>
             <exclude>org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java</exclude>
             <exclude>org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java</exclude>
-            <exclude>org/jbpm/test/pattern/data/casedata/CaseDataTest.java</exclude>
-            <exclude>org/jbpm/test/pattern/data/taskdata/TaskDataTest.java</exclude>
           </excludes>
         </configuration>
       </plugin>

Deleted: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/processmanager/ProcessManagerTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/processmanager/ProcessManagerTest.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/processmanager/ProcessManagerTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -1,90 +0,0 @@
-/*
- * 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.test.cts.processmanager;
-
-// $Id$
-
-import javax.management.ObjectName;
-
-import org.jbpm.api.client.SignalListener;
-import org.jbpm.api.model.Process;
-import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.model.builder.ProcessBuilder;
-import org.jbpm.api.model.builder.ProcessBuilderService;
-import org.jbpm.api.service.ProcessService;
-import org.jbpm.api.service.SignalService;
-import org.jbpm.api.test.CTSTestCase;
-
-/**
- * Test the ProcessService
- * 
- * @author thomas.diesler at jboss.com
- * @since 08-Jul-2008
- */
-public class ProcessManagerTest extends CTSTestCase
-{
-  public void testStartProcess() throws Exception
-  {
-    final Process proc = getProcess();
-    final ObjectName procID = proc.getKey();
-
-    final ProcessService procService = ProcessService.locateProcessService();
-    assertNull("A process created through the builder is not registered automatically", procService.getProcessByKey(procID));
-
-    SignalListener sigListener = new SignalListener()
-    {
-      public boolean acceptSignal(Signal signal)
-      {
-        return signal.getSignalType() == SignalType.SYSTEM_TASK_ENTER;
-      }
-
-      public void catchSignal(Signal signal)
-      {
-        assertNotNull(procService.getProcessByKey(procID));
-      }
-    };
-    SignalService sigManager = SignalService.locateSignalService();
-    sigManager.addSignalListener(sigListener);
-
-    try
-    {
-      // Start the process, which automatically adds it to the registery
-      assertEquals(procID, proc.startProcess());
-      proc.waitForEnd();
-    }
-    finally
-    {
-      sigManager.removeSignalListener(sigListener);
-    }
-
-    assertNull("A terminated process is removed from the registry", procService.getProcessByKey(procID));
-  }
-
-  private Process getProcess()
-  {
-    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
-    builder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("taskA");
-    Process proc = builder.addTask("taskA").addSequenceFlow("end").addEndEvent("end").getProcess();
-    return proc;
-  }
-}

Added: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessServiceTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessServiceTest.java	                        (rev 0)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessServiceTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -0,0 +1,86 @@
+/*
+ * 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.test.cts.service.process;
+
+// $Id$
+
+import org.jbpm.api.client.SignalListener;
+import org.jbpm.api.model.Process;
+import org.jbpm.api.model.Signal;
+import org.jbpm.api.model.Signal.SignalType;
+import org.jbpm.api.model.builder.ProcessBuilder;
+import org.jbpm.api.model.builder.ProcessBuilderService;
+import org.jbpm.api.service.ProcessService;
+import org.jbpm.api.service.SignalService;
+import org.jbpm.api.test.CTSTestCase;
+
+/**
+ * Test the ProcessService
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public class ProcessServiceTest extends CTSTestCase
+{
+  public void testStartProcess() throws Exception
+  {
+    final Process proc = getProcess();
+    final ProcessService procService = ProcessService.locateProcessService();
+    assertNull("Process not registered automatically", procService.getProcessByKey(proc.getKey()));
+
+    SignalListener sigListener = new SignalListener()
+    {
+      public boolean acceptSignal(Signal signal)
+      {
+        return signal.getSignalType() == SignalType.SYSTEM_TASK_ENTER;
+      }
+
+      public void catchSignal(Signal signal)
+      {
+        assertNotNull(procService.getProcessByKey(proc.getKey()));
+      }
+    };
+    SignalService sigManager = SignalService.locateSignalService();
+    sigManager.addSignalListener(sigListener);
+
+    try
+    {
+      // Start the process, which automatically adds it to the registery
+      proc.startProcess();
+      proc.waitForEnd();
+    }
+    finally
+    {
+      sigManager.removeSignalListener(sigListener);
+    }
+
+    assertNull("Process is removed", procService.getProcessByKey(proc.getKey()));
+  }
+
+  private Process getProcess()
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("taskA");
+    Process proc = builder.addTask("taskA").addSequenceFlow("end").addEndEvent("end").getProcess();
+    return proc;
+  }
+}


Property changes on: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessServiceTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/signal/SignalMultithreadTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/signal/SignalMultithreadTest.java	                        (rev 0)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/signal/SignalMultithreadTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -0,0 +1,149 @@
+/*
+ * 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.test.cts.service.signal;
+
+// $Id$
+
+import org.jbpm.api.client.SignalListener;
+import org.jbpm.api.model.Signal;
+import org.jbpm.api.model.Signal.SignalType;
+import org.jbpm.api.service.SignalService;
+import org.jbpm.api.test.CTSTestCase;
+
+/**
+ * Test the ProcessManager
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public class SignalMultithreadTest extends CTSTestCase
+{
+  final SignalService sigService = SignalService.locateSignalService();
+  final Signal sigA = new Signal(getTestID(), SignalType.USER_SIGNAL, "A");
+  final Signal sigB = new Signal(getTestID(), SignalType.USER_SIGNAL, "B");
+
+  private Signal gotA;
+  private Signal gotB;
+
+  public void testReentrantSingleThread() throws Exception
+  {
+    SignalListener sigListener = new SignalListener()
+    {
+      public boolean acceptSignal(Signal signal)
+      {
+        return signal.getSignalType() == SignalType.USER_SIGNAL;
+      }
+
+      public void catchSignal(Signal signal)
+      {
+        String sigMsg = signal.getMessage();
+        if ("A".equals(sigMsg))
+        {
+          gotA = signal;
+          sigService.throwSignal(sigB);
+        }
+        if ("B".equals(sigMsg))
+        {
+          gotB = signal;
+        }
+      }
+    };
+    sigService.addSignalListener(sigListener);
+    sigService.throwSignal(sigA);
+    sigService.removeSignalListener(sigListener);
+
+    assertEquals(sigA, gotA);
+    assertEquals(sigB, gotB);
+  }
+
+  public void testReentrantMultipleThread() throws Exception
+  {
+    SignalListener sigListener = new SignalListener()
+    {
+      public boolean acceptSignal(Signal signal)
+      {
+        return signal.getSignalType() == SignalType.USER_SIGNAL;
+      }
+
+      public void catchSignal(Signal signal)
+      {
+        String sigMsg = signal.getMessage();
+        if ("A".equals(sigMsg))
+        {
+          gotA = signal;
+          sendThreadSignal(sigB);
+        }
+        if ("B".equals(sigMsg))
+        {
+          gotB = signal;
+        }
+      }
+    };
+    sigService.addSignalListener(sigListener);
+    sendThreadSignal(sigA);
+    sigService.removeSignalListener(sigListener);
+
+    assertEquals(sigA, gotA);
+    assertEquals(sigB, gotB);
+  }
+
+  private void sendThreadSignal(Signal sig)
+  {
+    SignalRunner sigRunner = new SignalRunner(sig);
+    Thread thread = new Thread(sigRunner);
+    thread.start();
+    try
+    {
+      while (sigRunner.hasStarted() == false)
+      {
+        Thread.sleep(10);
+      }
+      thread.join();
+    }
+    catch (InterruptedException ex)
+    {
+      ex.printStackTrace();
+    }
+  }
+
+  class SignalRunner implements Runnable
+  {
+    private Signal threadSig;
+    private boolean hasStarted;
+
+    public SignalRunner(Signal sig)
+    {
+      this.threadSig = sig;
+    }
+
+    public boolean hasStarted()
+    {
+      return hasStarted;
+    }
+
+    public void run()
+    {
+      hasStarted = true;
+      sigService.throwSignal(threadSig);
+    }
+  }
+}


Property changes on: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/signal/SignalMultithreadTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Deleted: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/signalmanager/SignalManagerTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/signalmanager/SignalManagerTest.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/signalmanager/SignalManagerTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -1,149 +0,0 @@
-/*
- * 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.test.cts.signalmanager;
-
-// $Id$
-
-import org.jbpm.api.client.SignalListener;
-import org.jbpm.api.model.Signal;
-import org.jbpm.api.model.Signal.SignalType;
-import org.jbpm.api.service.SignalService;
-import org.jbpm.api.test.CTSTestCase;
-
-/**
- * Test the ProcessManager
- * 
- * @author thomas.diesler at jboss.com
- * @since 08-Jul-2008
- */
-public class SignalManagerTest extends CTSTestCase
-{
-  final SignalService sigManager = SignalService.locateSignalService();
-  final Signal sigA = new Signal(getTestID(), SignalType.USER_SIGNAL, "A");
-  final Signal sigB = new Signal(getTestID(), SignalType.USER_SIGNAL, "B");
-
-  private Signal gotA;
-  private Signal gotB;
-
-  public void testReentrantSingleThread() throws Exception
-  {
-    SignalListener sigListener = new SignalListener()
-    {
-      public boolean acceptSignal(Signal signal)
-      {
-        return signal.getSignalType() == SignalType.USER_SIGNAL;
-      }
-
-      public void catchSignal(Signal signal)
-      {
-        String sigMsg = signal.getMessage();
-        if ("A".equals(sigMsg))
-        {
-          gotA = signal;
-          sigManager.throwSignal(sigB);
-        }
-        if ("B".equals(sigMsg))
-        {
-          gotB = signal;
-        }
-      }
-    };
-    sigManager.addSignalListener(sigListener);
-    sigManager.throwSignal(sigA);
-    sigManager.removeSignalListener(sigListener);
-
-    assertEquals(sigA, gotA);
-    assertEquals(sigB, gotB);
-  }
-
-  public void testReentrantMultipleThread() throws Exception
-  {
-    SignalListener sigListener = new SignalListener()
-    {
-      public boolean acceptSignal(Signal signal)
-      {
-        return signal.getSignalType() == SignalType.USER_SIGNAL;
-      }
-
-      public void catchSignal(Signal signal)
-      {
-        String sigMsg = signal.getMessage();
-        if ("A".equals(sigMsg))
-        {
-          gotA = signal;
-          sendThreadSignal(sigB);
-        }
-        if ("B".equals(sigMsg))
-        {
-          gotB = signal;
-        }
-      }
-    };
-    sigManager.addSignalListener(sigListener);
-    sendThreadSignal(sigA);
-    sigManager.removeSignalListener(sigListener);
-
-    assertEquals(sigA, gotA);
-    assertEquals(sigB, gotB);
-  }
-
-  private void sendThreadSignal(Signal sig)
-  {
-    SignalRunner sigRunner = new SignalRunner(sig);
-    Thread thread = new Thread(sigRunner);
-    thread.start();
-    try
-    {
-      while (sigRunner.hasStarted() == false)
-      {
-        Thread.sleep(10);
-      }
-      thread.join();
-    }
-    catch (InterruptedException ex)
-    {
-      ex.printStackTrace();
-    }
-  }
-
-  class SignalRunner implements Runnable
-  {
-    private Signal threadSig;
-    private boolean hasStarted;
-
-    public SignalRunner(Signal sig)
-    {
-      this.threadSig = sig;
-    }
-
-    public boolean hasStarted()
-    {
-      return hasStarted;
-    }
-
-    public void run()
-    {
-      hasStarted = true;
-      sigManager.throwSignal(threadSig);
-    }
-  }
-}

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -30,7 +30,9 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Signal;
+import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.builder.EventBuilder;
 import org.jbpm.api.model.builder.MessageBuilder;
@@ -77,18 +79,20 @@
     // Wait for the process to end
     proc.waitForEnd();
 
-    // Start the process and send start trigger signal
-    proc.startProcess();
-    sigService.throwSignal(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
+    try
+    {
+      proc.startProcess();
+      fail("Cannot start process in state: Completed");
+    }
+    catch (IllegalStateException ex)
+    {
+      // expected
+    }
 
-    // Wait for the process to end
-    proc.waitForEnd();
-
     // Verify the result
     List<Message> messages = getMessages();
-    assertEquals(2, messages.size());
+    assertEquals(1, messages.size());
     assertEquals("TaskA", messages.get(0).getProperty("taskValue").getValue());
-    assertEquals("TaskA", messages.get(1).getProperty("taskValue").getValue());
   }
 
   public void testRestartBeforeEnd() throws Exception
@@ -104,6 +108,8 @@
     {
       // Start the process and send start trigger signal
       proc.startProcess();
+      
+      // This signal should be ignored
       sigManager.throwSignal(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
 
       // Wait for the process to end
@@ -116,9 +122,8 @@
 
     // Verify the result
     List<Message> messages = getMessages();
-    assertEquals(2, messages.size());
+    assertEquals(1, messages.size());
     assertEquals("TaskA", messages.get(0).getProperty("taskValue").getValue());
-    assertEquals("TaskA", messages.get(1).getProperty("taskValue").getValue());
   }
 
   public Process getProcess() throws IOException
@@ -127,7 +132,7 @@
     EventBuilder eventBuilder = procBuilder.addProcess("StartEventSignal").addStartEvent("StartA", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "A");
     TaskBuilder taskBuilder = procBuilder.addSequenceFlow("TaskA").addTask("TaskA");
-    //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValue");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValue");
     taskBuilder.addSequenceFlow("End");
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -27,7 +27,9 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -59,7 +61,7 @@
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("CaseData");
-    //procBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "CaseData_foo", "propValue");
+    procBuilder.addProcessAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "CaseData_foo", "propValue");
     procBuilder.addProcessProperty("foo", "bar").addStartEvent("Start").addSequenceFlow("TaskA");
     procBuilder.addTask("TaskA").addSequenceFlow("End");
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -27,7 +27,9 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
+import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -61,8 +63,8 @@
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("TaskData").addStartEvent("Start").addSequenceFlow("TaskA");
     TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
-    taskBuilder.addProcessProperty("foo", "bar").addSequenceFlow("End");
-    //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "TaskData_TaskA_foo", "foo");
+    taskBuilder.addNodeProperty("foo", "bar").addSequenceFlow("End");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "TaskData_TaskA_foo", "foo");
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("foo", null, true);

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -43,9 +43,9 @@
   private static final long serialVersionUID = 1L;
 
   @Id @GeneratedValue
-  private Integer id;
+  protected Integer id;
 
-  public Integer getId()
+  protected Integer getId()
   {
     return id;
   }
@@ -58,8 +58,32 @@
   /**
    * Called when the process is created
    */
-  protected void initialize(Process proc)
+  protected void create(Process proc)
   {
     // nothing to do
   }
+  
+  /**
+   * Called when the process is registered
+   */
+  protected void register(Process proc)
+  {
+    // nothing to do
+  }
+
+  /**
+   * Called when the process is unregistered
+   */
+  protected void unregister(Process proc)
+  {
+    // nothing to do
+  }
+
+  /**
+   * Called when the process is destroyed
+   */
+  protected void destroy(Process proc)
+  {
+    // nothing to do
+  }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -158,9 +158,9 @@
   }
 
   @Override
-  protected void initialize(Process proc)
+  protected void create(Process proc)
   {
-    super.initialize(proc);
+    super.create(proc);
     
     if (detailType == EventDetailType.Signal && signalRef == null)
       throw new InvalidProcessException("Event with detail type 'Signal' must have a signalRef");

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -308,9 +308,9 @@
   }
 
   @Override
-  protected void initialize(Process proc)
+  protected void create(Process proc)
   {
-    super.initialize(proc);
+    super.create(proc);
 
     // Set the associated process
     this.process = proc;

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -275,13 +275,13 @@
   }
 
   @Override
-  public void initialize(Process proc)
+  public void create(Process proc)
   {
     if (status != ProcessStatus.None)
       throw new IllegalStateException("Cannot initialize process in state: " + status);
 
     // Initialize the Element
-    super.initialize(this);
+    super.create(this);
 
     // Check required name
     if (name == null)
@@ -297,24 +297,45 @@
     for (Node node : getNodes())
     {
       NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.initialize(this);
+      nodeImpl.create(this);
     }
 
     status = ProcessStatus.Ready;
   }
   
-  public void resetProcess()
+  @Override
+  public void register(Process proc)
   {
-    log.debug("Reset process: " + this);
-    for (Node node : getNodes())
+    super.register(proc);
+    for (Node node : nodes)
     {
       NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.reset();
+      nodeImpl.register(this);
     }
-    status = ProcessStatus.Ready;
-    runtimeException = null;
   }
 
+  @Override
+  public void unregister(Process proc)
+  {
+    for (Node node : nodes)
+    {
+      NodeImpl nodeImpl = (NodeImpl)node;
+      nodeImpl.unregister(this);
+    }
+    super.unregister(proc);
+  }
+  
+  @Override
+  public void destroy(Process proc)
+  {
+    for (Node node : nodes)
+    {
+      NodeImpl nodeImpl = (NodeImpl)node;
+      nodeImpl.destroy(this);
+    }
+    super.destroy(proc);
+  }
+  
   protected void initializeMessageRef(MessageImpl msgRef)
   {
     String msgName = msgRef.getName();

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -30,12 +30,17 @@
 import org.jbpm.api.Constants;
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.client.SignalListener;
+import org.jbpm.api.model.Process;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.StartEvent;
+import org.jbpm.api.model.Process.ProcessStatus;
+import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.api.runtime.SignalHandler;
 import org.jbpm.api.runtime.Token;
+import org.jbpm.api.service.ExecutionService;
 import org.jbpm.api.service.SignalService;
 import org.jbpm.ri.model.builder.SingleOutFlowSupport;
 import org.slf4j.Logger;
@@ -57,6 +62,9 @@
   // Provide logging
   final static Logger log = LoggerFactory.getLogger(StartEventImpl.class);
 
+  // The start signal listener
+  private transient SignalListener startListener;
+
   public StartEventImpl(String name)
   {
     super(name);
@@ -107,9 +115,10 @@
     return new SignalHandler()
     {
       private static final long serialVersionUID = 1L;
-      
+
       ProcessEngine engine = getProcess().getProcessEngine();
       SignalService sigService = engine.getService(SignalService.class);
+
       public void throwEnterSignal(Token token)
       {
         Signal signal = new Signal(getKey(), Signal.SignalType.SYSTEM_START_EVENT_ENTER);
@@ -123,7 +132,79 @@
       }
     };
   }
-  
+
+  @Override
+  protected void register(final Process proc)
+  {
+    super.register(proc);
+
+    final ProcessEngine engine = proc.getProcessEngine();
+    
+    if (getTriggerType() == EventDetailType.Signal)
+    {
+      // Register the start signal listener
+      if (startListener == null)
+      {
+        final Signal startSignal = getSignalRef();
+        final StartEvent start = this;
+        startListener = new SignalListener()
+        {
+          public boolean acceptSignal(Signal signal)
+          {
+            SignalType expType = startSignal.getSignalType();
+            String expMsg = startSignal.getMessage();
+
+            String sigMsg = signal.getMessage();
+            SignalType sigType = signal.getSignalType();
+
+            boolean accept = (expType == sigType);
+            if (accept && expMsg != null)
+              accept = accept && expMsg.equals(sigMsg);
+
+            return accept;
+          }
+
+          public void catchSignal(Signal signal)
+          {
+            log.debug("catchSignal: " + signal);
+            ProcessStatus procStatus = proc.getProcessStatus();
+            if (procStatus == ProcessStatus.Ready)
+            {
+              log.debug("Start process from signal: " + signal);
+              ExecutionService execService = engine.getService(ExecutionService.class);
+              execService.startProcess(start, null);
+            }
+            else
+            {
+              log.debug("Ignore start signal for process: " + proc);
+            }
+          }
+
+          public String toString()
+          {
+            return start + "." + startSignal;
+          }
+        };
+        SignalService sigService = engine.getService(SignalService.class);
+        sigService.addSignalListener(startListener);
+      }
+    }
+  }
+
+  @Override
+  protected void unregister(final Process proc)
+  {
+    // Unregister the start signal listener
+    if (startListener != null)
+    {
+      ProcessEngine engine = proc.getProcessEngine();
+      SignalService sigService = engine.getService(SignalService.class);
+      sigService.removeSignalListener(startListener);
+      startListener = null;
+    }
+    super.unregister(proc);
+  }
+
   public String toString()
   {
     return "StartEvent[" + getName() + "]";

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -83,7 +83,7 @@
   public Process getProcess()
   {
     ProcessImpl procImpl = getProcessInternal();
-    procImpl.initialize(procImpl);
+    procImpl.create(procImpl);
     return procImpl;
   }
 

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -162,12 +162,8 @@
   private void startProcessPrepare(Process proc)
   {
     // Reset the process if already terminated
-    ProcessImpl procImpl = (ProcessImpl)proc;
-    if (isProcessTerminated(proc))
-      procImpl.resetProcess();
-    
     ProcessStatus procStatus = proc.getProcessStatus();
-    if (procStatus != ProcessStatus.Ready && procStatus != ProcessStatus.Active)
+    if (procStatus != ProcessStatus.Ready)
       throw new IllegalStateException("Cannot start process in state: " + procStatus);
 
     // Register the process if needed

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -82,7 +82,7 @@
     Transaction tx = session.beginTransaction();
     try
     {
-      session.saveOrUpdate(proc);
+      session.save(proc);
       tx.commit();
     }
     finally

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java	2008-09-30 18:45:02 UTC (rev 2452)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java	2008-09-30 20:13:45 UTC (rev 2453)
@@ -23,8 +23,12 @@
 
 // $Id$
 
+import javax.management.ObjectName;
+
 import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Process;
 import org.jbpm.api.service.ProcessService;
+import org.jbpm.ri.model.ProcessImpl;
 
 /**
  * The ProcessService is the entry point to create, find and otherwise manage processes.
@@ -39,4 +43,23 @@
   {
     super.setProcessEngine(engine);
   }
+
+  @Override
+  public ObjectName registerProcess(Process proc)
+  {
+    ObjectName procID = super.registerProcess(proc);
+    ProcessImpl procImpl = (ProcessImpl)proc;
+    procImpl.register(proc);
+    return procID;
+  }
+
+  @Override
+  public boolean unregisterProcess(Process proc)
+  {
+    boolean success = super.unregisterProcess(proc);
+    ProcessImpl procImpl = (ProcessImpl)proc;
+    procImpl.unregister(proc);
+    procImpl.destroy(proc);
+    return success;
+  }
 }
\ No newline at end of file




More information about the jbpm-commits mailing list