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

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Oct 2 16:44:53 EDT 2008


Author: thomas.diesler at jboss.com
Date: 2008-10-02 16:44:53 -0400 (Thu, 02 Oct 2008)
New Revision: 2468

Added:
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessDefinition.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessStructure.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessDefinitionService.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessBuilderTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessCatalog.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessDefinitionTest.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/ProcessStructureImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StructureDelegateImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java
Removed:
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/
Modified:
   projects/spec/trunk/modules/api/.classpath
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/client/Deployment.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/AbstractElement.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Node.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/DialectHandler.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ExecutionService.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/MessageService.java
   projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/PersistenceService.java
   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/.classpath
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewaySplitTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewaySplitTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewaySplitTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeInputSetTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeOutputSetTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodePropertyTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/persistence/PersistenceServiceTest.java
   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/startevent/StartEventSignalTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/exclusivechoice/ExclusiveChoiceTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/multichoice/MultiChoiceTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/parallelsplit/ParallelSplitTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/sequence/SequenceTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java
   projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.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/.classpath
   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/ComplexGatewayImpl.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/ExclusiveGatewayImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/GatewayImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/InclusiveGatewayImpl.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/ParallelGatewayImpl.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/ReceiveTaskImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.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/TaskImpl.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/runtime/DelegatingExecutionContext.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/RuntimeProcessImpl.java
   projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.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
   projects/spec/trunk/modules/impl/src/main/resources/jbpm-cfg-beans.xml
Log:
Add notion of ProcessDefinition

Modified: projects/spec/trunk/modules/api/.classpath
===================================================================
--- projects/spec/trunk/modules/api/.classpath	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/.classpath	2008-10-02 20:44:53 UTC (rev 2468)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/client/Deployment.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/client/Deployment.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/client/Deployment.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -32,12 +32,12 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.service.DialectHandler;
 import org.jbpm.api.service.DialectHandlerService;
 import org.jbpm.api.service.ProcessService;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 /**
  * A deployment, containing all information to create a process that will be deployed to the {@link ProcessService}
@@ -51,7 +51,7 @@
   private static final long serialVersionUID = 1L;
   
   private String procXML;
-  private Process process;
+  private ProcessDefinition process;
 
   public Deployment(String procXML)
   {
@@ -77,12 +77,12 @@
     procXML = strBuilder.toString();
   }
 
-  public Deployment(Process process)
+  public Deployment(ProcessDefinition procDef)
   {
-    this.process = process;
+    this.process = procDef;
   }
 
-  public Process getProcess(ProcessEngine engine)
+  public ProcessDefinition getProcessDefinition(ProcessEngine engine)
   {
     if (process == null)
     {
@@ -95,7 +95,7 @@
       if (dialectHandler == null)
         throw new IllegalStateException("Cannot obtain DialectHandler for: " + nsURI);
       
-      process = dialectHandler.createProcess(procXML);
+      process = dialectHandler.createProcessDefinition(procXML);
     }
     return process;
   }

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/AbstractElement.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/AbstractElement.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/AbstractElement.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,8 @@
 
 import javax.management.ObjectName;
 
+import org.jbpm.api.client.ProcessEngine;
+
 /**
  * The parrent of all Elements
  * 
@@ -39,4 +41,9 @@
    * Get the ID of this element
    */
   ObjectName getKey();
+  
+  /**
+   * Get the associated ProcessEngine
+   */
+  ProcessEngine getProcessEngine();
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Node.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Node.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Node.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -37,10 +37,19 @@
  */
 public interface Node extends AbstractElement, PropertySupport
 {
-  /** Get the associated Process */
+  /**
+   * Get the associated process definition 
+   */
+  ProcessDefinition getProcessDefinition();
+  
+  /**
+   * Get the associated process 
+   */
   Process getProcess();
 
-  /** Get the unique name. */
+  /** 
+   * Get the unique name. 
+   */
   String getName();
 
   /**
@@ -49,12 +58,18 @@
    */
   List<Assignment> getAssignments();
   
-  /** Get the associated ExecutionHandler */
+  /** 
+   * Get the associated ExecutionHandler 
+   */
   ExecutionHandler getExecutionHandler(boolean defaultHandler);
 
-  /** Get the associated SignalHandler */
+  /** 
+   * Get the associated SignalHandler 
+   */
   SignalHandler getSignalHandler(boolean defaultHandler);
 
-  /** Get the associated FlowHandler */
+  /** 
+   * Get the associated FlowHandler 
+   */
   FlowHandler getFlowHandler(boolean defaultHandler);
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/Process.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -23,12 +23,8 @@
 
 //$Id$
 
-import java.util.List;
-import java.util.Set;
-
 import javax.management.ObjectName;
 
-import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.runtime.Attachments;
 
 /**
@@ -37,7 +33,7 @@
  * @author thomas.diesler at jboss.com
  * @since 08-Jul-2008
  */
-public interface Process extends AbstractElement, PropertySupport
+public interface Process extends ProcessStructure
 {
   /**
    * Defines the status a {@link Process} can be in
@@ -48,62 +44,16 @@
   }
 
   /**
-   * Get the associated ProcessEngine
+   * Get the associated ProcessDefinition
    */
-  ProcessEngine getProcessEngine();
+  ProcessDefinition getProcessDefinition();
   
   /**
-   * Get the unique name.
-   */
-  String getName();
-  
-  /**
    * Get the process state
    */
   ProcessStatus getProcessStatus();
-  
-  /**
-   * Get the list of nodes
-   */
-  List<Node> getNodes();
 
   /**
-   * Get a list of nodes of a given type.
-   */
-  <T extends Node> List<T> getNodes(Class<T> clazz);
-
-  /**
-   * Get a node of a given type and name
-   */
-  <T extends Node> T getNode(Class<T> clazz, String name);
-
-  /**
-   * Get a node by name.
-   * @return null if not found
-   */
-  Node getNode(String name);
-  
-  /**
-   * One or more assignment expressions MAY be made for the object. The Assignment SHALL be performed as defined by the
-   * AssignTime attribute.
-   */
-  List<Assignment> getAssignments();
-  
-  /**
-   * Get the list of associated {@link Message} objects.
-   * @return An empty list if there are none
-   */
-  Set<Message> getMessages();
-
-  /**
-   * Get an associated {@link Message} by name.
-   * @return null if not found
-   */
-  Message getMessage(String msgName);
-  
-  // Runtime Aspects ==================================================================================================== 
-  
-  /**
    * Start the process
    */
   ObjectName startProcess();
@@ -114,18 +64,16 @@
   ObjectName startProcess(Attachments att);
 
   /**
-   * All Tokens that are generated at the Start Event for that Process must eventually arrive at an End Event. 
-   * The Process will be in a running state until all Tokens are consumed.
-   * <p/>
-   * This method until the process ends without timeout.
+   * All Tokens that are generated at the Start Event for that Process must eventually arrive at an End Event. The
+   * Process will be in a running state until all Tokens are consumed. <p/> This method until the process ends without
+   * timeout.
    */
   ProcessStatus waitForEnd();
-  
+
   /**
-   * All Tokens that are generated at the Start Event for that Process must eventually arrive at an End Event. 
-   * The Process will be in a running state until all Tokens are consumed.
-   * <p/>
-   * This method until the process ends with a given timeout.
+   * All Tokens that are generated at the Start Event for that Process must eventually arrive at an End Event. The
+   * Process will be in a running state until all Tokens are consumed. <p/> This method until the process ends with a
+   * given timeout.
    */
   ProcessStatus waitForEnd(long timeout);
 }
\ No newline at end of file

Added: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessDefinition.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessDefinition.java	                        (rev 0)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessDefinition.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,39 @@
+/*
+ * 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.api.model;
+
+//$Id$
+
+/**
+ * A ProcessDefinition defines the structure of an activity performed within a company or organization.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public interface ProcessDefinition extends ProcessStructure
+{
+  /**
+   * Create a new instance of this process definition
+   */
+  Process newInstance();
+
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessDefinition.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessStructure.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessStructure.java	                        (rev 0)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessStructure.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,83 @@
+/*
+ * 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.api.model;
+
+//$Id$
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * A ProcessStructure defines the structure of a Process 
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+public interface ProcessStructure extends AbstractElement, PropertySupport
+{
+  /**
+   * Get the unique name.
+   */
+  String getName();
+
+  /**
+   * Get the list of nodes
+   */
+  List<Node> getNodes();
+
+  /**
+   * Get a list of nodes of a given type.
+   */
+  <T extends Node> List<T> getNodes(Class<T> clazz);
+
+  /**
+   * Get a node of a given type and name
+   */
+  <T extends Node> T getNode(Class<T> clazz, String name);
+
+  /**
+   * Get a node by name.
+   * 
+   * @return null if not found
+   */
+  Node getNode(String name);
+
+  /**
+   * One or more assignment expressions MAY be made for the object. The Assignment SHALL be performed as defined by the
+   * AssignTime attribute.
+   */
+  List<Assignment> getAssignments();
+
+  /**
+   * Get the list of associated {@link Message} objects.
+   * 
+   * @return An empty list if there are none
+   */
+  Set<Message> getMessages();
+
+  /**
+   * Get an associated {@link Message} by name.
+   * 
+   * @return null if not found
+   */
+  Message getMessage(String msgName);
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/ProcessStructure.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/StartEvent.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,6 +28,9 @@
  * the Flow of the Process, and thus, will not have any incoming Sequence Flow. A Start Event can have a Trigger that
  * indicates how the Process starts: Message, Timer, Rule, Link, or Multiple.
  * 
+ * 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.
+ * 
  * @author thomas.diesler at jboss.com
  * @since 08-Jul-2008
  */

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/model/builder/ProcessBuilder.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -26,6 +26,7 @@
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Property;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
@@ -50,12 +51,11 @@
   ProcessBuilder addProcess(String name);
 
   /**
-   * Get the {@link Process}. 
+   * Get the {@link ProcessDefinition}. 
    * <p/> 
    * This is the final call to the ProcessBuilder after all elements have been added.
-   * The {@link Process} is initialized and put in state READY
    */
-  Process getProcess();
+  ProcessDefinition getProcessDefinition();
 
   /**
    * Add a SequenceFlow with a given name

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/DialectHandler.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/DialectHandler.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/DialectHandler.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,6 +28,7 @@
 import java.net.URI;
 import java.net.URL;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 
 /**
  * The DialectHandler converts a supported dialect to the Process model.
@@ -48,13 +49,13 @@
    * Create a {@link Process} from a descriptor.
    * @param isInclude TODO
    */
-  Process createProcess(String pXML);
+  ProcessDefinition createProcessDefinition(String pXML);
 
   /**
    * Create a {@link Process} from a descriptor URL.
    * @param isInclude TODO
    */
-  Process createProcess(URL pURL) throws IOException;
+  ProcessDefinition createProcessDefinition(URL pURL) throws IOException;
 
   /**
    * Marshall the process to the given writer

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ExecutionService.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ExecutionService.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ExecutionService.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -68,7 +68,7 @@
    * @param start The StartEvent that triggers the process
    * @param att The Attachments in the ExecutionContext
    */
-  public abstract void startProcess(StartEvent start, Attachments att);
+  public abstract void startProcess(Process proc, StartEvent start, Attachments att);
 
   /**
    * All Tokens that are generated at the Start Event for that Process must eventually arrive at an End Event. The

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/MessageService.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/MessageService.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/MessageService.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -36,8 +36,8 @@
 import org.jbpm.api.model.Event;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.Participant;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.Participant;
 import org.jbpm.api.model.Task;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -134,7 +134,7 @@
   public void sendMessage(ObjectName procID, String targetName, Message msg)
   {
     ProcessService procService = ProcessService.locateProcessService();
-    Process proc = procService.getProcessByKey(procID);
+    Process proc = procService.getProcess(procID);
     if (proc == null)
       throw new IllegalStateException("Cannot obtain registered process: " + procID);
 

Modified: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/PersistenceService.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/PersistenceService.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/PersistenceService.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -26,6 +26,7 @@
 import javax.management.ObjectName;
 
 import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Process;
 
 /**
@@ -46,6 +47,21 @@
   }
   
   /**
+   * Save the ProcessDefinition to persistent storage
+   */
+  public abstract ObjectName saveProcessDefinition(ProcessDefinition procDef);
+
+  /**
+   * Load the ProcessDefinition from persistent storage
+   */
+  public abstract ProcessDefinition loadProcessDefinition(ObjectName procDefID);
+
+  /**
+   * Delete the ProcessDefinition from persistent storage
+   */
+  public abstract void deleteProcessDefinition(ProcessDefinition procDef);
+  
+  /**
    * Save the Process to persistent storage
    */
   public abstract ObjectName saveProcess(Process proc);
@@ -53,11 +69,10 @@
   /**
    * Load the Process from persistent storage
    */
-  public abstract Process loadProcess(ObjectName key);
+  public abstract Process loadProcess(ObjectName procID);
 
   /**
    * Delete the Process from persistent storage
    */
   public abstract void deleteProcess(Process proc);
-  
 }
\ No newline at end of file

Added: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessDefinitionService.java
===================================================================
--- projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessDefinitionService.java	                        (rev 0)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessDefinitionService.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,162 @@
+/*
+ * 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.api.service;
+
+//$Id$
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.jbpm.api.client.Deployment;
+import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.ProcessDefinition;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The ProcessDefinitionService is the entry point to create, find and otherwise manage process definitions.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 25-Sep-2008
+ */
+public abstract class ProcessDefinitionService extends AbstractService
+{
+  // Provide logging
+  final static Logger log = LoggerFactory.getLogger(ProcessDefinitionService.class);
+
+  // The set of registered ProcessDefinitions
+  private Map<ObjectName, ProcessDefinition> procDefs = new HashMap<ObjectName, ProcessDefinition>();
+
+  // Hide public constructor
+  protected ProcessDefinitionService()
+  {
+  }
+  
+  /**
+   * Locate the default ProcessDefinitionService
+   */
+  public static ProcessDefinitionService locateProcessDefinitionService()
+  {
+    ProcessEngine engine = ProcessEngine.getProcessEngine();
+    return engine.getService(ProcessDefinitionService.class);
+  }
+  
+  /** 
+   * Deploy a new ProcessDefinition to the ProcessDefinition service. 
+   */
+  public ObjectName deploy(Deployment dep)
+  {
+    // Get the associated engine
+    ProcessEngine engine = getProcessEngine();
+    
+    // Get the ProcessDefinition from the deployment
+    ProcessDefinition procDef = dep.getProcessDefinition(engine);
+    if (procDef == null)
+      throw new IllegalStateException("Cannot obtain ProcessDefinition from: " + dep);
+    
+    ObjectName procDefID = registerProcessDefinition(procDef);
+    return procDefID;
+  }
+  
+  /**
+   * Register a ProcessDefinition.
+   */
+  public ObjectName registerProcessDefinition(ProcessDefinition procDef)
+  {
+    if (getProcessDefinitionByName(procDef.getName()) != null)
+      throw new IllegalStateException("Process definition already registered: " + procDef);
+    
+    log.debug("registerProcessDefinition: " + procDef);
+    
+    // Save the ProcessDefinition through the PersistenceService
+    PersistenceService dbService = getProcessEngine().getService(PersistenceService.class);
+    ObjectName procDefID = dbService.saveProcessDefinition(procDef);
+    
+    procDefs.put(procDefID, procDef);
+    return procDefID;
+  }
+
+  /**
+   * Unregister a ProcessDefinition.
+   */
+  public boolean unregisterProcessDefinition(ObjectName procDefID)
+  {
+    boolean removed = false;
+    ProcessDefinition procDef = procDefs.get(procDefID);
+    if (procDef != null)
+    {
+      log.debug("unregisterProcessDefinition: " + procDef);
+      
+      ProcessEngine engine = getProcessEngine();
+      
+      // Unregister the associated process instances
+      ProcessService procService = engine.getService(ProcessService.class);
+      for (ObjectName procID : procService.getProcesses(procDef.getName(), null))
+        procService.unregisterProcess(procID);
+        
+      // Delete the ProcessDefinition through the PersistenceService
+      PersistenceService dbService = engine.getService(PersistenceService.class);
+      dbService.deleteProcessDefinition(procDef);
+      
+      procDefs.remove(procDefID);
+      removed = true;
+    }
+    return removed;
+  }
+
+  /**
+   * Get a ProcessDefinition for a given id
+   */
+  public ProcessDefinition getProcessDefinition(ObjectName procDefID)
+  {
+    return procDefs.get(procDefID);
+  }
+
+  /**
+   * Get a ProcessDefinition for a given name
+   */
+  public ProcessDefinition getProcessDefinitionByName(String name)
+  {
+    ProcessDefinition procDef = null;
+    for (ProcessDefinition auxDef : procDefs.values())
+    {
+      if (auxDef.getName().equals(name))
+      {
+        procDef = auxDef;
+        break;
+      }
+    }
+    return procDef;
+  }
+
+  /**
+   * Get the set of registered ProcessDefinition names
+   */
+  public Set<ObjectName> getProcessDefinitions()
+  {
+    return Collections.unmodifiableSet(procDefs.keySet());
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessDefinitionService.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/service/ProcessService.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -31,7 +31,6 @@
 
 import javax.management.ObjectName;
 
-import org.jbpm.api.client.Deployment;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Process;
 import org.jbpm.api.model.Process.ProcessStatus;
@@ -66,23 +65,6 @@
     return engine.getService(ProcessService.class);
   }
   
-  /** 
-   * Deploy a new process to the process service. 
-   */
-  public ObjectName deploy(Deployment dep)
-  {
-    // Get the associated engine
-    ProcessEngine engine = getProcessEngine();
-    
-    // Get the process from the deployment
-    Process proc = dep.getProcess(engine);
-    if (proc == null)
-      throw new IllegalStateException("Cannot obtain process from: " + dep);
-    
-    ObjectName procID = registerProcess(proc);
-    return procID;
-  }
-  
   /**
    * Register a Process.
    */
@@ -101,10 +83,11 @@
   /**
    * Unregister a Process.
    */
-  public boolean unregisterProcess(Process proc)
+  public boolean unregisterProcess(ObjectName procID)
   {
     boolean removed = false;
-    if (registeredProcs.containsKey(proc.getKey()))
+    Process proc = registeredProcs.get(procID);
+    if (proc != null)
     {
       log.debug("unregisterProcess: " + proc);
       
@@ -112,27 +95,16 @@
       PersistenceService dbService = getProcessEngine().getService(PersistenceService.class);
       dbService.deleteProcess(proc);
       
-      registeredProcs.remove(proc.getKey());
+      registeredProcs.remove(procID);
       removed = true;
     }
     return removed;
   }
 
   /**
-   * Unregister a set of Processes by name.
-   */
-  public void unregisterProcess(String procName)
-  {
-    log.debug("unregisterProcess: " + procName);
-    
-    for (Process proc : getProcesses(procName, null))
-      unregisterProcess(proc);
-  }
-
-  /**
    * Get a Process for a given id
    */
-  public Process getProcessByKey(ObjectName procID)
+  public Process getProcess(ObjectName procID)
   {
     Process proc = registeredProcs.get(procID);
     return proc;
@@ -141,10 +113,9 @@
   /**
    * Get the set of registered Processes
    */
-  public Set<Process> getProcesses()
+  public Set<ObjectName> getProcesses()
   {
-    Set<Process> procSet = new HashSet<Process>(registeredProcs.values());
-    return Collections.unmodifiableSet(procSet);
+    return Collections.unmodifiableSet(registeredProcs.keySet());
   }
 
   /**
@@ -154,15 +125,15 @@
    * @param status The optional process status
    * @return An empty set if the process cannot be found
    */
-  public Set<Process> getProcesses(String name, ProcessStatus status)
+  public Set<ObjectName> getProcesses(String name, ProcessStatus status)
   {
-    Set<Process> procSet = new HashSet<Process>();
-    for (Process aux : registeredProcs.values())
+    Set<ObjectName> procSet = new HashSet<ObjectName>();
+    for (Process auxProc : registeredProcs.values())
     {
-      if (aux.getName().equals(name))
+      if (auxProc.getName().equals(name))
       {
-        if (status == null || aux.getProcessStatus() == status)
-          procSet.add(aux);
+        if (status == null || auxProc.getProcessStatus() == status)
+          procSet.add(auxProc.getKey());
       }
     }
     return procSet;

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/api/src/main/java/org/jbpm/api/test/CTSTestCase.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -38,11 +38,11 @@
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Message;
-import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.api.service.MessageService;
-import org.jbpm.api.service.ProcessService;
+import org.jbpm.api.service.ProcessDefinitionService;
 import org.jbpm.api.service.SignalService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -67,12 +67,20 @@
   private MessageListener messageListener;
   // The messages caught by this test case
   private List<Message> messages = new ArrayList<Message>();
+  // Unregister this process definition on tearDown
+  private ProcessDefinition procDef;
   
   protected ProcessEngine getProcessEngine()
   {
     return ProcessEngine.getProcessEngine();
   }
   
+  protected ProcessDefinition unregisterOnTearDown(ProcessDefinition procDef)
+  {
+    this.procDef = procDef;
+    return procDef;
+  }
+
   @Override
   protected void setUp() throws Exception
   {
@@ -109,9 +117,16 @@
     MessageService msgService = engine.getService(MessageService.class);
     msgService.removeMessageListener(getTestID());
 
+    // Auto unregister
+    ProcessDefinitionService procDefService = ProcessDefinitionService.locateProcessDefinitionService();
+    if (procDef != null)
+    {
+      procDefService.unregisterProcessDefinition(procDef.getKey());
+      procDef = null;
+    }
+    
     // Check that there are no registered processes left
-    ProcessService procManager = engine.getService(ProcessService.class);
-    Set<Process> procs = procManager.getProcesses();
+    Set<ObjectName> procs = procDefService.getProcessDefinitions();
     if (procs.size() > 0)
     {
       String logMsg = "Registered processes on tear down of " + getName() + ": " + procs;

Modified: projects/spec/trunk/modules/cts/.classpath
===================================================================
--- projects/spec/trunk/modules/cts/.classpath	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/.classpath	2008-10-02 20:44:53 UTC (rev 2468)
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
 	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/endevent/EndEventMessageTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -44,7 +45,8 @@
 {
   public void testStart() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Start the process
     BasicAttachments att = new BasicAttachments();
@@ -59,7 +61,7 @@
     assertEquals("the frog", endMessage.getProperty("kermit").getValue());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("EndEventMessage").addStartEvent("Start");
@@ -67,7 +69,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("kermit", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewayMergeTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,6 +28,7 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
@@ -54,7 +55,8 @@
 {
   public void testGateA() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     SignalService sigManager = SignalService.locateSignalService();
@@ -83,7 +85,8 @@
 
   public void testGateB() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     SignalService sigManager = SignalService.locateSignalService();
@@ -112,7 +115,8 @@
 
   public void testInvalidToken() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     SignalService sigManager = SignalService.locateSignalService();
@@ -164,7 +168,7 @@
     assertEquals("TaskA", endMessage.getProperty("taskValue").getValue());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
@@ -181,8 +185,7 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValue", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 
   class MergeListener implements SignalListener

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewaySplitTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewaySplitTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/exclusive/ExclusiveGatewaySplitTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 import java.util.List;
 
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.Gateway.GatewayType;
@@ -47,7 +48,8 @@
 {
   public void testGateA() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "5");
@@ -61,7 +63,8 @@
 
   public void testGateB() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "15");
@@ -75,7 +78,8 @@
 
   public void testInvalidGate() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "10");
@@ -91,7 +95,7 @@
     }
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split");
@@ -99,7 +103,6 @@
     gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
     gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo > 10");
     procBuilder.addEndEvent("EndA").addEndEvent("EndB");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewayMergeTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,6 +28,7 @@
 
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Gateway.GatewayType;
@@ -49,7 +50,8 @@
 {
   public void testGateA() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     SignalService sigService = SignalService.locateSignalService();
@@ -74,7 +76,7 @@
     assertEquals(2, endSignals.size());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
@@ -83,8 +85,7 @@
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     procBuilder.addSequenceFlow("Merge").addGateway("Merge", GatewayType.Inclusive).addSequenceFlow("End");
     procBuilder.addEndEvent("End");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 
   class MergeListener implements SignalListener

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewaySplitTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewaySplitTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/inclusive/InclusiveGatewaySplitTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 import java.util.List;
 
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.Gateway.GatewayType;
@@ -47,7 +48,8 @@
 {
   public void testGateA() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "5");
@@ -60,7 +62,8 @@
 
   public void testGateB() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "15");
@@ -72,7 +75,7 @@
     assertEquals("EndB", endSignals.get(0).getFromRef().getKeyProperty("name"));
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("InclusiveGatewaySplitTest").addStartEvent("Start").addSequenceFlow("Split");
@@ -80,7 +83,6 @@
     gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
     gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo < 20");
     procBuilder.addEndEvent("EndA").addEndEvent("EndB");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewayMergeTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,8 +28,11 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 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.Gateway.GatewayType;
 import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.builder.EventBuilder;
@@ -52,7 +55,8 @@
 {
   public void testParallelMerge() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     SignalService sigManager = SignalService.locateSignalService();
@@ -81,7 +85,8 @@
 
   public void testMergeTimeout() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Start the process and send start trigger signal
     proc.startProcess();
@@ -102,7 +107,8 @@
 
   public void testInvalidToken() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     SignalService sigManager = SignalService.locateSignalService();
@@ -154,25 +160,24 @@
     assertEquals("TaskB", endMessage.getProperty("taskValueB").getValue());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess(getName()).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'", "taskValueA");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValueA");
     taskBuilder.addSequenceFlow("Merge");
     eventBuilder = procBuilder.addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     taskBuilder = procBuilder.addSequenceFlow("TaskB").addTask("TaskB");
-    //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValueB");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValueB");
     taskBuilder.addSequenceFlow("Merge");
     procBuilder.addGateway("Merge", GatewayType.Parallel).addSequenceFlow("End");
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValueA", null, true).addProperty("taskValueB", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 
   public static class MergeListener implements SignalListener

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewaySplitTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewaySplitTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/gateway/parallel/ParallelGatewaySplitTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,6 +29,7 @@
 import javax.management.ObjectName;
 
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Gateway.GatewayType;
 import org.jbpm.api.model.Signal.SignalType;
@@ -47,7 +48,9 @@
 {
   public void testParallelSplit() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
 
@@ -61,12 +64,11 @@
     assertTrue("Unexpected from refs: " + fromRefs, fromRefs.contains("EndB"));
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ParallelGatewaySplit").addStartEvent("Start").addSequenceFlow("Split");
     procBuilder.addGateway("Split", GatewayType.Parallel).addSequenceFlow("EndA").addSequenceFlow("EndB");
-    Process proc = procBuilder.addEndEvent("EndA").addEndEvent("EndB").getProcess();
-    return proc;
+    return procBuilder.addEndEvent("EndA").addEndEvent("EndB").getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeInputSetTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeInputSetTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeInputSetTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -48,7 +49,8 @@
 {
   public void testValidProps() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("frog", "kermit");
@@ -62,7 +64,8 @@
 
   public void testInvalidProps() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("pig", "piggy");
@@ -78,7 +81,7 @@
     }
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ActivityInputSet").addStartEvent("Start").addSequenceFlow("TaskA");
@@ -87,7 +90,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("frog", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeOutputSetTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeOutputSetTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodeOutputSetTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -48,7 +49,8 @@
 {
   public void testValidProps() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     proc.startProcess();
     proc.waitForEnd();
@@ -58,7 +60,7 @@
     assertEquals("kermit", endMessage.getProperty("frog").getValue());
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ActivityInputSet").addStartEvent("Start").addSequenceFlow("TaskA");
@@ -67,7 +69,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("frog", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodePropertyTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodePropertyTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/node/NodePropertyTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
@@ -50,7 +51,9 @@
 {
   public void testActivityPropertyRead() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
     
@@ -59,7 +62,7 @@
     assertEquals("bar", endMessage.getProperty("propValue").getValue());
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ActivityProperties").addStartEvent("Start").addSequenceFlow("TaskA");
@@ -69,7 +72,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("propValue", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/process/ProcessPropertyTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
@@ -55,7 +56,9 @@
    */
   public void testProcessProperties() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
 
@@ -64,7 +67,7 @@
     assertEquals("bar", endMessage.getProperty("propValue").getValue());
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ProcessProperties").addStartEvent("Start").addSequenceFlow("TaskA");
@@ -73,7 +76,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("propValue", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/persistence/PersistenceServiceTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/persistence/PersistenceServiceTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/persistence/PersistenceServiceTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -26,10 +26,14 @@
 import javax.management.ObjectName;
 
 import org.jbpm.api.ProcessNotFoundException;
+import org.jbpm.api.model.EndEvent;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.model.StartEvent;
+import org.jbpm.api.model.Task;
 import org.jbpm.api.service.PersistenceService;
 import org.jbpm.api.test.CTSTestCase;
-import org.jbpm.test.cts.service.processbuilder.ProcessCatalog;
+import org.jbpm.test.cts.service.process.ProcessCatalog;
 
 /**
  * Test the PersistenceService
@@ -40,21 +44,68 @@
 public class PersistenceServiceTest extends CTSTestCase
 {
   /**
-   * Test save, load, delete of a trivial process
+   * Test save, load, delete of a trivial ProcessDefinition
    */
-  public void testSaveLoadDelete() throws Exception
+  public void testProcessDefinition() throws Exception
   {
     PersistenceService service = PersistenceService.locatePersistenceService();
 
-    // Save the process
-    Process proc = ProcessCatalog.getDefaultProcess();
+    // Save the ProcessDefinition
+    ProcessDefinition procDef = ProcessCatalog.getDefaultProcess();
+    service.saveProcessDefinition(procDef);
+
+    // Load the ProcessDefinition
+    ObjectName procDefID = procDef.getKey();
+    ProcessDefinition loadDef = service.loadProcessDefinition(procDefID);
+    ProcessCatalog.validateDefaultProcess(loadDef);
+
+    StartEvent start = loadDef.getNode(StartEvent.class, "Start");
+    Task task = loadDef.getNode(Task.class, "Task");
+    EndEvent end = loadDef.getNode(EndEvent.class, "End");
+    
+    assertSame(loadDef, start.getProcessDefinition());
+    assertSame(loadDef, task.getProcessDefinition());
+    assertSame(loadDef, end.getProcessDefinition());
+
+    // Delete the ProcessDefinition
+    service.deleteProcessDefinition(procDef);
+    try
+    {
+      service.loadProcessDefinition(procDefID);
+      fail("ProcessNotFoundException expected");
+    }
+    catch (ProcessNotFoundException ex)
+    {
+      // expected
+    }
+  }
+
+  /**
+   * Test save, load, delete of a trivial Process
+   */
+  public void testProcess() throws Exception
+  {
+    PersistenceService service = PersistenceService.locatePersistenceService();
+
+    ProcessDefinition procDef = unregisterOnTearDown(ProcessCatalog.getDefaultProcess());
+    Process proc = procDef.newInstance();
+
+    // Save the Process
     service.saveProcess(proc);
 
     // Load the process
     ObjectName procID = proc.getKey();
-    Process procLoad = service.loadProcess(procID);
-    ProcessCatalog.validateDefaultProcess(procLoad);
+    Process loadProc = service.loadProcess(procID);
+    ProcessCatalog.validateDefaultProcess(loadProc);
 
+    StartEvent start = loadProc.getNode(StartEvent.class, "Start");
+    Task task = loadProc.getNode(Task.class, "Task");
+    EndEvent end = loadProc.getNode(EndEvent.class, "End");
+    
+    assertSame(loadProc, start.getProcess());
+    assertSame(loadProc, task.getProcess());
+    assertSame(loadProc, end.getProcess());
+    
     // Delete the process
     service.deleteProcess(proc);
     try

Copied: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessBuilderTest.java (from rev 2450, projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/ProcessBuilderTest.java)
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessBuilderTest.java	                        (rev 0)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessBuilderTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,172 @@
+/*
+ * 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.InvalidProcessException;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.model.builder.ProcessBuilder;
+import org.jbpm.api.model.builder.ProcessBuilderService;
+import org.jbpm.api.test.CTSTestCase;
+
+/**
+ * Test the ProcessBuilder
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 24-Sep-2008
+ */
+public class ProcessBuilderTest extends CTSTestCase
+{
+  public void testBasicProcess() throws Exception
+  {
+    ProcessDefinition procDef = ProcessCatalog.getDefaultProcess();
+    ProcessCatalog.validateDefaultProcess(procDef);
+  }
+
+  public void testNoProcessName() throws Exception
+  {
+    try
+    {
+      ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+      builder.addProcess(null).addStartEvent("Start").addSequenceFlow("Task");
+      builder.addTask("Task").addSequenceFlow("End").addEndEvent("End");
+      builder.getProcessDefinition();
+      fail("Process name required");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testNoStartName() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addStartEvent(null).addSequenceFlow("Task");
+    builder.addTask("Task").addSequenceFlow("End").addEndEvent("End");
+    try
+    {
+      builder.getProcessDefinition();
+      fail("StartEvent name required");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testNoTaskName() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addStartEvent("Start").addSequenceFlow("Task");
+    builder.addTask(null).addSequenceFlow("End").addEndEvent("End");
+    try
+    {
+      builder.getProcessDefinition();
+      fail("Task name required");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testNoEndName() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addStartEvent("Start").addSequenceFlow("Task");
+    builder.addTask("Task").addSequenceFlow("End").addEndEvent(null);
+    try
+    {
+      builder.getProcessDefinition();
+      fail("EndEvent name required");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testNoStartEvent() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addTask("Task").addSequenceFlow("End").addEndEvent("End");
+    try
+    {
+      builder.getProcessDefinition();
+      fail("StartEvent required");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testNoEndEvent() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addStartEvent("Start").addSequenceFlow("Task");
+    builder.addTask("Task");
+    try
+    {
+      builder.getProcessDefinition();
+      fail("EndEvent required");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testUnreachableNode() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addStartEvent("Start").addSequenceFlow("Task1");
+    builder.addTask("Task1").addSequenceFlow("End").addTask("Task2").addSequenceFlow("End").addEndEvent("End");
+    try
+    {
+      builder.getProcessDefinition();
+      fail("Unreachable node Task2");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+
+  public void testDeadEndNode() throws Exception
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addStartEvent("Start").addSequenceFlow("Task");
+    builder.addTask("Task").addEndEvent("End");
+    try
+    {
+      builder.getProcessDefinition();
+      fail("Dead end Task");
+    }
+    catch (InvalidProcessException e)
+    {
+      // expected
+    }
+  }
+}

Copied: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessCatalog.java (from rev 2450, projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/processbuilder/ProcessCatalog.java)
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessCatalog.java	                        (rev 0)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessCatalog.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,91 @@
+/*
+ * 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 junit.framework.TestCase;
+
+import org.jbpm.api.model.EndEvent;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.model.ProcessStructure;
+import org.jbpm.api.model.SequenceFlow;
+import org.jbpm.api.model.StartEvent;
+import org.jbpm.api.model.Task;
+import org.jbpm.api.model.builder.ProcessBuilder;
+import org.jbpm.api.model.builder.ProcessBuilderService;
+
+/**
+ * A catalog of CTS test processes
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 24-Sep-2008
+ */
+public abstract class ProcessCatalog
+{
+  public static ProcessDefinition getDefaultProcess()
+  {
+    ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
+    builder.addProcess("Proc").addProcessProperty("proP1", "valP1").addProcessProperty("proP2", "valP2");
+    builder.addStartEvent("Start").addSequenceFlow("Task");
+    builder.addTask("Task").addNodeProperty("proT1", "valT1").addNodeProperty("proT2", "valT2");
+    builder.addSequenceFlow("End").addEndEvent("End");
+    return builder.getProcessDefinition();
+  }
+
+  public static void validateDefaultProcess(ProcessStructure procStruct)
+  {
+    TestCase.assertNotNull("Process not null", procStruct);
+    TestCase.assertEquals("Proc", procStruct.getName());
+
+    TestCase.assertEquals("Two proc props", 2, procStruct.getPropertyNames().size());
+    TestCase.assertEquals("valP1", procStruct.getProperty("proP1").getValue());
+    TestCase.assertEquals("valP2", procStruct.getProperty("proP2").getValue());
+    
+    StartEvent start = (StartEvent)procStruct.getNode("Start");
+    Task task = (Task)procStruct.getNode("Task");
+    EndEvent end = (EndEvent)procStruct.getNode("End");
+
+    TestCase.assertNotNull("Start not null", start);
+    TestCase.assertNotNull("Task not null", task);
+    TestCase.assertNotNull("End not null", end);
+
+    TestCase.assertEquals("No start props", 0, start.getPropertyNames().size());
+    TestCase.assertEquals("Two task props", 2, task.getPropertyNames().size());
+    TestCase.assertEquals("No end props", 0, end.getPropertyNames().size());
+    
+    TestCase.assertEquals("valT1", task.getProperty("proT1").getValue());
+    TestCase.assertEquals("valT2", task.getProperty("proT2").getValue());
+    
+    SequenceFlow startFlow = start.getOutFlow();
+    TestCase.assertNotNull("Start flow not null", startFlow);
+    TestCase.assertEquals("Task", startFlow.getTargetName());
+    TestCase.assertSame(start, startFlow.getSourceRef());
+    TestCase.assertSame(task, startFlow.getTargetRef());
+
+    SequenceFlow taskFlow = task.getOutFlow();
+    TestCase.assertNotNull("Task flow not null", taskFlow);
+    TestCase.assertEquals("End", taskFlow.getTargetName());
+    TestCase.assertSame(task, taskFlow.getSourceRef());
+    TestCase.assertSame(end, taskFlow.getTargetRef());
+  }
+}

Added: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessDefinitionTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessDefinitionTest.java	                        (rev 0)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessDefinitionTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,72 @@
+/*
+ * 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 java.util.Set;
+
+import javax.management.ObjectName;
+
+import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.service.ProcessDefinitionService;
+import org.jbpm.api.service.ProcessService;
+import org.jbpm.api.test.CTSTestCase;
+
+/**
+ * Test the ProcessDefinition
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 24-Sep-2008
+ */
+public class ProcessDefinitionTest extends CTSTestCase
+{
+  public void testBasicProcess() throws Exception
+  {
+    ProcessDefinition procDef = ProcessCatalog.getDefaultProcess();
+    ProcessCatalog.validateDefaultProcess(procDef);
+    
+    ProcessEngine engine = procDef.getProcessEngine();
+    assertNotNull("Process engine not null", engine);
+    
+    ProcessDefinitionService procDefService = engine.getService(ProcessDefinitionService.class);
+    ProcessService procService = engine.getService(ProcessService.class);
+    
+    Set<ObjectName> procDefs = procDefService.getProcessDefinitions();
+    assertEquals("ProcessDefinition not automatically registered", 0, procDefs.size());
+    
+    try
+    {
+      Process proc = procDef.newInstance();
+      assertNotNull("Process not null", proc);
+      
+      assertNotNull("Process registered", procService.getProcess(proc.getKey()));
+      assertNotNull("ProcessDefinition registered", procDefService.getProcessDefinition(procDef.getKey()));
+    }
+    finally
+    {
+      procDefService.unregisterProcessDefinition(procDef.getKey());
+    }
+  }
+}


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

Modified: 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	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/service/process/ProcessServiceTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -25,6 +25,7 @@
 
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -43,9 +44,10 @@
 {
   public void testStartProcess() throws Exception
   {
-    final Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    final Process proc = procDef.newInstance();
     final ProcessService procService = ProcessService.locateProcessService();
-    assertNull("Process not registered automatically", procService.getProcessByKey(proc.getKey()));
+    assertNull("Process not registered automatically", procService.getProcess(proc.getKey()));
 
     SignalListener sigListener = new SignalListener()
     {
@@ -56,7 +58,7 @@
 
       public void catchSignal(Signal signal)
       {
-        assertNotNull(procService.getProcessByKey(proc.getKey()));
+        assertNotNull(procService.getProcess(proc.getKey()));
       }
     };
     SignalService sigManager = SignalService.locateSignalService();
@@ -73,14 +75,13 @@
       sigManager.removeSignalListener(sigListener);
     }
 
-    assertNull("Process is removed", procService.getProcessByKey(proc.getKey()));
+    assertNull("Process is removed", procService.getProcess(proc.getKey()));
   }
 
-  private Process getProcess()
+  private ProcessDefinition getProcessDefinition()
   {
     ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
     builder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("taskA");
-    Process proc = builder.addTask("taskA").addSequenceFlow("end").addEndEvent("end").getProcess();
-    return proc;
+    return builder.addTask("taskA").addSequenceFlow("end").addEndEvent("end").getProcessDefinition();
   }
 }

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/startevent/StartEventSignalTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,6 +29,7 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
@@ -52,10 +53,12 @@
 {
   public void testStart() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
-    // Start the process and send start trigger signal
     proc.startProcess();
+
+    // Send start trigger signal
     SignalService sigService = SignalService.locateSignalService();
     sigService.throwSignal(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A"));
 
@@ -69,7 +72,8 @@
 
   public void testRestart() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Start the process and send start trigger signal
     proc.startProcess();
@@ -97,7 +101,8 @@
 
   public void testRestartBeforeEnd() throws Exception
   {
-    Process proc = getProcess();
+    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"));
@@ -126,7 +131,7 @@
     assertEquals("TaskA", messages.get(0).getProperty("taskValue").getValue());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess("StartEventSignal").addStartEvent("StartA", EventDetailType.Signal);
@@ -137,8 +142,7 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValue", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 
   public static class TaskListener implements SignalListener

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/ReceiveTaskTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -31,6 +31,7 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Signal.SignalType;
@@ -41,6 +42,7 @@
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
 import org.jbpm.api.service.MessageService;
+import org.jbpm.api.service.ProcessDefinitionService;
 import org.jbpm.api.service.ProcessService;
 import org.jbpm.api.service.SignalService;
 import org.jbpm.api.test.CTSTestCase;
@@ -60,7 +62,7 @@
     procBuilder.addTask("TaskA", TaskType.Receive).addSequenceFlow("End").addEndEvent("End");
     try
     {
-      procBuilder.getProcess();
+      procBuilder.getProcessDefinition();
       fail("A Message for the MessageRef attribute MUST be entered");
     }
     catch (InvalidProcessException ex)
@@ -71,7 +73,8 @@
 
   public void testUnregisteredProcess() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     MessageService msgManager = MessageService.locateMessageService();
     try
@@ -87,9 +90,12 @@
 
   public void testSuspendedMessage() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinitionService procDefService = ProcessDefinitionService.locateProcessDefinitionService();
     ProcessService procService = ProcessService.locateProcessService();
     
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     ObjectName procID = procService.registerProcess(proc);
     try
     {
@@ -102,7 +108,7 @@
     }
     finally
     {
-      procService.unregisterProcess(proc);
+      procDefService.unregisterProcessDefinition(procDef.getKey());
     }
 
     Message endMsg = getMessages().get(0);
@@ -112,7 +118,8 @@
 
   public void testSuspendedToken() throws Exception
   {
-    final Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    final Process proc = procDef.newInstance();
     SignalListener sigListener = new SignalListener()
     {
       private boolean sendMessage = true;
@@ -158,7 +165,7 @@
     return msg;
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("ReceiveTaskTest");
@@ -168,6 +175,6 @@
     procBuilder.addTask("TaskA", TaskType.Receive).addMessageRef("ReceiveTaskMessage");
     EventBuilder eventBuilder = procBuilder.addSequenceFlow("End").addEndEvent("End", EventDetailType.Message);
     eventBuilder.addMessageRef("EndEventMessage");
-    return procBuilder.getProcess();
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/SendTaskTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,6 +29,7 @@
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Task.TaskType;
 import org.jbpm.api.model.builder.MessageBuilder;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -46,7 +47,8 @@
 {
   public void testSendTask() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
     
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "bar");
@@ -65,7 +67,7 @@
     procBuilder.addTask("TaskA", TaskType.Send).addSequenceFlow("End").addEndEvent("End");
     try
     {
-      procBuilder.getProcess();
+      procBuilder.getProcessDefinition();
       fail("A Message for the MessageRef attribute MUST be entered");
     }
     catch (InvalidProcessException ex)
@@ -74,7 +76,7 @@
     }
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     MessageBuilder msgBuilder = procBuilder.addProcess("SendTaskTest").addProcessMessage("SendTaskMessage");
@@ -82,7 +84,6 @@
     procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
     procBuilder.addTask("TaskA", TaskType.Send).addMessageRef("SendTaskMessage");
     procBuilder.addSequenceFlow("End").addEndEvent("End");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/cts/task/TaskExecutionHandlerTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -25,8 +25,9 @@
 
 import java.io.IOException;
 
-import org.jbpm.api.model.Assignment;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.builder.ProcessBuilder;
 import org.jbpm.api.model.builder.ProcessBuilderService;
@@ -47,7 +48,9 @@
 {
   public void testExecutionHandler() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
     
@@ -57,17 +60,17 @@
     assertEquals(Boolean.TRUE, TaskExecutionHandler.taskAssign);
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("TaskExecutionHandlerTest").addProcessProperty("procProp", "kermit");
-    procBuilder.addProcessAssignment(Assignment.AssignTime.Start, ExpressionLanguage.MVEL, "TaskExecutionHandlerTest_procProp == 'kermit'", "procAssign");
+    procBuilder.addProcessAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "TaskExecutionHandlerTest_procProp == 'kermit'", "procAssign");
     procBuilder.addStartEvent("Start").addSequenceFlow("TaskA");
     TaskBuilder taskBuilder = procBuilder.addTask("TaskA");
     taskBuilder.addNodeProperty("taskProp", "piggy").addExecutionHandler(TaskExecutionHandler.class).addSequenceFlow("End");
-    taskBuilder.addNodeAssignment(Assignment.AssignTime.Start, ExpressionLanguage.MVEL, "TaskExecutionHandlerTest_TaskA_taskProp == 'piggy'", "taskAssign");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "TaskExecutionHandlerTest_TaskA_taskProp == 'piggy'", "taskAssign");
     procBuilder.addEndEvent("End");
-    return procBuilder.getProcess();
+    return procBuilder.getProcessDefinition();
   }
 
   @SuppressWarnings("serial")

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/exclusivechoice/ExclusiveChoiceTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/exclusivechoice/ExclusiveChoiceTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/exclusivechoice/ExclusiveChoiceTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,6 +28,7 @@
 
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.builder.GatewayBuilder;
@@ -47,7 +48,8 @@
 {
   public void testGateA() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "5");
@@ -61,7 +63,8 @@
 
   public void testGateB() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "15");
@@ -75,7 +78,8 @@
 
   public void testInvalidGate() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "10");
@@ -91,7 +95,7 @@
     }
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split");
@@ -99,7 +103,6 @@
     gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
     gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo > 10");
     procBuilder.addEndEvent("EndA").addEndEvent("EndB");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/multichoice/MultiChoiceTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/multichoice/MultiChoiceTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/multichoice/MultiChoiceTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -28,6 +28,7 @@
 
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.builder.GatewayBuilder;
@@ -47,7 +48,8 @@
 {
   public void testGateA() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "5");
@@ -60,7 +62,8 @@
 
   public void testGateB() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     BasicAttachments att = new BasicAttachments();
     att.addAttachment("foo", "15");
@@ -72,7 +75,7 @@
     assertEquals("EndB", endSignals.get(0).getFromRef().getKeyProperty("name"));
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("MultiChoiceTest").addStartEvent("Start").addSequenceFlow("Split");
@@ -80,7 +83,6 @@
     gatewayBuilder.addConditionalGate("EndA", ExpressionLanguage.MVEL, "foo < 10");
     gatewayBuilder.addConditionalGate("EndB", ExpressionLanguage.MVEL, "foo < 20");
     procBuilder.addEndEvent("EndA").addEndEvent("EndB");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/parallelsplit/ParallelSplitTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/parallelsplit/ParallelSplitTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/parallelsplit/ParallelSplitTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -30,6 +30,7 @@
 
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Signal.SignalType;
 import org.jbpm.api.model.builder.ProcessBuilder;
@@ -47,7 +48,9 @@
 {
   public void testParallelSplit() throws Exception 
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
     
@@ -61,11 +64,11 @@
     assertTrue("Unexpected from refs: " + fromRefs, fromRefs.contains("EndB"));
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
-    Process proc = procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split").addGateway("Split", Gateway.GatewayType.Parallel).
-    addSequenceFlow("EndA").addSequenceFlow("EndB").addEndEvent("EndA").addEndEvent("EndB").getProcess();
-    return proc;
+    procBuilder.addProcess(getName()).addStartEvent("Start").addSequenceFlow("Split").addGateway("Split", Gateway.GatewayType.Parallel).
+    addSequenceFlow("EndA").addSequenceFlow("EndB").addEndEvent("EndA").addEndEvent("EndB");
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/sequence/SequenceTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/sequence/SequenceTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/sequence/SequenceTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,13 +27,13 @@
 import java.util.List;
 
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 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.test.CTSTestCase;
 
-
 /**
  * Test the basic execution sequence
  * 
@@ -44,8 +44,10 @@
 {
   public void testSequence() throws Exception
   {
-    Process proc = getProcess();
-    
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+
+    Process proc = procDef.newInstance();
+
     // Start the Process
     proc.startProcess();
     proc.waitForEnd();
@@ -62,12 +64,11 @@
     assertEquals(SignalType.SYSTEM_PROCESS_EXIT, signals.get(7).getSignalType());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder builder = ProcessBuilderService.locateProcessBuilder();
     builder.addProcess("Proc").addStartEvent("Start").addSequenceFlow("Task");
     builder.addTask("Task").addSequenceFlow("End").addEndEvent("End");
-    Process proc = builder.getProcess();
-    return proc;
+    return builder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/simplemerge/SimpleMergeTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,6 +29,7 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Signal.SignalType;
@@ -49,10 +50,11 @@
 {
   public void testSimpleMerge() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
-    MergeListener sigListener = new MergeListener(proc.getName(), new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "B"));          
+    MergeListener sigListener = new MergeListener(procDef.getName(), new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "B"));          
     SignalService sigManager = SignalService.locateSignalService();
     sigManager.addSignalListener(sigListener);
 
@@ -74,7 +76,7 @@
     assertEquals(2, endSignals.size());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess(getName()).addStartEvent("StartA", EventDetailType.Signal);
@@ -83,8 +85,7 @@
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     procBuilder.addSequenceFlow("Merge").addGateway("Merge", Gateway.GatewayType.Inclusive).addSequenceFlow("End");
     procBuilder.addEndEvent("End");
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 
   class MergeListener implements SignalListener

Modified: projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java
===================================================================
--- projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/control/synchronization/SynchronizationTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,8 +29,11 @@
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 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;
@@ -52,7 +55,8 @@
 {
   public void testParallelMerge() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     MergeListener sigListener = new MergeListener(new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "B"));
@@ -81,7 +85,8 @@
 
   public void testMergeTimeout() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Start the process and send start trigger signal
     proc.startProcess();
@@ -102,7 +107,8 @@
 
   public void testInvalidToken() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
 
     // Add a signal listener that sends the other start trigger signal
     Signal startTrigger = new Signal(getTestID(), SignalType.SYSTEM_START_TRIGGER, "A");
@@ -156,25 +162,24 @@
     assertEquals("TaskB", endMessage.getProperty("taskValueB").getValue());
   }
 
-  public Process getProcess() throws IOException
+  public ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     EventBuilder eventBuilder = procBuilder.addProcess("Synchronization").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'", "taskValueA");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskA'", "taskValueA");
     taskBuilder.addSequenceFlow("Merge");
     eventBuilder = procBuilder.addStartEvent("StartB", EventDetailType.Signal);
     eventBuilder.addSignalRef(SignalType.SYSTEM_START_TRIGGER, "B");
     taskBuilder = procBuilder.addSequenceFlow("TaskB").addTask("TaskB");
-    //taskBuilder.addAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValueB");
+    taskBuilder.addNodeAssignment(AssignTime.Start, ExpressionLanguage.MVEL, "'TaskB'", "taskValueB");
     taskBuilder.addSequenceFlow("Merge");
     procBuilder.addGateway("Merge", Gateway.GatewayType.Parallel).addSequenceFlow("End");
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("taskValueA", null, true).addProperty("taskValueB", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 
   public static class MergeListener implements SignalListener

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/casedata/CaseDataTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
@@ -48,7 +49,9 @@
 {
   public void testCaseProperties() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
 
@@ -57,7 +60,7 @@
     assertEquals("bar", endMessage.getProperty("propValue").getValue());
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("CaseData");
@@ -67,7 +70,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("propValue", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }
\ No newline at end of file

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/cts/src/test/java/org/jbpm/test/pattern/data/taskdata/TaskDataTest.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
@@ -49,7 +50,9 @@
 {
   public void testTaskDataRead() throws Exception
   {
-    Process proc = getProcess();
+    ProcessDefinition procDef = unregisterOnTearDown(getProcessDefinition());
+    Process proc = procDef.newInstance();
+    
     proc.startProcess();
     proc.waitForEnd();
     
@@ -58,7 +61,7 @@
     assertEquals("bar", endMessage.getProperty("foo").getValue());
   }
 
-  protected Process getProcess() throws IOException
+  protected ProcessDefinition getProcessDefinition() throws IOException
   {
     ProcessBuilder procBuilder = ProcessBuilderService.locateProcessBuilder();
     procBuilder.addProcess("TaskData").addStartEvent("Start").addSequenceFlow("TaskA");
@@ -68,7 +71,6 @@
     procBuilder.addEndEvent("End", EventDetailType.Message).addMessageRef("EndMessage");
     MessageBuilder msgBuilder = procBuilder.addProcessMessage("EndMessage");
     msgBuilder.addToRef(getTestID()).addProperty("foo", null, true);
-    Process proc = procBuilder.getProcess();
-    return proc;
+    return procBuilder.getProcessDefinition();
   }
 }

Modified: projects/spec/trunk/modules/impl/.classpath
===================================================================
--- projects/spec/trunk/modules/impl/.classpath	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/.classpath	2008-10-02 20:44:53 UTC (rev 2468)
@@ -4,7 +4,7 @@
 	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
 	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
 	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/AbstractElementImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -24,12 +24,15 @@
 //$Id$
 
 import javax.management.ObjectName;
+import javax.persistence.Column;
 import javax.persistence.GeneratedValue;
 import javax.persistence.Id;
 import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
 
+import org.jbpm.api.InvalidProcessException;
+import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.AbstractElement;
-import org.jbpm.api.model.Process;
 
 /**
  * The parrent of all Elements
@@ -45,45 +48,36 @@
   @Id @GeneratedValue
   protected Integer id;
 
-  protected Integer getId()
+  @Column
+  private String engineName;
+  
+  protected AbstractElementImpl(ProcessEngine engine)
   {
-    return id;
+    if (engine == null)
+      throw new InvalidProcessException("Process engine cannot be null");
+    
+    this.engineName = engine.getName();
   }
 
-  /**
-   * Get the key for this element
-   */
-  public abstract ObjectName getKey();
-
-  /**
-   * Called when the process is created
-   */
-  protected void create(Process proc)
+  // Persistence ctor
+  protected AbstractElementImpl()
   {
-    // nothing to do
   }
   
-  /**
-   * Called when the process is registered
-   */
-  protected void register(Process proc)
+  protected Integer getId()
   {
-    // nothing to do
+    return id;
   }
 
   /**
-   * Called when the process is unregistered
+   * Get the key for this element
    */
-  protected void unregister(Process proc)
-  {
-    // nothing to do
-  }
+  public abstract ObjectName getKey();
 
-  /**
-   * Called when the process is destroyed
-   */
-  protected void destroy(Process proc)
+  @Override
+  @Transient
+  public ProcessEngine getProcessEngine()
   {
-    // nothing to do
+    return ProcessEngine.getProcessEngine(engineName);
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ComplexGatewayImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ComplexGatewayImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ComplexGatewayImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -27,6 +27,7 @@
 
 import org.jbpm.api.NotImplementedException;
 import org.jbpm.api.model.Expression;
+import org.jbpm.api.model.ProcessStructure;
 
 /**
  * A Complex Gateway handles situations that are not easily handled through the other types of Gateways. Complex
@@ -41,9 +42,9 @@
 {
   private static final long serialVersionUID = 1L;
 
-  public ComplexGatewayImpl(String name)
+  public ComplexGatewayImpl(ProcessStructure procStruct, String name)
   {
-    super(name, GatewayType.Complex);
+    super(procStruct, name, GatewayType.Complex);
   }
 
   public GatewayType getGatewayType()

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EndEventImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -32,6 +32,7 @@
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.EndEvent;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.builder.ObjectNameFactory;
@@ -63,9 +64,9 @@
   // provide logging
   final static Logger log = LoggerFactory.getLogger(EndEventImpl.class);
 
-  public EndEventImpl(String name)
+  public EndEventImpl(ProcessStructure procStruct, String name)
   {
-    super(name);
+    super(procStruct, name);
     this.eventType = EventType.End;
   }
 
@@ -116,7 +117,7 @@
     {
       private static final long serialVersionUID = 1L;
       
-      ProcessEngine engine = getProcess().getProcessEngine();
+      ProcessEngine engine = getProcessDefinition().getProcessEngine();
       SignalService sigService = engine.getService(SignalService.class);
       public void throwEnterSignal(Token token)
       {

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/EventImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -35,7 +35,7 @@
 import org.jbpm.api.model.Event;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
-import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.api.runtime.ExecutionHandler;
@@ -67,9 +67,9 @@
   @Transient
   private Signal signalRef;
   
-  public EventImpl(String name)
+  public EventImpl(ProcessStructure procStruct, String name)
   {
-    super(name);
+    super(procStruct, name);
     this.eventType = EventType.Intermediate;
   }
 
@@ -153,7 +153,7 @@
     {
       private static final long serialVersionUID = 1L;
       
-      ProcessEngine engine = getProcess().getProcessEngine();
+      ProcessEngine engine = getProcessDefinition().getProcessEngine();
       SignalService sigService = engine.getService(SignalService.class);
       public void throwEnterSignal(Token token)
       {
@@ -181,9 +181,9 @@
   }
 
   @Override
-  protected void create(Process proc)
+  protected void initialize(ProcessStructure procStruct)
   {
-    super.create(proc);
+    super.initialize(procStruct);
     
     if (detailType == EventDetailType.Signal && signalRef == null)
       throw new InvalidProcessException("Event with detail type 'Signal' must have a signalRef");
@@ -197,8 +197,8 @@
     
     if (messageRef != null)
     {
-      ProcessImpl procImpl = (ProcessImpl)proc;
-      procImpl.initializeMessageRef(messageRef);
+      ProcessStructureImpl procStructImpl = (ProcessStructureImpl)procStruct;
+      procStructImpl.initializeMessageRef(messageRef);
     }
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ExclusiveGatewayImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ExclusiveGatewayImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ExclusiveGatewayImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -31,6 +31,7 @@
 
 import org.jbpm.api.model.Expression;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.SequenceFlow.ConditionType;
 import org.jbpm.api.runtime.ExecutionHandler;
@@ -60,9 +61,9 @@
   @Transient
   private Set<SequenceFlow> outstandingFlows;
 
-  public ExclusiveGatewayImpl(String name)
+  public ExclusiveGatewayImpl(ProcessStructure procStruct, String name)
   {
-    super(name, GatewayType.Exclusive);
+    super(procStruct, name, GatewayType.Exclusive);
   }
 
   @Override

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/GatewayImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/GatewayImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/GatewayImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -37,6 +37,7 @@
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Gateway;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.SequenceFlow.ConditionType;
@@ -72,9 +73,9 @@
   @Transient
   protected List<Token> receivedTokens;
   
-  public GatewayImpl(String name, GatewayType gatewayType)
+  public GatewayImpl(ProcessStructure procStruct, String name, GatewayType gatewayType)
   {
-    super(name);
+    super(procStruct, name);
     this.gatewayType = gatewayType;
   }
 
@@ -199,7 +200,7 @@
     {
       private static final long serialVersionUID = 1L;
       
-      ProcessEngine engine = getProcess().getProcessEngine();
+      ProcessEngine engine = getProcessDefinition().getProcessEngine();
       SignalService sigService = engine.getService(SignalService.class);
       
       public void throwEnterSignal(Token token)

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/InclusiveGatewayImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/InclusiveGatewayImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/InclusiveGatewayImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -33,6 +33,7 @@
 import org.jbpm.api.model.Expression;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.SequenceFlow.ConditionType;
 import org.jbpm.api.runtime.ExecutionContext;
@@ -60,9 +61,9 @@
   // provide logging
   final static Logger log = LoggerFactory.getLogger(InclusiveGatewayImpl.class);
 
-  public InclusiveGatewayImpl(String name)
+  public InclusiveGatewayImpl(ProcessStructure procStruct, String name)
   {
-    super(name, GatewayType.Inclusive);
+    super(procStruct, name, GatewayType.Inclusive);
   }
   
   @Override

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/NodeImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -46,6 +46,8 @@
 import org.jbpm.api.model.EndEvent;
 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.Property;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.StartEvent;
@@ -80,8 +82,8 @@
   @Basic
   private String name;
 
-  @ManyToOne(targetEntity = ProcessImpl.class)
-  private Process process;
+  @ManyToOne(targetEntity = ProcessStructureImpl.class)
+  private ProcessStructure procStruct;
 
   @Basic
   private int nodeIndex;
@@ -115,8 +117,15 @@
   private transient FlowHandler customFlowHandler;
   private transient FlowHandler defaultFlowHandler;
 
-  public NodeImpl(String name)
+  @ManyToOne(targetEntity = ProcessDefinitionImpl.class)
+  private ProcessDefinition procDef;
+
+  @ManyToOne(targetEntity = ProcessImpl.class)
+  private Process proc;
+
+  public NodeImpl(ProcessStructure procStruct, String name)
   {
+    this.procStruct = procStruct;
     this.name = name;
   }
 
@@ -125,11 +134,28 @@
   {
   }
 
+  @Override
+  public ProcessDefinition getProcessDefinition()
+  {
+    return procDef;
+  }
+
+  void setProcessDefinition(ProcessDefinition procDef)
+  {
+    this.procDef = procDef;
+  }
+
+  @Override
   public Process getProcess()
   {
-    return process;
+    return proc;
   }
 
+  void setProcess(Process process)
+  {
+    this.proc = process;
+  }
+
   public int getNodeIndex()
   {
     return nodeIndex;
@@ -332,20 +358,14 @@
     return handler;
   }
 
-  @Override
-  protected void create(Process proc)
+  protected void initialize(ProcessStructure procStruct)
   {
-    super.create(proc);
-
-    // Set the associated process
-    this.process = proc;
-
     // Check required name
     if (name == null)
       throw new InvalidProcessException("Name is required for: " + this);
 
     // Check name uniqueness
-    for (Node aux : proc.getNodes())
+    for (Node aux : procStruct.getNodes())
     {
       String auxName = aux.getName();
       if (aux != this && name.equals(auxName))
@@ -358,7 +378,7 @@
     {
       SingleOutFlowSupport sof = (SingleOutFlowSupport)this;
       outFlow = sof.getOutFlow();
-      initFlow(proc, (SequenceFlowImpl)outFlow);
+      initFlow((SequenceFlowImpl)outFlow);
     }
     else if (this instanceof MultipleOutFlowSupport)
     {
@@ -366,7 +386,7 @@
       for (SequenceFlow flow : mof.getOutFlows())
       {
         outFlow = flow;
-        initFlow(proc, (SequenceFlowImpl)outFlow);
+        initFlow((SequenceFlowImpl)outFlow);
       }
     }
 
@@ -392,12 +412,17 @@
       throw new InvalidProcessException("Dead end node: " + this);
   }
 
-  private void initFlow(Process proc, SequenceFlowImpl flow)
+  protected void instantiate(Process proc)
   {
+    // noting to do
+  }
+  
+  private void initFlow(SequenceFlowImpl flow)
+  {
     if (flow != null)
     {
       String name = flow.getTargetName();
-      Node target = proc.getNode(name);
+      Node target = procStruct.getNode(name);
       if (target == null)
         throw new InvalidProcessException("Cannot find target for out flow: " + name);
 

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParallelGatewayImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParallelGatewayImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ParallelGatewayImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -32,6 +32,7 @@
 import javax.persistence.Transient;
 
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.FlowHandler;
@@ -62,9 +63,9 @@
   @Transient
   private Set<Token> mergeTokens;
 
-  public ParallelGatewayImpl(String name)
+  public ParallelGatewayImpl(ProcessStructure procStruct, String name)
   {
-    super(name, GatewayType.Parallel);
+    super(procStruct, name, GatewayType.Parallel);
   }
 
   @Override

Added: 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	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,112 @@
+/*
+ * 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.ri.model;
+
+//$Id$
+
+import javax.management.ObjectName;
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+import org.jbpm.api.Constants;
+import org.jbpm.api.client.ProcessEngine;
+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.Property;
+import org.jbpm.api.model.builder.ObjectNameFactory;
+import org.jbpm.api.service.ProcessDefinitionService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A process definition
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+ at Entity(name = "ProcessDefinition")
+public class ProcessDefinitionImpl extends StructureDelegateImpl implements ProcessDefinition
+{
+  private static final long serialVersionUID = 1L;
+
+  // provide logging
+  final static Logger log = LoggerFactory.getLogger(ProcessDefinitionImpl.class);
+
+  public ProcessDefinitionImpl(ProcessEngine engine, ProcessStructure procStruct)
+  {
+    super(engine, procStruct);
+    for (Node node : procStruct.getNodes())
+    {
+      NodeImpl nodeImpl = (NodeImpl)node;
+      nodeImpl.setProcessDefinition(this);
+    }
+  }
+  
+  // Persistence ctor
+  protected ProcessDefinitionImpl()
+  {
+  }
+  
+  @Override
+  public Process newInstance()
+  {
+    // Register the process definition if needed
+    ProcessDefinitionService procDefService = getProcessEngine().getService(ProcessDefinitionService.class);
+    if (procDefService.getProcessDefinitionByName(getName()) == null)
+      procDefService.registerProcessDefinition(this);
+    
+    ProcessStructureImpl procStructImpl = (ProcessStructureImpl)procStruct;
+    ProcessStructure newProcStruct = procStructImpl.newInstance();
+    ProcessImpl procImpl = new ProcessImpl(getProcessEngine(), this, newProcStruct);
+    
+    return procImpl;
+  }
+
+  @Override
+  @Transient
+  public ObjectName getKey()
+  {
+    StringBuilder str = new StringBuilder(Constants.ID_DOMAIN + ":");
+    str.append("type=ProcessDefinition,name=" + getName() + ",id=" + getId());
+    ObjectName oname = ObjectNameFactory.create(str.toString());
+    return oname;
+  }
+
+  @Override
+  public void addProperty(Property prop)
+  {
+    throw new IllegalStateException("Cannot add a property to a process definition");
+  }
+
+  @Override
+  public boolean removeProperty(String name)
+  {
+    throw new IllegalStateException("Cannot add remove a property to a process definition");
+  }
+
+  public String toString()
+  {
+    return "ProcessDefinition[" + getName() + "]";
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessDefinitionImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -23,33 +23,19 @@
 
 //$Id$
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import javax.management.ObjectName;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
+import javax.persistence.ManyToOne;
 import javax.persistence.Transient;
 
-import org.hibernate.annotations.IndexColumn;
 import org.jbpm.api.Constants;
-import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.client.ProcessEngine;
-import org.jbpm.api.model.Assignment;
-import org.jbpm.api.model.EndEvent;
-import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
-import org.jbpm.api.model.Property;
-import org.jbpm.api.model.StartEvent;
+import org.jbpm.api.model.ProcessDefinition;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.api.runtime.Attachments;
 import org.jbpm.api.service.ExecutionService;
@@ -63,47 +49,34 @@
  * @since 08-Jul-2008
  */
 @Entity(name = "Process")
-public class ProcessImpl extends AbstractElementImpl implements Process
+public class ProcessImpl extends StructureDelegateImpl implements Process
 {
   private static final long serialVersionUID = 1L;
   
   // provide logging
   final static Logger log = LoggerFactory.getLogger(ProcessImpl.class);
 
-  @Basic
-  private String name;
-  
   @Enumerated(EnumType.STRING)
   private ProcessStatus status = ProcessStatus.None;
   
-  @IndexColumn(name = "nodeIndex")
-  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "process", targetEntity = NodeImpl.class)
-  private List<Node> nodes = new ArrayList<Node>();
+  @ManyToOne(targetEntity = ProcessDefinitionImpl.class)
+  private ProcessDefinition procDef;
   
-  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = PropertyImpl.class)
-  private Set<Property> properties = new HashSet<Property>();
-
-  @Transient
-  private Set<Message> messages = new HashSet<Message>();
-  
-  @Transient
-  private List<Assignment> assignments = new ArrayList<Assignment>();
-  
   @Transient 
-  private transient ProcessEngine engine;
-  
-  @Transient 
   private transient RuntimeException runtimeException; 
 
-  public ProcessImpl(ProcessEngine engine, String name)
+  public ProcessImpl(ProcessEngine engine, ProcessDefinition procDef, ProcessStructure procStruct)
   {
-    if (engine == null)
-      throw new InvalidProcessException("Process engine cannot be null");
-    if (name == null)
-      throw new InvalidProcessException("Process name cannot be null");
+    super(engine, procStruct);
     
-    this.engine = engine;
-    this.name = name;
+    this.procDef = procDef;
+    
+    for (Node node : procStruct.getNodes())
+    {
+      NodeImpl nodeImpl = (NodeImpl)node;
+      nodeImpl.setProcessDefinition(procDef);
+      nodeImpl.setProcess(this);
+    }
   }
 
   // Persistence ctor
@@ -111,12 +84,6 @@
   {
   }
 
-  @Transient
-  public ProcessEngine getProcessEngine()
-  {
-    return engine;
-  }
-
   @Override
   @Transient
   public ObjectName getKey()
@@ -127,16 +94,12 @@
     return oname;
   }
 
-  public String getName()
+  @Override
+  public ProcessDefinition getProcessDefinition()
   {
-    return name;
+    return procDef;
   }
 
-  public void setName(String name)
-  {
-    this.name = name;
-  }
-
   public ProcessStatus getProcessStatus()
   {
     return status;
@@ -147,216 +110,6 @@
     this.status = status;
   }
 
-  @Override
-  public Property getProperty(String name)
-  {
-    for (Property prop : properties)
-    {
-      if (prop.getName().equals(name))
-        return prop;
-    }
-    return null;
-  }
-
-  @Override
-  public void addProperty(Property prop)
-  {
-    properties.add(prop);
-  }
-  
-  @Override
-  public Set<String> getPropertyNames()
-  {
-    Set<String> names = new HashSet<String>();
-    for (Property prop : properties)
-    {
-      names.add(prop.getName());
-    }
-    return names;
-  }
-
-  @Override
-  public boolean removeProperty(String name)
-  {
-    return properties.remove(name);
-  }
-
-  public void addNode(NodeImpl nodeImpl)
-  {
-    if (nodeImpl == null)
-      throw new IllegalArgumentException("Node cannot be null");
-    
-    nodeImpl.setNodeIndex(nodes.size());
-    nodes.add(nodeImpl);
-  }
-
-  public List<Node> getNodes()
-  {
-    return Collections.unmodifiableList(nodes);
-  }
-
-  public Node getNode(String name)
-  {
-    if (name == null)
-      throw new IllegalArgumentException("Cannot find node with name: null");
-
-    Node node = null;
-    for (Node aux : getNodes())
-    {
-      if (name.equals(aux.getName()))
-      {
-        node = aux;
-        break;
-      }
-    }
-    return node;
-  }
-
-  @SuppressWarnings("unchecked")
-  public <T extends Node> List<T> getNodes(Class<T> clazz)
-  {
-    List<T> retNodes = new ArrayList<T>();
-    for (Node node : nodes)
-    {
-      if (clazz.isAssignableFrom(node.getClass()))
-        retNodes.add((T)node);
-    }
-    return retNodes;
-  }
-
-  public <T extends Node> T getNode(Class<T> clazz, String name)
-  {
-    T node = null;
-    for (T aux : getNodes(clazz))
-    {
-      if (aux.getName().equals(name))
-      {
-        node = aux;
-        break;
-      }
-    }
-    return node;
-  }
-  
-  @Override
-  public Set<Message> getMessages()
-  {
-    return Collections.unmodifiableSet(messages);
-  }
-
-  public void addMessage(Message msg)
-  {
-    if (getMessage(msg.getName()) != null)
-      throw new InvalidProcessException("Duplicate message: " + msg);
-
-    messages.add(msg);
-  }
-
-  @Override
-  public Message getMessage(String msgName)
-  {
-    for (Message msg : messages)
-    {
-      if (msg.getName().equals(msgName))
-        return msg;
-    }
-    return null;
-  }
-  
-  @Override
-  public List<Assignment> getAssignments()
-  {
-    return Collections.unmodifiableList(assignments);
-  }
-
-  public void addAssignment(AssignmentImpl assignment)
-  {
-    this.assignments.add(assignment);
-  }
-
-  @Override
-  public void create(Process proc)
-  {
-    if (status != ProcessStatus.None)
-      throw new IllegalStateException("Cannot initialize process in state: " + status);
-
-    // Initialize the Element
-    super.create(this);
-
-    // Check required name
-    if (name == null)
-      throw new InvalidProcessException("Name is required for: " + this);
-    
-    if (getNodes(StartEvent.class).size() == 0)
-      throw new InvalidProcessException("Process does not have a start event");
-
-    if (getNodes(EndEvent.class).size() == 0)
-      throw new InvalidProcessException("Process does not have end events");
-
-    // Initialize the nodes
-    for (Node node : getNodes())
-    {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.create(this);
-    }
-
-    status = ProcessStatus.Ready;
-  }
-  
-  @Override
-  public void register(Process proc)
-  {
-    super.register(proc);
-    for (Node node : nodes)
-    {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      nodeImpl.register(this);
-    }
-  }
-
-  @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();
-    MessageImpl procMsg = (MessageImpl)getMessage(msgName);
-    if (procMsg == null)
-      throw new IllegalStateException("Cannot obtain process message: " + msgName);
-
-    if (msgRef.getFromRef() == null && procMsg.getFromRef() != null)
-      msgRef.setFromRef(procMsg.getFromRef());
-    if (msgRef.getToRef() == null && procMsg.getToRef() != null)
-      msgRef.setToRef(procMsg.getToRef());
-
-    for (String propName : procMsg.getPropertyNames())
-    {
-      Property prop = procMsg.getProperty(propName);
-      msgRef.addProperty(prop);
-    }
-  }
-  
-  // Runtime Aspects ====================================================================================================
-  
   public RuntimeException getRuntimeException()
   {
     return runtimeException;

Added: 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	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,340 @@
+/*
+ * 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.ri.model;
+
+//$Id$
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.management.ObjectName;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Lob;
+import javax.persistence.OneToMany;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.IndexColumn;
+import org.jbpm.api.Constants;
+import org.jbpm.api.InvalidProcessException;
+import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Assignment;
+import org.jbpm.api.model.EndEvent;
+import org.jbpm.api.model.Message;
+import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
+import org.jbpm.api.model.Process;
+import org.jbpm.api.model.Property;
+import org.jbpm.api.model.StartEvent;
+import org.jbpm.api.model.builder.ObjectNameFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A process definition
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+ at Entity(name = "ProcessStructure")
+public class ProcessStructureImpl extends AbstractElementImpl implements ProcessStructure
+{
+  private static final long serialVersionUID = 1L;
+
+  // provide logging
+  final static Logger log = LoggerFactory.getLogger(ProcessStructureImpl.class);
+
+  @Basic
+  private String name;
+
+  @IndexColumn(name = "nodeIndex")
+  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "procStruct", targetEntity = NodeImpl.class)
+  private List<Node> nodes = new ArrayList<Node>();
+
+  @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = PropertyImpl.class)
+  private Set<Property> properties = new HashSet<Property>();
+
+  @Transient
+  private Set<Message> messages = new HashSet<Message>();
+
+  @Transient
+  private List<Assignment> assignments = new ArrayList<Assignment>();
+  
+  @Lob
+  private byte[] rawProc;
+  
+  public ProcessStructureImpl(ProcessEngine engine, String name)
+  {
+    super(engine);
+    this.name = name;
+    
+    if (name == null)
+      throw new InvalidProcessException("Process name cannot be null");
+  }
+
+  // Persistence ctor
+  protected ProcessStructureImpl()
+  {
+  }
+  
+  public ProcessStructureImpl newInstance()
+  {
+    ProcessStructureImpl procCopy;
+    try
+    {
+      ByteArrayInputStream bais = new ByteArrayInputStream(rawProc);
+      ObjectInputStream ois = new ObjectInputStream(bais);
+      procCopy = (ProcessStructureImpl)ois.readObject();
+    }
+    catch (Exception ex)
+    {
+      throw new IllegalStateException("Cannot deserialize process", ex);
+    }
+    return procCopy;
+  }
+
+  @Override
+  @Transient
+  public ObjectName getKey()
+  {
+    StringBuilder str = new StringBuilder(Constants.ID_DOMAIN + ":");
+    str.append("type=ProcessDefinition,name=" + getName() + ",id=" + getId());
+    ObjectName oname = ObjectNameFactory.create(str.toString());
+    return oname;
+  }
+
+  @Override
+  public String getName()
+  {
+    return name;
+  }
+
+  @Override
+  public Property getProperty(String name)
+  {
+    for (Property prop : properties)
+    {
+      if (prop.getName().equals(name))
+        return prop;
+    }
+    return null;
+  }
+
+  @Override
+  public void addProperty(Property prop)
+  {
+    properties.add(prop);
+  }
+
+  @Override
+  public Set<String> getPropertyNames()
+  {
+    Set<String> names = new HashSet<String>();
+    for (Property prop : properties)
+    {
+      names.add(prop.getName());
+    }
+    return names;
+  }
+
+  @Override
+  public boolean removeProperty(String name)
+  {
+    return properties.remove(name);
+  }
+
+  public void addNode(NodeImpl nodeImpl)
+  {
+    if (nodeImpl == null)
+      throw new IllegalArgumentException("Node cannot be null");
+
+    nodeImpl.setNodeIndex(nodes.size());
+    nodes.add(nodeImpl);
+  }
+
+  @Override
+  public List<Node> getNodes()
+  {
+    return Collections.unmodifiableList(nodes);
+  }
+
+  @Override
+  public Node getNode(String name)
+  {
+    if (name == null)
+      throw new IllegalArgumentException("Cannot find node with name: null");
+
+    Node node = null;
+    for (Node aux : getNodes())
+    {
+      if (name.equals(aux.getName()))
+      {
+        node = aux;
+        break;
+      }
+    }
+    return node;
+  }
+
+  @SuppressWarnings("unchecked")
+  @Override
+  public <T extends Node> List<T> getNodes(Class<T> clazz)
+  {
+    List<T> retNodes = new ArrayList<T>();
+    for (Node node : nodes)
+    {
+      if (clazz.isAssignableFrom(node.getClass()))
+        retNodes.add((T)node);
+    }
+    return retNodes;
+  }
+
+  @Override
+  public <T extends Node> T getNode(Class<T> clazz, String name)
+  {
+    T node = null;
+    for (T aux : getNodes(clazz))
+    {
+      if (aux.getName().equals(name))
+      {
+        node = aux;
+        break;
+      }
+    }
+    return node;
+  }
+
+  @Override
+  public Set<Message> getMessages()
+  {
+    return Collections.unmodifiableSet(messages);
+  }
+
+  public void addMessage(Message msg)
+  {
+    if (getMessage(msg.getName()) != null)
+      throw new InvalidProcessException("Duplicate message: " + msg);
+
+    messages.add(msg);
+  }
+
+  @Override
+  public Message getMessage(String msgName)
+  {
+    for (Message msg : messages)
+    {
+      if (msg.getName().equals(msgName))
+        return msg;
+    }
+    return null;
+  }
+
+  @Override
+  public List<Assignment> getAssignments()
+  {
+    return Collections.unmodifiableList(assignments);
+  }
+
+  public void addAssignment(AssignmentImpl assignment)
+  {
+    this.assignments.add(assignment);
+  }
+
+  public void initialize(ProcessStructure procStruct)
+  {
+    // Check required name
+    if (name == null)
+      throw new InvalidProcessException("Name is required for: " + this);
+
+    if (getNodes(StartEvent.class).size() == 0)
+      throw new InvalidProcessException("Process does not have a start event");
+
+    if (getNodes(EndEvent.class).size() == 0)
+      throw new InvalidProcessException("Process does not have end events");
+
+    // Initialize the nodes
+    for (Node node : getNodes())
+    {
+      NodeImpl nodeImpl = (NodeImpl)node;
+      nodeImpl.initialize(procStruct);
+    }
+
+    // Save the initalized raw data
+    if (rawProc == null)
+    {
+      try
+      {
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        ObjectOutputStream oos = new ObjectOutputStream(baos);
+        oos.writeObject(this);
+        rawProc = baos.toByteArray();
+      }
+      catch (IOException ex)
+      {
+        throw new IllegalStateException("Cannot serialize process structure", ex);
+      }
+    }
+  }
+
+  public void instantiate(Process proc)
+  {
+    for (Node node : nodes)
+    {
+      NodeImpl nodeImpl = (NodeImpl)node;
+      nodeImpl.instantiate(proc);
+    }
+  }
+
+  public void initializeMessageRef(MessageImpl msgRef)
+  {
+    String msgName = msgRef.getName();
+    MessageImpl procMsg = (MessageImpl)getMessage(msgName);
+    if (procMsg == null)
+      throw new IllegalStateException("Cannot obtain process message: " + msgName);
+
+    if (msgRef.getFromRef() == null && procMsg.getFromRef() != null)
+      msgRef.setFromRef(procMsg.getFromRef());
+    if (msgRef.getToRef() == null && procMsg.getToRef() != null)
+      msgRef.setToRef(procMsg.getToRef());
+
+    for (String propName : procMsg.getPropertyNames())
+    {
+      Property prop = procMsg.getProperty(propName);
+      msgRef.addProperty(prop);
+    }
+  }
+
+  public String toString()
+  {
+    return "ProcessStructure[" + getName() + "]";
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ProcessStructureImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/ReceiveTaskImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -34,7 +34,7 @@
 import org.jbpm.api.client.MessageListener;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
-import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.runtime.ExecutionContext;
 import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.FlowHandler;
@@ -66,9 +66,9 @@
   @Transient
   private List<Token> suspendedTokens = new ArrayList<Token>();
 
-  public ReceiveTaskImpl(String name)
+  public ReceiveTaskImpl(ProcessStructure procStruct, String name)
   {
-    super(name, TaskType.Receive);
+    super(procStruct, name, TaskType.Receive);
   }
 
   // Persistence ctor
@@ -198,14 +198,14 @@
   }
 
   @Override
-  protected void create(Process proc)
+  protected void initialize(ProcessStructure procStruct)
   {
-    super.create(proc);
+    super.initialize(procStruct);
 
     if (messageRef == null)
       throw new InvalidProcessException("A message for the message ref attribute MUST be entered");
 
-    ProcessImpl procImpl = (ProcessImpl)proc;
-    procImpl.initializeMessageRef(messageRef);
+    ProcessStructureImpl procDefImpl = (ProcessStructureImpl)procStruct;
+    procDefImpl.initializeMessageRef(messageRef);
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/SendTaskImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,7 +29,7 @@
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.model.Message;
 import org.jbpm.api.model.Node;
-import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.runtime.ExecutionHandler;
 import org.jbpm.api.runtime.Token;
 import org.jbpm.ri.runtime.MessageSender;
@@ -53,9 +53,9 @@
   @Transient
   protected MessageImpl messageRef;
 
-  public SendTaskImpl(String name)
+  public SendTaskImpl(ProcessStructure procStruct, String name)
   {
-    super(name, TaskType.Send);
+    super(procStruct, name, TaskType.Send);
   }
 
   // Persistence ctor
@@ -101,15 +101,15 @@
   }
 
   @Override
-  protected void create(Process proc)
+  protected void initialize(ProcessStructure procStruct)
   {
-    super.create(proc);
+    super.initialize(procStruct);
 
     if (messageRef == null)
       throw new InvalidProcessException("A message for the message ref attribute MUST be entered");
 
-    ProcessImpl procImpl = (ProcessImpl)proc;
-    procImpl.initializeMessageRef(messageRef);
+    ProcessStructureImpl procDefImpl = (ProcessStructureImpl)procStruct;
+    procDefImpl.initializeMessageRef(messageRef);
 
     if (messageRef.getToRef() == null)
       throw new IllegalArgumentException("Message target cannot be null for: " + this);

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StartEventImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -33,10 +33,10 @@
 import org.jbpm.api.client.SignalListener;
 import org.jbpm.api.model.Node;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessStructure;
 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;
@@ -66,9 +66,9 @@
   // The start signal listener
   private transient SignalListener startListener;
 
-  public StartEventImpl(String name)
+  public StartEventImpl(ProcessStructure procStruct, String name)
   {
-    super(name);
+    super(procStruct, name);
     this.eventType = EventType.Start;
   }
 
@@ -118,7 +118,7 @@
     {
       private static final long serialVersionUID = 1L;
 
-      ProcessEngine engine = getProcess().getProcessEngine();
+      ProcessEngine engine = getProcessDefinition().getProcessEngine();
       SignalService sigService = engine.getService(SignalService.class);
 
       public void throwEnterSignal(Token token)
@@ -147,12 +147,13 @@
   }
 
   @Override
-  protected void register(final Process proc)
+  protected void instantiate(Process proc)
   {
-    super.register(proc);
+    super.instantiate(proc);
 
-    final ProcessEngine engine = proc.getProcessEngine();
-    
+    final ProcessEngine engine = getProcessEngine();
+    final SignalService sigService = engine.getService(SignalService.class);
+
     if (getTriggerType() == EventDetailType.Signal)
     {
       // Register the start signal listener
@@ -179,18 +180,11 @@
 
           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);
-            }
+            log.debug("Start process from signal: " + signal);
+            sigService.removeSignalListener(startListener);
+            
+            ExecutionService execService = engine.getService(ExecutionService.class);
+            execService.startProcess(getProcess(), start, null);
           }
 
           public String toString()
@@ -198,26 +192,13 @@
             return start + "." + startSignal;
           }
         };
-        SignalService sigService = engine.getService(SignalService.class);
+        
+        // Add the start signal listener
         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() + "]";

Added: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StructureDelegateImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StructureDelegateImpl.java	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StructureDelegateImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,142 @@
+/*
+ * 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.ri.model;
+
+//$Id$
+
+import java.util.List;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.OneToOne;
+
+import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.model.Assignment;
+import org.jbpm.api.model.Message;
+import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
+import org.jbpm.api.model.Property;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A process definition
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 08-Jul-2008
+ */
+ at MappedSuperclass
+public abstract class StructureDelegateImpl extends AbstractElementImpl implements ProcessStructure
+{
+  private static final long serialVersionUID = 1L;
+
+  // provide logging
+  final static Logger log = LoggerFactory.getLogger(StructureDelegateImpl.class);
+
+  @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, targetEntity = ProcessStructureImpl.class)
+  protected ProcessStructure procStruct;
+  
+  public StructureDelegateImpl(ProcessEngine engine, ProcessStructure procStruct)
+  {
+    super(engine);
+    this.procStruct = procStruct;
+  }
+  
+  // Persistence ctor
+  protected StructureDelegateImpl()
+  {
+  }
+  
+  @Override
+  public String getName()
+  {
+    return procStruct.getName();
+  }
+
+  @Override
+  public Property getProperty(String name)
+  {
+    return procStruct.getProperty(name);
+  }
+
+  @Override
+  public void addProperty(Property prop)
+  {
+    procStruct.addProperty(prop);
+  }
+
+  @Override
+  public Set<String> getPropertyNames()
+  {
+    return procStruct.getPropertyNames();
+  }
+
+  @Override
+  public boolean removeProperty(String name)
+  {
+    return procStruct.removeProperty(name);
+  }
+
+  @Override
+  public List<Node> getNodes()
+  {
+    return procStruct.getNodes();
+  }
+
+  @Override
+  public Node getNode(String name)
+  {
+    return procStruct.getNode(name);
+  }
+
+  @Override
+  public <T extends Node> List<T> getNodes(Class<T> clazz)
+  {
+    return procStruct.getNodes(clazz);
+  }
+
+  @Override
+  public <T extends Node> T getNode(Class<T> clazz, String name)
+  {
+    return procStruct.getNode(clazz, name);
+  }
+
+  @Override
+  public Set<Message> getMessages()
+  {
+    return procStruct.getMessages();
+  }
+
+  @Override
+  public Message getMessage(String msgName)
+  {
+    return procStruct.getMessage(msgName);
+  }
+
+  @Override
+  public List<Assignment> getAssignments()
+  {
+    return procStruct.getAssignments();
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/StructureDelegateImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/TaskImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/TaskImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/TaskImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -33,6 +33,7 @@
 import org.jbpm.api.InvalidProcessException;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessStructure;
 import org.jbpm.api.model.SequenceFlow;
 import org.jbpm.api.model.Signal;
 import org.jbpm.api.model.Task;
@@ -61,9 +62,9 @@
   @Enumerated(EnumType.STRING)
   protected TaskType taskType;
 
-  public TaskImpl(String name, TaskType taskType)
+  public TaskImpl(ProcessStructure procStruct, String name, TaskType taskType)
   {
-    super(name);
+    super(procStruct, name);
     this.taskType = taskType;
   }
 
@@ -123,7 +124,7 @@
     {
       private static final long serialVersionUID = 1L;
       
-      ProcessEngine engine = getProcess().getProcessEngine();
+      ProcessEngine engine = getProcessDefinition().getProcessEngine();
       SignalService sigService = engine.getService(SignalService.class);
       public void throwEnterSignal(Token token)
       {

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/model/builder/ProcessBuilderImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -26,6 +26,7 @@
 import org.jbpm.api.NotImplementedException;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Assignment.AssignTime;
 import org.jbpm.api.model.Event.EventDetailType;
 import org.jbpm.api.model.Expression.ExpressionLanguage;
@@ -48,7 +49,8 @@
 import org.jbpm.ri.model.InclusiveGatewayImpl;
 import org.jbpm.ri.model.NodeImpl;
 import org.jbpm.ri.model.ParallelGatewayImpl;
-import org.jbpm.ri.model.ProcessImpl;
+import org.jbpm.ri.model.ProcessDefinitionImpl;
+import org.jbpm.ri.model.ProcessStructureImpl;
 import org.jbpm.ri.model.PropertyImpl;
 import org.jbpm.ri.model.ReceiveTaskImpl;
 import org.jbpm.ri.model.SendTaskImpl;
@@ -65,7 +67,7 @@
 public class ProcessBuilderImpl implements ProcessBuilder
 {
   protected ProcessEngine engine;
-  protected ProcessImpl proc;
+  protected ProcessStructureImpl procStruct;
   protected NodeImpl node;
 
   public ProcessBuilderImpl(ProcessEngine engine)
@@ -76,20 +78,22 @@
   protected ProcessBuilderImpl(ProcessBuilderImpl procBuilder)
   {
     this.engine = procBuilder.engine;
-    this.proc = procBuilder.proc;
+    this.procStruct = procBuilder.procStruct;
     this.node = procBuilder.node;
   }
 
   public ProcessBuilder addProcess(String procName)
   {
-    proc = new ProcessImpl(engine, procName);
+    procStruct = new ProcessStructureImpl(engine, procName);
     return this;
   }
 
-  public Process getProcess()
+  public ProcessDefinition getProcessDefinition()
   {
-    ProcessImpl procImpl = getProcessInternal();
-    procImpl.create(procImpl);
+    ProcessStructureImpl procStruct = getProcessStructure();
+    procStruct.initialize(procStruct);
+    
+    ProcessDefinitionImpl procImpl = new ProcessDefinitionImpl(engine, procStruct);
     return procImpl;
   }
 
@@ -114,13 +118,13 @@
 
   public EventBuilder addStartEvent(String name)
   {
-    addNode(node = new StartEventImpl(name));
+    addNode(node = new StartEventImpl(procStruct, name));
     return new EventBuilderImpl(this);
   }
 
   public EventBuilder addStartEvent(String name, EventDetailType ResultType)
   {
-    StartEventImpl startImpl = new StartEventImpl(name);
+    StartEventImpl startImpl = new StartEventImpl(procStruct, name);
     startImpl.setTriggerType(ResultType);
     addNode(node = startImpl);
     return new EventBuilderImpl(this);
@@ -128,19 +132,19 @@
   
   public EventBuilder addEvent(String name)
   {
-    addNode(node = new EventImpl(name));
+    addNode(node = new EventImpl(procStruct, name));
     return new EventBuilderImpl(this);
   }
 
   public EventBuilder addEndEvent(String name)
   {
-    addNode(node = new EndEventImpl(name));
+    addNode(node = new EndEventImpl(procStruct, name));
     return new EventBuilderImpl(this);
   }
 
   public EventBuilder addEndEvent(String name, EventDetailType resultType)
   {
-    EndEventImpl endImpl = new EndEventImpl(name);
+    EndEventImpl endImpl = new EndEventImpl(procStruct, name);
     endImpl.setResultType(resultType);
     addNode(node = endImpl);
     return new EventBuilderImpl(this);
@@ -156,7 +160,7 @@
   {
     if (type == TaskType.None || type == null)
     {
-      node = new TaskImpl(name, TaskType.None);
+      node = new TaskImpl(procStruct, name, TaskType.None);
     }
     else if (type == TaskType.Service)
     {
@@ -164,11 +168,11 @@
     }
     else if (type == TaskType.Receive)
     {
-      node = new ReceiveTaskImpl(name);
+      node = new ReceiveTaskImpl(procStruct, name);
     }
     else if (type == TaskType.Send)
     {
-      node = new SendTaskImpl(name);
+      node = new SendTaskImpl(procStruct, name);
     }
     else if (type == TaskType.User)
     {
@@ -198,19 +202,19 @@
   {
     if (GatewayType.Exclusive == type)
     {
-      node = new ExclusiveGatewayImpl(name);
+      node = new ExclusiveGatewayImpl(procStruct, name);
     }
     else if (GatewayType.Inclusive == type)
     {
-      node = new InclusiveGatewayImpl(name);
+      node = new InclusiveGatewayImpl(procStruct, name);
     }
     else if (GatewayType.Parallel == type)
     {
-      node = new ParallelGatewayImpl(name);
+      node = new ParallelGatewayImpl(procStruct, name);
     }
     else if (GatewayType.Complex == type)
     {
-      node = new ComplexGatewayImpl(name);
+      node = new ComplexGatewayImpl(procStruct, name);
     }
     addNode(node);
     return new GatewayBuilderImpl(this);
@@ -219,7 +223,7 @@
   public ProcessBuilder addProcessAssignment(AssignTime time, ExpressionLanguage lang, String fromExpr, String toProp)
   {
     AssignmentImpl assignment = getAssignment(time, lang, fromExpr, toProp);
-    getProcessInternal().addAssignment(assignment);
+    getProcessStructure().addAssignment(assignment);
     return this;
   }
   
@@ -259,14 +263,14 @@
   public MessageBuilder addProcessMessage(String name)
   {
     MessageBuilder msgBuilder = new MessageBuilderImpl().newMessage(name);
-    getProcessInternal().addMessage(msgBuilder.getMessage());
+    getProcessStructure().addMessage(msgBuilder.getMessage());
     return msgBuilder;
   }
 
   public ProcessBuilder addProcessProperty(String name, String value)
   {
     PropertyImpl prop = new PropertyImpl(name, value);
-    getProcessInternal().addProperty(prop);
+    getProcessStructure().addProperty(prop);
     return this;
   }
 
@@ -279,7 +283,7 @@
 
   private ProcessBuilder addNode(NodeImpl nodeImpl)
   {
-    getProcessInternal().addNode(nodeImpl);
+    getProcessStructure().addNode(nodeImpl);
     return this;
   }
 
@@ -291,11 +295,11 @@
     return node;
   }
 
-  private ProcessImpl getProcessInternal()
+  private ProcessStructureImpl getProcessStructure()
   {
-    if (proc == null)
+    if (procStruct == null)
       throw new IllegalStateException("No process available");
 
-    return proc;
+    return procStruct;
   }
 }
\ No newline at end of file

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/DelegatingExecutionContext.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -29,6 +29,7 @@
 import java.util.Map;
 
 import org.jbpm.api.model.Node;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.model.Property;
 import org.jbpm.api.runtime.ExecutionContext;
 import org.jbpm.api.model.Process;
@@ -45,15 +46,15 @@
   private ExecutionContext delegate;
   private String activityPrefix;
   private String procPrefix;
-  private Process proc;
+  private ProcessDefinition procDef;
 
   DelegatingExecutionContext(Node node, ExecutionContext delegate)
   {
     this.node = node;
     this.delegate = delegate;
 
-    proc = node.getProcess();
-    procPrefix = proc.getName() + ".";
+    procDef = node.getProcessDefinition();
+    procPrefix = procDef.getName() + ".";
     activityPrefix = procPrefix + node.getName() + ".";
   }
 
@@ -76,7 +77,7 @@
     else if (name.startsWith(procPrefix))
     {
       String key = name.substring(procPrefix.length());
-      Property prop = proc.getProperty(key);
+      Property prop = procDef.getProperty(key);
       if (prop != null)
       {
         value = prop.getValue();
@@ -104,7 +105,7 @@
     }
 
     // Add process property keys
-    for (String propName : proc.getPropertyNames())
+    for (String propName : procDef.getPropertyNames())
     {
       Key key = new Key(null, procPrefix + propName);
       keys.add(key);

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/MessageSender.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -54,7 +54,7 @@
   {
     this.fromNode = fromNode;
     this.messageRef = messageRef;
-    this.fromRef = new ParticipantImpl(fromNode.getProcess().getKey());
+    this.fromRef = new ParticipantImpl(fromNode.getProcessDefinition().getKey());
     
     if (messageRef == null)
       throw new IllegalArgumentException("MessageRef cannot be null");
@@ -90,7 +90,7 @@
     MessageImpl msg = (MessageImpl)msgBuilder.getMessage();
     msg.setFromRef(fromRef);
 
-    ProcessEngine engine = fromNode.getProcess().getProcessEngine();
+    ProcessEngine engine = fromNode.getProcessDefinition().getProcessEngine();
     MessageService msgService = engine.getService(MessageService.class);
     msgService.sendMessage(msg);
   }

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/RuntimeProcessImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/RuntimeProcessImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/RuntimeProcessImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -23,8 +23,8 @@
 
 //$Id$
 
+import org.jbpm.api.model.Process;
 import org.jbpm.api.runtime.TokenExecutor;
-import org.jbpm.api.model.Process;
 
 /**
  * A RuntimeProcess add runtime behaviour to the {@link Process}

Modified: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java
===================================================================
--- projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/runtime/TokenExecutorImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -109,7 +109,7 @@
   {
     synchronized (runnableTokens)
     {
-      ProcessStatus procStatus = getProcess(token).getProcessStatus();
+      ProcessStatus procStatus = rtProc.getProcess().getProcessStatus();
       if (procStatus != ProcessStatus.Ready && procStatus != ProcessStatus.Active)
         throw new IllegalStateException("Cannot start token to process in state: " + procStatus);
 
@@ -187,11 +187,6 @@
     }
   }
 
-  private Process getProcess(Token token)
-  {
-    return token.getFlow().getTargetRef().getProcess();
-  }
-
   /****************************************************
    * The runnable Token
    */

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ExecutionServiceImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -92,20 +92,20 @@
       if (proc.getProcessStatus() == ProcessStatus.Active)
         throw new IllegalStateException("Cannot start an already active process");
       
-      startProcessInternal(start, att);
+      startProcessInternal(proc, start, att);
     }
   }
 
   @Override
-  public void startProcess(StartEvent start, Attachments att)
+  public void startProcess(Process proc, StartEvent start, Attachments att)
   {
     // Prepare the process for start
-    startProcessPrepare(start.getProcess());
+    startProcessPrepare(proc);
     
-    startProcessInternal(start, att);
+    startProcessInternal(proc, start, att);
   }
 
-  private synchronized void startProcessInternal(StartEvent start, Attachments att)
+  private synchronized void startProcessInternal(Process proc, StartEvent start, Attachments att)
   {
     @SuppressWarnings("serial")
     class InitialFlow extends SequenceFlowImpl
@@ -117,7 +117,6 @@
       }
     }
     
-    Process proc = start.getProcess();
     RuntimeProcess rtProc = getRuntimeProcess(proc, false);
     boolean startProcessThread = (rtProc == null); 
 
@@ -169,7 +168,7 @@
     // Register the process if needed
     ProcessEngine engine = getProcessEngine();
     ProcessService procService = engine.getService(ProcessService.class);
-    if (procService.getProcessByKey(proc.getKey()) == null)
+    if (procService.getProcess(proc.getKey()) == null)
       procService.registerProcess(proc);
   }
 
@@ -263,8 +262,8 @@
       // and then we get here because of a ProcessTimeoutException
       ProcessEngine engine = getProcessEngine();
       ProcessService procService = engine.getService(ProcessService.class);
-      if (procService.getProcessByKey(proc.getKey()) != null)
-        procService.unregisterProcess(proc);
+      if (procService.getProcess(proc.getKey()) != null)
+        procService.unregisterProcess(proc.getKey());
     }
 
     
@@ -370,7 +369,7 @@
         synchronized (proc)
         {
           ProcessService procService = engine.getService(ProcessService.class);
-          procService.unregisterProcess(proc);
+          procService.unregisterProcess(procID);
           runtimeProcesses.remove(procID);
           
           // Notify that the process has now ended

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-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/PersistenceServiceImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -38,8 +38,10 @@
 import org.jbpm.api.ProcessNotFoundException;
 import org.jbpm.api.client.ProcessEngine;
 import org.jbpm.api.model.Process;
+import org.jbpm.api.model.ProcessDefinition;
 import org.jbpm.api.service.PersistenceService;
 import org.jbpm.api.service.Service;
+import org.jbpm.ri.model.ProcessDefinitionImpl;
 import org.jbpm.ri.model.ProcessImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -75,6 +77,68 @@
     this.annotatedClasses = annotatedClasses;
   }
 
+  @Override
+  public ObjectName saveProcessDefinition(ProcessDefinition procDef)
+  {
+    log.debug("START saveProcessDefinition: " + procDef.getKey());
+    Session session = getSessionFactory().openSession();
+    Transaction tx = session.beginTransaction();
+    try
+    {
+      session.save(procDef);
+      tx.commit();
+    }
+    finally
+    {
+      session.close();
+    }
+    log.debug("END saveProcessDefinition: " + procDef.getKey());
+    return procDef.getKey();
+  }
+
+  @Override
+  public ProcessDefinition loadProcessDefinition(ObjectName procDefID)
+  {
+    log.debug("START loadProcessDefinition: " + procDefID);
+    ProcessDefinitionImpl procDefImpl = null;
+    Session session = getSessionFactory().openSession();
+    try
+    {
+      Integer id = Integer.valueOf(procDefID.getKeyProperty("id"));
+      procDefImpl = (ProcessDefinitionImpl)session.load(ProcessDefinitionImpl.class, id);
+      Hibernate.initialize(procDefImpl);
+    }
+    catch (ObjectNotFoundException ex)
+    {
+      throw new ProcessNotFoundException("Cannot find process: " + procDefID);
+    }
+    finally
+    {
+      session.close();
+    }
+    log.debug("END loadProcessDefinition: " + procDefID);
+    return (ProcessDefinition)procDefImpl;
+  }
+
+  @Override
+  public void deleteProcessDefinition(ProcessDefinition procDef)
+  {
+    log.debug("START deleteProcessDefinition: " + procDef);
+    Session session = getSessionFactory().openSession();
+    Transaction tx = session.beginTransaction();
+    try
+    {
+      session.delete(procDef);
+      tx.commit();
+    }
+    finally
+    {
+      session.close();
+    }
+    log.debug("END deleteProcessDefinition: " + procDef);
+  }
+
+  @Override
   public ObjectName saveProcess(Process proc)
   {
     log.debug("START saveProcess: " + proc.getKey());
@@ -93,6 +157,7 @@
     return proc.getKey();
   }
 
+  @Override
   public Process loadProcess(ObjectName procID)
   {
     log.debug("START loadProcess: " + procID);
@@ -113,12 +178,13 @@
       session.close();
     }
     log.debug("END loadProcess: " + procID);
-    return procImpl;
+    return (Process)procImpl;
   }
 
+  @Override
   public void deleteProcess(Process proc)
   {
-    log.debug("START deleteProcess: " + proc.getKey());
+    log.debug("START deleteProcess: " + proc);
     Session session = getSessionFactory().openSession();
     Transaction tx = session.beginTransaction();
     try
@@ -130,7 +196,7 @@
     {
       session.close();
     }
-    log.debug("END deleteProcess: " + proc.getKey());
+    log.debug("END deleteProcess: " + proc);
   }
 
   @SuppressWarnings("unchecked")

Added: 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	                        (rev 0)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -0,0 +1,42 @@
+/*
+ * 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.ri.service;
+
+// $Id$
+
+import org.jbpm.api.client.ProcessEngine;
+import org.jbpm.api.service.ProcessDefinitionService;
+
+/**
+ * The ProcessDefinitionService is the entry point to create, find and otherwise manage process definitions.
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 18-Jun-2008
+ */
+public class ProcessDefinitionServiceImpl extends ProcessDefinitionService implements MutableService
+{
+  @Override
+  public void setProcessEngine(ProcessEngine engine)
+  {
+    super.setProcessEngine(engine);
+  }
+}
\ No newline at end of file


Property changes on: projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessDefinitionServiceImpl.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

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-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/java/org/jbpm/ri/service/ProcessServiceImpl.java	2008-10-02 20:44:53 UTC (rev 2468)
@@ -23,12 +23,8 @@
 
 // $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.
@@ -43,23 +39,4 @@
   {
     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

Modified: projects/spec/trunk/modules/impl/src/main/resources/jbpm-cfg-beans.xml
===================================================================
--- projects/spec/trunk/modules/impl/src/main/resources/jbpm-cfg-beans.xml	2008-10-02 12:37:27 UTC (rev 2467)
+++ projects/spec/trunk/modules/impl/src/main/resources/jbpm-cfg-beans.xml	2008-10-02 20:44:53 UTC (rev 2468)
@@ -13,6 +13,7 @@
           <inject bean="jBPMMessageBuilderService" />
           <inject bean="jBPMPersistenceService" />
           <inject bean="jBPMProcessBuilderService" />
+          <inject bean="jBPMProcessDefinitionService" />
           <inject bean="jBPMProcessService" />
           <inject bean="jBPMSignalService" />
         </set>
@@ -33,12 +34,15 @@
           <value>org.jbpm.ri.model.NodeImpl</value>
           <value>org.jbpm.ri.model.ParallelGatewayImpl</value>
           <value>org.jbpm.ri.model.ParticipantImpl</value>
+          <value>org.jbpm.ri.model.ProcessDefinitionImpl</value>
+          <value>org.jbpm.ri.model.ProcessStructureImpl</value>
           <value>org.jbpm.ri.model.ProcessImpl</value>
           <value>org.jbpm.ri.model.PropertyImpl</value>
           <value>org.jbpm.ri.model.ReceiveTaskImpl</value>
           <value>org.jbpm.ri.model.SendTaskImpl</value>
           <value>org.jbpm.ri.model.SequenceFlowImpl</value>
           <value>org.jbpm.ri.model.StartEventImpl</value>
+          <value>org.jbpm.ri.model.StructureDelegateImpl</value>
           <value>org.jbpm.ri.model.TaskImpl</value>
         </set>
       </property>
@@ -49,6 +53,7 @@
     <bean name="jBPMMessageService" class="org.jbpm.ri.service.MessageServiceImpl" />
     <bean name="jBPMMessageBuilderService" class="org.jbpm.ri.service.MessageBuilderServiceImpl" />
     <bean name="jBPMProcessBuilderService" class="org.jbpm.ri.service.ProcessBuilderServiceImpl" />
+    <bean name="jBPMProcessDefinitionService" class="org.jbpm.ri.service.ProcessDefinitionServiceImpl" />
     <bean name="jBPMProcessService" class="org.jbpm.ri.service.ProcessServiceImpl" />
     <bean name="jBPMSignalService" class="org.jbpm.ri.service.SignalServiceImpl" />
     




More information about the jbpm-commits mailing list