You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by dg...@apache.org on 2003/10/16 06:21:12 UTC

cvs commit: jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils ResultSetConverter.java BasicResultSetConverter.java BeanHandler.java VectorHandler.java ResultSetIterator.java MapHandler.java CollectionHandler.java ResultSetIteratorV1.java DbUtils.java BeanCollectionHandler.java

dgraham     2003/10/15 21:21:12

  Modified:    dbutils/src/java/org/apache/commons/dbutils BeanHandler.java
                        VectorHandler.java ResultSetIterator.java
                        MapHandler.java CollectionHandler.java
                        ResultSetIteratorV1.java DbUtils.java
                        BeanCollectionHandler.java
  Added:       dbutils/src/java/org/apache/commons/dbutils
                        ResultSetConverter.java
                        BasicResultSetConverter.java
  Log:
  Refactored DbUtils.resultSetTo* methods into a ResultSetConverter
  interface with a BasicResultSetConverter implementation.  This
  allows clients to customize the implementation of these methods with
  subclasses.  It also makes the DbUtils API smaller and clearer.
  
  Revision  Changes    Path
  1.4       +7 -4      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BeanHandler.java
  
  Index: BeanHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BeanHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- BeanHandler.java	16 Oct 2003 03:05:10 -0000	1.3
  +++ BeanHandler.java	16 Oct 2003 04:21:11 -0000	1.4
  @@ -68,6 +68,7 @@
    * <code>ResultSet</code> row into a JavaBean.
    * 
    * @see ResultSetHandler
  + * 
    * @author Juozas Baliuka
    * @author David Graham
    */
  @@ -101,7 +102,9 @@
       public Object handle(ResultSet rs, Object[] params, Object userObject)
           throws SQLException {
   
  -        return rs.next() ? DbUtils.resultSetToBean(rs, this.type) : null;
  +        return rs.next()
  +            ? BasicResultSetConverter.instance().toBean(rs, this.type)
  +            : null;
       }
   
   }
  
  
  
  1.5       +5 -4      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/VectorHandler.java
  
  Index: VectorHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/VectorHandler.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- VectorHandler.java	16 Oct 2003 03:14:38 -0000	1.4
  +++ VectorHandler.java	16 Oct 2003 04:21:11 -0000	1.5
  @@ -69,6 +69,7 @@
    * <code>ResultSet</code> into an <code>Object[]</code>.
    * 
    * @see ResultSetHandler
  + * 
    * @author Juozas Baliuka
    * @author David Graham
    */
  @@ -86,7 +87,7 @@
       public Object handle(ResultSet rs, Object[] params, Object userObject)
           throws SQLException {
   
  -        return rs.next() ? DbUtils.resultSetToArray(rs) : null;
  +        return rs.next() ? BasicResultSetConverter.instance().toArray(rs) : null;
       }
   
   }
  
  
  
  1.5       +4 -4      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ResultSetIterator.java
  
  Index: ResultSetIterator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ResultSetIterator.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ResultSetIterator.java	16 Oct 2003 03:34:07 -0000	1.4
  +++ ResultSetIterator.java	16 Oct 2003 04:21:11 -0000	1.5
  @@ -94,7 +94,7 @@
       public Object next() {
           try {
               rs.next();
  -            return DbUtils.resultSetToArray(rs);
  +            return BasicResultSetConverter.instance().toArray(rs);
   
           } catch (SQLException e) {
               // TODO Logging?
  
  
  
  1.4       +4 -4      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/MapHandler.java
  
  Index: MapHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/MapHandler.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- MapHandler.java	16 Oct 2003 03:14:38 -0000	1.3
  +++ MapHandler.java	16 Oct 2003 04:21:11 -0000	1.4
  @@ -88,7 +88,7 @@
       public Object handle(ResultSet rs, Object[] params, Object userObject)
           throws SQLException {
   
  -        return rs.next() ? DbUtils.resultSetToMap(rs) : null;
  +        return rs.next() ? BasicResultSetConverter.instance().toMap(rs) : null;
       }
   
   }
  
  
  
  1.3       +9 -7      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/CollectionHandler.java
  
  Index: CollectionHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/CollectionHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- CollectionHandler.java	16 Oct 2003 03:14:38 -0000	1.2
  +++ CollectionHandler.java	16 Oct 2003 04:21:11 -0000	1.3
  @@ -71,6 +71,7 @@
    * <code>ResultSet</code> into a <code>List</code> of <code>Object[]</code>s.
    * 
    * @see ResultSetHandler
  + * 
    * @author Juozas Baliuka
    * @author David Graham
    */
  @@ -89,13 +90,14 @@
        */
       public Object handle(ResultSet rs, Object[] params, Object userObject)
           throws SQLException {
  -            
  +
           List result = new ArrayList();
  -        
  +
  +        ResultSetConverter convert = BasicResultSetConverter.instance();
           while (rs.next()) {
  -            result.add(DbUtils.resultSetToArray(rs));
  +            result.add(convert.toArray(rs));
           }
  -        
  +
           return result;
       }
   
  
  
  
  1.5       +4 -4      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ResultSetIteratorV1.java
  
  Index: ResultSetIteratorV1.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ResultSetIteratorV1.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ResultSetIteratorV1.java	16 Oct 2003 03:34:07 -0000	1.4
  +++ ResultSetIteratorV1.java	16 Oct 2003 04:21:11 -0000	1.5
  @@ -94,7 +94,7 @@
       private void doNext() {
           try {
               rs.next();
  -            this.val = DbUtils.resultSetToArray(rs);
  +            this.val = BasicResultSetConverter.instance().toArray(rs);
               
           } catch (SQLException sqle) {
               this.val = null;
  
  
  
  1.35      +119 -302  jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/DbUtils.java
  
  Index: DbUtils.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/DbUtils.java,v
  retrieving revision 1.34
  retrieving revision 1.35
  diff -u -r1.34 -r1.35
  --- DbUtils.java	16 Oct 2003 03:34:07 -0000	1.34
  +++ DbUtils.java	16 Oct 2003 04:21:11 -0000	1.35
  @@ -61,27 +61,17 @@
    
   package org.apache.commons.dbutils;
   
  -import java.beans.BeanInfo;
  -import java.beans.IntrospectionException;
  -import java.beans.Introspector;
  -import java.beans.PropertyDescriptor;
   import java.io.PrintWriter;
  -import java.lang.reflect.InvocationTargetException;
  -import java.lang.reflect.Method;
   import java.sql.Connection;
   import java.sql.PreparedStatement;
   import java.sql.ResultSet;
  -import java.sql.ResultSetMetaData;
   import java.sql.SQLException;
   import java.sql.Statement;
   import java.sql.Types;
   import java.util.ArrayList;
   import java.util.Arrays;
  -import java.util.Collection;
  -import java.util.HashMap;
   import java.util.Iterator;
   import java.util.List;
  -import java.util.Map;
   
   /**
    * A collection of JDBC helper methods.
  @@ -93,122 +83,125 @@
    */
   public final class DbUtils {
       
  -    private static Map DEFAULTS = new HashMap();
  -    
  -    static{
  -        
  -        DEFAULTS.put(int.class,     new Integer(0));
  -        DEFAULTS.put(short.class,   new Short((short)0));
  -        DEFAULTS.put(byte.class,    new Byte((byte)0));
  -        DEFAULTS.put(float.class,   new Float(0f));
  -        DEFAULTS.put(double.class,  new Double(0.0));
  -        DEFAULTS.put(long.class,    new Long(0L));
  -        DEFAULTS.put(boolean.class, Boolean.FALSE);
  -        DEFAULTS.put(char.class,    new Character('\u0000'));
  -        
  -    }
  -    
  -    public static abstract class ListAdapter extends ArrayList implements ResultSetHandler{
  -        
  -        public final Object handle(java.sql.ResultSet rs, Object[] params, Object userObject) throws java.sql.SQLException{
  -            
  -            while(rs.next()){
  +    private static abstract class ListAdapter
  +        extends ArrayList
  +        implements ResultSetHandler {
  +
  +        public final Object handle(ResultSet rs, Object[] params, Object userObject)
  +            throws SQLException {
  +
  +            while (rs.next()) {
                   add(fetch(rs));
               }
  +            
               return this;
           }
  -        
  -        public abstract Object fetch( ResultSet rs )throws SQLException;
  -        
  +
  +        public abstract Object fetch(ResultSet rs) throws SQLException;
       }
       
  -    
  -    
  -    public static boolean execute(Connection connection, String query,Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler rsmdh, Object userObject)
  -    throws SQLException {
  -        
  +    public static boolean execute(
  +        Connection conn,
  +        String query,
  +        Object[] vals,
  +        ResultSetHandler rsh,
  +        ResultSetMetaDataHandler rsmdh,
  +        Object userObject)
  +        throws SQLException {
  +
           PreparedStatement stmt = null;
           ResultSet rs = null;
  -        
  +
           try {
  -            
  -            stmt = connection.prepareStatement(query);
  +            stmt = conn.prepareStatement(query);
               fillStatement(stmt, vals);
  -            
  -            try{
  -                if(stmt.execute()){
  -                    do{
  -                        
  +
  +            try {
  +                if (stmt.execute()) {
  +                    do {
                           rs = stmt.getResultSet();
  -                        if(rs != null) {
  -                            if(rsmdh != null) {
  +                        if (rs != null) {
  +                            if (rsmdh != null) {
                                   rsmdh.handle(rs.getMetaData());
                               }
                           }
  -                        rsh.handle(rs,vals,userObject);
  -                        
  -                    }while(stmt.getMoreResults());
  -                    
  +                        rsh.handle(rs, vals, userObject);
  +
  +                    } while (stmt.getMoreResults());
  +
                       return true;
  -                    
  -                }else{
  -                    
  +
  +                } else {
  +
                       return false;
  -                    
  +
                   }
  -            }catch(SQLException sqle){
  -                
  +            } catch (SQLException sqle) {
  +
                   closeQuietly(rs);
  -                rethrow( sqle, query, vals);
  -                
  +                rethrow(sqle, query, vals);
  +
               }
               return false;
  -            
  +
           } finally {
               closeQuietly(stmt);
           }
  -        
  +
       }
  -    
  -    public static Object executeQuery(Connection connection, String query,
  -    Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler rsmdh) throws SQLException{
  -        return  executeQuery(connection,query, vals, rsh, rsmdh, null  );
  +
  +    public static Object executeQuery(
  +        Connection conn,
  +        String query,
  +        Object[] vals,
  +        ResultSetHandler rsh,
  +        ResultSetMetaDataHandler rsmdh)
  +        throws SQLException {
  +            
  +        return executeQuery(conn, query, vals, rsh, rsmdh, null);
       }
  -    
  -    public static Object executeQuery(Connection connection, String query,
  -    Object[] vals, ResultSetHandler rsh, ResultSetMetaDataHandler rsmdh, Object userObject)
  -    throws SQLException {
  -        
  +
  +    public static Object executeQuery(
  +        Connection conn,
  +        String query,
  +        Object[] vals,
  +        ResultSetHandler rsh,
  +        ResultSetMetaDataHandler rsmdh,
  +        Object userObject)
  +        throws SQLException {
  +
           PreparedStatement stmt = null;
           ResultSet rs = null;
  -        
  +
           try {
  -            
  -            stmt = connection.prepareStatement(query);
  +
  +            stmt = conn.prepareStatement(query);
               fillStatement(stmt, vals);
  -            
  -            try{
  +
  +            try {
                   rs = stmt.executeQuery();
  -            }catch(SQLException sqle){
  -                rethrow( sqle, query, vals);
  +                
  +            } catch (SQLException sqle) {
  +                rethrow(sqle, query, vals);
               }
  -            if(rs != null){
  -                if(rsmdh != null) {
  -                    try{
  +            
  +            if (rs != null) {
  +                if (rsmdh != null) {
  +                    try {
                           rsmdh.handle(rs.getMetaData());
  -                    }
  -                    catch(SQLException sqle){
  -                        rethrow( sqle, query, vals);
  +                    } catch (SQLException sqle) {
  +                        rethrow(sqle, query, vals);
                       }
                   }
               }
  -            return rsh.handle(rs,vals,userObject);
               
  +            return rsh.handle(rs, vals, userObject);
  +
           } finally {
               closeQuietly(rs);
               closeQuietly(stmt);
           }
  -        
  +
       }
       
       private static void rethrow(SQLException cause, String sql, Object[] vals)
  @@ -259,11 +252,14 @@
           }
       }
       
  -    
  -    public static List executeListQuery(Connection connection,
  -    String query, Object[] vals, Object userObject )
  -    throws SQLException {
  -        return executeListQuery(connection, query, vals, null, userObject);
  +    public static List executeListQuery(
  +        Connection conn,
  +        String query,
  +        Object[] vals,
  +        Object userObject)
  +        throws SQLException {
  +            
  +        return executeListQuery(conn, query, vals, null, userObject);
       }
       
       /**
  @@ -272,30 +268,33 @@
        * inside an List.
        * Null values in the Object array will be passed to the driver.
        */
  -    public static List executeListQuery(Connection connection,
  -    String query, Object[] vals, ResultSetMetaDataHandler rsmdh, Object userObject )
  -    throws SQLException {
  -        return (List)executeQuery(connection,query,vals,
  -        
  -        new ListAdapter(){
  +    public static List executeListQuery(
  +        Connection conn,
  +        String query,
  +        Object[] vals,
  +        ResultSetMetaDataHandler rsmdh,
  +        Object userObject)
  +        throws SQLException {
               
  -            public  Object fetch( ResultSet rs )throws SQLException{
  -                return resultSetToArray(rs);
  -            }
  +        ListAdapter la = new ListAdapter() {
  +            private ResultSetConverter convert = BasicResultSetConverter.instance();
               
  -        }
  -        
  -        , rsmdh
  -        , userObject );
  +            public Object fetch(ResultSet rs) throws SQLException {
  +                return convert.toArray(rs);
  +            }
  +        };
           
  +        return (List) executeQuery(conn, query, vals, la, rsmdh, userObject);
       }
       
  -    
  -    
  -    public static Iterator executeQuery(Connection connection, String query, Object[] vals, ResultSetMetaDataHandler rsmdh )
  -    throws SQLException {
  -        return executeListQuery(connection, query, vals, rsmdh, null ).iterator();
  -        
  +    public static Iterator executeQuery(
  +        Connection conn,
  +        String query,
  +        Object[] vals,
  +        ResultSetMetaDataHandler rsmdh)
  +        throws SQLException {
  +            
  +        return executeListQuery(conn, query, vals, rsmdh, null).iterator();
       }
       
       /**
  @@ -304,15 +303,15 @@
        * inside an Iterator.
        * Null values in the Object array will be passed to the driver.
        */
  -    public static Iterator executeQuery(Connection connection, String query, Object[] vals )
  -    throws SQLException {
  -        return executeListQuery(connection, query, vals, null, null ).iterator();
  -        
  +    public static Iterator executeQuery(
  +        Connection connection,
  +        String query,
  +        Object[] vals)
  +        throws SQLException {
  +            
  +        return executeListQuery(connection, query, vals, null, null).iterator();
       }
       
  -    
  -    
  -    
       /**
        * Ensures that a database driver class is loaded.
        * If this succeeds, then it returns true, else it returns false.
  @@ -342,188 +341,6 @@
           } catch (Throwable t) {
               return false;
           }
  -    }
  -    
  -    /**
  -     * Create a Map from a ResultSet.
  -     * It is assumed that next() has already been called on the ResultSet.
  -     */
  -    public static Map resultSetToMap(ResultSet rs) throws SQLException {
  -        Map result = new HashMap();
  -        ResultSetMetaData rsmd = rs.getMetaData();
  -        int cols = rsmd.getColumnCount();
  -        
  -        for (int i = 1; i <= cols; i++) {
  -            Object value = rs.getObject(i);
  -            if (!rs.wasNull()) {
  -                result.put(rsmd.getColumnName(i), value);
  -            }
  -        }
  -        
  -        return result;
  -    }
  -    
  -    /**
  -     * Create a JavaBean from a <code>ResultSet</code>.  It is assumed 
  -     * that <code>next()</code> has already been called on the 
  -     * <code>ResultSet</code>.
  -     */
  -    public static Object resultSetToBean(ResultSet rs, Class cls)
  -        throws SQLException {
  -
  -        Object obj = newInstance(cls);
  -
  -        PropertyDescriptor[] pd = propertyDescriptors(cls);
  -
  -        ResultSetMetaData rsmd = rs.getMetaData();
  -        int cols = rsmd.getColumnCount();
  -        LOOP : for (int i = 1; i <= cols; i++) {
  -            String columnName = rsmd.getColumnName(i);
  -            for (int j = 0; j < pd.length; j++) {
  -                if (columnName.equals(pd[j].getName())) {
  -                    Object value = rs.getObject(i);
  -                    if (rs.wasNull() && pd[j].getPropertyType().isPrimitive()) {
  -                        value = DEFAULTS.get(pd[j].getPropertyType());
  -                    }
  -
  -                    callSetter(pd[j], obj, value);
  -                    continue LOOP;
  -                }
  -            }
  -
  -            throw new SQLException(
  -                columnName + " not found in " + obj.getClass().getName());
  -        }
  -
  -        return obj;
  -    }
  -    
  -    /**
  -     * Calls the setter method on the target object for the given property.
  -     * If no setter method exists for the property, this method does nothing.
  -     * @param pd The property to set.
  -     * @param target The object to set the property on.
  -     * @param value The value to pass into the setter.
  -     * @throws DbException if an error occurs setting the property.
  -     */
  -    private static void callSetter(
  -        PropertyDescriptor pd,
  -        Object target,
  -        Object value) {
  -
  -        try {
  -            Method setter = pd.getWriteMethod();
  -
  -            if (setter != null) {
  -                setter.invoke(target, new Object[] { value });
  -            }
  -
  -        } catch (IllegalArgumentException e) {
  -            throw new DbException("Cannot set " + pd.getName(), e);
  -        } catch (IllegalAccessException e) {
  -            throw new DbException("Cannot set " + pd.getName(), e);
  -        } catch (InvocationTargetException e) {
  -            throw new DbException("Cannot set " + pd.getName(), e);
  -        }
  -    }
  -
  -    /**
  -     * Returns a PropertyDescriptor[] for the given Class.
  -     * @param c The Class to retrieve PropertyDescriptors for.
  -     * @return A PropertyDescriptor[] describing the Class.
  -     * @throws DbException if introspection failed.
  -     */
  -    private static PropertyDescriptor[] propertyDescriptors(Class c) {
  -        BeanInfo beanInfo = null;
  -        try {
  -            beanInfo = Introspector.getBeanInfo(c);
  -        } catch (IntrospectionException e) {
  -            throw new DbException(e);
  -        }
  -        
  -        return beanInfo.getPropertyDescriptors();
  -    }
  -    
  -    /**
  -     * Optimized for collections of beans.
  -     */
  -    public static Collection resultSetToBeanCollection(ResultSet rs, Class cls)
  -        throws SQLException {
  -
  -        Collection results = new ArrayList();
  -
  -        if (!rs.next()) {
  -            return results;
  -        }
  -
  -        PropertyDescriptor[] pd = propertyDescriptors(cls);
  -        ResultSetMetaData rsmd = rs.getMetaData();
  -        int cols = rsmd.getColumnCount();
  -        int nameToIndex[] = new int[cols + 1];
  -
  -        LOOP : for (int i = 1; i <= cols; i++) {
  -            String columnName = rsmd.getColumnName(i);
  -            for (int j = 0; j < pd.length; j++) {
  -                if (columnName.equals(pd[j].getName())) {
  -                    nameToIndex[i] = j;
  -                    continue LOOP;
  -                }
  -            }
  -            throw new SQLException(" index not found for " + columnName);
  -        }
  -
  -        do {
  -            Object obj = newInstance(cls);
  -
  -            for (int i = 1; i <= cols; i++) {
  -                Object value = rs.getObject(i);
  -                if (rs.wasNull()) {
  -                    continue;
  -                }
  -
  -                callSetter(pd[nameToIndex[i]], obj, value);
  -            }
  -
  -            results.add(obj);
  -
  -        } while (rs.next());
  -
  -        return results;
  -    }
  -
  -    /**
  -     * Returns a new instance of the given Class.
  -     * @param c The Class to create an object from.
  -     * @return A newly created object of the Class.
  -     * @throws DbException if creation failed.
  -     */
  -    private static Object newInstance(Class c) {
  -        try {
  -            return c.newInstance();
  -
  -        } catch (InstantiationException e) {
  -            throw new DbException("Cannot create " + c.getName(), e);
  -        } catch (IllegalAccessException e) {
  -            throw new DbException("Cannot create " + c.getName(), e);
  -        }
  -    }
  -    
  -    
  -    /**
  -     * Create an Object array from a ResultSet.
  -     * It is assumed that next() has already been called on the ResultSet.
  -     */
  -    public static Object[] resultSetToArray(ResultSet rs) throws SQLException {
  -        ResultSetMetaData meta = rs.getMetaData();
  -        int cols = meta.getColumnCount();
  -        Object[] objs = new Object[cols];
  -        for (int i = 0; i < cols; i++) {
  -            Object obj = rs.getObject(i + 1);
  -            
  -            objs[i] = rs.wasNull() ? null : obj;
  -        }
  -
  -        return objs;
       }
       
       /**
  
  
  
  1.3       +5 -4      jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BeanCollectionHandler.java
  
  Index: BeanCollectionHandler.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BeanCollectionHandler.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- BeanCollectionHandler.java	16 Oct 2003 03:14:38 -0000	1.2
  +++ BeanCollectionHandler.java	16 Oct 2003 04:21:11 -0000	1.3
  @@ -69,6 +69,7 @@
    * <code>ResultSet</code> column into an Object.
    * 
    * @see ResultSetHandler
  + * 
    * @author Juozas Baliuka
    * @author David Graham
    */
  @@ -102,7 +103,7 @@
       public Object handle(ResultSet rs, Object[] params, Object userObject)
           throws SQLException {
               
  -        return DbUtils.resultSetToBeanCollection(rs, type);
  +        return BasicResultSetConverter.instance().toBeanList(rs, type);
       }
   
   }
  
  
  
  1.1                  jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ResultSetConverter.java
  
  Index: ResultSetConverter.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/ResultSetConverter.java,v 1.1 2003/10/16 04:21:11 dgraham Exp $
   * $Revision: 1.1 $
   * $Date: 2003/10/16 04:21:11 $
   * 
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowledgement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgement may appear in the software itself,
   *    if and wherever such third-party acknowledgements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.dbutils;
  
  import java.sql.ResultSet;
  import java.sql.SQLException;
  import java.util.List;
  import java.util.Map;
  
  /**
   * <code>ResultSetConverter</code> implementations convert 
   * <code>ResultSet</code> rows into various other objects.  Implementations
   * can extend <code>BasicResultSetConverter</code> to protect themselves
   * from changes to this interface. 
   * 
   * @see BasicResultSetConverter
   * @author David Graham
   */
  public interface ResultSetConverter {
  
      /**
       * Create an <code>Object[]</code> from the column values in one 
       * <code>ResultSet</code> row.  The <code>ResultSet</code> should be 
       * positioned on a valid row before passing it to this method.  
       * Implementations of this method must not alter the row position of 
       * the <code>ResultSet</code>. 
       */
      public Object[] toArray(ResultSet rs) throws SQLException;
  
      /**
       * Create a JavaBean from the column values in one <code>ResultSet</code> 
       * row.  The <code>ResultSet</code> should be positioned on a valid row before
       * passing it to this method.  Implementations of this method must not
       * alter the row position of the <code>ResultSet</code>.
       */
      public Object toBean(ResultSet rs, Class type) throws SQLException;
  
      /**
       * Create a <code>List</code> of JavaBeans from the column values in all 
       * <code>ResultSet</code> rows.  <code>ResultSet.next()</code> should 
       * <strong>not</strong> be called before passing it to this method.
       * 
       * @return A <code>List</code> of beans with the given type in the order 
       * they were returned by the <code>ResultSet</code>.
       */
      public List toBeanList(ResultSet rs, Class type) throws SQLException;
  
      /**
       * Create a <code>Map</code> from the column values in one 
       * <code>ResultSet</code> row.  The <code>ResultSet</code> should be 
       * positioned on a valid row before
       * passing it to this method.  Implementations of this method must not
       * alter the row position of the <code>ResultSet</code>.
       */
      public Map toMap(ResultSet rs) throws SQLException;
  
  }
  
  
  
  1.1                  jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BasicResultSetConverter.java
  
  Index: BasicResultSetConverter.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons-sandbox/dbutils/src/java/org/apache/commons/dbutils/BasicResultSetConverter.java,v 1.1 2003/10/16 04:21:11 dgraham Exp $
   * $Revision: 1.1 $
   * $Date: 2003/10/16 04:21:11 $
   * 
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 2002-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowledgement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowledgement may appear in the software itself,
   *    if and wherever such third-party acknowledgements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Software Foundation.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.dbutils;
  
  import java.beans.BeanInfo;
  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.ResultSet;
  import java.sql.ResultSetMetaData;
  import java.sql.SQLException;
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  
  /**
   * Basic implementation of the <code>ResultSetConverter</code> interface.
   * This class is a thread-safe Singleton.
   * 
   * @see ResultSetConverter
   * 
   * @author Henri Yandell
   * @author Juozas Baliuka
   * @author David Graham
   */
  public class BasicResultSetConverter implements ResultSetConverter {
  
      /**
       * The Singleton instance of this class.
       */
      private static final BasicResultSetConverter instance =
          new BasicResultSetConverter();
  
      /**
       * If a column was null, and the bean property is a primitive type, set
       * the property to the default value for its type. 
       */
      private static final Map defaultValues = new HashMap();
  
      static {
          defaultValues.put(int.class, new Integer(0));
          defaultValues.put(short.class, new Short((short) 0));
          defaultValues.put(byte.class, new Byte((byte) 0));
          defaultValues.put(float.class, new Float(0f));
          defaultValues.put(double.class, new Double(0.0));
          defaultValues.put(long.class, new Long(0L));
          defaultValues.put(boolean.class, Boolean.FALSE);
          defaultValues.put(char.class, new Character('\u0000'));
      }
      
      /**
       * Returns the Singleton instance of this class.
       */
      public static BasicResultSetConverter instance(){
          return instance;
      }
  
      /**
       * Protected constructor for BasicResultSetConverter subclasses only.
       */
      protected BasicResultSetConverter() {
          super();
      }
  
      // See interface for javadoc.
      public Object[] toArray(ResultSet rs) throws SQLException {
          ResultSetMetaData meta = rs.getMetaData();
          int cols = meta.getColumnCount();
          Object[] objs = new Object[cols];
  
          for (int i = 0; i < cols; i++) {
              Object obj = rs.getObject(i + 1);
  
              objs[i] = rs.wasNull() ? null : obj;
          }
  
          return objs;
      }
  
      // See interface for javadoc.
      public Object toBean(ResultSet rs, Class type) throws SQLException {
          Object obj = newInstance(type);
  
          PropertyDescriptor[] pd = propertyDescriptors(type);
  
          ResultSetMetaData rsmd = rs.getMetaData();
          int cols = rsmd.getColumnCount();
          LOOP : for (int i = 1; i <= cols; i++) {
              String columnName = rsmd.getColumnName(i);
  
              for (int j = 0; j < pd.length; j++) {
  
                  if (columnName.equals(pd[j].getName())) {
                      Object value = rs.getObject(i);
  
                      if (rs.wasNull() && pd[j].getPropertyType().isPrimitive()) {
                          value = defaultValues.get(pd[j].getPropertyType());
                      }
  
                      callSetter(pd[j], obj, value);
                      continue LOOP;
                  }
              }
  
              throw new SQLException(
                  columnName + " not found in " + obj.getClass().getName());
          }
  
          return obj;
      }
  
      // See interface for javadoc.
      public List toBeanList(ResultSet rs, Class type) throws SQLException {
          List results = new ArrayList();
  
          if (!rs.next()) {
              return results;
          }
  
          PropertyDescriptor[] pd = propertyDescriptors(type);
          ResultSetMetaData rsmd = rs.getMetaData();
          int cols = rsmd.getColumnCount();
          int nameToIndex[] = new int[cols + 1];
  
          LOOP : for (int i = 1; i <= cols; i++) {
              String columnName = rsmd.getColumnName(i);
              for (int j = 0; j < pd.length; j++) {
  
                  if (columnName.equals(pd[j].getName())) {
                      nameToIndex[i] = j;
                      continue LOOP;
                  }
              }
  
              throw new SQLException(" index not found for " + columnName);
          }
  
          do {
              Object obj = newInstance(type);
  
              for (int i = 1; i <= cols; i++) {
                  Object value = rs.getObject(i);
                  if (rs.wasNull()) {
                      continue;
                  }
  
                  callSetter(pd[nameToIndex[i]], obj, value);
              }
  
              results.add(obj);
  
          } while (rs.next());
  
          return results;
      }
  
      // See interface for javadoc.
      public Map toMap(ResultSet rs) throws SQLException {
          Map result = new HashMap();
          ResultSetMetaData rsmd = rs.getMetaData();
          int cols = rsmd.getColumnCount();
  
          for (int i = 1; i <= cols; i++) {
              Object value = rs.getObject(i);
              if (!rs.wasNull()) {
                  result.put(rsmd.getColumnName(i), value);
              }
          }
  
          return result;
      }
  
      /**
       * Calls the setter method on the target object for the given property.
       * If no setter method exists for the property, this method does nothing.
       * @param pd The property to set.
       * @param target The object to set the property on.
       * @param value The value to pass into the setter.
       * @throws DbException if an error occurs setting the property.
       */
      private void callSetter(PropertyDescriptor pd, Object target, Object value) {
  
          try {
              Method setter = pd.getWriteMethod();
  
              if (setter != null) {
                  setter.invoke(target, new Object[] { value });
              }
  
          } catch (IllegalArgumentException e) {
              throw new DbException("Cannot set " + pd.getName(), e);
          } catch (IllegalAccessException e) {
              throw new DbException("Cannot set " + pd.getName(), e);
          } catch (InvocationTargetException e) {
              throw new DbException("Cannot set " + pd.getName(), e);
          }
      }
  
      /**
       * Returns a new instance of the given Class.
       * @param c The Class to create an object from.
       * @return A newly created object of the Class.
       * @throws DbException if creation failed.
       */
      private Object newInstance(Class c) {
          try {
              return c.newInstance();
  
          } catch (InstantiationException e) {
              throw new DbException("Cannot create " + c.getName(), e);
  
          } catch (IllegalAccessException e) {
              throw new DbException("Cannot create " + c.getName(), e);
          }
      }
  
      /**
       * Returns a PropertyDescriptor[] for the given Class.
       * @param c The Class to retrieve PropertyDescriptors for.
       * @return A PropertyDescriptor[] describing the Class.
       * @throws DbException if introspection failed.
       */
      private PropertyDescriptor[] propertyDescriptors(Class c) {
          BeanInfo beanInfo = null;
          try {
              beanInfo = Introspector.getBeanInfo(c);
  
          } catch (IntrospectionException e) {
              throw new DbException(e);
          }
  
          return beanInfo.getPropertyDescriptors();
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org