You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ode.apache.org by ka...@apache.org on 2009/03/11 22:28:37 UTC

svn commit: r752626 - in /ode/trunk: axis2-war/src/test/java/org/apache/ode/axis2/management/ bpel-api/src/main/java/org/apache/ode/bpel/pmapi/ bpel-api/src/main/java/org/apache/ode/bpel/rapi/ bpel-dao/src/main/java/org/apache/ode/bpel/dao/ dao-hiberna...

Author: karthick
Date: Wed Mar 11 21:28:36 2009
New Revision: 752626

URL: http://svn.apache.org/viewvc?rev=752626&view=rev
Log:
ODE-446 Improve performance of InstanceManagement

Modified:
    ode/trunk/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/pmapi/InstanceManagement.java
    ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
    ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java
    ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
    ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HCorrelationSet.java
    ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java
    ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java
    ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/BPELDAOConnectionImpl.java
    ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/CorrelationSetDAOImpl.java
    ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessInstanceDAOImpl.java
    ode/trunk/engine/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java
    ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java
    ode/trunk/engine/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java

Modified: ode/trunk/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java (original)
+++ ode/trunk/axis2-war/src/test/java/org/apache/ode/axis2/management/InstanceManagementTest.java Wed Mar 11 21:28:36 2009
@@ -122,7 +122,8 @@
 
   @Test
     public void testGetScopeInfo() throws Exception {
-        OMElement root = _client.buildMessage("listAllInstances", new String[] {}, new String[] {});
+      OMElement root = _client.buildMessage("listInstances", new String[] {"filter", "order", "limit"},
+              new String[] {"name=DynPartnerMain", "", "10"});
         OMElement result = sendToIM(root);
         String siid = result.getFirstElement().getFirstChildWithName(new QName(Namespaces.ODE_PMAPI, "instance-info"))
                 .getFirstChildWithName(new QName(Namespaces.ODE_PMAPI, "root-scope"))

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/pmapi/InstanceManagement.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/pmapi/InstanceManagement.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/pmapi/InstanceManagement.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/pmapi/InstanceManagement.java Wed Mar 11 21:28:36 2009
@@ -124,6 +124,17 @@
      */
     InstanceInfoListDocument listInstances(String filter, String order, int limit);
 
+    /**
+     * List instances and only return summary information about the instance,
+     * combined with all correlation properties.
+     *  
+     * @param filter See listInstances' filter argument
+     * @param order  See listInstances' order argument
+     * @param limit maximum number of instances to return
+     * @return list of matching instances
+     */
+    InstanceInfoListDocument listInstancesSummary(String filter, String order, int limit);
+
     /** @deprecated use listInstances instead */
     InstanceInfoListDocument queryInstances(String query);
 
@@ -131,6 +142,8 @@
      * List all instances in the default (database) order.
      * @see #listInstances(String, String, int)
      * @return list of matching instances
+     * @deprecated As of Ode 1.3, this method is deprecated in favor of 
+     *             listInstancesSummary(filter, order, limit)
      */
     InstanceInfoListDocument listAllInstances();
 
@@ -139,6 +152,8 @@
      * @see #listInstances(String, String, int)
      * @param limit maximum number of instances to return
      * @return list of matching instances
+     * @deprecated As of Ode 1.3, this method is deprecated in favor of 
+     *             listInstancesSummary(filter, order, limit)
      */
     InstanceInfoListDocument listAllInstancesWithLimit(int limit);
 

Modified: ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java (original)
+++ ode/trunk/bpel-api/src/main/java/org/apache/ode/bpel/rapi/ProcessModel.java Wed Mar 11 21:28:36 2009
@@ -24,4 +24,6 @@
     int getModelVersion();
     
     ConstantsModel getConstantsModel();
+    
+    ScopeModel getProcessScope();
 }

Modified: ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java
URL: http://svn.apache.org/viewvc/ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java (original)
+++ ode/trunk/bpel-dao/src/main/java/org/apache/ode/bpel/dao/BpelDAOConnection.java Wed Mar 11 21:28:36 2009
@@ -18,15 +18,17 @@
  */
 package org.apache.ode.bpel.dao;
 
+import java.util.Date;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.namespace.QName;
+
 import org.apache.ode.bpel.common.BpelEventFilter;
 import org.apache.ode.bpel.common.InstanceFilter;
 import org.apache.ode.bpel.evt.BpelEvent;
 
-import javax.xml.namespace.QName;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
 /**
  * Represents the physical resource for connecting to the bpel state store.
  */
@@ -105,6 +107,8 @@
 
     Collection<ProcessInstanceDAO> instanceQuery(String expression);
 
+    Map<Long, Collection<CorrelationSetDAO>> getCorrelationSets(Collection<ProcessInstanceDAO> instances);
+
     ProcessDAO createProcess(QName pid, QName type, String guid, long version);
 
     /**
@@ -121,4 +125,10 @@
     
     void releaseMessageExchange(String mexid);
 
+    /**
+     * Returns an interface for process and instance management.
+     * 
+     * @return a ProcessManagement DAO
+     */
+    ProcessManagementDAO getProcessManagement();
 }

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/BpelDAOConnectionImpl.java Wed Mar 11 21:28:36 2009
@@ -256,4 +256,32 @@
         return result;
     }
 
+    @SuppressWarnings("unchecked")
+    public Map<Long, Collection<CorrelationSetDAO>> getCorrelationSets(Collection<ProcessInstanceDAO> instances) {
+        if (instances.size() == 0) {
+            return new HashMap<Long, Collection<CorrelationSetDAO>>();
+        }
+        Long[] iids = new Long[instances.size()];
+        int i=0;
+        for (ProcessInstanceDAO dao: instances) {
+            iids[i] = dao.getInstanceId();
+            i++;
+        }
+        Collection<HCorrelationSet> csets = _session.getNamedQuery(HCorrelationSet.SELECT_CORSETS_BY_INSTANCES).setParameterList("instances", iids).list();        
+        Map<Long, Collection<CorrelationSetDAO>> map = new HashMap<Long, Collection<CorrelationSetDAO>>();
+        for (HCorrelationSet cset: csets) {
+            Long id = cset.getInstance().getId();
+            Collection<CorrelationSetDAO> existing = map.get(id);
+            if (existing == null) {
+                existing = new ArrayList<CorrelationSetDAO>();
+                map.put(id, existing);
+            }
+            existing.add(new CorrelationSetDaoImpl(_sm, cset));
+        }
+        return map;
+    }
+
+    public ProcessManagementDAO getProcessManagement() {
+        return new ProcessManagementDaoImpl(_sm);
+    }
 }

Modified: ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HCorrelationSet.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HCorrelationSet.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HCorrelationSet.java (original)
+++ ode/trunk/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HCorrelationSet.java Wed Mar 11 21:28:36 2009
@@ -25,8 +25,11 @@
  * Hibernate table representing correlation set values.
  * 
  * @hibernate.class table="BPEL_CORRELATION_SET"
+ * @hibernate.query name="SELECT_CORSETS_BY_INSTANCES" query="from HCorrelationSet as c left join fetch c.properties where c.instance.id in (:instances)"
  */
 public class HCorrelationSet extends HObject {
+	public static final String SELECT_CORSETS_BY_INSTANCES = "SELECT_CORSETS_BY_INSTANCES";
+	  
     private HProcess _process;
     private HProcessInstance _instance;
     private Collection<HCorrelationProperty> _properties = new HashSet<HCorrelationProperty>();

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=752626&r1=752625&r2=752626&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 Wed Mar 11 21:28:36 2009
@@ -28,8 +28,16 @@
  * Hibernate table representing a BPEL process instance.
  * 
  * @hibernate.class table="BPEL_INSTANCE" dynamic-update="true" lazy="true"
+ * @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"
  */
 public class HProcessInstance extends HObject {
+	public static final String SELECT_ACTIVE_INSTANCES="SELECT_ACTIVE_INSTANCES";
+	public static final String DELETE_INSTANCES_BY_PROCESS="DELETE_INSTANCES_BY_PROCESS";
+	public static final String COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID="COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID";
+	public static final String COUNT_INSTANCeS_BY_STATUS_AND_PROCESS_ID="COUNT_INSTANCES_BY_STATUS_AND_PROCESS_ID";
+	
     /** Foreign key to owner {@link HProcess}. */
     private HProcess _process;
 

Modified: ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java (original)
+++ ode/trunk/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ActivityRecoveryDAOImpl.java Wed Mar 11 21:28:36 2009
@@ -20,9 +20,7 @@
 package org.apache.ode.dao.jpa;
 
 
-import org.apache.ode.bpel.dao.ActivityRecoveryDAO;
-import org.apache.ode.utils.DOMUtils;
-import org.w3c.dom.Element;
+import java.util.Date;
 
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
@@ -34,13 +32,26 @@
 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.util.Date;
+
+import org.apache.ode.bpel.dao.ActivityRecoveryDAO;
+import org.apache.ode.utils.DOMUtils;
+import org.w3c.dom.Element;
 
 
 @Entity
 @Table(name="ODE_ACTIVITY_RECOVERY")
+@NamedQueries({
+ 	@NamedQuery(name=ActivityRecoveryDAOImpl.DELETE_ACTIVITY_RECOVERIES_BY_IDS, query="delete from ActivityRecoveryDAOImpl as a where a._instanceId in(:ids)"),
+	@NamedQuery(name=ActivityRecoveryDAOImpl.COUNT_ACTIVITY_RECOVERIES_BY_INSTANCES,
+			query="select r._instanceId, count(r._id) from ActivityRecoveryDAOImpl r where r._instance in(:instances) group by r._instanceId")
+})
 public class ActivityRecoveryDAOImpl implements ActivityRecoveryDAO {
+ 	public final static String DELETE_ACTIVITY_RECOVERIES_BY_IDS = "DELETE_ACTIVITY_RECOVERIES_BY_IDS";
+
+	public final static String COUNT_ACTIVITY_RECOVERIES_BY_INSTANCES = "COUNT_ACTIVITY_RECOVERIES_BY_INSTANCES";
 
     @Id @Column(name="ID")
     @GeneratedValue(strategy= GenerationType.AUTO)

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=752626&r1=752625&r2=752626&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 Wed Mar 11 21:28:36 2009
@@ -24,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -38,9 +39,11 @@
 import org.apache.ode.bpel.common.Filter;
 import org.apache.ode.bpel.common.InstanceFilter;
 import org.apache.ode.bpel.dao.BpelDAOConnection;
+import org.apache.ode.bpel.dao.CorrelationSetDAO;
 import org.apache.ode.bpel.dao.MessageExchangeDAO;
 import org.apache.ode.bpel.dao.ProcessDAO;
 import org.apache.ode.bpel.dao.ProcessInstanceDAO;
+import org.apache.ode.bpel.dao.ProcessManagementDAO;
 import org.apache.ode.bpel.dao.ScopeDAO;
 import org.apache.ode.bpel.evt.BpelEvent;
 import org.apache.ode.bpel.evt.ScopeEvent;
@@ -322,4 +325,31 @@
     public EntityManager getEntityManager() {
         return _em;
     }
+
+    @SuppressWarnings("unchecked")
+    public Map<Long, Collection<CorrelationSetDAO>> getCorrelationSets(Collection<ProcessInstanceDAO> instances) {
+        if (instances.size() == 0) {
+            return new HashMap<Long, Collection<CorrelationSetDAO>>();
+        }
+        ArrayList<Long> iids = new ArrayList<Long>(instances.size());
+        for (ProcessInstanceDAO dao: instances) {
+            iids.add(dao.getInstanceId());
+        }
+        Collection<CorrelationSetDAOImpl> csets = _em.createNamedQuery(CorrelationSetDAOImpl.SELECT_CORRELATION_SETS_BY_INSTANCES).setParameter("instances", iids).getResultList();        
+        Map<Long, Collection<CorrelationSetDAO>> map = new HashMap<Long, Collection<CorrelationSetDAO>>();
+        for (CorrelationSetDAOImpl cset: csets) {
+            Long id = cset.getScope().getProcessInstance().getInstanceId();
+            Collection<CorrelationSetDAO> existing = map.get(id);
+            if (existing == null) {
+                existing = new ArrayList<CorrelationSetDAO>();
+                map.put(id, existing);
+            }
+            existing.add(cset);
+        }
+        return map;
+    }
+
+    public ProcessManagementDAO getProcessManagement() {
+        return new ProcessManagementDAOImpl(_em);
+    }
 }

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=752626&r1=752625&r2=752626&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 Wed Mar 11 21:28:36 2009
@@ -19,9 +19,10 @@
 
 package org.apache.ode.dao.jpa;
 
-import org.apache.ode.bpel.common.CorrelationKey;
-import org.apache.ode.bpel.dao.CorrelationSetDAO;
-import org.apache.ode.bpel.dao.ScopeDAO;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
@@ -32,17 +33,23 @@
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.ManyToOne;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.Table;
 import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
+
+import org.apache.ode.bpel.common.CorrelationKey;
+import org.apache.ode.bpel.dao.CorrelationSetDAO;
+import org.apache.ode.bpel.dao.ScopeDAO;
 
 @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)")	
+})
 public class CorrelationSetDAOImpl implements CorrelationSetDAO {
+    public final static String SELECT_CORRELATION_SETS_BY_INSTANCES = "SELECT_CORRELATION_SETS_BY_INSTANCES";
 
 	@Id @Column(name="CORRELATION_SET_ID") 
 	@GeneratedValue(strategy=GenerationType.AUTO)

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=752626&r1=752625&r2=752626&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 Wed Mar 11 21:28:36 2009
@@ -19,19 +19,12 @@
 
 package org.apache.ode.dao.jpa;
 
-import org.apache.ode.bpel.common.ProcessState;
-import org.apache.ode.bpel.dao.ActivityRecoveryDAO;
-import org.apache.ode.bpel.dao.BpelDAOConnection;
-import org.apache.ode.bpel.dao.CorrelationSetDAO;
-import org.apache.ode.bpel.dao.CorrelatorDAO;
-import org.apache.ode.bpel.dao.FaultDAO;
-import org.apache.ode.bpel.dao.ProcessDAO;
-import org.apache.ode.bpel.dao.ProcessInstanceDAO;
-import org.apache.ode.bpel.dao.ScopeDAO;
-import org.apache.ode.bpel.dao.ScopeStateEnum;
-import org.apache.ode.bpel.dao.XmlDataDAO;
-import org.apache.ode.bpel.evt.ProcessInstanceEvent;
-import org.w3c.dom.Element;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
 import javax.persistence.Basic;
 import javax.persistence.CascadeType;
@@ -47,22 +40,45 @@
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
-import javax.persistence.Query;
 import javax.persistence.Table;
 import javax.xml.namespace.QName;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.ode.bpel.common.ProcessState;
+import org.apache.ode.bpel.dao.ActivityRecoveryDAO;
+import org.apache.ode.bpel.dao.BpelDAOConnection;
+import org.apache.ode.bpel.dao.CorrelationSetDAO;
+import org.apache.ode.bpel.dao.CorrelatorDAO;
+import org.apache.ode.bpel.dao.FaultDAO;
+import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.dao.ProcessInstanceDAO;
+import org.apache.ode.bpel.dao.ScopeDAO;
+import org.apache.ode.bpel.dao.ScopeStateEnum;
+import org.apache.ode.bpel.dao.XmlDataDAO;
+import org.apache.ode.bpel.evt.ProcessInstanceEvent;
+import org.w3c.dom.Element;
 
 @Entity
 @Table(name="ODE_PROCESS_INSTANCE")
 @NamedQueries({
-    @NamedQuery(name="ScopeById", query="SELECT s FROM ScopeDAOImpl as s WHERE s._scopeInstanceId = :sid and s._processInstance = :instance")
-        })
+    @NamedQuery(name="ScopeById", query="SELECT s FROM ScopeDAOImpl as s WHERE s._scopeInstanceId = :sid and s._processInstance = :instance"),
+ 	@NamedQuery(name=ProcessInstanceDAOImpl.DELETE_INSTANCES_BY_PROCESS, query="delete from ProcessInstanceDAOImpl as i where i._process = :process"),
+ 	@NamedQuery(name=ProcessInstanceDAOImpl.SELECT_INSTANCE_IDS_BY_PROCESS, query="select i._instanceId from ProcessInstanceDAOImpl as i where i._process = :process"),
+ 	@NamedQuery(name=ProcessInstanceDAOImpl.SELECT_FAULT_IDS_BY_PROCESS, query="select i._faultId from ProcessInstanceDAOImpl as i where i._process = :process and i._faultId is not null"),
+	@NamedQuery(name=ProcessInstanceDAOImpl.COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID, 
+			query="select count(i._instanceId), max(i._lastRecovery) from ProcessInstanceDAOImpl as i where i._process._processId = :processId and i._state in(:states) and exists(select r from ActivityRecoveryDAOImpl r where i = r._instance)")
+})
+
 public class ProcessInstanceDAOImpl extends OpenJPADAO implements ProcessInstanceDAO {
+	private static final Log __log = LogFactory.getLog(ProcessInstanceDAOImpl.class);
+	
+	public final static String DELETE_INSTANCES_BY_PROCESS = "DELETE_INSTANCES_BY_PROCESS";
+ 	public final static String SELECT_INSTANCE_IDS_BY_PROCESS = "SELECT_INSTANCE_IDS_BY_PROCESS";
+
+ 	public final static String SELECT_FAULT_IDS_BY_PROCESS = "SELECT_FAULT_IDS_BY_PROCESS";
+
+	public final static String COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID = "COUNT_FAILED_INSTANCES_BY_STATUS_AND_PROCESS_ID";
 
     @Id @Column(name="ID")
 	@GeneratedValue(strategy=GenerationType.AUTO)
@@ -98,6 +114,8 @@
 	@ManyToOne(fetch=FetchType.LAZY,cascade={CascadeType.PERSIST}) @Column(name="INSTANTIATING_CORRELATOR_ID")
 	private CorrelatorDAOImpl _instantiatingCorrelator;
 	
+	private transient int _activityFailureCount = -1;
+	
 	public ProcessInstanceDAOImpl() {}
 	public ProcessInstanceDAOImpl(CorrelatorDAOImpl correlator, ProcessDAOImpl process) {
 		_instantiatingCorrelator = correlator;
@@ -124,6 +142,11 @@
 		return ret;
 	}
 
+    @SuppressWarnings("unchecked")
+    public Collection<CorrelationSetDAO> selectCorrelationSets(Collection<ProcessInstanceDAO> instances) {
+	    return getEM().createNamedQuery(CorrelationSetDAOImpl.SELECT_CORRELATION_SETS_BY_INSTANCES).setParameter("instances", instances).getResultList();
+	}
+    
 	public void delete() {
 		if (getEM() != null ) {
 			getEM().remove(this);
@@ -157,7 +180,15 @@
 	}
 
 	public int getActivityFailureCount() {
-		return _recoveries.size();
+		if( _activityFailureCount == -1 ) {
+			_activityFailureCount = _recoveries.size();
+		}
+		
+		return _activityFailureCount;
+	}
+	
+	public void setActivityFailureCount(int activityFailureCount) {
+		_activityFailureCount = activityFailureCount;
 	}
 
 	public Date getActivityFailureDateTime() {

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=752626&r1=752625&r2=752626&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 Wed Mar 11 21:28:36 2009
@@ -19,6 +19,21 @@
 
 package org.apache.ode.bpel.engine;
 
+import java.io.File;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+import javax.xml.namespace.QName;
+
 import org.apache.commons.collections.comparators.ComparatorChain;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -103,9 +118,9 @@
 import org.apache.ode.bpel.pmapi.TVariableInfo;
 import org.apache.ode.bpel.pmapi.TVariableRef;
 import org.apache.ode.bpel.pmapi.VariableInfoDocument;
-import org.apache.ode.bpel.rapi.ProcessModel;
-import org.apache.ode.bpel.rapi.PartnerLinkModel;
 import org.apache.ode.bpel.rapi.ActivityModel;
+import org.apache.ode.bpel.rapi.PartnerLinkModel;
+import org.apache.ode.bpel.rapi.ProcessModel;
 import org.apache.ode.utils.ISO8601DateParser;
 import org.apache.ode.utils.msg.MessageBundle;
 import org.apache.ode.utils.stl.CollectionsX;
@@ -115,20 +130,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
-import javax.xml.namespace.QName;
-import java.io.File;
-import java.text.ParseException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Pattern;
-
 /**
  * Implentation of the Process and InstanceManagement APIs.
  * 
@@ -304,14 +305,46 @@
         return ret;
     }
 
+    public InstanceInfoListDocument listInstancesSummary(String filter, String order, int limit) {
+        InstanceInfoListDocument ret = InstanceInfoListDocument.Factory.newInstance();
+        final TInstanceInfoList infolist = ret.addNewInstanceInfoList();
+        final InstanceFilter instanceFilter = new InstanceFilter(filter, order, limit);
+        try {
+            _db.exec(new BpelDatabase.Callable<Object>() {
+                public Object run(BpelDAOConnection conn) {
+                    Collection<ProcessInstanceDAO> instances = conn.instanceQuery(instanceFilter);
+                    Map<Long, Collection<CorrelationSetDAO>> icsets = conn.getCorrelationSets(instances);
+                    conn.getProcessManagement().prefetchActivityFailureCounts(instances);
+                    for (ProcessInstanceDAO instance : instances) {
+                        TInstanceInfo info = infolist.addNewInstanceInfo();
+                        fillInstanceSummary(info, instance);
+                        Collection<CorrelationSetDAO> csets = icsets.get(instance.getInstanceId());
+                        if (csets != null) {
+                            for (CorrelationSetDAO cset: csets) {
+                                Map<QName, String> props = cset.getProperties();
+                                fillProperties(info, instance, props);
+                            }
+                        }
+                    }
+                    return null;
+                }
+            });
+        } catch (Exception e) {
+            __log.error("Exception while listing instances", e);
+            throw new ProcessingException("Exception while listing instances: " + e.toString());
+        }
+        return ret;
+    }
+
     public InstanceInfoListDocument listAllInstances() {
-        return listInstances(null, null, Integer.MAX_VALUE);
+        return listInstancesSummary(null, null, Integer.MAX_VALUE);
     }
 
     public InstanceInfoListDocument listAllInstancesWithLimit(int limit) {
-        return listInstances(null, null, limit);
+        return listInstancesSummary(null, null, limit);
     }
 
+
     public InstanceInfoDocument getInstanceInfo(Long iid) throws InstanceNotFoundException {
         return genInstanceInfoDocument(iid);
     }
@@ -854,13 +887,22 @@
         });
     }
 
-    private void fillInstanceInfo(TInstanceInfo info, ProcessInstanceDAO instance) {
+    private void fillProperties(TInstanceInfo info, ProcessInstanceDAO instance, Map<QName, String> props) {
+        TInstanceInfo.CorrelationProperties corrProperties = info.addNewCorrelationProperties();
+        for (Map.Entry<QName, String> property : props.entrySet()) {
+            TCorrelationProperty tproperty = corrProperties.addNewCorrelationProperty();
+            // not setting correlation-set id here -- too inconvenient for performance
+            // tproperty.setCsetid("" + cset.getCorrelationSetId());
+            tproperty.setPropertyName(property.getKey());
+            tproperty.setStringValue(property.getValue());
+        }
+    }
+
+    private void fillInstanceSummary(TInstanceInfo info, ProcessInstanceDAO instance) {
         info.setIid("" + instance.getInstanceId());
         ProcessDAO processDAO = instance.getProcess();
         info.setPid(processDAO.getProcessId().toString());
         info.setProcessName(processDAO.getType());
-        if (instance.getRootScope() != null)
-            info.setRootScope(genScopeRef(instance.getRootScope()));
         info.setDtStarted(toCalendar(instance.getCreateTime()));
         info.setDtLastActive(toCalendar(instance.getLastActiveTime()));
         info.setStatus(__psc.cvtInstanceStatus(instance.getState()));
@@ -871,9 +913,26 @@
             faultInfo.setAiid(instance.getFault().getActivityId());
             faultInfo.setLineNumber(instance.getFault().getLineNo());
         }
+        if (instance.getActivityFailureCount() > 0) {
+            TFailuresInfo failures = info.addNewFailures();
+            failures.setDtFailure(toCalendar(instance.getActivityFailureDateTime()));
+            failures.setCount(instance.getActivityFailureCount());
+        }
+    }
+    
+    private void fillInstanceInfo(TInstanceInfo info, ProcessInstanceDAO instance) {
+        fillInstanceSummary(info, instance);
+
+        if (instance.getRootScope() != null)
+            info.setRootScope(genScopeRef(instance.getRootScope()));
 
         ProcessInstanceDAO.EventsFirstLastCountTuple flc = instance.getEventsFirstLastCount();
         TInstanceInfo.EventInfo eventInfo = info.addNewEventInfo();
+        if (flc != null) {
+            eventInfo.setFirstDtime(toCalendar(flc.first));
+            eventInfo.setLastDtime(toCalendar(flc.last));
+            eventInfo.setCount(flc.count);
+        }
 
         // Setting valued correlation properties
         if (!instance.getCorrelationSets().isEmpty()) {
@@ -888,12 +947,6 @@
             }
         }
 
-        if (flc != null) {
-            eventInfo.setFirstDtime(toCalendar(flc.first));
-            eventInfo.setLastDtime(toCalendar(flc.last));
-            eventInfo.setCount(flc.count);
-        }
-
         if (instance.getActivityFailureCount() > 0) {
             TFailuresInfo failures = info.addNewFailures();
             failures.setDtFailure(toCalendar(instance.getActivityFailureDateTime()));

Modified: ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java (original)
+++ ode/trunk/engine/src/main/java/org/apache/ode/bpel/memdao/BpelDAOConnectionImpl.java Wed Mar 11 21:28:36 2009
@@ -41,6 +41,7 @@
 import org.apache.ode.bpel.common.InstanceFilter;
 import org.apache.ode.bpel.common.ProcessFilter;
 import org.apache.ode.bpel.dao.BpelDAOConnection;
+import org.apache.ode.bpel.dao.CorrelationSetDAO;
 import org.apache.ode.bpel.dao.MessageExchangeDAO;
 import org.apache.ode.bpel.dao.ProcessDAO;
 import org.apache.ode.bpel.dao.ProcessInstanceDAO;
@@ -406,4 +407,21 @@
         }
     }
     
+    public Map<Long, Collection<CorrelationSetDAO>> getCorrelationSets(Collection<ProcessInstanceDAO> instances) {
+        Map<Long, Collection<CorrelationSetDAO>> map = new HashMap<Long, Collection<CorrelationSetDAO>>();
+        for (ProcessInstanceDAO instance: instances) {
+            Long id = instance.getInstanceId();
+            Collection<CorrelationSetDAO> existing = map.get(id);
+            if (existing == null) {
+                existing = new ArrayList<CorrelationSetDAO>();
+                map.put(id, existing);
+            }
+            existing.addAll(instance.getCorrelationSets());
+        }
+        return map;
+    }
+
+    public ProcessManagementDaoImpl getProcessManagement() {
+        return new ProcessManagementDaoImpl();
+    }
 }

Modified: ode/trunk/engine/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java
URL: http://svn.apache.org/viewvc/ode/trunk/engine/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java?rev=752626&r1=752625&r2=752626&view=diff
==============================================================================
--- ode/trunk/engine/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java (original)
+++ ode/trunk/engine/src/test/java/org/apache/ode/bpel/runtime/ActivityRecoveryTest.java Wed Mar 11 21:28:36 2009
@@ -305,7 +305,7 @@
     }
 
     protected TInstanceInfo lastInstance() {
-        TInstanceInfoList instances = _management.listAllInstances().getInstanceInfoList();
+        TInstanceInfoList instances = _management.listInstances("", "", 1000).getInstanceInfoList();
         return instances.getInstanceInfoArray(instances.sizeOfInstanceInfoArray() - 1);
     }