Author: rr
Date: Tue Mar 30 18:03:11 2010
New Revision: 929208

URL: http://svn.apache.org/viewvc?rev=929208&view=rev
Log:
ODE-795: Speedup listAllProcesses + test case

Added:
    
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/ProcessManagementDaoTest.java
   (with props)
    ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/
    
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/log4j.properties   
(with props)
Modified:
    ode/branches/APACHE_ODE_1.X/Rakefile
    
ode/branches/APACHE_ODE_1.X/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessManagementDAO.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java
    
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/memdao/ProcessManagementDaoImpl.java
    
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessManagementDaoImpl.java
    
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java
    
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/BaseTestDAO.java
    
ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessManagementDAOImpl.java

Modified: ode/branches/APACHE_ODE_1.X/Rakefile
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/Rakefile?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- ode/branches/APACHE_ODE_1.X/Rakefile (original)
+++ ode/branches/APACHE_ODE_1.X/Rakefile Tue Mar 30 18:03:11 2010
@@ -273,7 +273,7 @@ define "ode" do
     end
     task "compile" => "hbm-hack"
 
-    test.with project("bpel-epr"), BACKPORT, COMMONS.collections, 
COMMONS.lang, HSQLDB,
+    test.with project("bpel-epr"), BACKPORT, COMMONS.collections, 
COMMONS.lang, DERBY, COMMONS.logging, LOG4J, SLF4J,
       GERONIMO.transaction, GERONIMO.kernel, GERONIMO.connector, 
JAVAX.connector, JAVAX.ejb, SPRING
 
     package :jar

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessManagementDAO.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessManagementDAO.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessManagementDAO.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-dao/src/main/java/org/apache/ode/bpel/dao/ProcessManagementDAO.java
 Tue Mar 30 18:03:11 2010
@@ -20,31 +20,83 @@
 package org.apache.ode.bpel.dao;
 
 import java.util.Collection;
+import java.util.Date;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
 
 /**
- * This DAO handles any process and instance management related database 
operations. The idea is to separate out
- * the operational side of database tasks from core engine.
+ * This DAO handles any process and instance management related database
+ * operations. The idea is to separate out the operational side of database
+ * tasks from core engine.
  * 
  * @author sean
- *
+ * 
  */
 public interface ProcessManagementDAO {
-       /**
-        * Finds process instances that have failures on a given process id, 
and, returns the number of failed instances
-        * and the last failed date in an object array.
-        * 
-        * @param conn BpelDAOConnection
-        * @param status the status string, e.g. "active"
-        * @param processId the string representation of the QName of the 
process
-        * @return an array containing the number of failed instances and the 
last failed date
-        */
-       public Object[] 
findFailedCountAndLastFailedDateForProcessId(BpelDAOConnection conn, String 
status, String processId);
-       
-       /**
-        * Prefetches the counts of activity failures for the given instances 
and sets the values to the _activityFailureCount
-        * member variable of the ProcesInstanceDAOImpl.
-        * 
-        * @param instances a collection of process instances
-        */
-       public void 
prefetchActivityFailureCounts(Collection<ProcessInstanceDAO> instances);
+    public static class InstanceSummaryKey {
+        public final String pid;
+        public final String instanceStatus;
+
+        public InstanceSummaryKey(String pid, String instanceStatus) {
+            super();
+            this.pid = pid;
+            this.instanceStatus = instanceStatus;
+        }
+
+        @Override
+        public String toString() {
+            return "InstanceSummaryKey [instanceStatus=" + instanceStatus
+                    + ", pid=" + pid + "]";
+        }
+
+        @Override
+        public int hashCode() {
+            final int prime = 31;
+            int result = 1;
+            result = prime
+                    * result
+                    + ((instanceStatus == null) ? 0 : 
instanceStatus.hashCode());
+            result = prime * result + ((pid == null) ? 0 : pid.hashCode());
+            return result;
+        }
+
+        @Override
+        public boolean equals(Object obj) {
+            if (this == obj)
+                return true;
+            if (obj == null)
+                return false;
+            if (getClass() != obj.getClass())
+                return false;
+            InstanceSummaryKey other = (InstanceSummaryKey) obj;
+            if (instanceStatus == null) {
+                if (other.instanceStatus != null)
+                    return false;
+            } else if (!instanceStatus.equals(other.instanceStatus))
+                return false;
+            if (pid == null) {
+                if (other.pid != null)
+                    return false;
+            } else if (!pid.equals(other.pid))
+                return false;
+            return true;
+        }
+        
+    }
+    
+    public static class FailedSummaryValue {
+        public final Long count;
+        public final Date lastFailed;
+        public FailedSummaryValue(Long count, Date lastFailed) {
+            super();
+            this.count = count;
+            this.lastFailed = lastFailed;
+        }
+    }
+
+    public Map<InstanceSummaryKey, Long> countInstancesSummary(Set<String> 
pids);
+    
+    public Map<String, FailedSummaryValue> 
findFailedCountAndLastFailedDateForProcessIds(Set<String> pids);
 }
\ No newline at end of file

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/engine/ProcessAndInstanceManagementImpl.java
 Tue Mar 30 18:03:11 2010
@@ -28,9 +28,11 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
 import java.util.EnumSet;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Pattern;
 
 import javax.xml.namespace.QName;
@@ -50,6 +52,8 @@ import org.apache.ode.bpel.dao.ProcessDA
 import org.apache.ode.bpel.dao.ProcessInstanceDAO;
 import org.apache.ode.bpel.dao.ScopeDAO;
 import org.apache.ode.bpel.dao.XmlDataDAO;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.FailedSummaryValue;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.InstanceSummaryKey;
 import org.apache.ode.bpel.engine.replayer.Replayer;
 import org.apache.ode.bpel.evt.ActivityEvent;
 import org.apache.ode.bpel.evt.BpelEvent;
@@ -174,14 +178,21 @@ public class ProcessAndInstanceManagemen
         try {
             _db.exec(new BpelDatabase.Callable<Object>() {
                 public Object run(BpelDAOConnection conn) throws Exception {
-                    for (ProcessConf pconf : processQuery(processFilter)) {
+                    Collection<ProcessConf> pconfs = 
processQuery(processFilter);
+                    for (ProcessConf pconf : pconfs) {
                         try {
-                            fillProcessInfo(conn, 
procInfoList.addNewProcessInfo(), pconf, custom);
+                            fillProcessInfo(procInfoList.addNewProcessInfo(), 
pconf, custom);
                         } catch (Exception e) {
                             failIfSQLException(e);
                             __log.error("Exception when querying process " + 
pconf.getProcessId(), e);
                         }
                     }
+                    try {
+                        fillProcessInfoSummary(conn, 
procInfoList.getProcessInfoList(), custom);
+                    } catch (Exception e) {
+                        failIfSQLException(e);
+                        __log.error("Exception fetching instances summary", e);
+                    }
                     return null;
                 }
             });
@@ -270,7 +281,7 @@ public class ProcessAndInstanceManagemen
                     if (proc == null)
                         throw new ProcessNotFoundException("ProcessNotFound:" 
+ pid);
 
-                    fillProcessInfo(conn, pi, proc, new 
ProcessInfoCustomizer(ProcessInfoCustomizer.Item.PROPERTIES));
+                    fillProcessInfo(pi, proc, new 
ProcessInfoCustomizer(ProcessInfoCustomizer.Item.PROPERTIES));
 
                     return null;
                 }
@@ -306,7 +317,7 @@ public class ProcessAndInstanceManagemen
                     if (proc == null)
                         throw new ProcessNotFoundException("ProcessNotFound:" 
+ pid);
 
-                    fillProcessInfo(conn, pi, proc, new 
ProcessInfoCustomizer(ProcessInfoCustomizer.Item.PROPERTIES));
+                    fillProcessInfo(pi, proc, new 
ProcessInfoCustomizer(ProcessInfoCustomizer.Item.PROPERTIES));
 
                     return null;
                 }
@@ -350,7 +361,6 @@ public class ProcessAndInstanceManagemen
                 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);
@@ -691,7 +701,8 @@ public class ProcessAndInstanceManagemen
             ProcessConf pconf = _store.getProcessConfiguration(procid);
             if (pconf == null)
                 throw new ProcessNotFoundException("ProcessNotFound:" + 
procid);
-            fillProcessInfo(conn, pi, pconf, custom);
+            fillProcessInfo(pi, pconf, custom);
+            fillProcessInfoSummary(conn, Collections.singletonList(pi), 
custom);
         } catch (ManagementException me) {
             throw me;
         } catch (Exception e) {
@@ -763,6 +774,29 @@ public class ProcessAndInstanceManagemen
         return ret;
     }
 
+    private void fillProcessInfoSummary(BpelDAOConnection conn, 
List<TProcessInfo> infos, ProcessInfoCustomizer custom) {
+        if (custom.includeInstanceSummary()) {
+            Set<String> pids = new HashSet<String>();
+            for (TProcessInfo i : infos) {
+               pids.add(i.getPid()); 
+            }
+
+            Map<InstanceSummaryKey, Long> m = 
conn.getProcessManagement().countInstancesSummary(pids);
+            Map<String, FailedSummaryValue> f = 
conn.getProcessManagement().findFailedCountAndLastFailedDateForProcessIds(pids);
+            
+            for (TProcessInfo info : infos) {
+                TInstanceSummary isum = info.addNewInstanceSummary();
+                genInstanceSummaryEntry(isum.addNewInstances(), 
TInstanceStatus.ACTIVE, info.getPid(), m);
+                genInstanceSummaryEntry(isum.addNewInstances(), 
TInstanceStatus.COMPLETED, info.getPid(), m);
+                genInstanceSummaryEntry(isum.addNewInstances(), 
TInstanceStatus.ERROR, info.getPid(), m);
+                genInstanceSummaryEntry(isum.addNewInstances(), 
TInstanceStatus.FAILED, info.getPid(), m);
+                genInstanceSummaryEntry(isum.addNewInstances(), 
TInstanceStatus.SUSPENDED, info.getPid(), m);
+                genInstanceSummaryEntry(isum.addNewInstances(), 
TInstanceStatus.TERMINATED, info.getPid(), m);
+                getInstanceSummaryActivityFailure(isum, f, info.getPid());
+            }
+        }
+    }
+    
     /**
      * Fill in the <code>process-info</code> element of the transfer object.
      *
@@ -776,7 +810,7 @@ public class ProcessAndInstanceManagemen
      *            used to customize the quantity of information produced in the
      *            info
      */
-    private void fillProcessInfo(BpelDAOConnection conn, TProcessInfo info, 
ProcessConf pconf, ProcessInfoCustomizer custom) {
+    private void fillProcessInfo(TProcessInfo info, ProcessConf pconf, 
ProcessInfoCustomizer custom) {
         if (pconf == null)
             throw new IllegalArgumentException("Null pconf.");
 
@@ -801,16 +835,6 @@ public class ProcessAndInstanceManagemen
         depinfo.setDocument(pconf.getBpelDocument());
         depinfo.setDeployDate(toCalendar(pconf.getDeployDate()));
         depinfo.setDeployer(pconf.getDeployer());
-        if (custom.includeInstanceSummary()) {
-            TInstanceSummary isum = info.addNewInstanceSummary();
-            genInstanceSummaryEntry(conn, isum.addNewInstances(), 
TInstanceStatus.ACTIVE, pconf);
-            genInstanceSummaryEntry(conn, isum.addNewInstances(), 
TInstanceStatus.COMPLETED, pconf);
-            genInstanceSummaryEntry(conn, isum.addNewInstances(), 
TInstanceStatus.ERROR, pconf);
-            genInstanceSummaryEntry(conn, isum.addNewInstances(), 
TInstanceStatus.FAILED, pconf);
-            genInstanceSummaryEntry(conn, isum.addNewInstances(), 
TInstanceStatus.SUSPENDED, pconf);
-            genInstanceSummaryEntry(conn, isum.addNewInstances(), 
TInstanceStatus.TERMINATED, pconf);
-            getInstanceSummaryActivityFailure(conn, isum, pconf);
-        }
 
         TProcessInfo.Documents docinfo = info.addNewDocuments();
         List<File> files = pconf.getFiles();
@@ -851,7 +875,19 @@ public class ProcessAndInstanceManagemen
 
         // TODO: add documents to the above data structure.
     }
-
+    
+    String findVersionStringFromNodeToken(String packageName) {
+       int i = packageName.length() - 1;
+       while( i > 0 && Character.isDigit(packageName.charAt(i)) ) {
+               i--;
+       }
+       if( i < packageName.length() - 1 && packageName.charAt(i) == '-') {
+               return packageName.substring(i + 1);
+       }
+       
+       return null;
+    }
+        
     /**
      * Generate document information elements for a set of files.
      *
@@ -889,29 +925,20 @@ public class ProcessAndInstanceManagemen
         }
     }
 
-    private void genInstanceSummaryEntry(BpelDAOConnection conn, 
TInstanceSummary.Instances instances,
-                                         TInstanceStatus.Enum state, 
ProcessConf pconf)
+    private void genInstanceSummaryEntry(TInstanceSummary.Instances instances,
+                                         TInstanceStatus.Enum state, String 
pid, Map<InstanceSummaryKey, Long> summary)
     {
         instances.setState(state);
-        String queryStatus = 
InstanceFilter.StatusKeys.valueOf(state.toString()).toString().toLowerCase();
-        InstanceFilter instanceFilter = new InstanceFilter("status=" + 
queryStatus + " pid="+ pconf.getProcessId());
+        Long count = summary.get(new InstanceSummaryKey(pid, 
state.toString())); 
+        instances.setCount(count == null ? 0 : count.intValue());
+    }
 
-        // TODO: this is grossly inefficient
-        int count = conn.instanceQuery(instanceFilter).size();
-        instances.setCount(count);
-    }
-
-    private void getInstanceSummaryActivityFailure(BpelDAOConnection conn, 
TInstanceSummary summary, ProcessConf pconf) {
-        String queryStatus = 
InstanceFilter.StatusKeys.valueOf(TInstanceStatus.ACTIVE.toString()).toString().toLowerCase();
-        Object[] results = 
conn.getProcessManagement().findFailedCountAndLastFailedDateForProcessId(
-                conn, queryStatus, String.valueOf(pconf.getProcessId()));
-
-        long failureInstances = (Long)results[0];
-        Date lastFailureDt = (Date)results[1];
-        if (failureInstances > 0) {
+    private void getInstanceSummaryActivityFailure(TInstanceSummary summary, 
Map<String, FailedSummaryValue> f, String pid) {
+        FailedSummaryValue v = f.get(pid);
+        if (v != null) {
             TFailuresInfo failures = summary.addNewFailures();
-            failures.setDtFailure(toCalendar(lastFailureDt));
-            failures.setCount((int)failureInstances);
+            failures.setDtFailure(toCalendar(v.lastFailed));
+            failures.setCount(v.count.intValue());
         }
     }
 

Modified: 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/memdao/ProcessManagementDaoImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/memdao/ProcessManagementDaoImpl.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/memdao/ProcessManagementDaoImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/bpel-runtime/src/main/java/org/apache/ode/bpel/memdao/ProcessManagementDaoImpl.java
 Tue Mar 30 18:03:11 2010
@@ -21,11 +21,16 @@ package org.apache.ode.bpel.memdao;
 
 import java.util.Collection;
 import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import javax.xml.namespace.QName;
 
 import org.apache.ode.bpel.common.InstanceFilter;
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.ProcessInstanceDAO;
 import org.apache.ode.bpel.dao.ProcessManagementDAO;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.InstanceSummaryKey;
 
 public class ProcessManagementDaoImpl extends DaoBaseImpl implements 
ProcessManagementDAO {
        public Object[] 
findFailedCountAndLastFailedDateForProcessId(BpelDAOConnection conn, String 
status, String processId) {
@@ -49,4 +54,19 @@ public class ProcessManagementDaoImpl ex
        public void 
prefetchActivityFailureCounts(Collection<ProcessInstanceDAO> instances) {
                // do nothing 
        }
+
+    public int countInstancesByPidAndString(BpelDAOConnection conn, QName pid, 
String status) {
+        InstanceFilter instanceFilter = new InstanceFilter("status=" + status 
+ " pid="+ pid);
+
+        // TODO: this is grossly inefficient
+        return conn.instanceQuery(instanceFilter).size();
+    }
+    
+    public Map<InstanceSummaryKey, Long> countInstancesSummary(Set<String> 
pids) {
+        return new HashMap<InstanceSummaryKey, Long>();
+    }
+
+    public Map<String, FailedSummaryValue> 
findFailedCountAndLastFailedDateForProcessIds(Set<String> pids) {
+        return new HashMap<String, FailedSummaryValue>();
+    }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessManagementDaoImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessManagementDaoImpl.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessManagementDaoImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/ProcessManagementDaoImpl.java
 Tue Mar 30 18:03:11 2010
@@ -19,50 +19,46 @@
 
 package org.apache.ode.daohib.bpel;
 
-import java.util.Collection;
-import java.util.List;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
 import org.apache.ode.bpel.common.InstanceFilter;
-import org.apache.ode.bpel.dao.BpelDAOConnection;
-import org.apache.ode.bpel.dao.ProcessInstanceDAO;
+import org.apache.ode.bpel.common.InstanceFilter.StatusKeys;
 import org.apache.ode.bpel.dao.ProcessManagementDAO;
 import org.apache.ode.daohib.SessionManager;
 import org.apache.ode.daohib.bpel.hobj.HProcessInstance;
 import org.hibernate.Query;
-import org.hibernate.transform.ResultTransformer;
 
 public class ProcessManagementDaoImpl extends HibernateDao implements 
ProcessManagementDAO {
     protected ProcessManagementDaoImpl(SessionManager sessionManager) {
         super(sessionManager, null);
     }
 
-    @SuppressWarnings("unchecked")
-    public Object[] 
findFailedCountAndLastFailedDateForProcessId(BpelDAOConnection conn, String 
status, String processId) {
-        Object[] results = new Object[] {0, null};
-        
-        Query query = 
getSession().getNamedQuery(HProcessInstance.COUNT_FAILED_INSTANCES_BY_PROCESS_IDS_AND_STATES);
-        query.setParameterList("states", new InstanceFilter("status=" + 
status).convertFilterState());
-        query.setParameterList("processIds", new String[] {processId});
-        query.setResultTransformer(new ResultTransformer() {
-            private static final long serialVersionUID = 8034301512569916379L;
-
-            public List transformList(List collection) {
-                return collection;
-            }
-            public Object transformTuple(Object[] tuple, String[] aliases) {
-                return tuple;
+    public Map<InstanceSummaryKey, Long> countInstancesSummary(Set<String> 
pids) {
+        Map<InstanceSummaryKey, Long> result = new HashMap<InstanceSummaryKey, 
Long>();
+        for (StatusKeys status : InstanceFilter.StatusKeys.values()) {
+            Query query = 
getSession().getNamedQuery(HProcessInstance.COUNT_INSTANCES_BY_PROCESSES_IDS_AND_STATES);
+            query.setParameterList("states", new InstanceFilter("status=" + 
status.toString()).convertFilterState());
+            query.setParameterList("processIds", pids);
+            for (Object o : query.list()) {
+                Object[] row = (Object[]) o;
+                InstanceSummaryKey key = new 
InstanceSummaryKey(row[0].toString(), status.toString());
+                result.put(key, (Long) row[1]);
             }
-        });
-        
-        List result = query.list();
-        if( !result.isEmpty() ) {
-            results = (Object[])result.iterator().next();
         }
-        
-        return results;
+        return result;
     }
     
-    public void prefetchActivityFailureCounts(Collection<ProcessInstanceDAO> 
instances) {
-        // do nothing; activity failures counts are already in a column 
+    public Map<String, FailedSummaryValue> 
findFailedCountAndLastFailedDateForProcessIds(Set<String> pids) {
+        Map<String, FailedSummaryValue> result = new HashMap<String, 
FailedSummaryValue>();
+        Query query = 
getSession().getNamedQuery(HProcessInstance.COUNT_FAILED_INSTANCES_BY_PROCESSES_IDS_AND_STATES);
+        query.setParameterList("processIds", pids);
+        for (Object o : query.list()) {
+            Object[] row = (Object[]) o;
+            result.put(row[0].toString(), new FailedSummaryValue((Long) 
row[1], (Date) row[2]));
+        }
+        return result;
     }
 }

Modified: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/main/java/org/apache/ode/daohib/bpel/hobj/HProcessInstance.java
 Tue Mar 30 18:03:11 2010
@@ -28,14 +28,16 @@ import java.util.Set;
  * Hibernate table representing a BPEL process instance.
  * 
  * @hibernate.class table="BPEL_INSTANCE" dynamic-update="true" lazy="true"
- * @hibernate.query name="COUNT_FAILED_INSTANCES_BY_PROCESS_IDS_AND_STATES" 
query="select count(i.id) as cnt, max(i.activityFailureDateTime) as 
lastFailureDt from HProcessInstance as i where i.process.processId in 
(:processIds) and i.state in(:states) and i.activityFailureCount > 0"
+ * @hibernate.query name="COUNT_FAILED_INSTANCES_BY_PROCESSES_IDS_AND_STATES" 
query="select i.process.processId as pid, count(i.id) as cnt, 
max(i.activityFailureDateTime) as lastFailureDt from HProcessInstance as i 
where i.process.processId in (:processIds) and i.state = 20 and 
i.activityFailureCount > 0 group by i.process.processId"
  * @hibernate.query name="SELECT_INSTANCES_BY_PROCESS" query="from 
HProcessInstance as i where i.process = :process)"
  * @hibernate.query name="SELECT_INSTANCES_BY_PROCESS_AND_STATES" query="from 
HProcessInstance as i where i.process = :process and i.state in (:states)"
+ * @hibernate.query name="COUNT_INSTANCES_BY_PROCESSES_IDS_AND_STATES" 
query="select i.process.processId as pid, count(i.id) as cnt from 
HProcessInstance as i where i.process.processId in (:processIds) and i.state 
in(:states) group by i.process.processId"
  */
 public class HProcessInstance extends HObject {
-    public static final String 
COUNT_FAILED_INSTANCES_BY_PROCESS_IDS_AND_STATES="COUNT_FAILED_INSTANCES_BY_PROCESS_IDS_AND_STATES";
+    public static final String 
COUNT_FAILED_INSTANCES_BY_PROCESSES_IDS_AND_STATES="COUNT_FAILED_INSTANCES_BY_PROCESSES_IDS_AND_STATES";
     public static final String 
SELECT_INSTANCES_BY_PROCESS="SELECT_INSTANCES_BY_PROCESS";
     public static final String 
SELECT_INSTANCES_BY_PROCESS_AND_STATES="SELECT_INSTANCES_BY_PROCESS_AND_STATES";
+    public static final String COUNT_INSTANCES_BY_PROCESSES_IDS_AND_STATES = 
"COUNT_INSTANCES_BY_PROCESSES_IDS_AND_STATES";
 
        /** Foreign key to owner {...@link HProcess}. */
     private HProcess _process;

Modified: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/BaseTestDAO.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/BaseTestDAO.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/BaseTestDAO.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/BaseTestDAO.java
 Tue Mar 30 18:03:11 2010
@@ -19,15 +19,15 @@
 
 package org.apache.ode.daohib.bpel;
 
+import javax.resource.spi.ConnectionManager;
 import javax.sql.DataSource;
 import javax.transaction.TransactionManager;
 
 import junit.framework.TestCase;
 
+import org.apache.derby.jdbc.EmbeddedXADataSource;
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.il.EmbeddedGeronimoFactory;
-import org.apache.ode.utils.GUID;
-import org.hsqldb.jdbc.jdbcDataSource;
 import org.hibernate.cfg.Environment;
 
 import java.util.Properties;
@@ -41,11 +41,13 @@ import java.util.Properties;
 public abstract class BaseTestDAO extends TestCase {
 
     protected BpelDAOConnection daoConn;
-    private TransactionManager txm;
+    protected TransactionManager txm;
+    protected ConnectionManager connectionManager;
     private DataSource ds;
 
     protected void initTM() throws Exception {
         EmbeddedGeronimoFactory factory = new EmbeddedGeronimoFactory();
+        connectionManager = new 
org.apache.geronimo.connector.outbound.GenericConnectionManager();
         txm = factory.getTransactionManager();
         ds = getDataSource();
         txm.begin();
@@ -66,11 +68,12 @@ public abstract class BaseTestDAO extend
 
     protected DataSource getDataSource() {
         if (ds == null) {
-            jdbcDataSource hsqlds = new jdbcDataSource();
-            hsqlds.setDatabase("jdbc:hsqldb:mem:" + new GUID().toString());
-            hsqlds.setUser("sa");
-            hsqlds.setPassword("");
-            ds = hsqlds;
+            EmbeddedXADataSource ds = new EmbeddedXADataSource();
+            ds.setCreateDatabase("create");
+            ds.setDatabaseName("target/testdb");
+            ds.setUser("sa");
+            ds.setPassword("");
+            this.ds = ds;
         }
         return ds;
     }

Added: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/ProcessManagementDaoTest.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/ProcessManagementDaoTest.java?rev=929208&view=auto
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/ProcessManagementDaoTest.java
 (added)
+++ 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/ProcessManagementDaoTest.java
 Tue Mar 30 18:03:11 2010
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.ode.daohib.bpel;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import javax.xml.namespace.QName;
+
+import org.apache.ode.bpel.common.InstanceFilter;
+import org.apache.ode.bpel.common.ProcessState;
+import org.apache.ode.bpel.dao.ProcessDAO;
+import org.apache.ode.bpel.dao.ProcessInstanceDAO;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.FailedSummaryValue;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.InstanceSummaryKey;
+
+/**
+ * Testing BpelDAOConnectionImpl.listInstance. We're just producing a lot of
+ * different filter combinations and test if they execute ok. To really test
+ * that the result is the one expected would take a huge test database (with at
+ * least a process and an instance for every possible combination).
+ */
+public class ProcessManagementDaoTest extends BaseTestDAO {
+
+    protected void setUp() throws Exception {
+        initTM();
+    }
+
+    protected void tearDown() throws Exception {
+        stopTM();
+    }
+
+    public void testInstanceSummary() throws Exception {
+        Set<String> pids = new HashSet<String>();
+        QName pid = QName.valueOf("{ns}pid");
+        pids.add(pid.toString());
+        ProcessDAO p = daoConn.createProcess(pid, QName.valueOf("{ns}type"), 
"abc", 1);
+        ProcessInstanceDAO i = p.createInstance(p.addCorrelator("cor"));
+        i.setState(ProcessState.STATE_COMPLETED_OK);
+        Map<InstanceSummaryKey, Long> r = 
daoConn.getProcessManagement().countInstancesSummary(pids);
+        System.out.println("resultSummary:" + r);
+        assertEquals(1, r.size());
+    }
+
+    public void testInstanceSummaryFailures() throws Exception {
+        Set<String> pids = new HashSet<String>();
+        QName pid = QName.valueOf("{ns}pid");
+        pids.add(pid.toString());
+        ProcessDAO p = daoConn.createProcess(pid, QName.valueOf("{ns}type"), 
"abc", 1);
+        ProcessInstanceDAO i = p.createInstance(p.addCorrelator("cor"));
+        Map<String, FailedSummaryValue> r = 
daoConn.getProcessManagement().findFailedCountAndLastFailedDateForProcessIds(pids);
+        System.out.println("resultSummary:" + r);
+        assertEquals(0, r.size());
+    }
+}

Propchange: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/java/org/apache/ode/daohib/bpel/ProcessManagementDaoTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/log4j.properties
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/log4j.properties?rev=929208&view=auto
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/log4j.properties 
(added)
+++ 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/log4j.properties 
Tue Mar 30 18:03:11 2010
@@ -0,0 +1,33 @@
+# 
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing, software
+# distributed  under the  License is distributed on an "AS IS" BASIS,
+# WITHOUT  WARRANTIES OR CONDITIONS  OF ANY KIND, either  express  or
+# implied.
+#  
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+#
+
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=DEBUG, file
+#log4j.rootLogger=INFO, file
+
+log4j.appender.file=org.apache.log4j.FileAppender
+log4j.appender.file.File=target/test/test.log
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.conversionpattern=%d{mm...@hh:mm:ss} %-5p (%13F:%L) 
%3x - %m%n 
+
+log4j.category.org.apache.ode=DEBUG
+

Propchange: 
ode/branches/APACHE_ODE_1.X/dao-hibernate/src/test/resources/log4j.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessManagementDAOImpl.java
URL: 
http://svn.apache.org/viewvc/ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessManagementDAOImpl.java?rev=929208&r1=929207&r2=929208&view=diff
==============================================================================
--- 
ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessManagementDAOImpl.java
 (original)
+++ 
ode/branches/APACHE_ODE_1.X/dao-jpa/src/main/java/org/apache/ode/dao/jpa/ProcessManagementDAOImpl.java
 Tue Mar 30 18:03:11 2010
@@ -22,6 +22,8 @@ package org.apache.ode.dao.jpa;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
+import javax.xml.namespace.QName;
 
 import javax.persistence.EntityManager;
 import javax.persistence.Query;
@@ -32,6 +34,8 @@ import org.apache.ode.bpel.common.Instan
 import org.apache.ode.bpel.dao.BpelDAOConnection;
 import org.apache.ode.bpel.dao.ProcessInstanceDAO;
 import org.apache.ode.bpel.dao.ProcessManagementDAO;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.FailedSummaryValue;
+import org.apache.ode.bpel.dao.ProcessManagementDAO.InstanceSummaryKey;
 
 public class ProcessManagementDAOImpl implements ProcessManagementDAO {
        private static final Log __log = 
LogFactory.getLog(ProcessManagementDAOImpl.class);
@@ -72,4 +76,19 @@ public class ProcessManagementDAOImpl im
                        }
                }
        }
+
+    public int countInstancesByPidAndString(BpelDAOConnection conn, QName pid, 
String status) {
+        InstanceFilter instanceFilter = new InstanceFilter("status=" + status 
+ " pid="+ pid);
+
+        // TODO: this is grossly inefficient
+        return conn.instanceQuery(instanceFilter).size();
+    }
+    
+    public Map<InstanceSummaryKey, Long> countInstancesSummary(Set<String> 
pids) {
+        return new HashMap<InstanceSummaryKey, Long>();
+    }
+    
+    public Map<String, FailedSummaryValue> 
findFailedCountAndLastFailedDateForProcessIds(Set<String> pids) {
+        return new HashMap<String, FailedSummaryValue>();
+    }
 }


Reply via email to