You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ba...@apache.org on 2009/02/25 11:01:32 UTC

svn commit: r747724 - in /commons/proper/dbutils/trunk: ./ src/java/org/apache/commons/dbutils/ src/java/org/apache/commons/dbutils/handlers/ src/test/org/apache/commons/dbutils/

Author: bayard
Date: Wed Feb 25 10:01:31 2009
New Revision: 747724

URL: http://svn.apache.org/viewvc?rev=747724&view=rev
Log:
Merging in Dab Fabulich's work on https://svn.apache.org/repos/asf/commons/sandbox/dbutils/bugfixing from -r741987:747723. Resolving DBUTILS-34 - DBUTILS-37 - DBUTILS-29 - DBUTILS-14 - DBUTILS-31 - DBUTILS-39 - DBUTILS-41 - DBUTILS-44 - DBUTILS-33 - DBUTILS-42 - DBUTILS-40

Added:
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/AbstractListHandler.java
      - copied unchanged from r747723, commons/sandbox/dbutils/bugfixing/src/java/org/apache/commons/dbutils/handlers/AbstractListHandler.java
    commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/QueryRunnerTest.java
      - copied unchanged from r747723, commons/sandbox/dbutils/bugfixing/src/test/org/apache/commons/dbutils/QueryRunnerTest.java
Removed:
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/GenericListHandler.java
Modified:
    commons/proper/dbutils/trunk/pom.xml
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BasicRowProcessor.java
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BeanProcessor.java
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/QueryRunner.java
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ArrayListHandler.java
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ColumnListHandler.java
    commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/MapListHandler.java
    commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/BaseTestCase.java

Modified: commons/proper/dbutils/trunk/pom.xml
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/pom.xml?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/pom.xml (original)
+++ commons/proper/dbutils/trunk/pom.xml Wed Feb 25 10:01:31 2009
@@ -233,6 +233,25 @@
             <enableRulesSummary>false</enableRulesSummary>
           </configuration>
         </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>findbugs-maven-plugin</artifactId>
+          <version>1.2</version>
+          <configuration>
+            <threshold>Normal</threshold>
+            <effort>Default</effort>
+         </configuration>
+        </plugin>
+        <plugin>
+          <groupId>org.codehaus.mojo</groupId>
+          <artifactId>cobertura-maven-plugin</artifactId>
+          <version>2.2</version>
+        </plugin>
+        <plugin>
+          <groupId>org.apache.maven.plugins</groupId>
+          <artifactId>maven-pmd-plugin</artifactId>
+          <version>2.3</version>
+        </plugin>
       </plugins>
     </reporting>
 

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BasicRowProcessor.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BasicRowProcessor.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BasicRowProcessor.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BasicRowProcessor.java Wed Feb 25 10:01:31 2009
@@ -144,10 +144,36 @@
      * A Map that converts all keys to lowercase Strings for case insensitive
      * lookups.  This is needed for the toMap() implementation because 
      * databases don't consistenly handle the casing of column names. 
+     * 
+     * <p>The keys are stored as they are given [BUG #DBUTILS-34], so we maintain
+     * an internal mapping from lowercase keys to the real keys in order to 
+     * achieve the case insensitive lookup.
+     * 
+     * <p>Note: This implementation does not allow <tt>null</tt>
+     * for key, whereas {@link HashMap} does, because of the code:
+     * <pre>
+     * key.toString().toLowerCase()
+     * </pre>
      */
     private static class CaseInsensitiveHashMap extends HashMap {
 
         /**
+         * The internal mapping from lowercase keys to the real keys.
+         * 
+         * <p>
+         * Any query operation using the key 
+         * ({@link #get(Object)}, {@link #containsKey(Object)})
+         * is done in three steps:
+         * <ul>
+         * <li>convert the parameter key to lower case</li>
+         * <li>get the actual key that corresponds to the lower case key</li>
+         * <li>query the map with the actual key</li>
+         * </ul>
+         * </p>
+         */
+        private final Map lowerCaseMap = new HashMap();
+
+        /**
          * Required for serialization support.
          * 
          * @see java.io.Serializable
@@ -158,31 +184,48 @@
          * @see java.util.Map#containsKey(java.lang.Object)
          */
         public boolean containsKey(Object key) {
-            return super.containsKey(key.toString().toLowerCase());
+            Object realKey = lowerCaseMap.get(key.toString().toLowerCase());
+            return super.containsKey(realKey);
+            // Possible optimisation here:
+            // Since the lowerCaseMap contains a mapping for all the keys,
+            // we could just do this:
+            // return lowerCaseMap.containsKey(key.toString().toLowerCase());
         }
 
         /**
          * @see java.util.Map#get(java.lang.Object)
          */
         public Object get(Object key) {
-            return super.get(key.toString().toLowerCase());
+            Object realKey = lowerCaseMap.get(key.toString().toLowerCase());
+            return super.get(realKey);
         }
 
         /**
          * @see java.util.Map#put(java.lang.Object, java.lang.Object)
          */
         public Object put(Object key, Object value) {
-            return super.put(key.toString().toLowerCase(), value);
+            /*
+             * In order to keep the map and lowerCaseMap synchronized,
+             * we have to remove the old mapping before putting the 
+             * new one. Indeed, oldKey and key are not necessaliry equals.
+             * (That's why we call super.remove(oldKey) and not just
+             * super.put(key, value))
+             */
+            Object oldKey = lowerCaseMap.put(key.toString().toLowerCase(), key);
+            Object oldValue = super.remove(oldKey);
+            super.put(key, value);
+            return oldValue;
         }
 
         /**
          * @see java.util.Map#putAll(java.util.Map)
          */
         public void putAll(Map m) {
-            Iterator iter = m.keySet().iterator();
+            Iterator iter = m.entrySet().iterator();
             while (iter.hasNext()) {
-                Object key = iter.next();
-                Object value = m.get(key);
+                Map.Entry entry = (Map.Entry) iter.next();
+                Object key = entry.getKey();
+                Object value = entry.getValue();
                 this.put(key, value);
             }
         }
@@ -191,7 +234,8 @@
          * @see java.util.Map#remove(java.lang.Object)
          */
         public Object remove(Object key) {
-            return super.remove(key.toString().toLowerCase());
+            Object realKey = lowerCaseMap.remove(key.toString().toLowerCase());
+            return super.remove(realKey);
         }
     }
     

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BeanProcessor.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BeanProcessor.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BeanProcessor.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/BeanProcessor.java Wed Feb 25 10:01:31 2009
@@ -432,7 +432,11 @@
      */
     protected Object processColumn(ResultSet rs, int index, Class propType)
         throws SQLException {
-
+    	
+    	if ( !propType.isPrimitive() && rs.getObject(index) == null ) {
+    		return null;
+    	}
+    	
         if (propType.equals(String.class)) {
             return rs.getString(index);
             

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/QueryRunner.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/QueryRunner.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/QueryRunner.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/QueryRunner.java Wed Feb 25 10:01:31 2009
@@ -16,7 +16,13 @@
  */
 package org.apache.commons.dbutils;
 
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.sql.Connection;
+import java.sql.ParameterMetaData;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -35,6 +41,11 @@
 public class QueryRunner {
 
     /**
+     * Is {@link ParameterMetaData#getParameterType(int)} broken (have we tried it yet)?
+     */
+    private volatile boolean pmdKnownBroken = false;
+    
+    /**
      * The DataSource to retrieve connections from.
      */
     protected DataSource ds = null;
@@ -47,7 +58,18 @@
     }
 
     /**
-     * Constructor for QueryRunner.  Methods that do not take a 
+     * Constructor for QueryRunner, allows workaround for Oracle drivers
+     * @param pmdKnownBroken Oracle drivers don't support {@link ParameterMetaData#getParameterType(int) };
+     * if <code>pmdKnownBroken</code> is set to true, we won't even try it; if false, we'll try it,
+     * and if it breaks, we'll remember not to use it again.
+     */
+    public QueryRunner(boolean pmdKnownBroken) {
+        super();
+        this.pmdKnownBroken = pmdKnownBroken; 
+    }
+    
+    /**
+     * Constructor for QueryRunner, allows workaround for Oracle drivers.  Methods that do not take a 
      * <code>Connection</code> parameter will retrieve connections from this
      * <code>DataSource</code>.
      * 
@@ -59,6 +81,22 @@
     }
     
     /**
+     * Constructor for QueryRunner, allows workaround for Oracle drivers.  Methods that do not take a 
+     * <code>Connection</code> parameter will retrieve connections from this
+     * <code>DataSource</code>.
+     * 
+     * @param ds The <code>DataSource</code> to retrieve connections from.
+     * @param pmdKnownBroken Oracle drivers don't support {@link ParameterMetaData#getParameterType(int) };
+     * if <code>pmdKnownBroken</code> is set to true, we won't even try it; if false, we'll try it,
+     * and if it breaks, we'll remember not to use it again.
+     */
+    public QueryRunner(DataSource ds, boolean pmdKnownBroken) {
+        super();
+        this.pmdKnownBroken = pmdKnownBroken;
+        setDataSource(ds);
+    }
+    
+    /**
      * Execute a batch of SQL INSERT, UPDATE, or DELETE queries.
      * 
      * @param conn The Connection to use to run the query.  The caller is
@@ -124,13 +162,18 @@
      * value to pass in.
      * @throws SQLException if a database access error occurs
      */
-    protected void fillStatement(PreparedStatement stmt, Object[] params)
+    public void fillStatement(PreparedStatement stmt, Object[] params)
         throws SQLException {
 
         if (params == null) {
             return;
         }
-
+        
+        ParameterMetaData pmd = stmt.getParameterMetaData();
+        if (pmd.getParameterCount() < params.length) {
+            throw new SQLException("Too many parameters: expected "
+                    + pmd.getParameterCount() + ", was given " + params.length);
+        }
         for (int i = 0; i < params.length; i++) {
             if (params[i] != null) {
                 stmt.setObject(i + 1, params[i]);
@@ -138,12 +181,103 @@
                 // VARCHAR works with many drivers regardless
                 // of the actual column type.  Oddly, NULL and 
                 // OTHER don't work with Oracle's drivers.
-                stmt.setNull(i + 1, Types.VARCHAR);
+                int sqlType = Types.VARCHAR;
+                if (!pmdKnownBroken) {
+                    try {
+                        sqlType = pmd.getParameterType(i + 1);
+                    } catch (SQLException e) {
+                        pmdKnownBroken = true;
+                    }
+                }
+                stmt.setNull(i + 1, sqlType);
             }
         }
     }
 
     /**
+     * Fill the <code>PreparedStatement</code> replacement parameters with the
+     * given object's bean property values.
+     * 
+     * @param stmt
+     *            PreparedStatement to fill
+     * @param bean
+     *            a JavaBean object
+     * @param properties
+     *            an ordered array of properties; this gives the order to insert
+     *            values in the statement
+     * @throws SQLException
+     *             if a database access error occurs
+     */
+    public void fillStatementWithBean(PreparedStatement stmt, Object bean,
+            PropertyDescriptor[] properties) throws SQLException {
+        Object[] params = new Object[properties.length];
+        for (int i = 0; i < properties.length; i++) {
+            PropertyDescriptor property = properties[i];
+            Object value = null;
+            Method method = property.getReadMethod();
+            if (method == null)
+                throw new RuntimeException("No read method for bean property "
+                        + bean.getClass() + " " + property.getName());
+            try {
+                value = method.invoke(bean, new Object[0]);
+            } catch (InvocationTargetException e) {
+                throw new RuntimeException("Couldn't invoke method: " + method, e);
+            } catch (IllegalArgumentException e) {
+                throw new RuntimeException("Couldn't invoke method with 0 arguments: " + method, e);
+            } catch (IllegalAccessException e) {
+                throw new RuntimeException("Couldn't invoke method: " + method, e);
+            } 
+            params[i] = value;
+        }
+        fillStatement(stmt, params);
+    }
+
+    /**
+     * Fill the <code>PreparedStatement</code> replacement parameters with the
+     * given object's bean property values.
+     * 
+     * @param stmt
+     *            PreparedStatement to fill
+     * @param bean
+     *            a JavaBean object
+     * @param propertyNames
+     *            an ordered array of property names (these should match the
+     *            getters/setters); this gives the order to insert values in the
+     *            statement
+     * @throws SQLException
+     *             if a database access error occurs
+     */
+    public void fillStatementWithBean(PreparedStatement stmt, Object bean,
+            String[] propertyNames) throws SQLException {
+        PropertyDescriptor[] descriptors;
+        try {
+            descriptors = Introspector.getBeanInfo(bean.getClass())
+                    .getPropertyDescriptors();
+        } catch (IntrospectionException e) {
+            throw new RuntimeException("Couldn't introspect bean " + bean.getClass().toString(), e);
+        }
+        PropertyDescriptor[] sorted = new PropertyDescriptor[propertyNames.length];
+        for (int i = 0; i < propertyNames.length; i++) {
+            String propertyName = propertyNames[i];
+            if (propertyName == null)
+                throw new NullPointerException("propertyName can't be null: " + i);
+            boolean found = false;
+            for (int j = 0; j < descriptors.length; j++) {
+                PropertyDescriptor descriptor = descriptors[j];
+                if (propertyName.equals(descriptor.getName())) {
+                    sorted[i] = descriptor;
+                    found = true;
+                    break;
+                }
+            }
+            if (!found)
+                throw new RuntimeException("Couldn't find bean property: "
+                        + bean.getClass() + " " + propertyName);
+        }
+        fillStatementWithBean(stmt, bean, sorted);
+    }
+
+    /**
      * Returns the <code>DataSource</code> this runner is using.  
      * <code>QueryRunner</code> methods always call this method to get the
      * <code>DataSource</code> so subclasses can provide specialized
@@ -205,11 +339,12 @@
      * @param rsh The handler that converts the results into an object.
      * @return The object returned by the handler.
      * @throws SQLException if a database access error occurs
+     * @deprecated Use {@link #query(Connection,String,ResultSetHandler,Object[])} instead
      */
     public Object query(Connection conn, String sql, Object param,
             ResultSetHandler rsh) throws SQLException {
 
-        return this.query(conn, sql, new Object[] { param }, rsh);
+        return this.query(conn, sql, rsh, new Object[] { param });
     }
 
     /**
@@ -222,9 +357,26 @@
      * @param rsh The handler that converts the results into an object.
      * @return The object returned by the handler.
      * @throws SQLException if a database access error occurs
+     * @deprecated Use {@link #query(Connection,String,ResultSetHandler,Object[])} instead
      */
     public Object query(Connection conn, String sql, Object[] params,
             ResultSetHandler rsh) throws SQLException {
+                return query(conn, sql, rsh, params);
+            }
+
+    /**
+     * Execute an SQL SELECT query with replacement parameters.  The
+     * caller is responsible for closing the connection.
+     * 
+     * @param conn The connection to execute the query in.
+     * @param sql The query to execute.
+     * @param rsh The handler that converts the results into an object.
+     * @param params The replacement parameters.
+     * @return The object returned by the handler.
+     * @throws SQLException if a database access error occurs
+     */
+    public Object query(Connection conn, String sql, ResultSetHandler rsh,
+            Object[] params) throws SQLException {
 
         PreparedStatement stmt = null;
         ResultSet rs = null;
@@ -263,7 +415,7 @@
     public Object query(Connection conn, String sql, ResultSetHandler rsh)
         throws SQLException {
 
-        return this.query(conn, sql, (Object[]) null, rsh);
+        return this.query(conn, sql, rsh, (Object[]) null);
     }
 
     /**
@@ -278,11 +430,12 @@
      * 
      * @return An object generated by the handler.
      * @throws SQLException if a database access error occurs
+     * @deprecated Use {@link #query(String,ResultSetHandler,Object[])} instead
      */
     public Object query(String sql, Object param, ResultSetHandler rsh)
         throws SQLException {
 
-        return this.query(sql, new Object[] { param }, rsh);
+        return this.query(sql, rsh, new Object[] { param });
     }
 
     /**
@@ -299,14 +452,33 @@
      * 
      * @return An object generated by the handler.
      * @throws SQLException if a database access error occurs
+     * @deprecated Use {@link #query(String,ResultSetHandler,Object[])} instead
      */
     public Object query(String sql, Object[] params, ResultSetHandler rsh)
         throws SQLException {
+            return query(sql, rsh, params);
+        }
+
+    /**
+     * Executes the given SELECT SQL query and returns a result object.
+     * The <code>Connection</code> is retrieved from the 
+     * <code>DataSource</code> set in the constructor.
+     * 
+     * @param sql The SQL statement to execute.
+     * @param rsh The handler used to create the result object from 
+     * the <code>ResultSet</code>.
+     * @param params Initialize the PreparedStatement's IN parameters with 
+     * this array.
+     * @return An object generated by the handler.
+     * @throws SQLException if a database access error occurs
+     */
+    public Object query(String sql, ResultSetHandler rsh, Object[] params)
+        throws SQLException {
 
         Connection conn = this.prepareConnection();
 
         try {
-            return this.query(conn, sql, params, rsh);
+            return this.query(conn, sql, rsh, params);
         } finally {
             close(conn);
         }
@@ -325,7 +497,7 @@
      * @throws SQLException if a database access error occurs
      */
     public Object query(String sql, ResultSetHandler rsh) throws SQLException {
-        return this.query(sql, (Object[]) null, rsh);
+        return this.query(sql, rsh, (Object[]) null);
     }
 
     /**
@@ -344,7 +516,9 @@
     protected void rethrow(SQLException cause, String sql, Object[] params)
         throws SQLException {
 
-        StringBuffer msg = new StringBuffer(cause.getMessage());
+        String causeMessage = cause.getMessage();
+        if (causeMessage == null) causeMessage = "";
+        StringBuffer msg = new StringBuffer(causeMessage);
 
         msg.append(" Query: ");
         msg.append(sql);

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ArrayListHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ArrayListHandler.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ArrayListHandler.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ArrayListHandler.java Wed Feb 25 10:01:31 2009
@@ -28,7 +28,7 @@
  * 
  * @see org.apache.commons.dbutils.ResultSetHandler
  */
-public class ArrayListHandler extends GenericListHandler {
+public class ArrayListHandler extends AbstractListHandler {
 
     /**
      * The RowProcessor implementation to use when converting rows 
@@ -62,7 +62,7 @@
      * @return <code>Object[]</code>, never <code>null</code>.
      * 
      * @throws SQLException if a database access error occurs
-     * @see org.apache.commons.dbutils.handlers.GenericListHandler#handle(ResultSet)
+     * @see org.apache.commons.dbutils.handlers.AbstractListHandler#handle(ResultSet)
      */
     protected Object handleRow(ResultSet rs) throws SQLException {
         return this.convert.toArray(rs);

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/BeanListHandler.java Wed Feb 25 10:01:31 2009
@@ -19,6 +19,7 @@
 import java.sql.ResultSet;
 import java.sql.SQLException;
 
+import org.apache.commons.dbutils.ResultSetHandler;
 import org.apache.commons.dbutils.RowProcessor;
 
 /**
@@ -28,7 +29,7 @@
  * 
  * @see org.apache.commons.dbutils.ResultSetHandler
  */
-public class BeanListHandler extends GenericListHandler {
+public class BeanListHandler implements ResultSetHandler {
 
     /**
      * The Class of beans produced by this handler.
@@ -65,16 +66,17 @@
     }
 
     /**
-     * Convert the <code>ResultSet</code> row into a bean with
+     * Convert the whole <code>ResultSet</code> into a List of beans with
      * the <code>Class</code> given in the constructor.
      * 
-     * @return A bean, never <code>null</code>.
+     * @param rs The <code>ResultSet</code> to handle.
+     * 
+     * @return A List of beans, never <code>null</code>.
      * 
      * @throws SQLException if a database access error occurs
-     * @see org.apache.commons.dbutils.handlers.GenericListHandler#handle(ResultSet)
+     * @see org.apache.commons.dbutils.RowProcessor#toBeanList(ResultSet, Class)
      */
-    protected Object handleRow(ResultSet rs) throws SQLException {
-        return this.convert.toBean(rs, type);
+    public Object handle(ResultSet rs) throws SQLException {
+        return this.convert.toBeanList(rs, type);
     }
-
 }

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ColumnListHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ColumnListHandler.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ColumnListHandler.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/ColumnListHandler.java Wed Feb 25 10:01:31 2009
@@ -27,7 +27,7 @@
  * @see org.apache.commons.dbutils.ResultSetHandler
  * @since DbUtils 1.1
  */
-public class ColumnListHandler extends GenericListHandler {
+public class ColumnListHandler extends AbstractListHandler {
 
     /**
      * The column number to retrieve.
@@ -75,7 +75,7 @@
      * 
      * @throws SQLException if a database access error occurs
      * 
-     * @see org.apache.commons.dbutils.handlers.GenericListHandler#handle(ResultSet)
+     * @see org.apache.commons.dbutils.handlers.AbstractListHandler#handle(ResultSet)
      */
    protected Object handleRow(ResultSet rs) throws SQLException {
         if (this.columnName == null) {

Modified: commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/MapListHandler.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/MapListHandler.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/MapListHandler.java (original)
+++ commons/proper/dbutils/trunk/src/java/org/apache/commons/dbutils/handlers/MapListHandler.java Wed Feb 25 10:01:31 2009
@@ -28,7 +28,7 @@
  * 
  * @see org.apache.commons.dbutils.ResultSetHandler
  */
-public class MapListHandler extends GenericListHandler {
+public class MapListHandler extends AbstractListHandler {
 
     /**
      * The RowProcessor implementation to use when converting rows 
@@ -62,7 +62,7 @@
      * 
      * @throws SQLException if a database access error occurs
      * 
-     * @see org.apache.commons.dbutils.handlers.GenericListHandler#handle(ResultSet)
+     * @see org.apache.commons.dbutils.handlers.AbstractListHandler#handle(ResultSet)
      */
     protected Object handleRow(ResultSet rs) throws SQLException {
         return this.convert.toMap(rs);

Modified: commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/BaseTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/BaseTestCase.java?rev=747724&r1=747723&r2=747724&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/BaseTestCase.java (original)
+++ commons/proper/dbutils/trunk/src/test/org/apache/commons/dbutils/BaseTestCase.java Wed Feb 25 10:01:31 2009
@@ -144,6 +144,7 @@
         suite.addTestSuite(ProxyFactoryTest.class);
         suite.addTestSuite(ResultSetIteratorTest.class);
         suite.addTestSuite(QueryLoaderTest.class);
+        suite.addTestSuite(QueryRunnerTest.class);
 
         // test handler implementations
         suite.addTestSuite(ArrayHandlerTest.class);