[jbpm-commits] JBoss JBPM SVN: r1912 - in jbossbpm/spec/trunk/modules: api/src/main/java/org/jboss/bpm/model and 4 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Sun Aug 17 17:03:51 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-08-17 17:03:51 -0400 (Sun, 17 Aug 2008)
New Revision: 1912

Added:
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/signalmanager/
   jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/signalmanager/SignalManagerTest.java
Modified:
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java
   jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java
   jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java
Log:
Sync signals

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java	2008-08-17 16:18:36 UTC (rev 1911)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/client/SignalManager.java	2008-08-17 21:03:51 UTC (rev 1912)
@@ -59,38 +59,47 @@
   /**
    * Add a SignalListener for a given process
    */
-  public synchronized void addSignalListener(String procName, SignalListener listener)
+  public void addSignalListener(String procName, SignalListener listener)
   {
-    log.debug("addSignalListener: " + procName + "=" + listener);
-    Set<SignalListener> set = listeners.get(procName);
-    if (set == null)
+    synchronized (listeners)
     {
-      set = new HashSet<SignalListener>();
-      listeners.put(procName, set);
+      log.debug("addSignalListener: " + procName + "=" + listener);
+      Set<SignalListener> set = listeners.get(procName);
+      if (set == null)
+      {
+        set = new HashSet<SignalListener>();
+        listeners.put(procName, set);
+      }
+      set.add(listener);
     }
-    set.add(listener);
   }
 
   /**
    * Remove an SignalListener for a given process
    */
-  public synchronized void removeSignalListener(String procName, SignalListener listener)
+  public void removeSignalListener(String procName, SignalListener listener)
   {
-    log.debug("removeSignalListener: " + procName + "=" + listener);
-    Set<SignalListener> set = listeners.get(procName);
-    if (set != null)
+    synchronized (listeners)
     {
-      set.remove(listener);
+      log.debug("removeSignalListener: " + procName + "=" + listener);
+      Set<SignalListener> set = listeners.get(procName);
+      if (set != null)
+      {
+        set.remove(listener);
+      }
     }
   }
 
   /**
    * Remove all SignalListener for a given process
    */
-  public synchronized void removeSignalListeners(String procName)
+  public void removeSignalListeners(String procName)
   {
-    log.debug("removeSignalListeners: " + procName);
-    listeners.remove(procName);
+    synchronized (listeners)
+    {
+      log.debug("removeSignalListeners: " + procName);
+      listeners.remove(procName);
+    }
   }
 
   /**
@@ -101,26 +110,32 @@
     log.debug("throwSignal: " + procName + "=" + signal);
 
     // Throw Signal to listeners associated with the process
-    Set<SignalListener> procListeners = listeners.get(procName);
-    if (procListeners != null)
+    Set<SignalListener> procListeners = getListenerSet(procName);
+    for (SignalListener listener : procListeners)
     {
-      for (SignalListener listener : procListeners)
-      {
-        failsafeThrow(listener, signal);
-      }
+      failsafeThrow(listener, signal);
     }
 
     // Throw Signal to listeners not associated with any process
-    Set<SignalListener> allProcListeners = listeners.get(null);
-    if (allProcListeners != null)
+    Set<SignalListener> allProcListeners = getListenerSet(null);
+    for (SignalListener listener : allProcListeners)
     {
-      for (SignalListener listener : allProcListeners)
-      {
-        failsafeThrow(listener, signal);
-      }
+      failsafeThrow(listener, signal);
     }
   }
 
+  private Set<SignalListener> getListenerSet(String procName)
+  {
+    synchronized (listeners)
+    {
+      HashSet<SignalListener> retSet = new HashSet<SignalListener>();
+      Set<SignalListener> listenerSet = listeners.get(procName);
+      if (listenerSet != null)
+        retSet.addAll(listenerSet);
+      return retSet;
+    }
+  }
+
   private void failsafeThrow(SignalListener listener, Signal signal)
   {
     try

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java	2008-08-17 16:18:36 UTC (rev 1911)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/model/Signal.java	2008-08-17 21:03:51 UTC (rev 1912)
@@ -46,7 +46,8 @@
     SYSTEM_GATEWAY_ENTER, SYSTEM_GATEWAY_EXIT, 
     SYSTEM_PROCESS_ENTER, SYSTEM_PROCESS_EXIT, 
     SYSTEM_SUB_PROCESS_ENTER, SYSTEM_SUB_PROCESS_EXIT, 
-    SYSTEM_TASK_ENTER, SYSTEM_TASK_EXIT, SYSTEM_TASK_TRIGGER
+    SYSTEM_TASK_ENTER, SYSTEM_TASK_EXIT, SYSTEM_TASK_TRIGGER,
+    USER_SIGNAL
   }
 
   private SignalType type;

Modified: jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java
===================================================================
--- jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java	2008-08-17 16:18:36 UTC (rev 1911)
+++ jbossbpm/spec/trunk/modules/api/src/main/java/org/jboss/bpm/test/AbstractAPITestCase.java	2008-08-17 21:03:51 UTC (rev 1912)
@@ -84,7 +84,10 @@
     // Setup the SignalListener
     SignalManager signalManager = SignalManager.locateSignalManager();
     signalManager.addSignalListener(null, getSignalListener());
-    signals.clear();
+    synchronized (signals)
+    {
+      signals.clear();
+    }
 
     // Setup the MessageListener
     MessageManager messageManager = MessageManager.locateMessageManager();
@@ -159,7 +162,10 @@
       {
         public void catchSignal(Signal signal)
         {
-          signals.add(signal);
+          synchronized (signals)
+          {
+            signals.add(signal);
+          }
         }
 
         public String toString()
@@ -173,8 +179,7 @@
 
   public List<Signal> getSignals()
   {
-    SignalManager signalManager = SignalManager.locateSignalManager();
-    synchronized (signalManager)
+    synchronized (signals)
     {
       return Collections.unmodifiableList(signals);
     }
@@ -182,8 +187,7 @@
 
   public List<Signal> getSignals(Signal.SignalType type)
   {
-    SignalManager signalManager = SignalManager.locateSignalManager();
-    synchronized (signalManager)
+    synchronized (signals)
     {
       List<Signal> retSignals = new ArrayList<Signal>();
       for (Signal sig : signals)

Modified: jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java
===================================================================
--- jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java	2008-08-17 16:18:36 UTC (rev 1911)
+++ jbossbpm/spec/trunk/modules/ri/src/main/java/org/jboss/bpm/model/internal/ProcessImpl.java	2008-08-17 21:03:51 UTC (rev 1912)
@@ -262,6 +262,9 @@
     if (status == ProcessStatus.None || status == ProcessStatus.Ready)
       throw new IllegalStateException("Cannot wait for process in state: " + status);
 
+    if (executorThread == null)
+      throw new IllegalStateException("No start signal, cannot obtain excutor thread");
+    
     // Wait a little for the process to end
     boolean forever = (timeout < 1);
     long now = System.currentTimeMillis();
@@ -270,27 +273,27 @@
     {
       while (forever || now < until)
       {
-        if (status == ProcessStatus.Cancelled || status == ProcessStatus.Completed || status == ProcessStatus.Aborted)
+        if (isProcessTerminated())
         {
-          if (runtimeException != null)
-            throw new BPMException("Process aborted", runtimeException);
+          if (getRuntimeException() != null)
+            throw new BPMException("Process aborted", getRuntimeException());
 
           break;
         }
 
         // Join the executor thread
-        executorThread.join(timeout);
+        getExecutorThread().join(timeout);
         now = System.currentTimeMillis();
       }
 
       // Throw timeout exception if it took too long
-      if (status != ProcessStatus.Cancelled && status != ProcessStatus.Completed && status != ProcessStatus.Aborted)
+      if (isProcessTerminated() == false)
       {
         RuntimeException rte = new ProcessTimeoutException("Process timeout after " + timeout + "ms for: " + getID());
         log.error(rte);
 
         log.error("Interrupt executor thread");
-        executorThread.interrupt();
+        getExecutorThread().interrupt();
 
         throw rte;
       }
@@ -308,6 +311,11 @@
     }
   }
 
+  private boolean isProcessTerminated()
+  {
+    return status == ProcessStatus.Cancelled || status == ProcessStatus.Completed || status == ProcessStatus.Aborted;
+  }
+
   public FlowObject getFlowObject(String name)
   {
     if (name == null)

Added: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/signalmanager/SignalManagerTest.java
===================================================================
--- jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/signalmanager/SignalManagerTest.java	                        (rev 0)
+++ jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/signalmanager/SignalManagerTest.java	2008-08-17 21:03:51 UTC (rev 1912)
@@ -0,0 +1,145 @@
+/*
+ * 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.jboss.bpm.cts.signalmanager;
+
+// $Id$
+
+import org.jboss.bpm.client.SignalListener;
+import org.jboss.bpm.client.SignalManager;
+import org.jboss.bpm.model.Signal;
+import org.jboss.bpm.model.Signal.SignalType;
+import org.jboss.bpm.test.DefaultEngineTestCase;
+
+/**
+ * Test the ProcessManager
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public class SignalManagerTest extends DefaultEngineTestCase
+{
+  final SignalManager sigManager = SignalManager.locateSignalManager();
+  final Signal sigA = new Signal(getShortName(), SignalType.USER_SIGNAL, "A");
+  final Signal sigB = new Signal(getShortName(), SignalType.USER_SIGNAL, "B");
+
+  private Signal gotA;
+  private Signal gotB;
+
+  public void testReentrantSingleThread() throws Exception
+  {
+    SignalListener sigListener = new SignalListener()
+    {
+      public void catchSignal(Signal signal)
+      {
+        String sigMsg = signal.getMessage();
+        if (signal.getSignalType() == SignalType.USER_SIGNAL)
+        {
+          if ("A".equals(sigMsg))
+          {
+            gotA = signal;
+            sigManager.throwSignal(getShortName(), sigB);
+          }
+          if ("B".equals(sigMsg))
+          {
+            gotB = signal;
+          }
+        }
+      }
+    };
+    sigManager.addSignalListener(getShortName(), sigListener);
+    sigManager.throwSignal(getShortName(), sigA);
+    sigManager.removeSignalListeners(getShortName());
+
+    assertEquals(sigA, gotA);
+    assertEquals(sigB, gotB);
+  }
+
+  public void testReentrantMultipleThread() throws Exception
+  {
+    SignalListener sigListener = new SignalListener()
+    {
+      public void catchSignal(Signal signal)
+      {
+        String sigMsg = signal.getMessage();
+        if (signal.getSignalType() == SignalType.USER_SIGNAL)
+        {
+          if ("A".equals(sigMsg))
+          {
+            gotA = signal;
+            sendThreadSignal(sigB);
+          }
+          if ("B".equals(sigMsg))
+          {
+            gotB = signal;
+          }
+        }
+      }
+    };
+    sigManager.addSignalListener(getShortName(), sigListener);
+    sendThreadSignal(sigA);
+    sigManager.removeSignalListeners(getShortName());
+
+    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(getShortName(), threadSig);
+    }
+  }
+}


Property changes on: jbossbpm/spec/trunk/modules/testsuite/src/test/java/org/jboss/bpm/cts/signalmanager/SignalManagerTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF




More information about the jbpm-commits mailing list