[jbpm-commits] JBoss JBPM SVN: r3220 - in jbpm3/trunk/modules: core/src/main/java/org/jbpm/graph/def and 10 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Fri Dec 5 06:14:57 EST 2008


Author: thomas.diesler at jboss.com
Date: 2008-12-05 06:14:56 -0500 (Fri, 05 Dec 2008)
New Revision: 3220

Added:
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java
   jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/
   jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java
Removed:
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java
Modified:
   jbpm3/trunk/modules/core/pom.xml
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java
   jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java
   jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java
   jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java
Log:
Update spec integration to use proxies

Modified: jbpm3/trunk/modules/core/pom.xml
===================================================================
--- jbpm3/trunk/modules/core/pom.xml	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/pom.xml	2008-12-05 11:14:56 UTC (rev 3220)
@@ -119,6 +119,11 @@
       <artifactId>hsqldb</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>mysql</groupId>
+      <artifactId>mysql-connector-java</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
   <!-- Plugins -->

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/GraphElement.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -42,7 +42,7 @@
 import org.jbpm.svc.Services;
 import org.jbpm.util.EqualsUtil;
 
-public abstract class GraphElement implements Serializable {
+public abstract class GraphElement implements Identifiable, Serializable {
   
   private static final long serialVersionUID = 1L;
 

Added: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java	                        (rev 0)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,33 @@
+/*
+ * 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.graph.def;
+
+/**
+ * Implemteded by elemtes that support an id
+ * 
+ * @author Thomas.Diesler at jboss.com
+ * @since 04-Dec-2008
+ */
+public interface Identifiable 
+{
+  long getId();
+}


Property changes on: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Identifiable.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/def/Node.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -48,6 +48,8 @@
 {
 
   private static final long serialVersionUID = 1L;
+  
+  public enum NodeType { Node, StartState, EndState, State, Task, Fork, Join, Decision };
 
   protected List<Transition> leavingTransitions = null;
   transient Map leavingTransitionMap = null;
@@ -57,10 +59,20 @@
   protected boolean isAsync = false;
   protected boolean isAsyncExclusive = false;
 
+  
+  public NodeType getNodeType()
+  {
+    return NodeType.Node;
+  }
+  
   // event types //////////////////////////////////////////////////////////////
 
-  public static final String[] supportedEventTypes = new String[] { Event.EVENTTYPE_NODE_ENTER, Event.EVENTTYPE_NODE_LEAVE, Event.EVENTTYPE_BEFORE_SIGNAL,
-      Event.EVENTTYPE_AFTER_SIGNAL };
+  public static final String[] supportedEventTypes = new String[] { 
+    Event.EVENTTYPE_NODE_ENTER, 
+    Event.EVENTTYPE_NODE_LEAVE, 
+    Event.EVENTTYPE_BEFORE_SIGNAL,
+    Event.EVENTTYPE_AFTER_SIGNAL 
+  };
 
   public String[] getSupportedEventTypes()
   {
@@ -274,7 +286,7 @@
   /**
    * are the arriving transitions.
    */
-  public Set getArrivingTransitions()
+  public Set<Transition> getArrivingTransitions()
   {
     return arrivingTransitions;
   }

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/ProcessInstance.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,6 +33,7 @@
 import org.jbpm.JbpmException;
 import org.jbpm.context.exe.ContextInstance;
 import org.jbpm.graph.def.Event;
+import org.jbpm.graph.def.Identifiable;
 import org.jbpm.graph.def.Node;
 import org.jbpm.graph.def.ProcessDefinition;
 import org.jbpm.graph.def.Transition;
@@ -54,7 +55,7 @@
  * definition, just use the {@link #ProcessInstance(ProcessDefinition)}.
  * 
  */
-public class ProcessInstance implements Serializable
+public class ProcessInstance implements Identifiable, Serializable
 {
 
   private static final long serialVersionUID = 1L;
@@ -163,6 +164,11 @@
     }
 
     Node initialNode = rootToken.getNode();
+    fireStartEvent(initialNode);
+  }
+
+  public void fireStartEvent(Node initialNode)
+  {
     // fire the process start event
     if (initialNode != null)
     {

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/exe/Token.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -37,6 +37,7 @@
 import org.jbpm.JbpmException;
 import org.jbpm.db.JobSession;
 import org.jbpm.graph.def.Event;
+import org.jbpm.graph.def.Identifiable;
 import org.jbpm.graph.def.Node;
 import org.jbpm.graph.def.ProcessDefinition;
 import org.jbpm.graph.def.Transition;
@@ -57,7 +58,7 @@
  * {@link org.jbpm.graph.def.ProcessDefinition}. Most common way to get a hold of the token objects is with
  * {@link ProcessInstance#getRootToken()} or {@link org.jbpm.graph.exe.ProcessInstance#findToken(String)}.
  */
-public class Token implements Serializable
+public class Token implements Identifiable, Serializable
 {
 
   private static final long serialVersionUID = 1L;

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Decision.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -58,6 +58,12 @@
     super(name);
   }
 
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.Decision;
+  }
+
   public void read(Element decisionElement, JpdlXmlReader jpdlReader) {
 
     String expression = decisionElement.attributeValue("expression");

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/EndState.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -46,6 +46,12 @@
     super(name);
   }
   
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.EndState;
+  }
+
   public void read(Element nodeElement, JpdlXmlReader jpdlXmlReader) {
     endCompleteProcess = nodeElement.attributeValue("end-complete-process");
   }

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Fork.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -76,6 +76,12 @@
     super(name);
   }
 
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.Fork;
+  }
+
   public void read(Element forkElement, JpdlXmlReader jpdlReader) {
     Element scriptElement = forkElement.element("script");
     if (scriptElement!=null) {

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/Join.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -77,6 +77,12 @@
     super(name);
   }
 
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.Join;
+  }
+
   public void read(Element element, JpdlXmlReader jpdlReader) {
     String lock = element.attributeValue("lock");
     if (lock != null) {

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/StartState.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -41,6 +41,22 @@
     super(name);
   }
 
+  @Override
+  public String getName()
+  {
+    String name = super.getName();
+    if (name == null)
+      name = "StartState";
+    
+    return name;
+  }
+
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.StartState;
+  }
+
   // event types //////////////////////////////////////////////////////////////
 
   public static final String[] supportedEventTypes = new String[]{

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/State.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -36,6 +36,13 @@
     super( name );
   }
 
-  public void execute(ExecutionContext executionContext) {
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.State;
   }
+
+  public void execute(ExecutionContext executionContext)
+  {
+  }
 }

Modified: jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java
===================================================================
--- jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/core/src/main/java/org/jbpm/graph/node/TaskNode.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -115,6 +115,12 @@
     super(name);
   }
 
+  @Override
+  public NodeType getNodeType()
+  {
+    return NodeType.Task;
+  }
+
   public void read(Element element, JpdlXmlReader jpdlReader) {
     // get the signal
     String signalText = element.attributeValue("signal");

Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/AbstractElementImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,107 @@
+/*
+ * 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.integration.spec.model;
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.AbstractElement;
+import org.jboss.bpm.api.runtime.ExecutionContext;
+import org.jboss.bpm.api.service.ExecutionContextService;
+import org.jbpm.JbpmContext;
+import org.jbpm.graph.def.Identifiable;
+
+/**
+ * An integration wrapper
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public abstract class AbstractElementImpl<T extends Identifiable> implements AbstractElement
+{
+  private static final long serialVersionUID = 1L;
+
+  private ProcessEngine engine;
+
+  private T tempObj;
+  private Class<T> objClass;
+  private long objID;
+
+  @SuppressWarnings("unchecked")
+  public AbstractElementImpl(ProcessEngine engine, Identifiable tempObj, Class<T> objClass)
+  {
+    this.engine = engine;
+    this.objClass = objClass;
+    // Store the ID of the underlying jBPM3 object
+    objID = tempObj.getId();
+    if (objID == 0)
+      this.tempObj = (T)tempObj;
+  }
+
+  public ProcessEngine getProcessEngine()
+  {
+    return engine;
+  }
+
+  @SuppressWarnings("unchecked")
+  public T getDelegate()
+  {
+    T retObj = null;
+    
+    // Determine the current ID to use
+    long currID = objID;
+    if (currID == 0 && tempObj != null)
+      currID = tempObj.getId();
+    
+    // If there is no ID, use the tmp object
+    if (currID == 0 && tempObj != null)
+      retObj = tempObj;
+
+    // Get the delegate from the persistence session 
+    if (retObj == null)
+    {
+      if (objClass == null || currID == 0)
+        throw new IllegalArgumentException("Cannot obtain delegate for '" + objClass + "' id: " + currID);
+
+      // From now on use this object ID
+      objID = currID;
+      tempObj = null;
+      
+      ExecutionContextService execService = getProcessEngine().getService(ExecutionContextService.class);
+      ExecutionContext bpmContext = execService.getExecutionContext(true);
+      try
+      {
+        JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
+        Object obj = jbpmContext.getSession().get(objClass, objID);
+        retObj = (T)obj;
+      }
+      finally
+      {
+        bpmContext.close();
+      }
+    }
+
+    // Complain if the delegate cannot be obtained
+    if (retObj == null)
+      throw new IllegalStateException("Cannot obtain delegate for '" + objClass.getName() + "' id: " + objID);
+
+    return retObj;
+  }
+}


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

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EndEventImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -24,9 +24,11 @@
 import java.util.List;
 
 import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.EndEvent;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.model.SequenceFlow;
+import org.jbpm.graph.def.Node;
 import org.jbpm.graph.node.EndState;
 
 /**
@@ -35,13 +37,13 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class EndEventImpl extends EventImpl implements EndEvent
+public class EndEventImpl extends EventImpl<EndState> implements EndEvent
 {
   private static final long serialVersionUID = 1L;
   
-  public EndEventImpl(ProcessDefinition procDef, EndState oldEnd)
+  public EndEventImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldEnd)
   {
-    super(procDef, oldEnd);
+    super(engine, procDef, EndState.class, oldEnd);
   }
 
   //@Override

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/EventImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -21,6 +21,7 @@
  */
 package org.jbpm.integration.spec.model;
 
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.Event;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jbpm.graph.def.Node;
@@ -31,12 +32,12 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public abstract class EventImpl extends NodeImpl implements Event
+public abstract class EventImpl<T extends Node> extends NodeImpl<T> implements Event
 {
   private static final long serialVersionUID = 1L;
   
-  public EventImpl(ProcessDefinition procDef, Node oldNode)
+  public EventImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, Node oldNode)
   {
-    super(procDef, oldNode);
+    super(engine, procDef, clazz, oldNode);
   }
 }

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ExclusiveGatewayImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -30,6 +30,7 @@
 import org.jboss.bpm.api.model.SequenceFlow;
 import org.jboss.bpm.api.model.SequenceFlow.ConditionType;
 import org.jboss.bpm.api.runtime.Token;
+import org.jbpm.graph.def.Node;
 import org.jbpm.graph.exe.ExecutionContext;
 import org.jbpm.graph.node.Decision;
 import org.jbpm.graph.node.DecisionHandler;
@@ -43,15 +44,15 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class ExclusiveGatewayImpl extends GatewayImpl implements ExclusiveGateway
+public class ExclusiveGatewayImpl extends GatewayImpl<Decision> implements ExclusiveGateway
 {
   private static final long serialVersionUID = 1L;
 
-  public ExclusiveGatewayImpl(ProcessDefinition procDef, Decision oldDecision)
+  public ExclusiveGatewayImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldDecision)
   {
-    super(procDef, oldDecision);
+    super(engine, procDef, Decision.class, oldDecision);
     ExclusiveGatewayDecisionHandler decisionHandler = new ExclusiveGatewayDecisionHandler();
-    oldDecision.setDecisionDelegation(new Delegation(decisionHandler));
+    getDelegate().setDecisionDelegation(new Delegation(decisionHandler));
   }
 
   //@Override
@@ -118,7 +119,7 @@
       }
 
       if (selectedGate == null)
-        throw new IllegalStateException("Cannot select applicable gate in: " + getOldNode());
+        throw new IllegalStateException("Cannot select applicable gate in: " + this);
 
       return selectedGate.getTargetRef();
     }

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/GatewayImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -24,6 +24,7 @@
 import java.util.List;
 
 import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.Gateway;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.model.SequenceFlow;
@@ -35,13 +36,13 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public abstract class GatewayImpl extends NodeImpl implements Gateway
+public abstract class GatewayImpl<T extends Node> extends NodeImpl<T> implements Gateway
 {
   private static final long serialVersionUID = 1L;
 
-  public GatewayImpl(ProcessDefinition procDef, Node oldNode)
+  public GatewayImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, Node oldNode)
   {
-    super(procDef, oldNode);
+    super(engine, procDef, clazz, oldNode);
   }
 
   //@Override

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NodeImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -30,6 +30,7 @@
 import org.jboss.bpm.api.Constants;
 import org.jboss.bpm.api.InvalidProcessException;
 import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.Node;
 import org.jboss.bpm.api.model.Process;
 import org.jboss.bpm.api.model.ProcessDefinition;
@@ -37,6 +38,7 @@
 import org.jboss.bpm.api.model.SequenceFlow.ConditionType;
 import org.jboss.bpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.graph.def.Transition;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
 
 /**
  * An integration wrapper 
@@ -44,36 +46,30 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class NodeImpl implements Node
+public abstract class NodeImpl<T extends org.jbpm.graph.def.Node> extends AbstractElementImpl<T> implements Node
 {
   private static final long serialVersionUID = 1L;
   
   private ProcessDefinition procDef;
   
-  private org.jbpm.graph.def.Node oldNode;
   private List<SequenceFlow> outFlows = new ArrayList<SequenceFlow>();
   private List<SequenceFlow> inFlows = new ArrayList<SequenceFlow>();
 
-  public NodeImpl(ProcessDefinition procDef, org.jbpm.graph.def.Node oldNode)
+  public NodeImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, org.jbpm.graph.def.Node oldNode)
   {
+    super(engine, oldNode, clazz);
     this.procDef = procDef;
-    this.oldNode = oldNode;
   }
 
   public ObjectName getKey()
   {
-    long id = oldNode.getId();
+    long id = getDelegate().getId();
     return ObjectNameFactory.create(Constants.ID_DOMAIN + ":node=" + getName() + ",id=" + id);
   }
   
-  public org.jbpm.graph.def.Node getOldNode()
-  {
-    return oldNode;
-  }
-
   public String getName()
   {
-    return oldNode.getName();
+    return getDelegate().getName();
   }
 
   public ProcessDefinition getProcessDefinition()
@@ -86,18 +82,21 @@
     throw new NotImplementedException();
   }
   
+  @SuppressWarnings("unchecked")
   public void addSequenceFlow(SequenceFlowImpl flow)
   {
     String targetRef = flow.getTargetRef();
-    NodeImpl targetNode = (NodeImpl)procDef.getNode(targetRef);
+    NodeImpl<T> targetNode = (NodeImpl<T>)procDef.getNode(targetRef);
     if (targetNode == null)
       throw new InvalidProcessException("Cannot obtain target node: " + targetRef);
     
+    org.jbpm.graph.def.Node delegate = getDelegate();
+    
     Transition trans = flow.getOldTransition();
-    if (oldNode.hasLeavingTransition(trans.getName()) == false)
+    if (delegate.hasLeavingTransition(trans.getName()) == false)
     {
-      oldNode.addLeavingTransition(trans);
-      targetNode.getOldNode().addArrivingTransition(trans);
+      delegate.addLeavingTransition(trans);
+      targetNode.getDelegate().addArrivingTransition(trans);
     }
     
     if (flow.getConditionType() == ConditionType.Expression)
@@ -118,7 +117,7 @@
     SequenceFlow outFlow = null;
     for (SequenceFlow auxFlow : outFlows)
     {
-      SequenceFlowImpl flowImpl = (SequenceFlowImpl)auxFlow;
+      SequenceFlowImpl flowImpl = InvocationProxy.getUnderlying(auxFlow, SequenceFlowImpl.class);
       if (flowImpl.getOldTransition() == trans)
       {
         outFlow = auxFlow;
@@ -137,9 +136,4 @@
   {
     return Collections.unmodifiableList(outFlows);
   }
-
-  public String toString()
-  {
-    return oldNode.toString();
-  }
 }

Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/NoneTaskImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,49 @@
+/*
+ * 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.integration.spec.model;
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.api.model.Task;
+import org.jbpm.graph.def.Node;
+
+/**
+ * An integration wrapper
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public class NoneTaskImpl extends TaskImpl<Node> implements Task
+{
+  private static final long serialVersionUID = 1L;
+
+  public NoneTaskImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldNode)
+  {
+    super(engine, procDef, Node.class, oldNode);
+  }
+
+  //@Override
+  public TaskType getTaskType()
+  {
+    return TaskType.None;
+  }
+}


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

Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayForkImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,52 @@
+/*
+ * 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.integration.spec.model;
+
+// $Id$
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.incubator.model.ParallelGateway;
+import org.jbpm.graph.def.Node;
+import org.jbpm.graph.node.Fork;
+
+/**
+ * An integration wrapper
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public class ParallelGatewayForkImpl extends GatewayImpl<Fork> implements ParallelGateway
+{
+  private static final long serialVersionUID = 1L;
+
+  public ParallelGatewayForkImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldFork)
+  {
+    super(engine, procDef, Fork.class, oldFork);
+  }
+  
+  // @Override
+  public GatewayType getGatewayType()
+  {
+    return GatewayType.Parallel;
+  }
+}


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

Deleted: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -1,56 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jbpm.integration.spec.model;
-
-// $Id$
-
-import org.jboss.bpm.api.model.ProcessDefinition;
-import org.jboss.bpm.incubator.model.ParallelGateway;
-import org.jbpm.graph.node.Fork;
-import org.jbpm.graph.node.Join;
-
-/**
- * An integration wrapper
- * 
- * @author thomas.diesler at jboss.com
- * @since 15-Nov-2008
- */
-public class ParallelGatewayImpl extends GatewayImpl implements ParallelGateway
-{
-  private static final long serialVersionUID = 1L;
-
-  public ParallelGatewayImpl(ProcessDefinition procDef, Fork oldFork)
-  {
-    super(procDef, oldFork);
-  }
-
-  public ParallelGatewayImpl(ProcessDefinition procDef, Join oldJoin)
-  {
-    super(procDef, oldJoin);
-  }
-
-  // @Override
-  public GatewayType getGatewayType()
-  {
-    return GatewayType.Parallel;
-  }
-}

Copied: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java (from rev 3200, jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayImpl.java)
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ParallelGatewayJoinImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,52 @@
+/*
+ * 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.integration.spec.model;
+
+// $Id$
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.incubator.model.ParallelGateway;
+import org.jbpm.graph.def.Node;
+import org.jbpm.graph.node.Join;
+
+/**
+ * An integration wrapper
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 15-Nov-2008
+ */
+public class ParallelGatewayJoinImpl extends GatewayImpl<Join> implements ParallelGateway
+{
+  private static final long serialVersionUID = 1L;
+
+  public ParallelGatewayJoinImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldJoin)
+  {
+    super(engine, procDef, Join.class, oldJoin);
+  }
+
+  // @Override
+  public GatewayType getGatewayType()
+  {
+    return GatewayType.Parallel;
+  }
+}

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessDefinitionImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -29,6 +29,7 @@
 
 import org.jboss.bpm.api.Constants;
 import org.jboss.bpm.api.InvalidProcessException;
+import org.jboss.bpm.api.NotImplementedException;
 import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.Expression;
 import org.jboss.bpm.api.model.Node;
@@ -37,14 +38,9 @@
 import org.jboss.bpm.api.model.SequenceFlow.ConditionType;
 import org.jboss.bpm.api.model.builder.ObjectNameFactory;
 import org.jbpm.graph.def.Transition;
+import org.jbpm.graph.def.Node.NodeType;
 import org.jbpm.graph.exe.ProcessInstance;
-import org.jbpm.graph.node.Decision;
-import org.jbpm.graph.node.EndState;
-import org.jbpm.graph.node.Fork;
-import org.jbpm.graph.node.Join;
-import org.jbpm.graph.node.StartState;
-import org.jbpm.graph.node.State;
-import org.jbpm.graph.node.TaskNode;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,15 +50,14 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class ProcessDefinitionImpl implements ProcessDefinition
+public class ProcessDefinitionImpl extends AbstractElementImpl<org.jbpm.graph.def.ProcessDefinition> implements ProcessDefinition
 {
   private static final long serialVersionUID = 1L;
 
   // provide logging
   private static final Logger log = LoggerFactory.getLogger(ProcessDefinitionImpl.class);
-  
-  private ProcessEngine engine;
-  private org.jbpm.graph.def.ProcessDefinition oldProcDef;
+
+  private ObjectName keyCache;
   private List<Node> nodes;
 
   public ProcessDefinitionImpl(ProcessEngine engine, String name)
@@ -70,28 +65,25 @@
     this(engine, new org.jbpm.graph.def.ProcessDefinition(name));
   }
 
-  public ProcessDefinitionImpl(ProcessEngine engine, org.jbpm.graph.def.ProcessDefinition oldProcDef)
+  public ProcessDefinitionImpl(ProcessEngine engine, org.jbpm.graph.def.ProcessDefinition tmpProcDef)
   {
-    this.oldProcDef = oldProcDef;
-    this.engine = engine;
+    super(engine, tmpProcDef, org.jbpm.graph.def.ProcessDefinition.class);
 
-    if (oldProcDef.getName() == null)
+    if (tmpProcDef.getName() == null)
       throw new InvalidProcessException("ProcessDefinition name cannot be null");
   }
 
-  public org.jbpm.graph.def.ProcessDefinition getOldProcessDefinition()
-  {
-    return oldProcDef;
-  }
-
-  public ProcessEngine getProcessEngine()
-  {
-    return engine;
-  }
-
   public ObjectName getKey()
   {
-    return getKey(oldProcDef);
+    ObjectName objKey = keyCache;
+    if (objKey == null)
+    {
+      org.jbpm.graph.def.ProcessDefinition delegate = getDelegate();
+      objKey = getKey(delegate);
+      if (delegate.getId() > 0)
+        keyCache = objKey;
+    }
+    return objKey;
   }
 
   public static ObjectName getKey(org.jbpm.graph.def.ProcessDefinition oldProcDef)
@@ -108,32 +100,36 @@
 
   public String getName()
   {
-    return oldProcDef.getName();
+    return getDelegate().getName();
   }
 
   public String getVersion()
   {
-    int version = oldProcDef.getVersion();
+    int version = getDelegate().getVersion();
     return version > 0 ? String.valueOf(version) : null;
   }
 
   public Process newInstance()
   {
-    ProcessImpl procImpl = new ProcessImpl(engine, new ProcessInstance(oldProcDef));
-    return procImpl;
+    ProcessInstance oldProc = new ProcessInstance();
+    oldProc.setProcessDefinition(getDelegate());
+
+    Process proc = new ProcessImpl(getProcessEngine(), oldProc);
+    proc = InvocationProxy.newInstance((ProcessImpl)proc, Process.class);
+    return proc;
   }
 
-  public void addNode(NodeImpl nodeImpl)
+  public void addNode(NodeImpl<?> nodeImpl)
   {
-    org.jbpm.graph.def.Node oldNode = nodeImpl.getOldNode();
-    oldProcDef.addNode(oldNode);
+    org.jbpm.graph.def.Node oldNode = nodeImpl.getDelegate();
+    getDelegate().addNode(oldNode);
   }
 
   public Node getNode(String name)
   {
     if (name == null)
       throw new IllegalArgumentException("Cannot find node with name: null");
-    
+
     Node retNode = null;
     for (Node auxNode : getNodes())
     {
@@ -151,46 +147,50 @@
     if (nodes == null)
     {
       nodes = new ArrayList<Node>();
-      for(org.jbpm.graph.def.Node oldNode : oldProcDef.getNodes())
+      ProcessEngine engine = getProcessEngine();
+      for (org.jbpm.graph.def.Node oldNode : getDelegate().getNodes())
       {
-        NodeImpl nodeImpl;
-        if (oldNode instanceof StartState)
+        NodeImpl<?> nodeImpl;
+        NodeType nodeType = oldNode.getNodeType();
+        if (nodeType == NodeType.StartState)
         {
-          nodeImpl = new StartEventImpl(this, (StartState)oldNode);
+          nodeImpl = new StartEventImpl(engine, this, oldNode);
         }
-        else if (oldNode instanceof State)
+        else if (nodeType == NodeType.State)
         {
-          nodeImpl = new WaitStateImpl(this, (State)oldNode);
+          nodeImpl = new WaitStateImpl(engine, this, oldNode);
         }
-        else if (oldNode instanceof Fork)
+        else if (nodeType == NodeType.Fork)
         {
-          nodeImpl = new ParallelGatewayImpl(this, (Fork)oldNode);
+          nodeImpl = new ParallelGatewayForkImpl(engine, this, oldNode);
         }
-        else if (oldNode instanceof Join)
+        else if (nodeType == NodeType.Join)
         {
-          nodeImpl = new ParallelGatewayImpl(this, (Join)oldNode);
+          nodeImpl = new ParallelGatewayJoinImpl(engine, this, oldNode);
         }
-        else if (oldNode instanceof Decision)
+        else if (nodeType == NodeType.Decision)
         {
-          nodeImpl = new ExclusiveGatewayImpl(this, (Decision)oldNode);
+          nodeImpl = new ExclusiveGatewayImpl(engine, this, oldNode);
         }
-        else if (oldNode instanceof TaskNode)
+        else if (nodeType == NodeType.Task)
         {
-          nodeImpl = new UserTaskImpl(this, (TaskNode)oldNode);
+          nodeImpl = new UserTaskImpl(engine, this, oldNode);
         }
-        else if (oldNode instanceof EndState)
+        else if (nodeType == NodeType.EndState)
         {
-          nodeImpl = new EndEventImpl(this, (EndState)oldNode);
+          nodeImpl = new EndEventImpl(engine, this, oldNode);
         }
-        // Fallback to a general Task node
+        else if (nodeType == NodeType.Node)
+        {
+          nodeImpl = new NoneTaskImpl(engine, this, oldNode);
+        }
         else
         {
-          nodeImpl = new TaskImpl(this, oldNode);
+          throw new NotImplementedException("Unsupported node type: " + nodeType);
         }
-        
+
         nodes.add(nodeImpl);
       }
-      
       initializeSequenceFlows(nodes);
     }
     return Collections.unmodifiableList(nodes);
@@ -223,14 +223,14 @@
   {
     for (Node node : nodes)
     {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      org.jbpm.graph.def.Node oldNode = nodeImpl.getOldNode();
+      NodeImpl<?> nodeImpl = (NodeImpl<?>)node;
+      org.jbpm.graph.def.Node oldNode = nodeImpl.getDelegate();
       if (oldNode.getLeavingTransitions() != null)
       {
         for (Transition trans : oldNode.getLeavingTransitions())
         {
           SequenceFlowImpl seqFlow = new SequenceFlowImpl(trans);
-          
+
           String condition = trans.getCondition();
           if (condition != null)
           {

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/ProcessImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -41,8 +41,11 @@
 import org.jboss.bpm.api.runtime.Token.TokenStatus;
 import org.jboss.bpm.api.service.ExecutionContextService;
 import org.jboss.bpm.api.service.ProcessService;
+import org.jbpm.JbpmContext;
 import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
 import org.jbpm.integration.spec.runtime.TokenImpl;
+import org.jbpm.util.Clock;
 
 /**
  * An integration wrapper
@@ -50,65 +53,60 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class ProcessImpl implements Process
+public class ProcessImpl extends AbstractElementImpl<ProcessInstance> implements Process
 {
   private static final long serialVersionUID = 1L;
 
-  private ProcessEngine engine;
-  private ProcessInstance oldProc;
-  private ProcessDefinition procDefCache;
+  private ObjectName keyCache;
+  
+  // [TODO] delegate this property
   private ProcessStatus status = ProcessStatus.None;
 
-  public ProcessImpl(ProcessEngine engine, ProcessInstance oldProc)
+  public ProcessImpl(ProcessEngine engine, ProcessInstance tempObj)
   {
-    this.engine = engine;
-    this.oldProc = oldProc;
+    super(engine, tempObj, ProcessInstance.class);
   }
 
   // @Override
   public ObjectName getKey()
   {
-    return getKey(oldProc);
+    ObjectName objKey = keyCache;
+    if (objKey == null)
+    {
+      ProcessInstance delegate = getDelegate();
+      objKey = getKey(delegate);
+      if (delegate.getId() > 0)
+        keyCache = objKey;
+    }
+    return objKey;
   }
 
-  public static ObjectName getKey(ProcessInstance oldProc)
+  public static ObjectName getKey(ProcessInstance procInst)
   {
-    return ObjectNameFactory.create(Constants.ID_DOMAIN + ":proc=" + oldProc.getProcessDefinition().getName() + ",id=" + oldProc.getId());
+    org.jbpm.graph.def.ProcessDefinition oldProcDef = procInst.getProcessDefinition();
+    return ObjectNameFactory.create(Constants.ID_DOMAIN + ":proc=" + oldProcDef.getName() + ",id=" + procInst.getId());
   }
   
   // @Override
   public ProcessDefinition getProcessDefinition()
   {
-    if (procDefCache == null)
-    {
-      procDefCache = new ProcessDefinitionImpl(engine, oldProc.getProcessDefinition());
-    }
-    return procDefCache;
+    ProcessDefinitionImpl procDef = new ProcessDefinitionImpl(getProcessEngine(), getDelegate().getProcessDefinition());
+    return InvocationProxy.newInstance(procDef, ProcessDefinition.class);
   }
 
   // @Override
-  public ProcessEngine getProcessEngine()
-  {
-    return getProcessDefinition().getProcessEngine();
-  }
-
-  public ProcessInstance getOldProcessInstance()
-  {
-    return oldProc;
-  }
-
-  // @Override
   public ProcessStatus getProcessStatus()
   {
     Token rootToken = getRootToken();
     TokenStatus tokenStatus = rootToken != null ? rootToken.getTokenStatus() : null;
 
-    if (oldProc.isSuspended())
+    ProcessInstance delegate = getDelegate();
+    if (delegate.isSuspended())
       status = ProcessStatus.Suspended;
 
     if (status == ProcessStatus.Active)
     {
-      if (oldProc.hasEnded() || tokenStatus == TokenStatus.Destroyed)
+      if (delegate.hasEnded() || tokenStatus == TokenStatus.Destroyed)
         status = ProcessStatus.Completed;
     }
     return status;
@@ -119,6 +117,17 @@
     this.status = status;
   }
 
+  public Token getRootToken()
+  {
+    Token token = null;
+    if (getDelegate().getRootToken() != null)
+    {
+      TokenImpl tokenImpl = new TokenImpl(getProcessEngine(), getDelegate().getRootToken());
+      token = InvocationProxy.newInstance(tokenImpl, Token.class);
+    }
+    return token;
+  }
+
   // @Override
   public String getName()
   {
@@ -127,12 +136,12 @@
 
   public Date getEndDate()
   {
-    return oldProc.getEnd();
+    return getDelegate().getEnd();
   }
 
   public Date getStartDate()
   {
-    return oldProc.getStart();
+    return getDelegate().getStart();
   }
 
   // @Override
@@ -168,17 +177,28 @@
   // @Override
   public Token startProcess(Attachments contextData)
   {
-    
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
     {
       // Register the Process
       ProcessService procService = getProcessEngine().getService(ProcessService.class);
-      procService.registerProcess(this);
+      if (procService.getProcess(getKey()) == null)
+        procService.registerProcess(this);
 
+      ProcessInstance delegate = getDelegate();
+      
+      // Initialize the members
+      org.jbpm.graph.exe.Token rootToken = new org.jbpm.graph.exe.Token(delegate);
+      delegate.setStart(Clock.getCurrentTime());
+      delegate.setRootToken(rootToken);
+
       // Create the root token
-      Token token = new TokenImpl(engine, oldProc.getRootToken());
+      Token token = new TokenImpl(getProcessEngine(), rootToken);
+      
+      // Save the root token
+      JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
+      jbpmContext.getSession().save(rootToken);
 
       // Initialize the context data
       if (contextData != null)
@@ -191,23 +211,29 @@
         }
       }
 
+      // Set process to active
+      setProcessStatus(ProcessStatus.Active);
+      
+      // Fire the jbpm3 start event
+      NodeImpl<?> initialNode = (NodeImpl<?>)token.getCurrentNode();
+      delegate.fireStartEvent(initialNode.getDelegate());
+      
       // Signal the root token
-      setProcessStatus(ProcessStatus.Active);
       token.signal();
 
-      return token;
+      return InvocationProxy.newInstance((TokenImpl)token, Token.class);
     }
+    catch (RuntimeException rte)
+    {
+      setProcessStatus(ProcessStatus.Aborted);
+      throw rte;
+    }
     finally
     {
       bpmContext.close();
     }
   }
 
-  public Token getRootToken()
-  {
-    return new TokenImpl(engine, oldProc.getRootToken());
-  }
-
   public Set<Token> getTokens()
   {
     return getAllTokens(getRootToken());
@@ -218,7 +244,7 @@
     if (status != ProcessStatus.Active)
       throw new IllegalStateException("Cannot suspend a process in state: " + status);
     
-    oldProc.suspend();
+    getDelegate().suspend();
     status = ProcessStatus.Suspended;
   }
 
@@ -227,7 +253,7 @@
     if (status != ProcessStatus.Suspended)
       throw new IllegalStateException("Cannot resume a process in state: " + status);
     
-    oldProc.resume();
+    getDelegate().resume();
     status = ProcessStatus.Active;
   }
 
@@ -236,8 +262,10 @@
     if (status != ProcessStatus.Active && status != ProcessStatus.Suspended)
       throw new IllegalStateException("Cannot cancel a process in state: " + status);
     
-    oldProc.setEnd(new Date());
-    oldProc.end();
+    ProcessInstance delegate = getDelegate();
+    delegate.setEnd(new Date());
+    delegate.end();
+    
     status = ProcessStatus.Cancelled;
   }
 

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/StartEventImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -23,11 +23,12 @@
 
 import java.util.List;
 
-import org.jboss.bpm.api.InvalidProcessException;
 import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.model.SequenceFlow;
 import org.jboss.bpm.api.model.StartEvent;
+import org.jbpm.graph.def.Node;
 import org.jbpm.graph.node.StartState;
 
 /**
@@ -36,19 +37,13 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class StartEventImpl extends EventImpl implements StartEvent
+public class StartEventImpl extends EventImpl<StartState> implements StartEvent
 {
   private static final long serialVersionUID = 1L;
 
-  private StartState oldStart;
-
-  public StartEventImpl(ProcessDefinition procDef, StartState oldStart)
+  public StartEventImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldStart)
   {
-    super(procDef, oldStart);
-    this.oldStart = oldStart;
-
-    if (oldStart.getName() == null)
-      throw new InvalidProcessException("StartEvent name cannot be null");
+    super(engine, procDef, StartState.class, oldStart);
   }
 
   // @Override

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/TaskImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -24,11 +24,11 @@
 import java.util.List;
 
 import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.model.SequenceFlow;
 import org.jboss.bpm.api.model.Task;
 import org.jbpm.graph.def.Node;
-import org.jbpm.graph.def.Transition;
 
 /**
  * An integration wrapper
@@ -36,22 +36,16 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class TaskImpl extends NodeImpl implements Task
+public abstract class TaskImpl<T extends Node> extends NodeImpl<T> implements Task
 {
   private static final long serialVersionUID = 1L;
 
-  public TaskImpl(ProcessDefinition procDef, org.jbpm.graph.def.Node oldNode)
+  public TaskImpl(ProcessEngine engine, ProcessDefinition procDef, Class<T> clazz, Node oldNode)
   {
-    super(procDef, oldNode);
+    super(engine, procDef, clazz, oldNode);
   }
 
   //@Override
-  public TaskType getTaskType()
-  {
-    return TaskType.None;
-  }
-  
-  //@Override
   public SequenceFlow getInFlow()
   {
     List<SequenceFlow> inFlows = getInFlows();

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/UserTaskImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -22,10 +22,12 @@
 package org.jbpm.integration.spec.model;
 
 import org.jboss.bpm.api.NotImplementedException;
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.incubator.client.UserTaskCallback;
 import org.jboss.bpm.incubator.model.Message;
 import org.jboss.bpm.incubator.model.UserTask;
+import org.jbpm.graph.def.Node;
 import org.jbpm.graph.node.TaskNode;
 
 /**
@@ -34,13 +36,13 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class UserTaskImpl extends TaskImpl implements UserTask
+public class UserTaskImpl extends TaskImpl<TaskNode> implements UserTask
 {
   private static final long serialVersionUID = 1L;
 
-  public UserTaskImpl(ProcessDefinition procDef, TaskNode oldTaskNode)
+  public UserTaskImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldTaskNode)
   {
-    super(procDef, oldTaskNode);
+    super(engine, procDef, TaskNode.class, oldTaskNode);
   }
 
   // @Override

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/WaitStateImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -21,8 +21,10 @@
  */
 package org.jbpm.integration.spec.model;
 
+import org.jboss.bpm.api.client.ProcessEngine;
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.model.WaitState;
+import org.jbpm.graph.def.Node;
 import org.jbpm.graph.node.State;
 
 /**
@@ -31,13 +33,13 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class WaitStateImpl extends TaskImpl implements WaitState
+public class WaitStateImpl extends TaskImpl<State> implements WaitState
 {
   private static final long serialVersionUID = 1L;
 
-  public WaitStateImpl(ProcessDefinition procDef, State oldState)
+  public WaitStateImpl(ProcessEngine engine, ProcessDefinition procDef, Node oldState)
   {
-    super(procDef, oldState);
+    super(engine, procDef, State.class, oldState);
   }
 
   //@Override

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/model/builder/ProcessBuilderImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -41,6 +41,7 @@
 import org.jboss.bpm.api.model.builder.GatewayBuilder;
 import org.jboss.bpm.api.model.builder.ProcessBuilder;
 import org.jbpm.graph.def.Transition;
+import org.jbpm.graph.def.Node.NodeType;
 import org.jbpm.graph.node.Decision;
 import org.jbpm.graph.node.EndState;
 import org.jbpm.graph.node.StartState;
@@ -48,10 +49,10 @@
 import org.jbpm.integration.spec.model.EndEventImpl;
 import org.jbpm.integration.spec.model.ExclusiveGatewayImpl;
 import org.jbpm.integration.spec.model.NodeImpl;
+import org.jbpm.integration.spec.model.NoneTaskImpl;
 import org.jbpm.integration.spec.model.ProcessDefinitionImpl;
 import org.jbpm.integration.spec.model.SequenceFlowImpl;
 import org.jbpm.integration.spec.model.StartEventImpl;
-import org.jbpm.integration.spec.model.TaskImpl;
 import org.jbpm.integration.spec.model.WaitStateImpl;
 
 /**
@@ -64,7 +65,7 @@
 {
   protected ProcessEngine engine;
   protected ProcessDefinitionImpl procDefImpl;
-  protected NodeImpl nodeImpl;
+  protected NodeImpl<?> nodeImpl;
   
   private List<FlowSpec> flows = new ArrayList<FlowSpec>();
 
@@ -98,7 +99,10 @@
   //@Override
   public ProcessBuilder addStartEvent(String name)
   {
-    nodeImpl = new StartEventImpl(procDefImpl, new StartState(name));
+    if (name == null)
+      throw new InvalidProcessException("StartEvent name cannot be null");
+    
+    nodeImpl = new StartEventImpl(engine, procDefImpl, new StartState(name));
     procDefImpl.addNode(nodeImpl);
     return this;
   }
@@ -108,7 +112,7 @@
   {
     if (type == GatewayType.Exclusive)
     {
-      nodeImpl = new ExclusiveGatewayImpl(procDefImpl, new Decision(name));
+      nodeImpl = new ExclusiveGatewayImpl(engine, procDefImpl, new Decision(name));
       procDefImpl.addNode(nodeImpl);
     }
     else
@@ -129,12 +133,12 @@
   {
     if (type == TaskType.None)
     {
-      nodeImpl = new TaskImpl(procDefImpl, new org.jbpm.graph.def.Node(name));
+      nodeImpl = new NoneTaskImpl(engine, procDefImpl, new org.jbpm.graph.def.Node(name));
       procDefImpl.addNode(nodeImpl);
     }
     else if (type == TaskType.Wait)
     {
-      nodeImpl = new WaitStateImpl(procDefImpl, new State(name));
+      nodeImpl = new WaitStateImpl(engine, procDefImpl, new State(name));
       procDefImpl.addNode(nodeImpl);
     }
     else
@@ -147,7 +151,7 @@
   //@Override
   public ProcessBuilder addEndEvent(String name)
   {
-    nodeImpl = new EndEventImpl(procDefImpl, new EndState(name));
+    nodeImpl = new EndEventImpl(engine, procDefImpl, new EndState(name));
     procDefImpl.addNode(nodeImpl);
     return this;
   }
@@ -185,17 +189,17 @@
     // Initialize the flows
     for (FlowSpec flow : flows)
     {
-      NodeImpl srcNode = (NodeImpl)procDefImpl.getNode(flow.source);
+      NodeImpl<?> srcNode = (NodeImpl<?>)procDefImpl.getNode(flow.source);
       if (srcNode == null)
         throw new InvalidProcessException("Cannot obtain source node: " + flow.source);
       
-      NodeImpl targetNode = (NodeImpl)procDefImpl.getNode(flow.target);
+      NodeImpl<?> targetNode = (NodeImpl<?>)procDefImpl.getNode(flow.target);
       if (targetNode == null)
         throw new InvalidProcessException("Cannot obtain target node: " + flow.target);
       
       Transition trans = new Transition(flow.target);
-      trans.setFrom(srcNode.getOldNode());
-      trans.setTo(targetNode.getOldNode());
+      trans.setFrom(srcNode.getDelegate());
+      trans.setTo(targetNode.getDelegate());
       
       SequenceFlowImpl seqFlow = new SequenceFlowImpl(trans, flow.exprLang, flow.exprBody);
       srcNode.addSequenceFlow(seqFlow);
@@ -214,18 +218,24 @@
     // Detect unreachable nodes
     for (Node node : procDefImpl.getNodes())
     {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      Set arriving = nodeImpl.getOldNode().getArrivingTransitions();
-      if (!(node instanceof StartEvent) && arriving == null)
+      NodeImpl<?> nodeImpl = (NodeImpl<?>)node;
+      org.jbpm.graph.def.Node delegate = nodeImpl.getDelegate();
+      Set<Transition> arriving = delegate.getArrivingTransitions();
+      
+      NodeType nodeType = delegate.getNodeType();
+      if (nodeType != NodeType.StartState && arriving == null)
         throw new InvalidProcessException("Unreachable node: " + node);
     }
     
     // Detect dead end nodes
     for (Node node : procDefImpl.getNodes())
     {
-      NodeImpl nodeImpl = (NodeImpl)node;
-      List leaving = nodeImpl.getOldNode().getLeavingTransitions();
-      if (!(node instanceof EndEvent) && leaving == null)
+      NodeImpl<?> nodeImpl = (NodeImpl<?>)node;
+      org.jbpm.graph.def.Node delegate = nodeImpl.getDelegate();
+      List<Transition> leaving = delegate.getLeavingTransitions();
+      
+      NodeType nodeType = delegate.getNodeType();
+      if (nodeType != NodeType.EndState && leaving == null)
         throw new InvalidProcessException("Dead end node: " + node);
     }
   }

Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,113 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file 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.integration.spec.runtime;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.util.Arrays;
+import java.util.List;
+
+import org.jboss.bpm.api.client.ProcessEngine;
+import org.jboss.bpm.api.model.AbstractElement;
+import org.jboss.bpm.api.runtime.ExecutionContext;
+import org.jboss.bpm.api.service.ExecutionContextService;
+import org.jbpm.integration.spec.model.AbstractElementImpl;
+
+/**
+ * Decorates management invocations with common system aspects.
+ * 
+ * @author Thomas.Diesler at jboss.com
+ * @since 05-Dec-2008
+ */
+public class InvocationProxy implements InvocationProxySupport, InvocationHandler
+{
+  private static List<Method> proxyMethods = Arrays.asList(InvocationProxySupport.class.getMethods());
+  
+  private AbstractElementImpl<?> abstractElement;
+  private ProcessEngine engine;
+  
+  @SuppressWarnings("unchecked")
+  public static <T> T newInstance(AbstractElementImpl<?> obj, Class<T> interf)
+  {
+    Class[] interfaces = new Class[] { interf, InvocationProxySupport.class };
+    ClassLoader classLoader = obj.getClass().getClassLoader();
+    return (T)Proxy.newProxyInstance(classLoader, interfaces, new InvocationProxy(obj));
+  }
+
+  @SuppressWarnings("unchecked")
+  public static <T> T getUnderlying(Object implObj, Class<T> implClazz)
+  {
+    T underlyingImpl;
+    if (implClazz.isInstance(implObj))
+    {
+      underlyingImpl = (T)implObj;
+    }
+    else if (implObj instanceof InvocationProxySupport)
+    {
+      InvocationProxySupport proxy = (InvocationProxySupport)implObj;
+      underlyingImpl = (T)proxy.getAbstractElement();
+    }
+    else
+    {
+      throw new IllegalArgumentException("Cannot obtain underlying implementation from: " + implObj);
+    }
+    return underlyingImpl;
+  }
+  
+  private InvocationProxy(AbstractElementImpl<?> obj)
+  {
+    this.engine = obj.getProcessEngine();
+    this.abstractElement = obj;
+  }
+
+  public AbstractElement getAbstractElement()
+  {
+    return abstractElement;
+  }
+
+  public Object invoke(Object proxy, Method m, Object[] args) throws Throwable
+  {
+    if (proxyMethods.contains(m) && "getAbstractElement".equals(m.getName()))
+    {
+      return getAbstractElement();
+    }
+    else
+    {
+      ExecutionContextService ctxService = engine.getService(ExecutionContextService.class);
+      ExecutionContext bpmContext = ctxService.getExecutionContext(true);
+      try
+      {
+        return m.invoke(abstractElement, args);
+      }
+      catch (InvocationTargetException ex)
+      {
+        throw ex.getTargetException();
+      }
+      finally
+      {
+        bpmContext.close();
+      }
+    }
+  }
+}
\ No newline at end of file


Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxy.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Added: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2006, Red Hat Middleware LLC, and individual contributors
+ * as indicated by the @author tags. See the copyright.txt file 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.integration.spec.runtime;
+
+import org.jboss.bpm.api.model.AbstractElement;
+
+/**
+ * Implemented by the proxy to give access to the underlying element.
+ * 
+ * @author Thomas.Diesler at jboss.com
+ * @since 05-Dec-2008
+ */
+public interface InvocationProxySupport
+{
+  AbstractElement getAbstractElement();
+}


Property changes on: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/InvocationProxySupport.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/NodeExecuteInterceptor.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -23,7 +23,6 @@
 
 //$Id$
 
-import org.jboss.bpm.api.runtime.Token;
 
 /**
  * An interceptor that invokes the Node.execute 
@@ -36,6 +35,6 @@
   //@Override
   public void execute(RuntimeContext rtContext)
   {
-    Token token = rtContext.getToken();
+    rtContext.getToken();
   }
 }
\ No newline at end of file

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenAttachmentDelegate.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -57,10 +57,11 @@
     return addAttachment(null, name, value);
   }
 
+  @SuppressWarnings("unchecked")
   public <T> T addAttachment(Class<T> clazz, String name, Object value)
   {
     Key key = new Key(clazz, name);
-    context.createVariable(key.toString(), value, token.getOldToken());
+    context.createVariable(key.toString(), value, token.getDelegate());
     return (T)value;
   }
 
@@ -74,16 +75,18 @@
     return getAttachment(null, name);
   }
 
+  @SuppressWarnings("unchecked")
   public <T> T getAttachment(Class<T> clazz, String name)
   {
     Key key = new Key(clazz, name);
-    return (T)context.getVariable(key.toString(), token.getOldToken());
+    return (T)context.getVariable(key.toString(), token.getDelegate());
   }
 
+  @SuppressWarnings("unchecked")
   public Collection<Key> getAttachmentKeys()
   {
     Set<Key> keys = new HashSet<Key>();
-    Set<String> strKeys = context.getVariables(token.getOldToken()).keySet();
+    Set<String> strKeys = context.getVariables(token.getDelegate()).keySet();
     for (String strKey : strKeys)
     {
       Key key = Key.valueOf(strKey);
@@ -97,7 +100,7 @@
   {
     Key key = new Key(clazz, name);
     T value = getAttachment(clazz, name);
-    context.deleteVariable(key.toString(), token.getOldToken());
+    context.deleteVariable(key.toString(), token.getDelegate());
     return value;
   }
 

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/runtime/TokenImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -40,6 +40,7 @@
 import org.jboss.bpm.api.service.ExecutionContextService;
 import org.jbpm.context.exe.ContextInstance;
 import org.jbpm.graph.def.Transition;
+import org.jbpm.integration.spec.model.AbstractElementImpl;
 import org.jbpm.integration.spec.model.NodeImpl;
 import org.jbpm.integration.spec.model.ProcessImpl;
 
@@ -49,44 +50,47 @@
  * @author thomas.diesler at jboss.com
  * @since 15-Nov-2008
  */
-public class TokenImpl implements Token
+public class TokenImpl extends AbstractElementImpl<org.jbpm.graph.exe.Token> implements Token
 {
   private static final long serialVersionUID = 1L;
 
-  private ProcessEngine engine;
-  private org.jbpm.graph.exe.Token oldToken;
+  private ObjectName keyCache;
+  private SequenceFlow lastFlow;
   private Attachments att;
-  private SequenceFlow lastFlow;
 
   public TokenImpl(ProcessEngine engine, org.jbpm.graph.exe.Token oldToken)
   {
-    this.engine = engine;
-    this.oldToken = oldToken;
+    super(engine, oldToken, org.jbpm.graph.exe.Token.class);
 
     ContextInstance context = oldToken.getProcessInstance().getContextInstance();
     this.att = new TokenAttachmentDelegate(this, context);
   }
 
-  public org.jbpm.graph.exe.Token getOldToken()
+  public ObjectName getKey()
   {
-    return oldToken;
+    ObjectName objKey = keyCache;
+    if (objKey == null)
+    {
+      org.jbpm.graph.exe.Token delegate = getDelegate();
+      objKey = getKey(delegate);
+      if (delegate.getId() > 0)
+        keyCache = objKey;
+    }
+    return objKey;
   }
 
-  public ObjectName getKey()
+  public static ObjectName getKey(org.jbpm.graph.exe.Token oldToken)
   {
     return ObjectNameFactory.create(Constants.ID_DOMAIN + ":id=" + oldToken.getId());
   }
 
   public Process getProcess()
   {
-    return new ProcessImpl(engine, oldToken.getProcessInstance());
+    Process proc = new ProcessImpl(getProcessEngine(), getDelegate().getProcessInstance());
+    proc = InvocationProxy.newInstance((ProcessImpl)proc, Process.class);
+    return proc;
   }
 
-  public ProcessEngine getProcessEngine()
-  {
-    return engine;
-  }
-
   // @Override
   public Attachments getAttachments()
   {
@@ -97,7 +101,7 @@
   public TokenStatus getTokenStatus()
   {
     TokenStatus status = TokenStatus.Suspended;
-    if (oldToken.hasEnded())
+    if (getDelegate().hasEnded())
     {
       status = TokenStatus.Destroyed;
     }
@@ -108,15 +112,15 @@
   public Set<Token> getChildTokens()
   {
     Set<Token> childTokens = new HashSet<Token>();
-    Map<String, org.jbpm.graph.exe.Token> oldChildMap = oldToken.getChildren();
+    Map<String, org.jbpm.graph.exe.Token> oldChildMap = getDelegate().getChildren();
     if (oldChildMap != null)
     {
       for (org.jbpm.graph.exe.Token oldChildToken : oldChildMap.values())
       {
         if (oldChildToken.hasEnded() == false)
         {
-          TokenImpl childToken = new TokenImpl(engine, oldChildToken);
-          childTokens.add(childToken);
+          Token childToken = new TokenImpl(getProcessEngine(), oldChildToken);
+          childTokens.add(InvocationProxy.newInstance((TokenImpl)childToken, Token.class));
         }
       }
     }
@@ -126,7 +130,7 @@
   // @Override
   public Node getCurrentNode()
   {
-    String nodeName = oldToken.getNode().getName();
+    String nodeName = getDelegate().getNode().getName();
     return getProcess().getNode(nodeName);
   }
 
@@ -139,18 +143,26 @@
   // @Override
   public Token getParentToken()
   {
-    org.jbpm.graph.exe.Token parent = oldToken.getParent();
-    return parent != null ? new TokenImpl(engine, parent) : null;
+    Token token = null;
+    if (getDelegate().getParent() != null)
+    {
+      token = new TokenImpl(getProcessEngine(), getDelegate().getParent());
+      token = InvocationProxy.newInstance((TokenImpl)token, Token.class);
+    }
+    return token;
   }
 
   // @Override
   public Token getRootToken()
   {
-    org.jbpm.graph.exe.Token root = oldToken;
+    org.jbpm.graph.exe.Token root = getDelegate();
     while (root.getParent() != null)
       root = root.getParent();
 
-    return new TokenImpl(engine, root);
+    Token token = new TokenImpl(getProcessEngine(), root);
+    token = InvocationProxy.newInstance((TokenImpl)token, Token.class);
+    
+    return token;
   }
 
   // @Override
@@ -167,12 +179,10 @@
 
   private void signalInternal(String name)
   {
-    ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
-    ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
     {
       // Make sure we have a current node
-      NodeImpl currNode = (NodeImpl)getCurrentNode();
+      NodeImpl<?> currNode = (NodeImpl<?>)getCurrentNode();
       if (currNode == null)
         throw new IllegalStateException("Cannot signal token with no current node: " + this);
 
@@ -188,39 +198,48 @@
       }
       if (hasActiveChild)
         throw new IllegalStateException("Cannot signal token with active child tokens: " + this);
-        
+
       // Signal the underlying jBPM node
       if (name != null)
       {
-        Transition trans = currNode.getOldNode().getLeavingTransition(name);
+        Transition trans = currNode.getDelegate().getLeavingTransition(name);
         lastFlow = currNode.getOutFlowByTransition(trans);
-        oldToken.signal(name);
+        getDelegate().signal(name);
       }
       else
       {
-        Transition trans = currNode.getOldNode().getDefaultLeavingTransition();
+        Transition trans = currNode.getDelegate().getDefaultLeavingTransition();
         lastFlow = currNode.getOutFlowByTransition(trans);
-        oldToken.signal();
+        getDelegate().signal();
       }
     }
     catch (RuntimeException rte)
     {
-      ProcessImpl procImpl = (ProcessImpl)getProcess();
+      ProcessImpl procImpl = InvocationProxy.getUnderlying(getProcess(), ProcessImpl.class);
       procImpl.setProcessStatus(ProcessStatus.Aborted);
       throw rte;
     }
+  }
+
+  public String toString()
+  {
+    ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
+    ExecutionContext bpmContext = ctxService.getExecutionContext(true);
+    try
+    {
+      Node currNode = getCurrentNode();
+      int children = getChildTokens().size();
+      boolean root = getParentToken() == null;
+      TokenStatus status = getTokenStatus();
+      return "[key=" + getKey() + ",root=" + root + ",status=" + status + ",node=" + currNode + ",flow=" + lastFlow + ",child=" + children + "]";
+    }
+    catch (RuntimeException rte)
+    {
+      throw rte;
+    }
     finally
     {
       bpmContext.close();
     }
   }
-
-  public String toString()
-  {
-    Node currNode = getCurrentNode();
-    int children = getChildTokens().size();
-    boolean root = getParentToken() == null;
-    TokenStatus status = getTokenStatus();
-    return "[key=" + getKey() + ",root=" + root + ",status=" + status + ",node=" + currNode + ",flow=" + lastFlow + ",child=" + children + "]";
-  }
 }

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/DeploymentServiceImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,7 +33,6 @@
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.service.ProcessDefinitionService;
 import org.jboss.bpm.api.service.internal.AbstractDeploymentService;
-import org.jboss.bpm.api.service.internal.AbstractProcessDefinitionService;
 import org.jbpm.integration.spec.deployment.PARDeployment;
 import org.jbpm.integration.spec.deployment.XMLDeployment;
 import org.slf4j.Logger;
@@ -84,10 +83,9 @@
       ProcessDefinitionService pdService = getProcessEngine().getService(ProcessDefinitionService.class);
       ProcessDefinition procDef = pdService.parseProcessDefinition(pdXML);
       procDef = pdService.registerProcessDefinition(procDef);
-   
-      ObjectName key = procDef.getKey();
-      dep.addAttachment(ObjectName.class, "procDefKey", key);
       
+      dep.addAttachment(ObjectName.class, "procDefKey", procDef.getKey());
+      
       return procDef;
     }
     catch (IOException ex)

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ExecutionServiceImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,7 +33,6 @@
 import org.jboss.bpm.api.runtime.Token;
 import org.jboss.bpm.api.service.ExecutionService;
 import org.jboss.bpm.api.service.ProcessService;
-import org.jboss.bpm.api.service.internal.AbstractProcessService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessDefinitionServiceImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,11 +33,13 @@
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.runtime.ExecutionContext;
 import org.jboss.bpm.api.service.ExecutionContextService;
+import org.jboss.bpm.api.service.ProcessDefinitionService;
 import org.jboss.bpm.api.service.ProcessService;
 import org.jboss.bpm.api.service.internal.AbstractProcessDefinitionService;
 import org.jbpm.JbpmContext;
 import org.jbpm.db.GraphSession;
 import org.jbpm.integration.spec.model.ProcessDefinitionImpl;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,7 +49,7 @@
  * @author thomas.diesler at jboss.com
  * @since 18-Jun-2008
  */
-public class ProcessDefinitionServiceImpl extends AbstractProcessDefinitionService implements MutableService
+public class ProcessDefinitionServiceImpl extends AbstractProcessDefinitionService implements ProcessDefinitionService, MutableService
 {
   // Provide logging
   final static Logger log = LoggerFactory.getLogger(ProcessDefinitionServiceImpl.class);
@@ -72,6 +74,7 @@
       if (oldProcDef != null)
       {
         procDef = new ProcessDefinitionImpl(getProcessEngine(), oldProcDef);
+        procDef = InvocationProxy.newInstance((ProcessDefinitionImpl)procDef, ProcessDefinition.class);
       }
     }
     finally
@@ -105,25 +108,26 @@
 
   public ProcessDefinition registerProcessDefinition(ProcessDefinition procDef)
   {
-    log.debug("registerProcessDefinition: " + procDef);
-    
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
     {
+      log.debug("registerProcessDefinition: " + procDef);
+      
       if (getProcessDefinition(procDef.getKey()) != null)
         throw new IllegalStateException("Process definition already registered: " + procDef);
       
       JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
-      ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
-      jbpmContext.deployProcessDefinition(procDefImpl.getOldProcessDefinition());
+      ProcessDefinitionImpl procDefImpl = InvocationProxy.getUnderlying(procDef, ProcessDefinitionImpl.class);
+      jbpmContext.deployProcessDefinition(procDefImpl.getDelegate());
+      
+      procDef = InvocationProxy.newInstance(procDefImpl, ProcessDefinition.class);
+      return procDef;
     }
     finally
     {
       bpmContext.close();
     }
-    
-    return procDef;
   }
 
   public boolean unregisterProcessDefinition(ObjectName procDefID)
@@ -144,10 +148,8 @@
         for (ObjectName procID : procService.getProcesses(procDefID, null))
           procService.unregisterProcess(procID);
         
-        ProcessDefinitionImpl procDefImpl = (ProcessDefinitionImpl)procDef;
-        long oldID = procDefImpl.getOldProcessDefinition().getId();
         JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
-        jbpmContext.getGraphSession().deleteProcessDefinition(oldID);
+        jbpmContext.getGraphSession().deleteProcessDefinition(adaptKey(procDefID));
         removed = true;
       }
     }

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/service/ProcessServiceImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -38,11 +38,14 @@
 import org.jboss.bpm.api.runtime.ExecutionContext;
 import org.jboss.bpm.api.service.ExecutionContextService;
 import org.jboss.bpm.api.service.ProcessDefinitionService;
+import org.jboss.bpm.api.service.ProcessService;
 import org.jboss.bpm.api.service.internal.AbstractProcessService;
 import org.jbpm.JbpmContext;
 import org.jbpm.db.GraphSession;
 import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.integration.spec.model.ProcessDefinitionImpl;
 import org.jbpm.integration.spec.model.ProcessImpl;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
 import org.jbpm.integration.spec.runtime.NodeInterceptor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -53,7 +56,7 @@
  * @author thomas.diesler at jboss.com
  * @since 18-Jun-2008
  */
-public class ProcessServiceImpl extends AbstractProcessService implements MutableService
+public class ProcessServiceImpl extends AbstractProcessService implements ProcessService, MutableService
 {
   // Provide logging
   final static Logger log = LoggerFactory.getLogger(ProcessServiceImpl.class);
@@ -87,7 +90,7 @@
   public Process getProcess(ObjectName procID)
   {
     Process proc = null;
-    
+
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
@@ -98,6 +101,7 @@
       if (oldProc != null)
       {
         proc = new ProcessImpl(getProcessEngine(), oldProc);
+        proc = InvocationProxy.newInstance((ProcessImpl)proc, Process.class);
       }
     }
     finally
@@ -114,7 +118,7 @@
   public Set<ObjectName> getProcesses()
   {
     Set<ObjectName> procs = new HashSet<ObjectName>();
-    
+
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
@@ -149,7 +153,7 @@
   public Set<ObjectName> getProcesses(ObjectName procDefID, ProcessStatus status)
   {
     Set<ObjectName> procs = new HashSet<ObjectName>();
-    
+
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
@@ -174,12 +178,10 @@
   /**
    * Register a Process.
    */
-  public ObjectName registerProcess(Process proc)
+  public Process registerProcess(Process proc)
   {
     log.debug("registerProcess: " + proc);
 
-    ObjectName procID;
-    
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
@@ -187,30 +189,37 @@
       if (getProcess(proc.getKey()) != null)
         throw new IllegalStateException("Process already registered: " + proc);
 
-      ProcessImpl procImpl = (ProcessImpl)proc;
       ProcessStatus procStatus = proc.getProcessStatus();
-      ProcessDefinition procDef = proc.getProcessDefinition();
-
       if (procStatus != ProcessStatus.None)
         throw new IllegalStateException("Cannot register process in state: " + procStatus);
 
+      ProcessDefinition procDef = proc.getProcessDefinition();
+
       // Register the process definition if needed
       ProcessDefinitionService procDefService = getProcessEngine().getService(ProcessDefinitionService.class);
       if (procDefService.getProcessDefinition(procDef.getKey()) == null)
         procDefService.registerProcessDefinition(procDef);
+      
+      ProcessImpl procImpl = InvocationProxy.getUnderlying(proc, ProcessImpl.class);
+      ProcessInstance procInst = procImpl.getDelegate();
 
-      // Save the Process instance
-      bpmContext.getAttachment(JbpmContext.class).save(procImpl.getOldProcessInstance());
+      // Make sure the process definition from this session is associated with the process instance
+      procDef = procDefService.getProcessDefinition(procDef.getKey());
+      ProcessDefinitionImpl procDefImpl = InvocationProxy.getUnderlying(procDef, ProcessDefinitionImpl.class);
+      procInst.setProcessDefinition(procDefImpl.getDelegate());
 
+      // Save the ProcessInstance
+      JbpmContext jbpmContext = bpmContext.getAttachment(JbpmContext.class);
+      jbpmContext.save(procInst);
+
       procImpl.setProcessStatus(ProcessStatus.Ready);
-      procID = proc.getKey();
+      proc = InvocationProxy.newInstance(procImpl, Process.class);
+      return proc;
     }
     finally
     {
       bpmContext.close();
     }
-
-    return procID;
   }
 
   /**
@@ -219,7 +228,7 @@
   public boolean unregisterProcess(ObjectName procID)
   {
     boolean removed = false;
-    
+
     ExecutionContextService ctxService = getProcessEngine().getService(ExecutionContextService.class);
     ExecutionContext bpmContext = ctxService.getExecutionContext(true);
     try
@@ -229,9 +238,9 @@
       {
         log.debug("unregisterProcess: " + proc);
 
-        ProcessImpl procImpl = (ProcessImpl)proc;
+        ProcessImpl procImpl = InvocationProxy.getUnderlying(proc, ProcessImpl.class);
         GraphSession graphSession = bpmContext.getAttachment(JbpmContext.class).getGraphSession();
-        graphSession.deleteProcessInstance(procImpl.getOldProcessInstance());
+        graphSession.deleteProcessInstance(procImpl.getDelegate());
         removed = true;
       }
     }
@@ -260,7 +269,7 @@
     }
     return itor;
   }
-  
+
   private Long adaptKey(ObjectName key)
   {
     String id = key.getKeyProperty("id");

Modified: jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/main/java/org/jbpm/integration/spec/task/TaskImpl.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -33,6 +33,7 @@
 import org.jboss.bpm.api.runtime.Token;
 import org.jboss.bpm.api.service.ExecutionService;
 import org.jboss.bpm.api.task.Task;
+import org.jbpm.integration.spec.runtime.InvocationProxy;
 import org.jbpm.integration.spec.runtime.TokenImpl;
 import org.jbpm.taskmgmt.exe.PooledActor;
 import org.jbpm.taskmgmt.exe.TaskInstance;
@@ -83,8 +84,8 @@
       ExecutionService exService = engine.getService(ExecutionService.class);
       for (Token auxTok : exService.getTokens())
       {
-        TokenImpl tokenImpl = (TokenImpl)auxTok;
-        if (tokenImpl.getOldToken().getId() == tokenId)
+        TokenImpl tokenImpl = InvocationProxy.getUnderlying(auxTok, TokenImpl.class);
+        if (tokenImpl.getDelegate().getId() == tokenId)
         {
           token = auxTok;
           break;

Modified: jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java	2008-12-05 10:32:18 UTC (rev 3219)
+++ jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/deployment/DeploymentPARTest.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -34,6 +34,7 @@
 import org.jboss.bpm.api.model.ProcessDefinition;
 import org.jboss.bpm.api.runtime.Token;
 import org.jboss.bpm.api.service.DeploymentService;
+import org.jboss.bpm.api.service.ProcessService;
 import org.jboss.bpm.api.service.TaskService;
 import org.jboss.bpm.api.task.Task;
 import org.jboss.bpm.api.test.APITestCase;
@@ -55,32 +56,43 @@
 
     ProcessDefinition procDef = depService.deploy(dep);
     assertNotNull("ProcDef not null", procDef);
+
+    Process proc = procDef.newInstance();
     
-    Process proc = procDef.newInstance();
+    /*    
     Token token = proc.startProcess();
+
+    assertEquals("start", token.getCurrentNode().getName());
+    assertEquals(0, token.getChildTokens().size());
+
+    token.signal();
     
     assertEquals("fork1", token.getCurrentNode().getName());
     assertEquals(2, token.getChildTokens().size());
     
     // Get the child tokens
-    Map<String,Token> childToks = new HashMap<String, Token>();
+    Token childOne = getChildToken(token, "Review Order");
+    assertNotNull("Review Order", childOne);
+    
+    Token childTwo = getChildToken(token, "Prepare shipping");
+    assertNotNull("Review Order", childTwo);
+    
+    TaskService taskService = getProcessEngine().getService(TaskService.class);
+    assertEquals(2, taskService.getTasksByProcess(proc.getKey()).size());
+*/    
+    // Undeploy the process
+    assertTrue("Undeploy successful", depService.undeploy(dep));
+  }
+
+  private Token getChildToken(Token token, String nodeName)
+  {
+    Map<String, Token> childToks = new HashMap<String, Token>();
     Iterator<Token> itTok = token.getChildTokens().iterator();
     while (itTok.hasNext())
     {
       Token child = itTok.next();
       childToks.put(child.getCurrentNode().getName(), child);
     }
-    Token childOne = childToks.get("Prepare shipping");
-    Token childTwo = childToks.get("Review Order");
-    
-    assertNotNull("Prepare shipping", childOne);
-    assertNotNull("Review Order", childTwo);
-
-    TaskService taskService = getProcessEngine().getService(TaskService.class);
-    List<Task> tasks = taskService.getTasksByActor("sales");
-    System.out.println(tasks);
-    
-    // Undeploy the process
-    assertTrue("Undeploy successful", depService.undeploy(dep));
+    return childToks.get(nodeName);
   }
 }

Added: jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java
===================================================================
--- jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java	                        (rev 0)
+++ jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java	2008-12-05 11:14:56 UTC (rev 3220)
@@ -0,0 +1,310 @@
+/*
+ * 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.integration.spec.task;
+
+// $Id$
+
+import java.util.Collection;
+import java.util.Iterator;
+
+import org.jboss.bpm.api.deployment.Deployment;
+import org.jboss.bpm.api.deployment.SimpleDeployment;
+import org.jboss.bpm.api.model.Process;
+import org.jboss.bpm.api.model.ProcessDefinition;
+import org.jboss.bpm.api.service.DeploymentService;
+import org.jboss.bpm.api.test.APITestCase;
+import org.jbpm.JbpmConfiguration;
+import org.jbpm.JbpmContext;
+import org.jbpm.db.GraphSession;
+import org.jbpm.graph.def.ActionHandler;
+import org.jbpm.graph.exe.ExecutionContext;
+import org.jbpm.graph.exe.ProcessInstance;
+import org.jbpm.taskmgmt.exe.TaskInstance;
+
+/**
+ * This uses the API to do the same as the EndTasksDbTest
+ * 
+ * @author thomas.diesler at jboss.com
+ * @since 03-Dec-2008
+ */
+public class TaskTest extends APITestCase
+{
+  private JbpmConfiguration jbpmConfiguration;
+  private JbpmContext jbpmContext;
+  private GraphSession graphSession;
+  
+  public void testCancelOld() 
+  {
+    org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+      "<process-definition name='endtasksprocess'>" +
+      "  <start-state>" +
+      "    <transition to='approval' />" +
+      "  </start-state>" +
+      "  <task-node name='approval' end-tasks='true'>" +
+      "    <task name='approve' description='Review order'>" +
+      "      <assignment pooled-actors='reviewers' />" +
+      "    </task>" +
+      "    <transition name='approve' to='process'>" +
+      "      <action class='"+Buzz.class.getName()+"' />" +
+      "    </transition>" +
+      "    <transition name='cancel'  to='cancelled'/>" +
+      "  </task-node>" +
+      "  <state name='process' />" +
+      "  <state name='cancelled' />" +
+      "</process-definition>"
+    );
+    
+    jbpmContext = createJbpmContext();
+    
+    jbpmContext.deployProcessDefinition(processDefinition);
+    ProcessInstance processInstance = jbpmContext.newProcessInstance("endtasksprocess");
+    
+    processInstance = saveAndReload(processInstance);
+    
+    processInstance.signal();
+    assertEquals("approval", processInstance.getRootToken().getNode().getName());
+    
+    processInstance = saveAndReload(processInstance);
+
+    processInstance.signal("cancel");
+    assertEquals("cancelled", processInstance.getRootToken().getNode().getName());
+    
+    jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+    jbpmContext.close();
+  }
+  
+  public void _testCancel() 
+  {
+    Deployment procDefDeployment = new SimpleDeployment(
+      "<process-definition name='endtasksprocess' xmlns='urn:jbpm.org:jpdl-3.2'>" +
+      "  <start-state>" +
+      "    <transition to='approval' />" +
+      "  </start-state>" +
+      "  <task-node name='approval' end-tasks='true'>" +
+      "    <task name='approve' description='Review order'>" +
+      "      <assignment pooled-actors='reviewers' />" +
+      "    </task>" +
+      "    <transition name='approve' to='process'>" +
+      "      <action class='" + Buzz.class.getName() + "' />" +
+      "    </transition>" +
+      "    <transition name='cancel'  to='cancelled'/>" +
+      "  </task-node>" +
+      "  <state name='process' />" +
+      "  <state name='cancelled' />" +
+      "</process-definition>"
+    );
+    
+    DeploymentService depService = getProcessEngine().getService(DeploymentService.class);
+    ProcessDefinition procDef = depService.deploy(procDefDeployment);
+
+    Process proc = procDef.newInstance();
+    proc.startProcess();
+
+    assertEquals("approval", proc.getRootToken().getCurrentNode().getName());
+    proc.getRootToken().signal("cancel");
+    assertEquals("cancelled", proc.getRootToken().getCurrentNode().getName());
+
+    depService.undeploy(procDefDeployment);
+  }
+
+  public void _testApprove() 
+  {
+    jbpmContext = createJbpmContext();
+    graphSession = jbpmContext.getGraphSession();
+    
+    org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+      "<process-definition name='endtasksprocess'>" +
+      "  <start-state>" +
+      "    <transition to='approval' />" +
+      "  </start-state>" +
+      "  <task-node name='approval' end-tasks='true'>" +
+      "    <task name='approve' description='Review order'>" +
+      "      <assignment pooled-actors='reviewers' />" +
+      "    </task>" +
+      "    <transition name='approve' to='process'/>" +
+      "    <transition name='reject'  to='cancelled'/>" +
+      "    <transition name='cancel'  to='cancelled'/>" +
+      "  </task-node>" +
+      "  <state name='process' />" +
+      "  <state name='cancelled' />" +
+      "</process-definition>"
+    );
+    jbpmContext.deployProcessDefinition(processDefinition);
+    try
+    {
+      newTransaction();
+
+      ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess");
+      processInstance.signal();
+
+      processInstance = saveAndReload(processInstance);
+
+      assertEquals("approval", processInstance.getRootToken().getNode().getName());
+      TaskInstance taskInstance = (TaskInstance)processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();
+      
+      taskInstance.end("approve");
+      assertEquals("process", processInstance.getRootToken().getNode().getName());
+    }
+    finally
+    {
+      jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+      jbpmContext.close();
+    }
+  }
+
+  public void _testReject() 
+  {
+    jbpmContext = createJbpmContext();
+    graphSession = jbpmContext.getGraphSession();
+    
+    org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+      "<process-definition name='endtasksprocess'>" +
+      "  <start-state>" +
+      "    <transition to='approval' />" +
+      "  </start-state>" +
+      "  <task-node name='approval' end-tasks='true'>" +
+      "    <task name='approve' description='Review order'>" +
+      "      <assignment pooled-actors='reviewers' />" +
+      "    </task>" +
+      "    <transition name='approve' to='process'/>" +
+      "    <transition name='reject'  to='cancelled'/>" +
+      "    <transition name='cancel'  to='cancelled'/>" +
+      "  </task-node>" +
+      "  <state name='process' />" +
+      "  <state name='cancelled' />" +
+      "</process-definition>"
+    );
+    jbpmContext.deployProcessDefinition(processDefinition);
+    try
+    {
+      newTransaction();
+
+      ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess");
+      processInstance.signal();
+
+      processInstance = saveAndReload(processInstance);
+
+      assertEquals("approval", processInstance.getRootToken().getNode().getName());
+      TaskInstance taskInstance = (TaskInstance)processInstance.getTaskMgmtInstance().getTaskInstances().iterator().next();
+      
+      taskInstance.end("reject");
+      assertEquals("cancelled", processInstance.getRootToken().getNode().getName());
+    }
+    finally
+    {
+      jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+      jbpmContext.close();
+    }
+  }
+
+  public void _testTaskInstancesAfterCancellation() 
+  {
+    jbpmContext = createJbpmContext();
+    graphSession = jbpmContext.getGraphSession();
+    
+    org.jbpm.graph.def.ProcessDefinition processDefinition = org.jbpm.graph.def.ProcessDefinition.parseXmlString(
+      "<process-definition name='endtasksprocess'>" +
+      "  <start-state>" +
+      "    <transition to='approval' />" +
+      "  </start-state>" +
+      "  <task-node name='approval' end-tasks='true'>" +
+      "    <task name='approve' description='Review order'>" +
+      "      <assignment pooled-actors='reviewers' />" +
+      "    </task>" +
+      "    <transition name='approve' to='process'/>" +
+      "    <transition name='reject'  to='cancelled'/>" +
+      "    <transition name='cancel'  to='cancelled'/>" +
+      "  </task-node>" +
+      "  <state name='process' />" +
+      "  <state name='cancelled' />" +
+      "</process-definition>"
+    );
+    jbpmContext.deployProcessDefinition(processDefinition);
+    try
+    {
+      newTransaction();
+
+      ProcessInstance processInstance = jbpmContext.newProcessInstanceForUpdate("endtasksprocess");
+      processInstance.signal();
+
+      processInstance = saveAndReload(processInstance);
+      processInstance.signal("cancel");
+
+      Collection taskInstances = processInstance.getTaskMgmtInstance().getTaskInstances();
+      Iterator iter = taskInstances.iterator();
+      while(iter.hasNext()) {
+        TaskInstance taskInstance = (TaskInstance) iter.next();
+        assertTrue(taskInstance.getName()+" ended", taskInstance.hasEnded());
+        assertFalse(taskInstance.getName()+" not cancelled", taskInstance.isCancelled());
+        assertFalse(taskInstance.getName()+" not blocking", taskInstance.isBlocking());
+        assertFalse(taskInstance.getName()+" not signalling", taskInstance.isSignalling());
+      }
+    }
+    finally
+    {
+      jbpmContext.getGraphSession().deleteProcessDefinition(processDefinition.getId());
+      jbpmContext.close();
+    }
+  }
+
+  public static class Buzz implements ActionHandler
+  {
+    private static final long serialVersionUID = 1L;
+
+    public void execute(ExecutionContext executionContext) throws Exception
+    {
+      throw new RuntimeException("buzz");
+    }
+  }
+
+  private JbpmContext createJbpmContext()
+  {
+    return getJbpmConfiguration().createJbpmContext();
+  }
+  
+  private ProcessInstance saveAndReload(ProcessInstance pi)
+  {
+    if (jbpmContext == null)
+      jbpmContext = createJbpmContext();
+    
+    jbpmContext.save(pi);
+    newTransaction();
+    return graphSession.loadProcessInstance(pi.getId());
+  }
+
+  private void newTransaction()
+  {
+    if (jbpmContext != null)
+      jbpmContext.close();
+    
+    jbpmContext = createJbpmContext();
+    graphSession = jbpmContext.getGraphSession();
+  }
+  
+  private JbpmConfiguration getJbpmConfiguration()
+  {
+    if (jbpmConfiguration == null)
+      jbpmConfiguration = JbpmConfiguration.getInstance();
+    
+    return jbpmConfiguration;
+  }
+}


Property changes on: jbpm3/trunk/modules/integration/spec/src/test/java/org/jbpm/test/integration/spec/task/TaskTest.java
___________________________________________________________________
Name: svn:keywords
   + Id Revision
Name: svn:eol-style
   + LF




More information about the jbpm-commits mailing list