DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24185>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=24185

Enhancement to ResultSetDynaClass to allow case-insensitive and missing parameter bean 
mapping

           Summary: Enhancement to ResultSetDynaClass to allow case-
                    insensitive and missing parameter bean mapping
           Product: Commons
           Version: 1.0 Alpha
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: Bean Utilities
        AssignedTo: [EMAIL PROTECTED]
        ReportedBy: [EMAIL PROTECTED]


##This is a 1 file patch for JDBCDynaClass and ResultSetDynaClass to allow more
##flexibility in the mapping of variable names to bean attributes.  
##e.g. PROJNBR in resultset will automatically get mapped to ProjNbr or PrOjNbR
##in bean.  class returned by iterator will not fail if there are fewer fields
##in resultset than in input bean.
--- JDBCDynaClass.orig  2003-10-14 11:40:20.000000000 -0400
+++ JDBCDynaClass.java  2003-10-13 11:39:49.000000000 -0400
@@ -69,11 +69,13 @@
 import java.util.HashMap;
 import java.util.Map;
 
+
 /**
  * <p>Provides common logic for JDBC implementations of [EMAIL PROTECTED] 
DynaClass}.</p>
  *
  * @author   Craig R. McClanahan
  * @author   George Franciscus
+ * @author   Michael Mainguy
  * @version $Revision: 1.3 $ $Date: 2003/10/09 20:43:15 $
  */
 
@@ -256,6 +258,48 @@
 
     }
 
-}
 
+       /**
+        * <p>Introspect the metadata associated with our result set, and 
populate
+        * the <code>properties</code> and <code>propertiesMap</code> instance
+        * variables.</p>
+        *
+        * @param resultSet The <code>resultSet</code> whose metadata is to
+        *  be introspected
+        * @param resultSet The <code>DynaClass</code> whose properties we want
+        *  to use
+        * 
+        * @exception SQLException if an error is encountered processing the
+        *  result set metadata
+        * 
+        */
+       protected void introspect(ResultSet resultSet, DynaClass dynaClass) 
throws SQLException {
+               HashMap propmap = new HashMap();
+               DynaProperty[] props = dynaClass.getDynaProperties();
+               for (int i = 0; i< props.length; i++) {
+                       propmap.put(props[i].getName().toLowerCase(), props[i]);
+               
+               }
+               // Accumulate an ordered list of DynaProperties
+               ArrayList list = new ArrayList();
+               ResultSetMetaData metadata = resultSet.getMetaData();
+               int n = metadata.getColumnCount();
+               for (int i = 1; i <= n; i++) { // JDBC is one-relative!
+                       DynaProperty dynaProperty = (DynaProperty)propmap.get
(metadata.getColumnName(i).toLowerCase());
+                       if (dynaProperty != null) {
+                                       list.add(dynaProperty);
+                       }
+               }
+
+               // Convert this list into the internal data structures we need
+               properties =
+                       (DynaProperty[]) list.toArray(new DynaProperty[list.size
()]);
+               for (int i = 0; i < properties.length; i++) {
+                       propertiesMap.put(properties[i].getName(), properties
[i]);
+               }
+
+       }
+
+
+}
--- ResultSetDynaClass.orig     2003-10-14 11:39:15.000000000 -0400
+++ ResultSetDynaClass.java     2003-10-13 11:39:47.000000000 -0400
@@ -123,145 +123,171 @@
  * </pre>
  *
  * @author Craig R. McClanahan
+ * @author Michael Mainguy
  * @version $Revision: 1.13 $ $Date: 2003/10/09 20:43:15 $
  */
 
 public class ResultSetDynaClass extends JDBCDynaClass implements DynaClass {
 
 
-       // ----------------------------------------------------------- 
Constructors
+    // ----------------------------------------------------------- Constructors
 
 
-       /**
-        * <p>Construct a new ResultSetDynaClass for the specified
-        * <code>ResultSet</code>.  The property names corresponding
-        * to column names in the result set will be lower cased.</p>
-        *
-        * @param resultSet The result set to be wrapped
-        *
-        * @exception NullPointerException if <code>resultSet</code>
-        *  is <code>null</code>
-        * @exception SQLException if the metadata for this result set
-        *  cannot be introspected
-        */
-       public ResultSetDynaClass(ResultSet resultSet) throws SQLException {
 
-               this(resultSet, true);
 
-       }
+    /**
+     * <p>Construct a new ResultSetDynaClass for the specified
+     * <code>ResultSet</code>.  The property names corresponding
+     * to column names in the result set will be lower cased.</p>
+     *
+     * @param resultSet The result set to be wrapped
+     *
+     * @exception NullPointerException if <code>resultSet</code>
+     *  is <code>null</code>
+     * @exception SQLException if the metadata for this result set
+     *  cannot be introspected
+     */
+    public ResultSetDynaClass(ResultSet resultSet) throws SQLException {
+
+        this(resultSet, true);
+
+    }
+
+
+    /**
+     * <p>Construct a new ResultSetDynaClass for the specified
+     * <code>ResultSet</code>.  The property names corresponding
+     * to the column names in the result set will be lower cased or not,
+     * depending on the specified <code>lowerCase</code> value.</p>
+     *
+     * <p><strong>WARNING</strong> - If you specify <code>false</code>
+     * for <code>lowerCase</code>, the returned property names will
+     * exactly match the column names returned by your JDBC driver.
+     * Because different drivers might return column names in different
+     * cases, the property names seen by your application will vary
+     * depending on which JDBC driver you are using.</p>
+     *
+     * @param resultSet The result set to be wrapped
+     * @param lowerCase Should property names be lower cased?
+     *
+     * @exception NullPointerException if <code>resultSet</code>
+     *  is <code>null</code>
+     * @exception SQLException if the metadata for this result set
+     *  cannot be introspected
+     */
+    public ResultSetDynaClass(ResultSet resultSet, boolean lowerCase)
+        throws SQLException {
+
+        if (resultSet == null) {
+            throw new NullPointerException();
+        }
+        this.resultSet = resultSet;
+        this.lowerCase = lowerCase;
+        introspect(resultSet);
+
+    }
+
 
+    // ----------------------------------------------------- Instance Variables
 
        /**
         * <p>Construct a new ResultSetDynaClass for the specified
         * <code>ResultSet</code>.  The property names corresponding
-        * to the column names in the result set will be lower cased or not,
-        * depending on the specified <code>lowerCase</code> value.</p>
-        *
-        * <p><strong>WARNING</strong> - If you specify <code>false</code>
-        * for <code>lowerCase</code>, the returned property names will
-        * exactly match the column names returned by your JDBC driver.
-        * Because different drivers might return column names in different
-        * cases, the property names seen by your application will vary
-        * depending on which JDBC driver you are using.</p>
+        * will be case insensitive compared to the properties on the 
+        * input dynaClass and mapped appropriately.</p>
         *
         * @param resultSet The result set to be wrapped
-        * @param lowerCase Should property names be lower cased?
+        * @param dynaClass The DynaClass containing the properties we want to 
map 
         *
         * @exception NullPointerException if <code>resultSet</code>
         *  is <code>null</code>
         * @exception SQLException if the metadata for this result set
         *  cannot be introspected
         */
-       public ResultSetDynaClass(ResultSet resultSet, boolean lowerCase)
-               throws SQLException {
+       public ResultSetDynaClass(ResultSet resultSet, DynaClass dynaClass) 
throws SQLException {
 
                if (resultSet == null) {
                        throw new NullPointerException();
                }
                this.resultSet = resultSet;
-               this.lowerCase = lowerCase;
-               introspect(resultSet);
+               introspect(resultSet, dynaClass);
 
        }
 
 
-       // ----------------------------------------------------- Instance 
Variables
+    /**
+     * Flag defining whether column names should be lower cased when
+     * converted to property names.
+     */
+    protected boolean lowerCase = true;
 
 
-       /**
-        * Flag defining whether column names should be lower cased when
-        * converted to property names.
-        */
-       protected boolean lowerCase = true;
+    /**
+     * The set of dynamic properties that are part of this DynaClass.
+     */
+    protected DynaProperty properties[] = null;
 
 
-       /**
-        * The set of dynamic properties that are part of this DynaClass.
-        */
-       protected DynaProperty properties[] = null;
+    /**
+     * The set of dynamic properties that are part of this DynaClass,
+     * keyed by the property name.  Individual descriptor instances will
+     * be the same instances as those in the <code>properties</code> list.
+     */
+    protected HashMap propertiesMap = new HashMap();
 
 
-       /**
-        * The set of dynamic properties that are part of this DynaClass,
-        * keyed by the property name.  Individual descriptor instances will
-        * be the same instances as those in the <code>properties</code> list.
-        */
-       protected HashMap propertiesMap = new HashMap();
+    /**
+     * <p>The <code>ResultSet</code> we are wrapping.</p>
+     */
+    protected ResultSet resultSet = null;
 
 
-       /**
-        * <p>The <code>ResultSet</code> we are wrapping.</p>
-        */
-       protected ResultSet resultSet = null;
+    // --------------------------------------------------------- Public Methods
 
 
-       // --------------------------------------------------------- Public 
Methods
+    /**
+     * <p>Return an <code>Iterator</code> of [EMAIL PROTECTED] DynaBean} instances for
+     * each row of the wrapped <code>ResultSet</code>, in "forward" order.
+     * Unless the underlying result set supports scrolling, this method
+     * should be called only once.</p>
+     */
+    public Iterator iterator() {
 
+        return (new ResultSetIterator(this));
 
-       /**
-        * <p>Return an <code>Iterator</code> of [EMAIL PROTECTED] DynaBean} instances 
for
-        * each row of the wrapped <code>ResultSet</code>, in "forward" order.
-        * Unless the underlying result set supports scrolling, this method
-        * should be called only once.</p>
-        */
-       public Iterator iterator() {
+    }
 
-               return (new ResultSetIterator(this));
 
-       }
+    // -------------------------------------------------------- Package Methods
 
 
-       // -------------------------------------------------------- Package 
Methods
+    /**
+     * <p>Return the result set we are wrapping.</p>
+     */
+    ResultSet getResultSet() {
 
+        return (this.resultSet);
 
-       /**
-        * <p>Return the result set we are wrapping.</p>
-        */
-       ResultSet getResultSet() {
-
-               return (this.resultSet);
-
-       }
+    }
 
 
-       // ------------------------------------------------------ Protected 
Methods
+    // ------------------------------------------------------ Protected Methods
     
-       /**
-        * <p>Loads the class of the given name which by default uses the class 
loader used 
-        * to load this library.
-        * Dervations of this class could implement alternative class loading 
policies such as
-        * using custom ClassLoader or using the Threads's context class loader 
etc.
-        * </p>
-        */        
-       protected Class loadClass(String className) throws SQLException {
-
-               try {
-                       return getClass().getClassLoader().loadClass(className);
-               } 
-               catch (Exception e) {
-                       throw new SQLException("Cannot load column class '" +
-                                                                  className 
+ "': " + e);
-               }
-       }
-}
-
+    /**
+     * <p>Loads the class of the given name which by default uses the class 
loader used 
+     * to load this library.
+     * Dervations of this class could implement alternative class loading 
policies such as
+     * using custom ClassLoader or using the Threads's context class loader 
etc.
+     * </p>
+     */        
+    protected Class loadClass(String className) throws SQLException {
+
+        try {
+            return getClass().getClassLoader().loadClass(className);
+        } 
+        catch (Exception e) {
+            throw new SQLException("Cannot load column class '" +
+                                   className + "': " + e);
+        }
+    }
+}
\ No newline at end of file

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to