[jbpm-commits] JBoss JBPM SVN: r2478 - in projects/spec/trunk/modules: cts/src/test/java/org/jbpm/test/cts/startevent and 2 other directories.
do-not-reply at jboss.org
do-not-reply at jboss.org
Sat Oct 4 10:22:42 EDT 2008
Author: thomas.diesler at jboss.com
Date: 2008-10-04 10:22:42 -0400 (Sat, 04 Oct 2008)
New Revision: 2478
Modified:
projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java
projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.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/ProcessDefinitionImpl.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/ProcessStructureImpl.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/service/ExecutionServiceImpl.java
projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java
projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java
Log:
Signal StartEvent creates new process instance
Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java 2008-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Event.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -55,6 +55,11 @@
EventType getEventType();
/**
+ * Get the detail type fopr this event
+ */
+ EventDetailType getDetailType();
+
+ /**
* Get the associated signal ref
*/
Signal getSignalRef();
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-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -24,8 +24,10 @@
// $Id$
import java.io.IOException;
-import java.util.List;
+import java.util.Set;
+import javax.management.ObjectName;
+
import org.jbpm.api.client.SignalListener;
import org.jbpm.api.model.Message;
import org.jbpm.api.model.Process;
@@ -40,6 +42,8 @@
import org.jbpm.api.model.builder.ProcessBuilder;
import org.jbpm.api.model.builder.ProcessBuilderService;
import org.jbpm.api.model.builder.TaskBuilder;
+import org.jbpm.api.service.ProcessDefinitionService;
+import org.jbpm.api.service.ProcessService;
import org.jbpm.api.service.SignalService;
import org.jbpm.api.test.CTSTestCase;
@@ -54,81 +58,38 @@
public void testStart() throws Exception
{
ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
- Process proc = procDef.newInstance();
+
+ // You need to register the process definition to activate the start trigger
+ ProcessDefinitionService procDefService = ProcessDefinitionService.locateProcessDefinitionService();
+ procDefService.registerProcessDefinition(procDef);
- proc.startProcess();
-
- // Send start trigger signal
- SignalService sigService = SignalService.locateSignalService();
- sigService.throwSignal(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
-
- // Wait for the process to end
- proc.waitForEnd();
-
- // Verify the result
- Message endMessage = getMessages().get(0);
- assertEquals("TaskA", endMessage.getProperty("taskValue").getValue());
- }
-
- public void testRestart() throws Exception
- {
- ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
Process proc = procDef.newInstance();
-
- // Start the process and send start trigger signal
- proc.startProcess();
- SignalService sigService = SignalService.locateSignalService();
- sigService.throwSignal(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
-
- // Wait for the process to end
- proc.waitForEnd();
-
try
{
proc.startProcess();
- fail("Cannot start process in state: Completed");
+ fail("Cannot obtain StartEvent.None to start the process explicitly");
}
catch (IllegalStateException ex)
{
// expected
}
- // Verify the result
- List<Message> messages = getMessages();
- assertEquals(1, messages.size());
- assertEquals("TaskA", messages.get(0).getProperty("taskValue").getValue());
- }
+ // Send start trigger signal
+ SignalService sigService = SignalService.locateSignalService();
+ sigService.throwSignal(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
- public void testRestartBeforeEnd() throws Exception
- {
- ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
- Process proc = procDef.newInstance();
-
- // Add a signal listener that sends the other start trigger signal
- TaskListener sigListener = new TaskListener(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
- SignalService sigManager = SignalService.locateSignalService();
- sigManager.addSignalListener(sigListener);
-
- try
- {
- // 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
+ // Get the just started process
+ ProcessService procService = ProcessService.locateProcessService();
+ Set<ObjectName> procIDs = procService.getProcesses("StartEventSignal", null);
+ proc = procService.getProcess(procIDs.iterator().next());
+
+ // Wait for the process to end
+ if (proc != null)
proc.waitForEnd();
- }
- finally
- {
- sigManager.removeSignalListener(sigListener);
- }
// Verify the result
- List<Message> messages = getMessages();
- assertEquals(1, messages.size());
- assertEquals("TaskA", messages.get(0).getProperty("taskValue").getValue());
+ Message endMessage = getMessages().get(0);
+ assertEquals("TaskA", endMessage.getProperty("taskValue").getValue());
}
public ProcessDefinition getProcessDefinition() throws IOException
Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java 2008-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -193,9 +193,4 @@
tokenExecutor.destroy(token);
}
}
-
- public String toString()
- {
- return "EndEvent[" + getName() + "]";
- }
}
\ 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-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -96,6 +96,12 @@
}
@Override
+ public EventDetailType getDetailType()
+ {
+ return detailType;
+ }
+
+ @Override
public Message getMessageRef()
{
return messageRef;
@@ -215,4 +221,9 @@
procDefImpl.initializeMessageRef(messageRef);
}
}
+
+ public String toString()
+ {
+ return getEventType() + "Event[" + getName() + "," + getDetailType() + "]";
+ }
}
\ No newline at end of file
Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java 2008-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -63,22 +63,7 @@
public ProcessDefinitionImpl(ProcessEngine engine, ProcessStructureImpl procStruct)
{
super(engine, procStruct);
-
- // Save the raw process structure
- try
- {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream(baos);
- oos.writeObject(procStruct);
- rawProcStruct = baos.toByteArray();
- }
- catch (IOException ex)
- {
- throw new IllegalStateException("Cannot serialize process structure", ex);
- }
-
- // Call the create life cycle
- procStruct.create(this);
+ create(this);
}
// Persistence ctor
@@ -147,6 +132,48 @@
}
}
+ @Override
+ protected void create(ProcessDefinition procDef)
+ {
+ super.create(procDef);
+
+ // Save the raw process structure
+ try
+ {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream(baos);
+ oos.writeObject(procStruct);
+ rawProcStruct = baos.toByteArray();
+ }
+ catch (IOException ex)
+ {
+ throw new IllegalStateException("Cannot serialize process structure", ex);
+ }
+
+ procStruct.create(this);
+ }
+
+ @Override
+ public void register(ProcessDefinition procDef)
+ {
+ super.register(procDef);
+ procStruct.register(procDef);
+ }
+
+ @Override
+ public void unregister(ProcessDefinition procDef)
+ {
+ super.unregister(procDef);
+ procStruct.unregister(procDef);
+ }
+
+ @Override
+ protected void destroy(ProcessDefinition procDef)
+ {
+ super.destroy(procDef);
+ procStruct.destroy(procDef);
+ }
+
public String toString()
{
return "ProcessDefinition[" + getName() + "]";
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-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -37,6 +37,7 @@
import org.jbpm.api.model.builder.ObjectNameFactory;
import org.jbpm.api.runtime.Attachments;
import org.jbpm.api.service.ExecutionService;
+import org.jbpm.api.service.ProcessService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -67,7 +68,7 @@
{
super(engine, procStruct);
this.procDef = procDef;
- procStruct.create(this);
+ create(this);
}
// Persistence ctor
@@ -126,8 +127,18 @@
{
ProcessEngine engine = getProcessEngine();
ExecutionService exService = engine.getService(ExecutionService.class);
- exService.startProcess(this, att);
- return getKey();
+ try
+ {
+ exService.startProcess(this, att);
+ return getKey();
+ }
+ catch (RuntimeException rte)
+ {
+ // A process that cannot be started id unregistered automatically
+ ProcessService procService = getProcessEngine().getService(ProcessService.class);
+ procService.unregisterProcess(getKey());
+ throw rte;
+ }
}
public ProcessStatus waitForEnd()
@@ -153,6 +164,13 @@
}
@Override
+ protected void create(Process proc)
+ {
+ super.create(proc);
+ procStruct.create(proc);
+ }
+
+ @Override
public void register(Process proc)
{
super.register(proc);
@@ -166,6 +184,13 @@
procStruct.unregister(proc);
}
+ @Override
+ protected void destroy(Process proc)
+ {
+ super.destroy(proc);
+ procStruct.destroy(proc);
+ }
+
public String toString()
{
return "Process[" + getName() + ",status=" + getProcessStatus() + "]";
Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java 2008-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -268,10 +268,42 @@
}
@Override
+ protected void register(ProcessDefinition procDef)
+ {
+ super.register(procDef);
+ for (Node node : getNodes())
+ {
+ NodeImpl nodeImpl = (NodeImpl)node;
+ nodeImpl.register(procDef);
+ }
+ }
+
+ @Override
+ protected void unregister(ProcessDefinition procDef)
+ {
+ super.unregister(procDef);
+ for (Node node : getNodes())
+ {
+ NodeImpl nodeImpl = (NodeImpl)node;
+ nodeImpl.unregister(procDef);
+ }
+ }
+
+ @Override
+ protected void destroy(ProcessDefinition procDef)
+ {
+ super.destroy(procDef);
+ for (Node node : getNodes())
+ {
+ NodeImpl nodeImpl = (NodeImpl)node;
+ nodeImpl.destroy(procDef);
+ }
+ }
+
+ @Override
protected void create(Process proc)
{
super.create(proc);
-
for (Node node : getNodes())
{
NodeImpl nodeImpl = (NodeImpl)node;
@@ -279,6 +311,39 @@
}
}
+ @Override
+ protected void register(Process proc)
+ {
+ super.register(proc);
+ for (Node node : getNodes())
+ {
+ NodeImpl nodeImpl = (NodeImpl)node;
+ nodeImpl.register(proc);
+ }
+ }
+
+ @Override
+ protected void unregister(Process proc)
+ {
+ super.unregister(proc);
+ for (Node node : getNodes())
+ {
+ NodeImpl nodeImpl = (NodeImpl)node;
+ nodeImpl.unregister(proc);
+ }
+ }
+
+ @Override
+ protected void destroy(Process proc)
+ {
+ super.destroy(proc);
+ for (Node node : getNodes())
+ {
+ NodeImpl nodeImpl = (NodeImpl)node;
+ nodeImpl.destroy(proc);
+ }
+ }
+
public String toString()
{
return "ProcessStructure[" + 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-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -33,6 +33,7 @@
import org.jbpm.api.client.SignalListener;
import org.jbpm.api.model.Node;
import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
import org.jbpm.api.model.ProcessStructure;
import org.jbpm.api.model.SequenceFlow;
import org.jbpm.api.model.Signal;
@@ -147,10 +148,10 @@
}
@Override
- protected void create(Process proc)
+ protected void register(final ProcessDefinition procDef)
{
- super.create(proc);
-
+ super.register(procDef);
+
final ProcessEngine engine = getProcessEngine();
final SignalService sigService = engine.getService(SignalService.class);
@@ -160,7 +161,7 @@
if (startListener == null)
{
final Signal startSignal = getSignalRef();
- final StartEvent start = this;
+ final String startEventName = getName();
startListener = new SignalListener()
{
public boolean acceptSignal(Signal signal)
@@ -182,14 +183,20 @@
{
log.debug("Start process from signal: " + signal);
sigService.removeSignalListener(startListener);
+
+ // There MAY be multiple Start Events for a given Process level. Each Start Event is an independent event.
+ // That is, a Process Instance SHALL be generated when the Start Event is triggered.
+ Process proc = procDef.newInstance();
+ StartEvent startEvent = proc.getNode(StartEvent.class, startEventName);
ExecutionService execService = engine.getService(ExecutionService.class);
- execService.startProcess(getProcess(), start, null);
+ execService.startProcess(proc, startEvent, null);
}
public String toString()
{
- return start + "." + startSignal;
+ StartEvent startEvent = procDef.getNode(StartEvent.class, startEventName);
+ return startEvent + "." + startSignal;
}
};
@@ -198,9 +205,4 @@
}
}
}
-
- public String toString()
- {
- return "StartEvent[" + getName() + "]";
- }
}
\ No newline at end of file
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-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -24,6 +24,7 @@
// $Id$
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import javax.management.ObjectName;
@@ -78,35 +79,35 @@
{
super.setProcessEngine(engine);
}
-
+
@Override
public void startProcess(Process proc, Attachments att)
{
- // Prepare the process for start
- startProcessPrepare(proc);
-
// Get the None Start Event if there is one and start the initial flow
StartEvent start = getNoneStartEvent(proc);
- if (start != null)
+ if (start == null)
{
- if (proc.getProcessStatus() == ProcessStatus.Active)
- throw new IllegalStateException("Cannot start an already active process");
-
- startProcessInternal(proc, start, att);
+ List<StartEvent> startEvents = proc.getNodes(StartEvent.class);
+ throw new IllegalStateException("Cannot obtain StartEvent.None to start the process explicitly: " + startEvents);
}
+
+ if (proc.getProcessStatus() == ProcessStatus.Active)
+ throw new IllegalStateException("Cannot start an already active process");
+
+ startProcessInternal(proc, start, att);
}
@Override
public void startProcess(Process proc, StartEvent start, Attachments att)
{
- // Prepare the process for start
- startProcessPrepare(proc);
-
startProcessInternal(proc, start, att);
}
private synchronized void startProcessInternal(Process proc, StartEvent start, Attachments att)
{
+ // Prepare the process to start
+ startProcessPrepare(proc);
+
@SuppressWarnings("serial")
class InitialFlow extends SequenceFlowImpl
{
@@ -116,20 +117,20 @@
setTargetRef(start);
}
}
-
+
RuntimeProcess rtProc = getRuntimeProcess(proc, false);
- boolean startProcessThread = (rtProc == null);
+ boolean startProcessThread = (rtProc == null);
// Create initial Token
TokenImpl initialToken = new TokenImpl(att);
InitialFlow initialFlow = new InitialFlow(start);
initialToken.setFlow(initialFlow);
-
- // Register the initial Token
+
+ // Register the initial Token
rtProc = getRuntimeProcess(proc, true);
TokenExecutor tokenExecutor = rtProc.getTokenExecutor();
tokenExecutor.create(initialToken, initialFlow);
-
+
// Start a new process thread
if (startProcessThread)
{
@@ -150,10 +151,10 @@
}
}
}
-
+
// Do the start time assignments
startTimeAssignments(proc, initialToken);
-
+
// Start the initial token
tokenExecutor.start(initialToken);
}
@@ -189,7 +190,7 @@
}
}
}
-
+
public ProcessStatus waitForEnd(Process proc)
{
return waitForEndInternal(proc, 0);
@@ -208,7 +209,7 @@
private ProcessStatus waitForEndInternal(Process proc, long timeout)
{
ProcessImpl procImpl = (ProcessImpl)proc;
-
+
ProcessStatus status = proc.getProcessStatus();
if (status == ProcessStatus.None)
throw new IllegalStateException("Cannot wait for process in state: " + status);
@@ -234,14 +235,14 @@
break;
}
}
-
+
// Start waiting to get notified
long waitTimeout = forever ? 0 : until - now;
proc.wait(waitTimeout);
}
now = System.currentTimeMillis();
}
-
+
// Throw timeout exception if it took too long
if (isProcessTerminated(proc) == false)
{
@@ -266,17 +267,16 @@
procService.unregisterProcess(proc.getKey());
}
-
status = proc.getProcessStatus();
return status;
}
-
+
private boolean isProcessTerminated(Process proc)
{
ProcessStatus status = proc.getProcessStatus();
return status == ProcessStatus.Cancelled || status == ProcessStatus.Completed || status == ProcessStatus.Aborted;
}
-
+
private StartEvent getNoneStartEvent(Process proc)
{
StartEvent start = null;
@@ -327,7 +327,7 @@
ProcessEngine engine = getProcessEngine();
SignalService sigService = engine.getService(SignalService.class);
-
+
ObjectName procID = proc.getKey();
String procName = proc.getName();
try
@@ -340,7 +340,7 @@
// Notify that the process is now Active
proc.notifyAll();
}
-
+
synchronized (rtProc)
{
// Wait until there are no more runnable tokens
@@ -355,9 +355,9 @@
log.error("Process interrupted", ex);
}
}
-
+
log.debug("End execution thread [proc=" + procName + ",status=" + proc.getProcessStatus() + "]");
-
+
if (proc.getProcessStatus() == ProcessStatus.Active)
procImpl.setProcessStatus(ProcessStatus.Completed);
}
@@ -371,7 +371,7 @@
ProcessService procService = engine.getService(ProcessService.class);
procService.unregisterProcess(procID);
runtimeProcesses.remove(procID);
-
+
// Notify that the process has now ended
proc.notifyAll();
}
Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java 2008-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -23,8 +23,12 @@
// $Id$
+import javax.management.ObjectName;
+
import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.ProcessDefinition;
import org.jbpm.api.service.ProcessDefinitionService;
+import org.jbpm.ri.model.ProcessDefinitionImpl;
/**
* The ProcessDefinitionService is the entry point to create, find and otherwise manage process definitions.
@@ -39,4 +43,23 @@
{
super.setProcessEngine(engine);
}
+
+ @Override
+ public ObjectName registerProcessDefinition(ProcessDefinition procDef)
+ {
+ ObjectName procDefID = super.registerProcessDefinition(procDef);
+ ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
+ procDefImpl.register(procDef);
+ return procDefID;
+ }
+
+ @Override
+ public boolean unregisterProcessDefinition(ObjectName procDefID)
+ {
+ ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)getProcessDefinition(procDefID);
+ if (procDefImpl != null)
+ procDefImpl.unregister(procDefImpl);
+
+ return super.unregisterProcessDefinition(procDefID);
+ }
}
\ No newline at end of file
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-10-04 12:59:53 UTC (rev 2477)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java 2008-10-04 14:22:42 UTC (rev 2478)
@@ -61,7 +61,9 @@
public boolean unregisterProcess(ObjectName procID)
{
ProcessImpl procImpl = (ProcessImpl)getProcess(procID);
- procImpl.unregister(procImpl);
+ if (procImpl != null)
+ procImpl.unregister(procImpl);
+
return super.unregisterProcess(procID);
}
}
\ No newline at end of file
More information about the jbpm-commits
mailing list