You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by se...@apache.org on 2009/04/06 23:53:27 UTC

svn commit: r762523 [8/9] - in /ode/trunk: ./ axis2-war/src/main/webapp/WEB-INF/classes/ axis2-war/src/main/webapp/WEB-INF/conf.hib-derby/ axis2-war/src/main/webapp/WEB-INF/conf.jpa-derby/ axis2-war/src/main/webapp/WEB-INF/conf.template/ axis2-war/src/...

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HPartnerLink.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HPartnerLink.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HPartnerLink.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HPartnerLink.java Mon Apr  6 21:53:20 2009
@@ -28,8 +28,12 @@
  * configuration).
  * 
  * @hibernate.class table="BPEL_PLINK_VAL"
+ * @hibernate.query name="DELETE_PARTNER_LINKS_BY_INSTANCE" query="delete from HPartnerLink as l where l.scope in (select s from HScope as s where s.instance = :instance)"
+ * @hibernate.query name="DELETE_PARTNER_LINKS_BY_PROCESS" query="delete from HPartnerLink as l where l.scope in (select s.id from HScope as s where s.instance.process = :process)"
  */
 public class HPartnerLink extends HObject {
+    public final static String DELETE_PARTNER_LINKS_BY_INSTANCE = "DELETE_PARTNER_LINKS_BY_INSTANCE";
+    public final static String DELETE_PARTNER_LINKS_BY_PROCESS = "DELETE_PARTNER_LINKS_BY_PROCESS";
 
     private String _linkName;
 
@@ -82,7 +86,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="MYROLE_EPR" cascade="delete"
+     * @hibernate.many-to-one column="MYROLE_EPR" cascade="delete" foreign-key="none"
      */
     public HLargeData getMyEPR() {
         return _myEPR;
@@ -93,7 +97,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="PARTNERROLE_EPR" cascade="delete"
+     * @hibernate.many-to-one column="PARTNERROLE_EPR" cascade="delete" foreign-key="none"
      */
     public HLargeData getPartnerEPR() {
         return _partnerEPR;
@@ -104,7 +108,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="PROCESS"
+     * @hibernate.many-to-one column="PROCESS" foreign-key="none"
      */
     public HProcess getProcess() {
         return _process;
@@ -115,7 +119,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="SCOPE"
+     * @hibernate.many-to-one column="SCOPE" foreign-key="none"
      */
     public HScope getScope() {
         return _scope;
@@ -187,7 +191,7 @@
      *    inverse="true"
      *    cascade="delete"
      * @hibernate.collection-key
-     *    column="PARTNERLINK"
+     *    column="PARTNERLINK" foreign-key="none"
      * @hibernate.collection-one-to-many
      *    class="org.apache.ode.daohib.bpel.hobj.HMessageExchange"
      */

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcess.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcess.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcess.java Mon Apr  6 21:53:20 2009
@@ -76,7 +76,7 @@
      *  inverse="true"
      *  cascade="delete"
      * @hibernate.collection-key
-     *  column="PROCESS"
+     *  column="PROCESS" foreign-key="none"
      * @hibernate.collection-one-to-many
      *   class="org.apache.ode.daohib.bpel.hobj.HMessageExchange"
      */
@@ -94,7 +94,7 @@
      *  inverse="true"
      *  cascade="delete"
      * @hibernate.collection-key
-     *  column="PROCESS_ID"
+     *  column="PROCESS_ID" foreign-key="none"
      * @hibernate.collection-one-to-many
      *   class="org.apache.ode.daohib.bpel.hobj.HCorrelator"
      */
@@ -110,9 +110,8 @@
      * @hibernate.bag
      *  lazy="true"
      *  inverse="true"
-     *  cascade="delete"
      * @hibernate.collection-key
-     *  column="PROCESS_ID"
+     *  column="PROCESS_ID" foreign-key="none"
      * @hibernate.collection-one-to-many
      *  class="org.apache.ode.daohib.bpel.hobj.HProcessInstance"
      */
@@ -128,9 +127,8 @@
      * @hibernate.bag
      *  lazy="true"
      *  inverse="true"
-     *  cascade="delete"
      * @hibernate.collection-key
-     *  column="PID"
+     *  column="PID" foreign-key="none"
      * @hibernate.collection-one-to-many
      *  class="org.apache.ode.daohib.bpel.hobj.HBpelEvent"
      */
@@ -146,8 +144,8 @@
      * Get the partner links values as deployed.
      *
      * @return {@link Set}<{@link HPartnerLink}> with variable values
-     * @hibernate.set lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="PROCESS"
+     * @hibernate.set lazy="true" inverse="true"
+     * @hibernate.collection-key column="PROCESS" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HPartnerLink"
      */
     public Set<HPartnerLink> getDeploymentPartnerLinks() {

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java Mon Apr  6 21:53:20 2009
@@ -31,6 +31,7 @@
  * @hibernate.query name="COUNT_INSTANCES_BY_STATUS_AND_PROCESS_ID" query="select count(i.id) as cnt, max(i.activityFailureDateTime) as lastFailureDt from HProcessInstance as i where i.process.processId = :processId and i.state in(:states) and i.activityFailureCount > 0"
  * @hibernate.query name="COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID" query="select count(i.id) as cnt, max(i.activityFailureDateTime) as lastFailureDt from HProcessInstance as i where i.process.processId = :processId and i.state in(:states) and i.activityFailureCount > 0"
  * @hibernate.query name="SELECT_ACTIVE_INSTANCES" query="from HProcessInstance as i where i.process.id = :processId and i.state = :state"
+ * @hibernate.query name="DELETE_INSTANCES_BY_PROCESS" query="delete from HProcessInstance as p where p.process = :process"
  */
 public class HProcessInstance extends HObject {
 	public static final String SELECT_ACTIVE_INSTANCES="SELECT_ACTIVE_INSTANCES";
@@ -84,7 +85,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="INSTANTIATING_CORRELATOR"
+     * @hibernate.many-to-one column="INSTANTIATING_CORRELATOR" foreign-key="none"
      */
     public HCorrelator getInstantiatingCorrelator() {
         return _instantiatingCorrelator;
@@ -95,7 +96,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="FAULT" cascade="delete" column="FAULT"
+     * @hibernate.many-to-one column="FAULT" column="FAULT" foreign-key="none"
      */
     public HFaultData getFault() {
         return _fault;
@@ -106,7 +107,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="JACOB_STATE" cascade="delete"
+     * @hibernate.many-to-one column="JACOB_STATE" foreign-key="none"
      */
     public HLargeData getJacobState() {
         return _jacobState;
@@ -117,8 +118,8 @@
     }
 
     /**
-     * @hibernate.bag lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="IID"
+     * @hibernate.bag lazy="true" inverse="true"
+     * @hibernate.collection-key column="IID" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HBpelEvent"
      */
     public Collection<HBpelEvent> getEvents() {
@@ -130,8 +131,8 @@
     }
 
     /**
-     * @hibernate.set lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="PIID"
+     * @hibernate.set lazy="true" inverse="true"
+     * @hibernate.collection-key column="PIID" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HCorrelatorSelector"
      */
     public Set<HCorrelatorSelector> getCorrelatorSelectors() {
@@ -147,8 +148,8 @@
     }
 
     /**
-     * @hibernate.set lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="PIID"
+     * @hibernate.set lazy="true" inverse="true"
+     * @hibernate.collection-key column="PIID" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HMessageExchange"
      */
     public Set<HMessageExchange> getMessageExchanges() {
@@ -172,7 +173,7 @@
 
     /**
      *
-     * @hibernate.many-to-one column="PROCESS_ID" lazy="false" outer-join="true"
+     * @hibernate.many-to-one column="PROCESS_ID" lazy="false" outer-join="true" foreign-key="none"
      */
     public HProcess getProcess() {
         return _process;
@@ -183,8 +184,8 @@
     }
 
     /**
-     * @hibernate.bag lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="PIID"
+     * @hibernate.bag lazy="true" inverse="true"
+     * @hibernate.collection-key column="PIID" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HScope"
      */
     public Collection<HScope> getScopes() {
@@ -196,8 +197,8 @@
     }
 
     /**
-     * @hibernate.bag lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="PIID"
+     * @hibernate.bag lazy="true" inverse="true"
+     * @hibernate.collection-key column="PIID" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HCorrelationSet"
      */
     public Collection<HCorrelationSet> getCorrelationSets() {
@@ -243,7 +244,7 @@
 
     /**
      * @hibernate.bag lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="PIID"
+     * @hibernate.collection-key column="PIID" foreign-key="none"
      * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HActivityRecovery"
      */
     public Collection<HActivityRecovery> getActivityRecoveries() {

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HScope.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HScope.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HScope.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HScope.java Mon Apr  6 21:53:20 2009
@@ -25,8 +25,13 @@
  * Hibernate table representing a BPEL scope instance.
  * 
  * @hibernate.class table="BPEL_SCOPE"
+ * @hibernate.query name="DELETE_SCOPES_BY_INSTANCE" query="delete from HScope as s where s.instance = :instance"
+ * @hibernate.query name="DELETE_SCOPES_BY_PROCESS" query="delete from HScope as s where s.instance in (select i from HProcessInstance as i where i.process = :process)"
  */
 public class HScope extends HObject {
+    public final static String DELETE_SCOPES_BY_INSTANCE = "DELETE_SCOPES_BY_INSTANCE";
+    public final static String DELETE_SCOPES_BY_PROCESS = "DELETE_SCOPES_BY_PROCESS";
+
     /** Process instance to which this scope belongs. */
     private HProcessInstance _instance;
 
@@ -55,9 +60,8 @@
 
     /**
      * @hibernate.set lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="SCOPE_ID"
-     * @hibernate.collection-one-to-many 
-     *                                   class="org.apache.ode.daohib.bpel.hobj.HCorrelationSet"
+     * @hibernate.collection-key column="SCOPE_ID" foreign-key="none"
+     * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HCorrelationSet"
      */
     public Set<HCorrelationSet> getCorrelationSets() {
         return _correlationSets;
@@ -70,7 +74,7 @@
     /**
      * Get the {@link HProcessInstance} to which this scope object belongs.
      * 
-     * @hibernate.many-to-one column="PIID"
+     * @hibernate.many-to-one column="PIID" foreign-key="none"
      */
     public HProcessInstance getInstance() {
         return _instance;
@@ -84,7 +88,7 @@
     /**
      * Get the "parent" {@link HScope} of this scope.
      * 
-     * @hibernate.many-to-one column="PARENT_SCOPE_ID"
+     * @hibernate.many-to-one column="PARENT_SCOPE_ID" foreign-key="none"
      */
     public HScope getParentScope() {
         return _parentScope;
@@ -126,9 +130,8 @@
      * 
      * @return {@link Set}&lt;{@link HXmlData}&gt; with variable values
      * @hibernate.set lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="SCOPE_ID"
-     * @hibernate.collection-one-to-many 
-     *                                   class="org.apache.ode.daohib.bpel.hobj.HXmlData"
+     * @hibernate.collection-key column="SCOPE_ID" foreign-key="none"
+     * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HXmlData"
      */
     public Set<HXmlData> getVariables() {
         return _variables;
@@ -144,9 +147,8 @@
      * 
      * @return {@link Set}&lt;{@link HPartnerLink}&gt; with variable values
      * @hibernate.set lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="SCOPE"
-     * @hibernate.collection-one-to-many 
-     *                                   class="org.apache.ode.daohib.bpel.hobj.HPartnerLink"
+     * @hibernate.collection-key column="SCOPE" foreign-key="none"
+     * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HPartnerLink"
      */
     public Set<HPartnerLink> getPartnerLinks() {
         return _partnerLinks;

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HVariableProperty.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HVariableProperty.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HVariableProperty.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HVariableProperty.java Mon Apr  6 21:53:20 2009
@@ -23,8 +23,12 @@
  * of process instances based on indexed lookup of property values.
  * 
  * @hibernate.class table="VAR_PROPERTY"
+ * @hibernate.query name="DELETE_VARIABLE_PROPERITES_BY_PROCESS" query="delete from HVariableProperty as p where p.xmlData in(select x.id from HXmlData x where x.instance.process = :process)"
+ * @hibernate.query name="DELETE_VARIABLE_PROPERITES_BY_INSTANCE" query="delete from HVariableProperty as p where p.xmlData in(select x.id from HXmlData x where x.instance = :instance)"
  */
 public class HVariableProperty extends HObject {
+    public final static String DELETE_VARIABLE_PROPERITES_BY_PROCESS = "DELETE_VARIABLE_PROPERITES_BY_PROCESS";
+    public final static String DELETE_VARIABLE_PROPERITES_BY_INSTANCE = "DELETE_VARIABLE_PROPERITES_BY_INSTANCE";
 
     private String _propertyValue;
     private String _propertyName;
@@ -44,7 +48,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="XML_DATA_ID"
+     * @hibernate.many-to-one column="XML_DATA_ID" foreign-key="none"
      */
     public HXmlData getXmlData() {
         return _variable;

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HXmlData.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HXmlData.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HXmlData.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HXmlData.java Mon Apr  6 21:53:20 2009
@@ -23,8 +23,12 @@
 
 /**
  * @hibernate.class table="BPEL_XML_DATA"
+ * @hibernate.query name="DELETE_XMLDATA_BY_PROCESS" query="delete from HXmlData as x where x.instance in(select i from HProcessInstance as i where i.process = :process)"
+ * @hibernate.query name="DELETE_XMLDATA_BY_INSTANCE" query="delete from HXmlData as x where x.instance = :instance"
  */
 public class HXmlData extends HObject {
+    public static final String DELETE_XMLDATA_BY_PROCESS = "DELETE_XMLDATA_BY_PROCESS";
+    public static final String DELETE_XMLDATA_BY_INSTANCE = "DELETE_XMLDATA_BY_INSTANCE";
 
     private boolean _simpleType;
     private HLargeData _data;
@@ -39,7 +43,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="LDATA_ID" cascade="delete"
+     * @hibernate.many-to-one column="LDATA_ID" cascade="delete" foreign-key="none"
      */
     public HLargeData getData() {
         return _data;
@@ -63,9 +67,8 @@
 
     /**
      * @hibernate.bag lazy="true" inverse="true" cascade="delete"
-     * @hibernate.collection-key column="XML_DATA_ID"
-     * @hibernate.collection-one-to-many 
-     *                                   class="org.apache.ode.daohib.bpel.hobj.HVariableProperty"
+     * @hibernate.collection-key column="XML_DATA_ID" foreign-key="none"
+     * @hibernate.collection-one-to-many class="org.apache.ode.daohib.bpel.hobj.HVariableProperty"
      */
     public Collection<HVariableProperty> getProperties() {
         return _properties;
@@ -76,7 +79,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="SCOPE_ID"
+     * @hibernate.many-to-one column="SCOPE_ID" foreign-key="none"
      */
     public HScope getScope() {
         return _scope;
@@ -91,7 +94,7 @@
     }
 
     /**
-     * @hibernate.many-to-one column="PIID"
+     * @hibernate.many-to-one column="PIID" foreign-key="none"
      */
     public HProcessInstance getInstance() {
         return _instance;

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionFactoryImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionFactoryImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionFactoryImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionFactoryImpl.java Mon Apr  6 21:53:20 2009
@@ -23,21 +23,19 @@
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.BpelDAOConnectionFactoryJDBC;
 import org.apache.openjpa.ee.ManagedRuntime;
+import org.apache.openjpa.util.GeneralException;
 
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
 import javax.sql.DataSource;
-import javax.transaction.HeuristicMixedException;
-import javax.transaction.HeuristicRollbackException;
-import javax.transaction.InvalidTransactionException;
 import javax.transaction.NotSupportedException;
 import javax.transaction.RollbackException;
 import javax.transaction.Synchronization;
 import javax.transaction.SystemException;
 import javax.transaction.Transaction;
 import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAResource;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -48,7 +46,7 @@
 public class BPELDAOConnectionFactoryImpl implements BpelDAOConnectionFactoryJDBC {
     static final Log __log = LogFactory.getLog(BPELDAOConnectionFactoryImpl.class);
 
-    private EntityManagerFactory _emf;
+    protected EntityManagerFactory _emf;
     private TransactionManager _tm;
     private DataSource _ds;
     private Object _dbdictionary;
@@ -80,12 +78,16 @@
             HashMap propMap2 = new HashMap();
             propMap2.put("openjpa.TransactionMode", "managed");
             EntityManager em = _emf.createEntityManager(propMap2);
-            BPELDAOConnectionImpl conn = new BPELDAOConnectionImpl(em);
+            BPELDAOConnectionImpl conn = createBPELDAOConnection(em);
             _connections.set(conn);
             return conn;
         }
     }
 
+    protected BPELDAOConnectionImpl createBPELDAOConnection(EntityManager em) {
+        return new BPELDAOConnectionImpl(em);
+    }
+
     public void init(Properties properties) {
         HashMap<String, Object> propMap = new HashMap<String,Object>();
 
@@ -137,6 +139,7 @@
     private class TxMgrProvider implements ManagedRuntime {
         public TxMgrProvider() {
         }
+        
         public TransactionManager getTransactionManager() throws Exception {
             return _tm;
         }
@@ -151,6 +154,37 @@
         public Object getTransactionKey() throws Exception, SystemException {
             return _tm.getTransaction();
         }
-    }
 
+        public void doNonTransactionalWork(java.lang.Runnable runnable) throws NotSupportedException {
+            TransactionManager tm = null;
+            Transaction transaction = null;
+            
+            try { 
+                tm = getTransactionManager(); 
+                transaction = tm.suspend();
+            } catch (Exception e) {
+                NotSupportedException nse =
+                    new NotSupportedException(e.getMessage());
+                nse.initCause(e);
+                throw nse;
+            }
+            
+            runnable.run();
+            
+            try {
+                tm.resume(transaction);
+            } catch (Exception e) {
+                try {
+                    transaction.setRollbackOnly();
+                }
+                catch(SystemException se2) {
+                    throw new GeneralException(se2);
+                }
+                NotSupportedException nse =
+                    new NotSupportedException(e.getMessage());
+                nse.initCause(e);
+                throw nse;
+            } 
+        }
+    }
 }

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java Mon Apr  6 21:53:20 2009
@@ -27,6 +27,7 @@
 import org.apache.ode.bpel.dao.*;
 import org.apache.ode.bpel.evt.BpelEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.apache.ode.utils.ISO8601DateParser;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
 import org.apache.openjpa.persistence.OpenJPAQuery;
@@ -42,10 +43,9 @@
  * @author Matthieu Riou <mriou at apache dot org>
  */
 public class BPELDAOConnectionImpl implements BpelDAOConnection {
-	
 	static final Log __log = LogFactory.getLog(BPELDAOConnectionImpl.class);
 	
-	EntityManager _em;
+	protected EntityManager _em;
 
     public BPELDAOConnectionImpl(EntityManager em) {
         _em = em;
@@ -79,8 +79,9 @@
     }
 
     public void releaseMessageExchange(String mexid) {
-		// TODO Auto-generated method stub
-	}
+        MessageExchangeDAO dao = getMessageExchange(mexid);
+        dao.release(true);
+ 	}
     
     public ProcessDAO createProcess(QName pid, QName type, String guid, long version) {
         ProcessDAOImpl ret = new ProcessDAOImpl(pid,type,guid,version);

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrSetProperty.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrSetProperty.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrSetProperty.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrSetProperty.java Mon Apr  6 21:53:20 2009
@@ -27,6 +27,8 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
 /**
@@ -34,16 +36,25 @@
  */
 @Entity
 @Table(name="ODE_CORSET_PROP")
+@NamedQueries({
+    @NamedQuery(name=CorrSetProperty.DELETE_CORSET_PROPERTIES_BY_PROPERTY_IDS, query="delete from CorrSetProperty as p where p.corrSetId in(:corrSetIds)")
+})
 public class CorrSetProperty {
+    public final static String DELETE_CORSET_PROPERTIES_BY_PROPERTY_IDS = "DELETE_CORSET_PROPERTIES_BY_PROPERTY_IDS";
 
     @Id @Column(name="ID")
     @GeneratedValue(strategy=GenerationType.AUTO)
+    @SuppressWarnings("unused")
     private Long _id;
     @Basic @Column(name="PROP_KEY")
     private String propertyKey;
     @Basic @Column(name="PROP_VALUE")
     private String propertyValue;
 
+    @SuppressWarnings("unused")
+    @Basic @Column(name="CORRSET_ID", insertable=false, updatable=false, nullable=true)
+    private Long corrSetId;
+
     @ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="CORRSET_ID")
     private CorrelationSetDAOImpl _corrSet;
 

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelationSetDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelationSetDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelationSetDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelationSetDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -46,10 +46,18 @@
 @Entity
 @Table(name="ODE_CORRELATION_SET")
 @NamedQueries({
-    @NamedQuery(name=CorrelationSetDAOImpl.SELECT_CORRELATION_SETS_BY_INSTANCES, query="select c from CorrelationSetDAOImpl as c left join fetch c._scope left join fetch c._props where c._scope._processInstance._instanceId in (:instances)")	
+    @NamedQuery(name=CorrelationSetDAOImpl.DELETE_CORRELATION_SETS_BY_IDS, query="delete from CorrelationSetDAOImpl as c where c._correlationSetId in (:ids)"),
+    @NamedQuery(name=CorrelationSetDAOImpl.SELECT_CORRELATION_SETS_BY_INSTANCES, query="select c from CorrelationSetDAOImpl as c left join fetch c._scope left join fetch c._props where c._scope._processInstance._instanceId in (:instances)"),    
+    @NamedQuery(name=CorrelationSetDAOImpl.SELECT_CORRELATION_SET_IDS_BY_PROCESS, query="select c._correlationSetId from CorrelationSetDAOImpl as c where c._scope._processInstance._process = :process"),
+    @NamedQuery(name=CorrelationSetDAOImpl.SELECT_CORRELATION_SET_IDS_BY_INSTANCE, query="select c._correlationSetId from CorrelationSetDAOImpl as c where c._scope._processInstance = :instance"),
+    @NamedQuery(name=CorrelationSetDAOImpl.SELECT_ACTIVE_SETS, query="select c from CorrelationSetDAOImpl as c left join fetch c._scope where c._scope._processInstance._state = (:state)")
 })
 public class CorrelationSetDAOImpl implements CorrelationSetDAO {
+    public final static String DELETE_CORRELATION_SETS_BY_IDS = "DELETE_CORRELATION_SETS_BY_IDS";
     public final static String SELECT_CORRELATION_SETS_BY_INSTANCES = "SELECT_CORRELATION_SETS_BY_INSTANCES";
+    public final static String SELECT_CORRELATION_SET_IDS_BY_PROCESS = "SELECT_CORRELATION_SET_IDS_BY_PROCESS";
+    public final static String SELECT_CORRELATION_SET_IDS_BY_INSTANCE = "SELECT_CORRELATION_SET_IDS_BY_INSTANCE";
+    public final static String SELECT_ACTIVE_SETS = "SELECT_ACTIVE_SETS";
 
 	@Id @Column(name="CORRELATION_SET_ID") 
 	@GeneratedValue(strategy=GenerationType.AUTO)
@@ -59,7 +67,7 @@
 	@Basic @Column(name="CORRELATION_KEY")
     private String _correlationKey;
 
-    @OneToMany(targetEntity=CorrSetProperty.class,mappedBy="_corrSet",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
+    @OneToMany(targetEntity=CorrSetProperty.class,mappedBy="_corrSet",fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
     private Collection<CorrSetProperty> _props = new ArrayList<CorrSetProperty>();
     @ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="SCOPE_ID")
     private ScopeDAOImpl _scope;

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelatorDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelatorDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelatorDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelatorDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -38,18 +38,20 @@
             "FROM MessageRouteDAOImpl as route " +
             "WHERE route._correlationKey = :ckey " +
                    "and route._correlator._process._processType = :ptype " +
-                   "and route._correlator._correlatorKey = :corrkey")
-        })
+                   "and route._correlator._correlatorKey = :corrkey"),
+    @NamedQuery(name=CorrelatorDAOImpl.DELETE_CORRELATORS_BY_PROCESS, query="delete from CorrelatorDAOImpl as c where c._process = :process")
+})
 public class CorrelatorDAOImpl extends OpenJPADAO implements CorrelatorDAO {
+    public final static String DELETE_CORRELATORS_BY_PROCESS = "DELETE_CORRELATORS_BY_PROCESS";
 
     @Id @Column(name="CORRELATOR_ID")
     @GeneratedValue(strategy=GenerationType.AUTO)
     private Long _correlatorId;
     @Basic @Column(name="CORRELATOR_KEY")
     private String _correlatorKey;
-    @OneToMany(targetEntity=MessageRouteDAOImpl.class,mappedBy="_correlator",fetch=FetchType.EAGER,cascade={CascadeType.ALL})
+    @OneToMany(targetEntity=MessageRouteDAOImpl.class,mappedBy="_correlator",fetch=FetchType.EAGER,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
     private Collection<MessageRouteDAOImpl> _routes = new ArrayList<MessageRouteDAOImpl>();
-    @OneToMany(targetEntity=MessageExchangeDAOImpl.class,mappedBy="_correlator",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
+    @OneToMany(targetEntity=MessageExchangeDAOImpl.class,mappedBy="_correlator",fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
     private Collection<MessageExchangeDAOImpl> _exchanges = new ArrayList<MessageExchangeDAOImpl>();
     @ManyToOne(fetch= FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="PROC_ID")
     private ProcessDAOImpl _process;

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/EventDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/EventDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/EventDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/EventDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -31,6 +31,8 @@
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import java.sql.Timestamp;
 
@@ -39,7 +41,15 @@
  */
 @Entity
 @Table(name="ODE_EVENT")
+@NamedQueries({
+    @NamedQuery(name=EventDAOImpl.SELECT_EVENT_IDS_BY_PROCESS, query="select e._id from EventDAOImpl as e where e._instance._process = :process"),
+    @NamedQuery(name=EventDAOImpl.DELETE_EVENTS_BY_IDS, query="delete from EventDAOImpl as e where e._id in (:ids)"),
+    @NamedQuery(name=EventDAOImpl.DELETE_EVENTS_BY_INSTANCE, query="delete from EventDAOImpl as e where e._instance = :instance")
+})
 public class EventDAOImpl {
+    public final static String SELECT_EVENT_IDS_BY_PROCESS = "SELECT_EVENT_IDS_BY_PROCESS";
+    public final static String DELETE_EVENTS_BY_IDS = "DELETE_EVENTS_BY_IDS";
+    public final static String DELETE_EVENTS_BY_INSTANCE = "DELETE_EVENTS_BY_INSTANCE";
 
     @Id @Column(name="EVENT_ID")
 	@GeneratedValue(strategy= GenerationType.AUTO)

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/FaultDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/FaultDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/FaultDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/FaultDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -30,13 +30,18 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.xml.namespace.QName;
 
-
 @Entity
 @Table(name="ODE_FAULT")
+@NamedQueries({
+    @NamedQuery(name=FaultDAOImpl.DELETE_FAULTS_BY_IDS, query="delete from FaultDAOImpl as f where f._id in(:ids)")
+})
 public class FaultDAOImpl implements FaultDAO {
+    public final static String DELETE_FAULTS_BY_IDS = "DELETE_FAULTS_BY_IDS";
 
 	@Id @Column(name="FAULT_ID") 
 	@GeneratedValue(strategy=GenerationType.AUTO)

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -19,7 +19,6 @@
 
 package org.apache.ode.dao.jpa;
 
-
 import javax.persistence.Basic;
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -27,6 +26,8 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.Lob;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.xml.namespace.QName;
@@ -35,14 +36,22 @@
 import org.apache.ode.utils.DOMUtils;
 import org.w3c.dom.Element;
 
-
 @Entity
 @Table(name="ODE_MESSAGE")
+@NamedQueries({
+    @NamedQuery(name=MessageDAOImpl.SELECT_REQUEST_MESSAGE_IDS_BY_PROCESS, query="select x._request._id from MessageExchangeDAOImpl as x where x._process = :process"),
+    @NamedQuery(name=MessageDAOImpl.SELECT_RESPONSE_MESSAGE_IDS_BY_PROCESS, query="select x._response._id from MessageExchangeDAOImpl as x where x._process = :process"),
+    @NamedQuery(name=MessageDAOImpl.DELETE_MESSAGES_BY_IDS, query="delete from MessageDAOImpl as m where m._id in (:ids)")
+})
 public class MessageDAOImpl implements MessageDAO {
+    public final static String SELECT_REQUEST_MESSAGE_IDS_BY_PROCESS = "SELECT_REQUEST_MESSAGE_IDS_BY_PROCESS";
+    public final static String SELECT_RESPONSE_MESSAGE_IDS_BY_PROCESS = "SELECT_RESPONSE_MESSAGE_IDS_BY_PROCESS";
+    public final static String DELETE_MESSAGES_BY_IDS = "DELETE_MESSAGES_BY_IDS";
 
     @Id @Column(name="MESSAGE_ID")
     @GeneratedValue(strategy=GenerationType.AUTO)
-    private Long _id;
+    @SuppressWarnings("unused")
+    Long _id;
     @Basic @Column(name="TYPE")
     private String _type;
     @Lob @Column(name="DATA")
@@ -55,8 +64,8 @@
     private Element _headerElement;
 
     public MessageDAOImpl() {
-
     }
+
     public MessageDAOImpl(QName type, MessageExchangeDAOImpl me) {
         _type = type.toString();
     }

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageExchangeDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -34,12 +34,16 @@
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.xml.namespace.QName;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.common.CorrelationKey;
 import org.apache.ode.bpel.dao.MessageDAO;
 import org.apache.ode.bpel.dao.MessageExchangeDAO;
@@ -56,7 +60,15 @@
 
 @Entity
 @Table(name="ODE_MESSAGE_EXCHANGE")
-public class MessageExchangeDAOImpl implements MessageExchangeDAO {
+@NamedQueries({
+    @NamedQuery(name=MessageExchangeDAOImpl.DELETE_MEXS_BY_PROCESS, query="delete from MessageExchangeDAOImpl as m where m._process = :process"),
+    @NamedQuery(name=MessageExchangeDAOImpl.SELECT_MEX_IDS_BY_PROCESS, query="select m._id from MessageExchangeDAOImpl as m where m._process = :process")
+})
+public class MessageExchangeDAOImpl extends OpenJPADAO implements MessageExchangeDAO {
+    private static final Log __log = LogFactory.getLog(MessageExchangeDAOImpl.class);
+    
+    public final static String DELETE_MEXS_BY_PROCESS = "DELETE_MEXS_BY_PROCESS";
+    public final static String SELECT_MEX_IDS_BY_PROCESS = "SELECT_MEX_IDS_BY_PROCESS";
 
 	@Id @Column(name="MESSAGE_EXCHANGE_ID") 
 	private String _id;
@@ -100,7 +112,7 @@
     @Basic @Column(name="ACK_TYPE")
     private String _ackType;
 
-    @OneToMany(targetEntity=MexProperty.class,mappedBy="_mex",fetch=FetchType.EAGER,cascade={CascadeType.ALL})
+    @OneToMany(targetEntity=MexProperty.class,mappedBy="_mex",fetch=FetchType.EAGER,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
     private Collection<MexProperty> _props = new ArrayList<MexProperty>();
 	@ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="INSTANCE")
 	private ProcessInstanceDAOImpl _processInst;
@@ -108,9 +120,9 @@
 	private PartnerLinkDAOImpl _partnerLink;
 	@ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="PROCESS")
 	private ProcessDAOImpl _process;
-	@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="REQUEST")
+	@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) @Column(name="REQUEST")
 	private MessageDAOImpl _request;
-    @OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="RESPONSE")
+    @OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) @Column(name="RESPONSE")
 	private MessageDAOImpl _response;
 
     @ManyToOne(fetch= FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="CORRELATOR")
@@ -351,8 +363,20 @@
     }
 
 
-    public void release() {
-        // no-op for now, could be used to do some cleanup
+    public void release(boolean doClean) {
+        if( __log.isDebugEnabled() ) __log.debug("INSTANCE CLEANUP(MEX, doClean=" + doClean + ")");
+        if( doClean ) {
+            deleteMessages();
+        }
+    }
+
+    public void deleteMessages() {
+        if( __log.isDebugEnabled() ) __log.debug("INSTANCE CLEANUP(MEX:" + _id + "(request:" + _request + ", response:" + _response);
+        
+        getEM().remove(_request);
+        getEM().remove(_response);
+        getEM().createNamedQuery(MexProperty.DELETE_MEX_PROPERTIES_BY_MEX_ID).setParameter("mexId", _id).executeUpdate();
+        getEM().remove(this); // This deletes MexProperty, REQUEST MessageDAO, RESPONSE MessageDAO
     }
 
     public CorrelatorDAOImpl getCorrelator() {

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageRouteDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageRouteDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageRouteDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MessageRouteDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -32,11 +32,19 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
 @Entity
 @Table(name="ODE_MESSAGE_ROUTE")
+@NamedQueries ({
+    @NamedQuery(name=MessageRouteDAOImpl.DELETE_MESSAGE_ROUTES_BY_INSTANCE_IDS, query="delete from MessageRouteDAOImpl as r where r._instanceId in(:instanceIds)"),
+    @NamedQuery(name=MessageRouteDAOImpl.DELETE_MESSAGE_ROUTES_BY_INSTANCE, query="delete from MessageRouteDAOImpl as r where r._processInst = :instance")
+})
 public class MessageRouteDAOImpl implements MessageRouteDAO {
+    public final static String DELETE_MESSAGE_ROUTES_BY_INSTANCE = "DELETE_MESSAGE_ROUTES_BY_INSTANCE";
+    public final static String DELETE_MESSAGE_ROUTES_BY_INSTANCE_IDS = "DELETE_MESSAGE_ROUTES_BY_INSTANCE_IDS";
 	
 	@Id @Column(name="MESSAGE_ROUTE_ID") 
 	@GeneratedValue(strategy=GenerationType.AUTO)
@@ -48,6 +56,9 @@
 	@Basic @Column(name="CORRELATION_KEY")
     private String _correlationKey;
 
+    @Basic @Column(name="PROCESS_INSTANCE_ID", insertable=false, updatable=false, nullable=true)
+    @SuppressWarnings("unused")
+    private int _instanceId;
     @ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="PROCESS_INSTANCE_ID")
     private ProcessInstanceDAOImpl _processInst;
     @ManyToOne(fetch= FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="CORR_ID")

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MexProperty.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MexProperty.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MexProperty.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/MexProperty.java Mon Apr  6 21:53:20 2009
@@ -28,6 +28,8 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
 /**
@@ -35,7 +37,13 @@
  */
 @Entity
 @Table(name="ODE_MEX_PROP")
+@NamedQueries({
+    @NamedQuery(name=MexProperty.DELETE_MEX_PROPERTIES_BY_MEX_IDS, query="delete from MexProperty as p where p._mexId in (:mexIds)"),
+    @NamedQuery(name=MexProperty.DELETE_MEX_PROPERTIES_BY_MEX_ID, query="delete from MexProperty as p where p._mexId = :mexId")
+})
 public class MexProperty {
+    public final static String DELETE_MEX_PROPERTIES_BY_MEX_IDS = "DELETE_MEX_PROPERTIES_BY_MEX_IDS";
+    public final static String DELETE_MEX_PROPERTIES_BY_MEX_ID = "DELETE_MEX_PROPERTIES_BY_MEX_ID";
 
     @Id @Column(name="ID")
     @GeneratedValue(strategy=GenerationType.AUTO)
@@ -44,6 +52,10 @@
     private String propertyKey;
     @Basic @Column(name="PROP_VALUE", length=2000)
     private String propertyValue;
+
+    @Basic @Column(name="MEX_ID", insertable=false, updatable=false, nullable=true)
+    @SuppressWarnings("unused")
+    private String _mexId;
     @ManyToOne(fetch= FetchType.LAZY,cascade={CascadeType.PERSIST})
     @Column(name="MEX_ID")
     private MessageExchangeDAOImpl _mex;

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/OpenJPADAO.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/OpenJPADAO.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/OpenJPADAO.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/OpenJPADAO.java Mon Apr  6 21:53:20 2009
@@ -18,16 +18,23 @@
  */
 package org.apache.ode.dao.jpa;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
+import org.apache.openjpa.persistence.OpenJPAQuery;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
+
+import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
 /**
  * @author Matthieu Riou <mriou at apache dot org>
  */
 public class OpenJPADAO {
+    private static final Log __log = LogFactory.getLog(OpenJPADAO.class);
 
     protected BPELDAOConnectionImpl getConn() {
         return BPELDAOConnectionFactoryImpl._connections.get();
@@ -44,10 +51,35 @@
      * @param qry query to execute
      * @return whatever you assign it to
      */
+    @SuppressWarnings("unchecked")
     protected <T> T getSingleResult(Query qry) {
         List res = qry.getResultList();
         if (res.size() == 0) return null;
         return (T) res.get(0);
+    }
 
+    protected <T> void batchUpdateByIds(Iterator<T> ids, Query query, String parameterName) {
+        // don't sweat, a collection result from a query in openjpa is a lazy-loading list, instead of fully loaded list like in Hibernate
+        // using iterator on the result list depends on the nature of the query, if a scrollable result set is supported by
+        // the database's jdbc, iterating on the list becomes most efficient
+        if( query instanceof OpenJPAQuery ) {
+            OpenJPAQuery openJpaQuery = (OpenJPAQuery)query;
+            int batchSize = openJpaQuery.getFetchPlan().getFetchBatchSize();
+            if( __log.isDebugEnabled() ) __log.debug("BATCH fetchBatchSize = " + batchSize);
+            if( batchSize < 1 ) {
+                if( __log.isWarnEnabled() ) __log.warn("BATCH size returned " + batchSize + ", overriding to 10.");
+                batchSize = 10;
+            }
+            List<T> batch = new ArrayList<T>();
+            while( ids.hasNext() ) {
+                for( int i = 0; i < batchSize && ids.hasNext(); i++ ) {
+                    batch.add(ids.next());
+                }
+                if( __log.isDebugEnabled() ) __log.debug("BATCH updating " + batch.size() + " objects.");
+                query.setParameter(parameterName, batch);
+                query.executeUpdate();
+                batch.clear();
+            }
+        }
     }
 }

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/PartnerLinkDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/PartnerLinkDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/PartnerLinkDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/PartnerLinkDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -34,16 +34,23 @@
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 import javax.persistence.Transient;
 import javax.xml.namespace.QName;
 
 @Entity
 @Table(name="ODE_PARTNER_LINK")
+@NamedQueries({
+    @NamedQuery(name=PartnerLinkDAOImpl.DELETE_PARTNER_LINKS_BY_SCOPE_IDS, query="delete from PartnerLinkDAOImpl as l where l._scopeId in (:scopeIds)")
+})
 public class PartnerLinkDAOImpl implements PartnerLinkDAO {
+    public final static String DELETE_PARTNER_LINKS_BY_SCOPE_IDS = "DELETE_PARTNER_LINKS_BY_SCOPE_IDS";
 
 	@Id @Column(name="PARTNER_LINK_ID") 
 	@GeneratedValue(strategy=GenerationType.AUTO)
+    @SuppressWarnings("unused")
 	private Long _id;
 	@Lob @Column(name="MY_EPR")
     private String _myEPR;
@@ -68,7 +75,11 @@
 	@Basic @Column(name="PARTNER_SESSION_ID")
     private String _partnerSessionId;
 
+    @Basic @Column(name="SCOPE_ID", nullable=true, insertable=false, updatable=false)
+    @SuppressWarnings("unused")
+    private Long _scopeId;
     @ManyToOne(fetch= FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="SCOPE_ID")
+    @SuppressWarnings("unused")
     private ScopeDAOImpl _scope;
 
     public PartnerLinkDAOImpl() {}

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -19,6 +19,8 @@
 
 package org.apache.ode.dao.jpa;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.ode.bpel.common.CorrelationKey;
 import org.apache.ode.bpel.dao.CorrelatorDAO;
 import org.apache.ode.bpel.dao.ProcessDAO;
@@ -45,6 +47,7 @@
             " WHERE c._correlatorKey = :ckey AND c._process = :process")
 })
 public class ProcessDAOImpl extends OpenJPADAO implements ProcessDAO {
+    private static final Log __log = LogFactory.getLog(ProcessDAOImpl.class);
 
     @Id @Column(name="ID")
     @GeneratedValue(strategy= GenerationType.AUTO)
@@ -119,7 +122,64 @@
 	}
 
     public void delete() {
-        getEM().remove(this);
+        if(__log.isDebugEnabled()) __log.debug("Cleaning up process data.");
+
+        getEM().flush();
+        deleteEvents();
+        deleteCorrelations();
+        deleteMessages();
+        deleteVariables();
+        deleteProcessInstances();
+        getEM().remove(this); // This deletes CorrelatorDAO
+        getEM().flush();
+    }
+
+    @SuppressWarnings("unchecked")
+    private void deleteProcessInstances() {
+        Collection faultIds = getEM().createNamedQuery(ProcessInstanceDAOImpl.SELECT_FAULT_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(faultIds.iterator(), getEM().createNamedQuery(FaultDAOImpl.DELETE_FAULTS_BY_IDS), "ids");
+        Collection instanceIds = getEM().createNamedQuery(ProcessInstanceDAOImpl.SELECT_INSTANCE_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(instanceIds.iterator(), getEM().createNamedQuery(ActivityRecoveryDAOImpl.DELETE_ACTIVITY_RECOVERIES_BY_IDS), "ids");
+        getEM().createNamedQuery(ProcessInstanceDAOImpl.DELETE_INSTANCES_BY_PROCESS).setParameter("process", this).executeUpdate();
+    }
+
+    @SuppressWarnings("unchecked")
+    private void deleteVariables() {
+        Collection xmlDataIds = getEM().createNamedQuery(XmlDataDAOImpl.SELECT_XMLDATA_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(xmlDataIds.iterator(), getEM().createNamedQuery(XmlDataProperty.DELETE_XML_DATA_PROPERTIES_BY_XML_DATA_IDS), "xmlDataIds");
+        Collection scopeIds = getEM().createNamedQuery(ScopeDAOImpl.SELECT_SCOPE_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(scopeIds.iterator(), getEM().createNamedQuery(XmlDataDAOImpl.DELETE_XMLDATA_BY_SCOPE_IDS), "scopeIds");
+
+//          Collection scopeIds = getEM().createNamedQuery(ScopeDAOImpl.SELECT_SCOPE_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(scopeIds.iterator(), getEM().createNamedQuery(PartnerLinkDAOImpl.DELETE_PARTNER_LINKS_BY_SCOPE_IDS), "scopeIds");
+        batchUpdateByIds(scopeIds.iterator(), getEM().createNamedQuery(ScopeDAOImpl.DELETE_SCOPES_BY_SCOPE_IDS), "ids");
+    }
+
+    @SuppressWarnings("unchecked")
+    private void deleteMessages() {
+        Collection eventIds = getEM().createNamedQuery(MessageDAOImpl.SELECT_REQUEST_MESSAGE_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(eventIds.iterator(), getEM().createNamedQuery(MessageDAOImpl.DELETE_MESSAGES_BY_IDS), "ids");
+        eventIds = getEM().createNamedQuery(MessageDAOImpl.SELECT_RESPONSE_MESSAGE_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(eventIds.iterator(), getEM().createNamedQuery(MessageDAOImpl.DELETE_MESSAGES_BY_IDS), "ids");
+        Collection mexIds = getEM().createNamedQuery(MessageExchangeDAOImpl.SELECT_MEX_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(mexIds.iterator(), getEM().createNamedQuery(MexProperty.DELETE_MEX_PROPERTIES_BY_MEX_IDS), "mexIds");
+        getEM().createNamedQuery(MessageExchangeDAOImpl.DELETE_MEXS_BY_PROCESS).setParameter("process", this).executeUpdate();
+        Collection instanceIds = getEM().createNamedQuery(ProcessInstanceDAOImpl.SELECT_INSTANCE_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(instanceIds.iterator(), getEM().createNamedQuery(MessageRouteDAOImpl.DELETE_MESSAGE_ROUTES_BY_INSTANCE_IDS), "instanceIds");
+        getEM().createNamedQuery(CorrelatorDAOImpl.DELETE_CORRELATORS_BY_PROCESS).setParameter("process", this).executeUpdate();
+    }
+
+    @SuppressWarnings("unchecked")
+    private void deleteCorrelations() {
+        Collection corrSetIds = getEM().createNamedQuery(CorrelationSetDAOImpl.SELECT_CORRELATION_SET_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(corrSetIds.iterator(), getEM().createNamedQuery(CorrSetProperty.DELETE_CORSET_PROPERTIES_BY_PROPERTY_IDS), "corrSetIds");
+        batchUpdateByIds(corrSetIds.iterator(), getEM().createNamedQuery(CorrelationSetDAOImpl.DELETE_CORRELATION_SETS_BY_IDS), "ids");
+    }
+
+    @SuppressWarnings("unchecked")
+    private void deleteEvents() {
+        Collection eventIds = getEM().createNamedQuery(EventDAOImpl.SELECT_EVENT_IDS_BY_PROCESS).setParameter("process", this).getResultList();
+        batchUpdateByIds(eventIds.iterator(), getEM().createNamedQuery(EventDAOImpl.DELETE_EVENTS_BY_IDS), "ids");
     }
 
     public int getNumInstances() {

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -24,6 +24,7 @@
 import org.apache.ode.bpel.common.ProcessState;
 import org.apache.ode.bpel.dao.*;
 import org.apache.ode.bpel.evt.ProcessInstanceEvent;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.w3c.dom.Element;
 
 import javax.persistence.*;
@@ -72,13 +73,17 @@
     @Basic @Column(name="EXEC_STATE_COUNTER")
     private int _execStateCounter;
 	
-	@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.ALL}) @Column(name="ROOT_SCOPE_ID")
-	private ScopeDAOImpl _rootScope;
-	@OneToMany(targetEntity=ScopeDAOImpl.class,mappedBy="_processInstance",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
-	private Collection<ScopeDAO> _scopes = new ArrayList<ScopeDAO>();
+    @OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) @Column(name="ROOT_SCOPE_ID")
+    private ScopeDAOImpl _rootScope;
+    @OneToMany(targetEntity=ScopeDAOImpl.class,mappedBy="_processInstance",fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
+    private Collection<ScopeDAO> _scopes = new ArrayList<ScopeDAO>();
 	@OneToMany(targetEntity=ActivityRecoveryDAOImpl.class,mappedBy="_instance",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
     private Collection<ActivityRecoveryDAO> _recoveries = new ArrayList<ActivityRecoveryDAO>();
-	@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.ALL}) @Column(name="FAULT_ID")
+
+    @Basic @Column(name="FAULT_ID", insertable=false, updatable=false, nullable=true)
+    @SuppressWarnings("unused")
+    private long _faultId;
+	@OneToOne(fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) @Column(name="FAULT_ID")
 	private FaultDAOImpl _fault;
 	@ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="PROCESS_ID")
 	private ProcessDAOImpl _process;
@@ -118,13 +123,78 @@
 	    return getEM().createNamedQuery(CorrelationSetDAOImpl.SELECT_CORRELATION_SETS_BY_INSTANCES).setParameter("instances", instances).getResultList();
 	}
     
-	public void delete() {
-		if (getEM() != null ) {
-			getEM().remove(this);
-		}
-	}
+    public boolean delete(Set<CLEANUP_CATEGORY> cleanupCategories) {
+        if(__log.isDebugEnabled()) __log.debug("Cleaning up instance Data with " + cleanupCategories);
+        
+        boolean instanceDeleted = false;
+        
+        // remove jacob state
+        setExecutionState(null);
+        if (getEM() != null) {
+            if( !cleanupCategories.isEmpty() ) {
+                // by default, we do not flush before select; flush it, so we can delete no matter if an entity is loaded up
+                // or not; more importantly, OpenJPA will secretly load from the entire table if some entities reside only
+                // in memory
+                getEM().flush();
+            }
+            
+            if (cleanupCategories.contains(CLEANUP_CATEGORY.EVENTS)) {
+                deleteEvents();
+            }
+            if (cleanupCategories.contains(CLEANUP_CATEGORY.CORRELATIONS)) {
+                deleteCorrelations();
+            }
+            if( cleanupCategories.contains(CLEANUP_CATEGORY.MESSAGES) ) {
+                deleteMessageRoutes();
+            }
+            if (cleanupCategories.contains(CLEANUP_CATEGORY.VARIABLES)) {
+                deleteVariables();
+            }
+            if (cleanupCategories.contains(CLEANUP_CATEGORY.INSTANCE)) {
+                deleteInstance();
+                instanceDeleted = true;
+            }
+
+            getEM().flush();
+        }
+        
+        return instanceDeleted;
+    }
+    
+    private void deleteInstance() {
+        if( _fault != null ) {
+            getEM().remove(_fault);
+        }
+        getEM().remove(this); // This deletes ActivityRecoveryDAO 
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void deleteVariables() {
+        Collection xmlDataIds = getEM().createNamedQuery(XmlDataDAOImpl.SELECT_XMLDATA_IDS_BY_INSTANCE).setParameter("instance", this).getResultList();
+        batchUpdateByIds(xmlDataIds.iterator(), getEM().createNamedQuery(XmlDataProperty.DELETE_XML_DATA_PROPERTIES_BY_XML_DATA_IDS), "xmlDataIds");
+        Collection scopeIds = getEM().createNamedQuery(ScopeDAOImpl.SELECT_SCOPE_IDS_BY_INSTANCE).setParameter("instance", this).getResultList();
+        batchUpdateByIds(scopeIds.iterator(), getEM().createNamedQuery(XmlDataDAOImpl.DELETE_XMLDATA_BY_SCOPE_IDS), "scopeIds");
 
-	public void deleteActivityRecovery(String channel) {
+        batchUpdateByIds(scopeIds.iterator(), getEM().createNamedQuery(PartnerLinkDAOImpl.DELETE_PARTNER_LINKS_BY_SCOPE_IDS), "scopeIds");
+        batchUpdateByIds(scopeIds.iterator(), getEM().createNamedQuery(ScopeDAOImpl.DELETE_SCOPES_BY_SCOPE_IDS), "ids");
+    }
+
+    private void deleteMessageRoutes() {
+        getEM().createNamedQuery(MessageRouteDAOImpl.DELETE_MESSAGE_ROUTES_BY_INSTANCE).setParameter ("instance", this).executeUpdate();
+    }
+    
+    @SuppressWarnings("unchecked")
+    private void deleteCorrelations() {
+        Collection corrSetIds = getEM().createNamedQuery(CorrelationSetDAOImpl.SELECT_CORRELATION_SET_IDS_BY_INSTANCE).setParameter("instance", this).getResultList();
+        batchUpdateByIds(corrSetIds.iterator(), getEM().createNamedQuery(CorrSetProperty.DELETE_CORSET_PROPERTIES_BY_PROPERTY_IDS), "corrSetIds");
+        batchUpdateByIds(corrSetIds.iterator(), getEM().createNamedQuery(CorrelationSetDAOImpl.DELETE_CORRELATION_SETS_BY_IDS), "ids");
+    }
+
+    private void deleteEvents() {
+        getEM().createNamedQuery(EventDAOImpl.DELETE_EVENTS_BY_INSTANCE).setParameter ("instance", this).executeUpdate();
+    }
+    
+    public void deleteActivityRecovery(String channel) {
         ActivityRecoveryDAOImpl toRemove = null;
         for (ActivityRecoveryDAO _recovery : _recoveries) {
             ActivityRecoveryDAOImpl arElement = (ActivityRecoveryDAOImpl) _recovery;

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ScopeDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ScopeDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ScopeDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ScopeDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -48,9 +48,15 @@
 @Entity
 @Table(name="ODE_SCOPE")
 @NamedQueries({
-    @NamedQuery(name="ScopeEvents", query="SELECT se FROM EventDAOImpl as se WHERE se._scopeId = :sid")
-        })
+    @NamedQuery(name="ScopeEvents", query="SELECT se FROM EventDAOImpl as se WHERE se._scopeId = :sid"),
+    @NamedQuery(name=ScopeDAOImpl.SELECT_SCOPE_IDS_BY_PROCESS, query="select s._scopeInstanceId from ScopeDAOImpl as s where s._processInstance._process = :process"),
+    @NamedQuery(name=ScopeDAOImpl.SELECT_SCOPE_IDS_BY_INSTANCE, query="select s._scopeInstanceId from ScopeDAOImpl as s where s._processInstance = :instance"),
+    @NamedQuery(name=ScopeDAOImpl.DELETE_SCOPES_BY_SCOPE_IDS, query="delete from ScopeDAOImpl as s where s._scopeInstanceId in(:ids)")
+})
 public class ScopeDAOImpl extends OpenJPADAO implements ScopeDAO {
+    public final static String SELECT_SCOPE_IDS_BY_PROCESS = "SELECT_SCOPE_IDS_BY_PROCESS";
+    public final static String SELECT_SCOPE_IDS_BY_INSTANCE = "SELECT_SCOPE_IDS_BY_INSTANCE";
+    public final static String DELETE_SCOPES_BY_SCOPE_IDS = "DELETE_SCOPES_BY_SCOPE_IDS";
 
     @Id @Column(name="SCOPE_ID")
     @GeneratedValue(strategy= GenerationType.AUTO)
@@ -67,14 +73,14 @@
 	@Column(name="PARENT_SCOPE_ID")
 	private ScopeDAOImpl _parentScope;
 	
-	@OneToMany(targetEntity=ScopeDAOImpl.class,mappedBy="_parentScope",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
+	@OneToMany(targetEntity=ScopeDAOImpl.class,mappedBy="_parentScope",fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
 	private Collection<ScopeDAO> _childScopes = new ArrayList<ScopeDAO>();
 	@OneToMany(targetEntity=CorrelationSetDAOImpl.class,mappedBy="_scope",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
 	private Collection<CorrelationSetDAO> _correlationSets = new ArrayList<CorrelationSetDAO>();
-	@OneToMany(targetEntity=PartnerLinkDAOImpl.class,mappedBy="_scope",fetch= FetchType.LAZY,cascade={CascadeType.ALL})
+    @OneToMany(targetEntity=PartnerLinkDAOImpl.class,mappedBy="_scope",fetch= FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
     private Collection<PartnerLinkDAO> _partnerLinks = new ArrayList<PartnerLinkDAO>();
-	@OneToMany(targetEntity=XmlDataDAOImpl.class,mappedBy="_scope",fetch=FetchType.LAZY,cascade={CascadeType.ALL})
-	private Collection<XmlDataDAO> _variables = new ArrayList<XmlDataDAO>();
+    @OneToMany(targetEntity=XmlDataDAOImpl.class,mappedBy="_scope",fetch=FetchType.LAZY,cascade={CascadeType.MERGE, CascadeType.REFRESH, CascadeType.PERSIST})
+    private Collection<XmlDataDAO> _variables = new ArrayList<XmlDataDAO>();
 	@ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="PROCESS_INSTANCE_ID")
 	private ProcessInstanceDAOImpl _processInstance;
 

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -37,6 +37,8 @@
 import javax.persistence.Id;
 import javax.persistence.Lob;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.persistence.Transient;
@@ -48,10 +50,19 @@
  */
 @Entity
 @Table(name="ODE_XML_DATA")
+@NamedQueries({
+    @NamedQuery(name=XmlDataDAOImpl.SELECT_XMLDATA_IDS_BY_PROCESS, query="select distinct x._id from XmlDataDAOImpl as x where x._scope._processInstance._process = :process"),
+    @NamedQuery(name=XmlDataDAOImpl.SELECT_XMLDATA_IDS_BY_INSTANCE, query="select distinct x._id from XmlDataDAOImpl as x where x._scope._processInstance = :instance"),
+    @NamedQuery(name=XmlDataDAOImpl.DELETE_XMLDATA_BY_SCOPE_IDS, query="delete from XmlDataDAOImpl as x where x._scopeId in(:scopeIds)")
+})
 public class XmlDataDAOImpl implements XmlDataDAO {
+    public final static String SELECT_XMLDATA_IDS_BY_PROCESS = "SELECT_XMLDATA_IDS_BY_PROCESS";
+    public final static String SELECT_XMLDATA_IDS_BY_INSTANCE = "SELECT_XMLDATA_IDS_BY_INSTANCE";
+    public final static String DELETE_XMLDATA_BY_SCOPE_IDS = "DELETE_XMLDATA_BY_SCOPE_IDS";
 	
-	@Id @Column(name="XML_DATA_ID") 
+    @Id @Column(name="XML_DATA_ID") 
 	@GeneratedValue(strategy=GenerationType.AUTO)
+    @SuppressWarnings("unused")
 	private Long _id;
 	@Lob @Column(name="DATA")
     private String _data;
@@ -65,6 +76,9 @@
     @OneToMany(targetEntity=XmlDataProperty.class,mappedBy="_xmlData",fetch=FetchType.EAGER,cascade={CascadeType.ALL})
     private Collection<XmlDataProperty> _props = new ArrayList<XmlDataProperty>();
 
+    @Basic @Column(name="SCOPE_ID", nullable=true, insertable=false, updatable=false)
+    @SuppressWarnings("unused")
+    private Long _scopeId;
 	@ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="SCOPE_ID")
 	private ScopeDAOImpl _scope;
 	

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataProperty.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataProperty.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataProperty.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/XmlDataProperty.java Mon Apr  6 21:53:20 2009
@@ -28,6 +28,8 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.Table;
 
 /**
@@ -35,17 +37,27 @@
  */
 @Entity
 @Table(name="ODE_XML_DATA_PROP")
+@NamedQueries({
+    @NamedQuery(name=XmlDataProperty.DELETE_XML_DATA_PROPERTIES_BY_XML_DATA_IDS, query="delete from XmlDataProperty as p where p._xmlDataId in (:xmlDataIds)")
+})
 public class XmlDataProperty {
+    public final static String DELETE_XML_DATA_PROPERTIES_BY_XML_DATA_IDS = "DELETE_XML_DATA_PROPERTIES_BY_XML_DATA_IDS";
 
     @Id @Column(name="ID")
     @GeneratedValue(strategy= GenerationType.AUTO)
+    @SuppressWarnings("unused")
     private Long _id;
     @Basic @Column(name="PROP_KEY")
     private String propertyKey;
     @Basic @Column(name="PROP_VALUE")
     private String propertyValue;
+
+    @Basic @Column(name="XML_DATA_ID", insertable=false, updatable=false, nullable=true)
+    @SuppressWarnings("unused")
+    private Long _xmlDataId;
     @ManyToOne(fetch= FetchType.LAZY,cascade={CascadeType.PERSIST})
     @Column(name="XML_DATA_ID")
+    @SuppressWarnings("unused")
     private XmlDataDAOImpl _xmlData;
 
     public XmlDataProperty() {

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelRuntimeContextImpl.java Mon Apr  6 21:53:20 2009
@@ -61,6 +61,7 @@
 import org.apache.ode.bpel.iapi.MessageExchange.FailureType;
 import org.apache.ode.bpel.iapi.MessageExchange.MessageExchangePattern;
 import org.apache.ode.bpel.iapi.MessageExchange.Status;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.apache.ode.bpel.memdao.ProcessInstanceDaoImpl;
 import org.apache.ode.bpel.rapi.CorrelationSet;
 import org.apache.ode.bpel.rapi.FaultInfo;
@@ -115,6 +116,12 @@
 
     /** Five second maximum for continuous execution. */
     private long _maxReductionTimeMs = 2000000;
+    
+    /**
+     * This flag tells if the instance associated with the contextImpl instance is cleaned up by the 
+     * instance cleanup process
+     */
+    private boolean _instanceCleanedUp = false;
 
     public BpelRuntimeContextImpl(BpelInstanceWorker instanceWorker, ProcessInstanceDAO instanceDAO, OdeRTInstance rti) {
         _instanceWorker = instanceWorker;
@@ -190,6 +197,8 @@
 
         sendEvent(new ProcessCompletionEvent(faultData.getFaultName()));
         _dao.finishCompletion();
+
+        _instanceCleanedUp = _dao.delete(_bpelProcess.getCleanupCategories(false));
     }
 
     public void completedOk() {
@@ -206,6 +215,8 @@
 
         sendEvent(new ProcessCompletionEvent(null));
         _dao.finishCompletion();
+        
+        _instanceCleanedUp = _dao.delete(_bpelProcess.getCleanupCategories(true));
     }
 
     public Long createScopeInstance(Long parentScopeId, String name, int modelId) {
@@ -431,7 +442,13 @@
         Status previousStatus = myrolemex.getStatus();
         myrolemex.setStatus(Status.ACK);
         myrolemex.setAckType(ackType);
-        _bpelProcess.onMyRoleMexAck(myrolemex, previousStatus);
+        try {
+            _bpelProcess.onMyRoleMexAck(myrolemex, previousStatus);
+        } finally {
+            if (myrolemex.getPipedMessageExchangeId() != null) {
+                myrolemex.release(_bpelProcess.isCleanupCategoryEnabled(myrolemex.getAckType() == MessageExchange.AckType.RESPONSE, CLEANUP_CATEGORY.MESSAGES));
+            }
+        }
         sendEvent(evt);
     }
 
@@ -541,6 +558,12 @@
         }
         _bpelProcess.invokePartner(mexDao);
 
+        if (mexDao.getPattern().equals(MessageExchangePattern.REQUEST_ONLY)) {
+            mexDao.setStatus(MessageExchange.Status.ASYNC);
+            // This mex can now be released
+            boolean succeeded = mexDao.getAckType() != MessageExchange.AckType.FAILURE && mexDao.getAckType() != MessageExchange.AckType.FAULT; 
+            mexDao.release(_bpelProcess.isCleanupCategoryEnabled(succeeded, CLEANUP_CATEGORY.MESSAGES));
+        }
         // In case a response/fault was available right away, which will happen for BLOCKING/TRANSACTED invocations,
         // we need to inject a message on the response channel, so that the process continues.
         switch (mexDao.getStatus()) {
@@ -593,12 +616,14 @@
             canReduce = _rti.execute();
         }
         
-        _dao.setLastActiveTime(new Date());
+        if( !_instanceCleanedUp ) {
+            _dao.setLastActiveTime(new Date());
+        }
         if (!ProcessState.isFinished(_dao.getState())) {
             if (_forceRollback) {
                 rollbackState();
             } else {
-                saveState();            	
+                saveState();
             }
 
             if (ProcessState.canExecute(_dao.getState()) && canReduce) {
@@ -880,9 +905,9 @@
         return response;
     }
 
-    public void releasePartnerMex(String mexId) {
+    public void releasePartnerMex(String mexId, boolean instanceSucceeded) {
         MessageExchangeDAO dao = _dao.getConnection().getMessageExchange(mexId);
-        dao.release();
+        dao.release(_bpelProcess.isCleanupCategoryEnabled(instanceSucceeded, CLEANUP_CATEGORY.MESSAGES) );
     }
 
 

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/BpelServerImpl.java Mon Apr  6 21:53:20 2009
@@ -425,6 +425,10 @@
         }
     }
 
+    public void cleanupProcess(QName pid) throws BpelEngineException {
+        deleteProcessDAO(pid);
+    }
+
     /**
      * Register a global message exchange interceptor.
      * 

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MessageExchangeImpl.java Mon Apr  6 21:53:20 2009
@@ -146,6 +146,10 @@
     }
     
     void load(MessageExchangeDAO dao) {
+        if(__log.isDebugEnabled()) __log.debug("INMEM MessageExchange loading.");
+        
+        _epr = _contexts.eprContext.resolveEndpointReference(dao.getEPR());
+        
         _timeout = dao.getTimeout();
         _iid = dao.getInstance() != null ? dao.getInstance().getInstanceId() : null;
         _ackType = dao.getAckType();
@@ -300,7 +304,9 @@
         return _epr = doInTX(new InDbAction<EndpointReference>() {
 
             public EndpointReference call(MessageExchangeDAO mexdao) {
-                Element eprdao = mexdao.getEPR();
+                Element eprdao = null;
+                // mexdao is already release for non-callback myrole
+                if( mexdao != null ) eprdao = mexdao.getEPR();
                 return _epr = eprdao == null ? null : _contexts.eprContext.resolveEndpointReference(mexdao.getEPR());
             }
 
@@ -351,6 +357,7 @@
     public void release() {
         __log.debug("Releasing mex " + getMessageExchangeId());
         _changes.add(Change.RELEASE);
+        // for a one-way, message exchanges are always deleted
         _process.releaseMessageExchange(getMessageExchangeId());
     }
 

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/MyRoleMessageExchangeImpl.java Mon Apr  6 21:53:20 2009
@@ -14,6 +14,7 @@
 import org.apache.ode.bpel.iapi.BpelEngineException;
 import org.apache.ode.bpel.iapi.Message;
 import org.apache.ode.bpel.iapi.MyRoleMessageExchange;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.apache.ode.bpel.rapi.PartnerLinkModel;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -110,7 +111,13 @@
 
     }
 
-  
+    public void release(boolean instanceSucceeded) {
+        if( _process.isCleanupCategoryEnabled(instanceSucceeded, CLEANUP_CATEGORY.MESSAGES) ) {
+            if(__log.isDebugEnabled()) __log.debug("Releasing mex " + getMessageExchangeId());
+            _process.releaseMessageExchange(getMessageExchangeId());
+        }
+    }
+ 
     protected MessageExchangeDAO doInvoke() {
         if (getStatus() != Status.NEW) throw new IllegalStateException("Invalid state: " + getStatus());
         request();

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ODEProcess.java Mon Apr  6 21:53:20 2009
@@ -64,6 +64,7 @@
 import org.apache.ode.bpel.iapi.MessageExchange.MessageExchangePattern;
 import org.apache.ode.bpel.iapi.MessageExchange.Status;
 import org.apache.ode.bpel.iapi.MyRoleMessageExchange.CorrelationStatus;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.apache.ode.bpel.iapi.Scheduler.JobInfo;
 import org.apache.ode.bpel.iapi.Scheduler.JobProcessorException;
 import org.apache.ode.bpel.intercept.FailMessageExchangeException;
@@ -377,6 +378,9 @@
     void executeContinueInstanceMyRoleRequestReceived(MessageExchangeDAO mexdao) {
         assert _hydrationLatch.isLatched(1);
 
+        assert mexdao != null;
+        assert mexdao.getInstance() != null;
+        
         BpelInstanceWorker worker = _instanceWorkerCache.get(mexdao.getInstance().getInstanceId());
         assert worker.isWorkerThread();
 
@@ -449,6 +453,8 @@
             BpelRuntimeContextImpl brc = new BpelRuntimeContextImpl(worker, instanceDao, rti);
             brc.injectMyRoleMessageExchange(mroute.getGroupId(), mroute.getIndex(), mexdao);
             brc.execute();
+            
+            mexdao.release(true);
         } else {
             __log.debug("MatcherEvent handling: nothing to do, no matching message in DB");
 
@@ -609,6 +615,8 @@
         switch (we.getType()) {
         case MYROLE_INVOKE:
             executeContinueInstanceMyRoleRequestReceived(mexDao);
+            if(__log.isDebugEnabled()) __log.debug("handleWorkEvent: releasing myrole mex dao: " + mexDao);
+            mexDao.release(true);
             break;
         case TIMER:
             executeContinueInstanceTimerReceived(instanceDAO, we.getChannel());
@@ -1081,9 +1089,25 @@
         return _inMemDao.getConnection().getMessageExchange(mexId);
     }
 
-    public void releaseMessageExchange(String mexId) {
+    public void releaseMessageExchange(final String mexId) {
         if (isInMemory()) {
             _inMemDao.getConnection().releaseMessageExchange(mexId);
+        } else {
+            if( _contexts.isTransacted() ) {
+                _contexts.dao.getConnection().releaseMessageExchange(mexId);
+            } else {
+                // ATT-MRIOU; what's the right way without creating its own transaction for releasing my role mex?
+                try {
+                    _contexts.execTransaction(new Callable<Object>() {
+                        public Object call() throws Exception {
+                            _contexts.dao.getConnection().releaseMessageExchange(mexId);
+                            return null;
+                        }
+                    });
+                } catch (Exception e) {
+                    throw new RuntimeException(e);
+                }
+            }
         }
     }
     /**
@@ -1490,6 +1514,14 @@
         }
     }
 
+    public boolean isCleanupCategoryEnabled(boolean instanceSucceeded, CLEANUP_CATEGORY category) {
+        return _pconf.isCleanupCategoryEnabled(instanceSucceeded, category);
+    }
+
+    public Set<CLEANUP_CATEGORY> getCleanupCategories(boolean instanceSucceeded) {
+        return _pconf.getCleanupCategories(instanceSucceeded);
+    }
+
     public Node getProcessProperty(QName propertyName) {
         Map<QName, Node> properties = _pconf.getProcessProperties();
         if (properties != null) {

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerRoleMessageExchangeImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerRoleMessageExchangeImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerRoleMessageExchangeImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/PartnerRoleMessageExchangeImpl.java Mon Apr  6 21:53:20 2009
@@ -175,8 +175,6 @@
     }
 
     public void replyWithFailure(FailureType type, String description, Element details) throws BpelEngineException {
-        if (__log.isDebugEnabled()) __log.debug("replyWithFailure mex=" + getMessageExchangeId());
-
         _accessLock.lock();
         try {
             checkReplyContextOk();

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java Mon Apr  6 21:53:20 2009
@@ -27,6 +27,7 @@
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
+import java.util.EnumSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -76,6 +77,7 @@
 import org.apache.ode.bpel.iapi.ProcessConf;
 import org.apache.ode.bpel.iapi.ProcessState;
 import org.apache.ode.bpel.iapi.ProcessStore;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.apache.ode.bpel.pmapi.ActivityExtInfoListDocument;
 import org.apache.ode.bpel.pmapi.ActivityInfoDocument;
 import org.apache.ode.bpel.pmapi.EventInfoListDocument;
@@ -457,7 +459,7 @@
                 public Object run(BpelDAOConnection conn) {
                     Collection<ProcessInstanceDAO> instances = conn.instanceQuery(instanceFilter);
                     for (ProcessInstanceDAO instance : instances) {
-                        instance.delete();
+                        instance.delete(EnumSet.allOf(CLEANUP_CATEGORY.class));
                         ret.add(instance.getInstanceId());
                     }
                     return null;

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/UnreliableMyRoleMessageExchangeImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/UnreliableMyRoleMessageExchangeImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/UnreliableMyRoleMessageExchangeImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/UnreliableMyRoleMessageExchangeImpl.java Mon Apr  6 21:53:20 2009
@@ -15,6 +15,7 @@
 import org.apache.ode.bpel.iapi.BpelEngineException;
 import org.apache.ode.bpel.iapi.InvocationStyle;
 import org.apache.ode.bpel.rapi.PartnerLinkModel;
+import org.w3c.dom.Element;
 
 /**
  * For invoking the engine using UNRELIABLE style.
@@ -23,6 +24,7 @@
  * 
  */
 public class UnreliableMyRoleMessageExchangeImpl extends MyRoleMessageExchangeImpl {
+    @SuppressWarnings("unused")
     private static final Log __log = LogFactory.getLog(ReliableMyRoleMessageExchangeImpl.class);
 
     boolean _done = false;
@@ -118,7 +120,7 @@
     }
 
     @Override
-    protected void onAsyncAck(MessageExchangeDAO mexdao) {
+    protected void onAsyncAck(final MessageExchangeDAO mexdao) {
         final MemBackedMessageImpl response;
         final QName fault = mexdao.getFault();
         final FailureType failureType = mexdao.getFailureType();
@@ -134,9 +136,10 @@
             response = null;
         }
 
-        final UnreliableMyRoleMessageExchangeImpl self = this;
-        final ResponseFuture f = _future;
-        // Lets be careful, the TX can still rollback!
+        Element eprdao = mexdao.getEPR();
+        _epr = eprdao == null ? null : _contexts.eprContext.resolveEndpointReference(mexdao.getEPR());
+        
+        // Lets be careful, the TX can still roll-back!
         _process.scheduleRunnable(new Runnable() {
             public void run() {
                 _response = response;
@@ -146,10 +149,7 @@
 
                 ack(ackType);
                 _future.done(Status.ACK);
-
             }
-
         });
     }
-
 }

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/MessageExchangeDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/MessageExchangeDAOImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/MessageExchangeDAOImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/MessageExchangeDAOImpl.java Mon Apr  6 21:53:20 2009
@@ -259,7 +259,7 @@
     }
 
 
-    public void release() {
+    public void release(boolean doClean) {
         instance = null;
         process = null;
         _plink = null;

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessInstanceDaoImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessInstanceDaoImpl.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessInstanceDaoImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/ProcessInstanceDaoImpl.java Mon Apr  6 21:53:20 2009
@@ -29,6 +29,7 @@
 import org.apache.ode.bpel.dao.ScopeDAO;
 import org.apache.ode.bpel.dao.XmlDataDAO;
 import org.apache.ode.bpel.evt.ProcessInstanceEvent;
+import org.apache.ode.bpel.iapi.ProcessConf.CLEANUP_CATEGORY;
 import org.apache.ode.utils.QNameUtils;
 import org.w3c.dom.Element;
 
@@ -296,8 +297,9 @@
         this.getProcess().instanceCompleted(this);
     }
 
-    public void delete() {
+    public boolean delete(Set<CLEANUP_CATEGORY> cleanupCategories) {
         _processDao._instances.remove(_instanceId);
+        return true;
     }
 
     public Collection<ScopeDAO> getScopes() {

Propchange: ode/trunk/runtimes/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Apr  6 21:53:20 2009
@@ -1,3 +1,4 @@
 reports
 .classpath
 .project
+target

Modified: ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/INVOKE.java
URL: http://svn.apache.org/viewvc/ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/INVOKE.java?rev=762523&r1=762522&r2=762523&view=diff
==============================================================================
--- ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/INVOKE.java (original)
+++ ode/trunk/runtimes/src/main/java/org/apache/ode/bpel/rtrep/v1/INVOKE.java Mon Apr  6 21:53:20 2009
@@ -158,7 +158,7 @@
                         // TODO update output variable with data from non-initiate correlation sets
 
                         _self.parent.completed(fault, CompensationHandler.emptySet());
-                        getBpelRuntime().releasePartnerMex(mexId);
+                        getBpelRuntime().releasePartnerMex(mexId, fault == null);
                     }
 
                     public void onFault() {
@@ -168,7 +168,7 @@
                         FaultData fault = createFault(faultName, msg,
                             _oinvoke.getOwner().messageTypes.get(msgType), _self.o);
                         _self.parent.completed(fault, CompensationHandler.emptySet());
-                        getBpelRuntime().releasePartnerMex(mexId);
+                        getBpelRuntime().releasePartnerMex(mexId, false);
                     }
 
                     public void onFailure() {
@@ -184,7 +184,7 @@
                         } catch (Exception e) {
                             _self.parent.failure(reason, null);
                         }
-                        getBpelRuntime().releasePartnerMex(mexId);
+                        getBpelRuntime().releasePartnerMex(mexId, false);
                     }
 
                 }.or(new TerminationChannelListener(_self.self) {