[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