[ http://issues.apache.org/jira/browse/BEANUTILS-213?page=all ]
Niall Pemberton updated BEANUTILS-213:
--------------------------------------
Bugzilla Id: (was: 24185)
Component/s: DynaBean
> [beanutils] Enhancement to ResultSetDynaClass to allow case-insensitive and
> missing parameter bean mapping
> ----------------------------------------------------------------------------------------------------------
>
> Key: BEANUTILS-213
> URL: http://issues.apache.org/jira/browse/BEANUTILS-213
> Project: Commons BeanUtils
> Issue Type: Improvement
> Components: DynaBean
> Affects Versions: 1.6.1
> Environment: Operating System: other
> Platform: Other
> Reporter: Michael Mainguy
> Priority: Minor
> Attachments: introspectClassJDBCDynaClass.patch,
> ResultSetDynaClass.java
>
>
> ##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
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]