Author: niallp
Date: Fri Jul 13 23:37:06 2007
New Revision: 556233

URL: http://svn.apache.org/viewvc?view=rev&rev=556233
Log:
BEANUTILS-142 - RowSetDynaClass fails to copy ResultSet to DynaBean with Oracle 
10g JDBC driver
 - remove previous ConvertUtils fix
 - Use SQL Type to determine DynaProperty type for Date/Time/Timestamp
 - Use getDate() / getTime() / getTimestamp() for appropriate DynaProperty 
types (and getObject() for the rest)

Modified:
    
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/JDBCDynaClass.java
    
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
    
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaRowSetTestCase.java
    
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSet.java
    
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSetMetaData.java

Modified: 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/JDBCDynaClass.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/JDBCDynaClass.java?view=diff&rev=556233&r1=556232&r2=556233
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/JDBCDynaClass.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/JDBCDynaClass.java
 Fri Jul 13 23:37:06 2007
@@ -18,9 +18,12 @@
 package org.apache.commons.beanutils;
 
 import java.io.Serializable;
+import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.Time;
+import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
@@ -174,7 +177,17 @@
         }
         String className = null;
         try {
-            className = metadata.getColumnClassName(i);
+            int sqlType = metadata.getColumnType(i);
+            switch (sqlType) {
+                case java.sql.Types.DATE:
+                    return new DynaProperty(name, java.sql.Date.class);
+                case java.sql.Types.TIMESTAMP:
+                    return new DynaProperty(name, java.sql.Timestamp.class);
+                case java.sql.Types.TIME:
+                    return new DynaProperty(name, java.sql.Time.class);
+                default:
+                    className = metadata.getColumnClassName(i);
+            }
         } catch (SQLException e) {
             // this is a patch for HsqlDb to ignore exceptions
             // thrown by its metadata implementation
@@ -233,7 +246,28 @@
      */
     protected Object getObject(ResultSet resultSet, String name) throws 
SQLException {
 
+        DynaProperty property = getDynaProperty(name);
+        if (property == null) {
+            throw new IllegalArgumentException("Invalid name '" + name + "'");
+        }
         String columnName = getColumnName(name);
+        Class type = property.getType();
+
+        // java.sql.Date
+        if (type.equals(Date.class)) {
+            return resultSet.getDate(columnName);
+        }
+
+        // java.sql.Timestamp
+        if (type.equals(Timestamp.class)) {
+            return resultSet.getTimestamp(columnName);
+        }
+
+        // java.sql.Time
+        if (type.equals(Time.class)) {
+            return resultSet.getTime(columnName);
+        }
+
         return resultSet.getObject(columnName);
     }
 

Modified: 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java?view=diff&rev=556233&r1=556232&r2=556233
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/RowSetDynaClass.java
 Fri Jul 13 23:37:06 2007
@@ -230,13 +230,6 @@
             for (int i = 0; i < properties.length; i++) {
                 String name = properties[i].getName();
                 Object value = getObject(resultSet, name);
-                if (value != null) {
-                    Class type = properties[i].getType();
-                    try {
-                        value = ConvertUtils.convert(value, type);
-                    } catch (Throwable t) {
-                    }
-                }
                 bean.set(name, value);
             }
             rows.add(bean);

Modified: 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaRowSetTestCase.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaRowSetTestCase.java?view=diff&rev=556233&r1=556232&r2=556233
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaRowSetTestCase.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaRowSetTestCase.java
 Fri Jul 13 23:37:06 2007
@@ -20,9 +20,12 @@
 
 
 import java.math.BigDecimal;
+import java.sql.Date;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.sql.Types;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -300,21 +303,75 @@
         
     }
 
-    public void testInconsistent() throws Exception {
+    /**
+     * Test issues associated with Oracle JDBC driver.
+     * 
+     * See issue# https://issues.apache.org/jira/browse/BEANUTILS-142
+     * 
+     * @throws Exception if an error occurs
+     */
+    public void testInconsistentOracleDriver() throws Exception {
 
         ResultSetMetaData metaData = TestResultSetMetaData.createProxy(new 
TestResultSetMetaDataInconsistent());
-        ResultSet resultSet = TestResultSet.createProxy(metaData);
-        
+        ResultSet resultSet = TestResultSet.createProxy(new 
TestResultSetInconsistent(metaData));
+
+        // Date Column returns "java.sql.Timestamp" for the column class name 
but ResultSet getObject
+        // returns a java.sql.Date value
         int dateColIdx = 4;
-        assertEquals("Meta Column Name",       "dateProperty",       
metaData.getColumnName(dateColIdx));
-        assertEquals("Meta Column Class Name", "java.sql.Timestamp", 
metaData.getColumnClassName(dateColIdx));
-        assertEquals("ResultSet Value",        java.sql.Date.class,  
resultSet.getObject("dateProperty").getClass());
+        assertEquals("Date Meta Name",       "dateProperty",       
metaData.getColumnName(dateColIdx));
+        assertEquals("Date Meta Class",      "java.sql.Timestamp", 
metaData.getColumnClassName(dateColIdx));
+        assertEquals("Date Meta Type",       java.sql.Types.DATE,  
metaData.getColumnType(dateColIdx));
+        assertEquals("Date ResultSet Value", java.sql.Date.class,  
resultSet.getObject("dateProperty").getClass());
+
+        // Timestamp column class returns a custom Timestamp impl for the 
column class name and ResultSet getObject
+        int timestampColIdx = 13;
+        assertEquals("Timestamp Meta Name",       "timestampProperty",         
    metaData.getColumnName(timestampColIdx));
+        assertEquals("Timestamp Meta Class",      
CustomTimestamp.class.getName(), metaData.getColumnClassName(timestampColIdx));
+        assertEquals("Timestamp Meta Type",       java.sql.Types.TIMESTAMP,    
    metaData.getColumnType(timestampColIdx));
+        assertEquals("Timestamp ResultSet Value", CustomTimestamp.class,       
    resultSet.getObject("timestampProperty").getClass());
 
         RowSetDynaClass inconsistentDynaClass = new RowSetDynaClass(resultSet);
         DynaBean firstRow = (DynaBean)inconsistentDynaClass.getRows().get(0);
-        DynaProperty dynaProperty = 
firstRow.getDynaClass().getDynaProperty("dateproperty");
-        assertEquals("DynaProperty Class", java.sql.Timestamp.class, 
dynaProperty.getType());
-        assertEquals("DynaBean Value",     java.sql.Timestamp.class, 
firstRow.get("dateproperty").getClass());
+        Class expectedType = null;
+        DynaProperty property = null;
+        
+        // Test Date
+        property = firstRow.getDynaClass().getDynaProperty("dateproperty");
+        expectedType = java.sql.Date.class;
+        assertEquals("Date Class", expectedType, property.getType());
+        assertEquals("Date Value", expectedType, 
firstRow.get(property.getName()).getClass());
+
+        // Test Timestamp
+        property = 
firstRow.getDynaClass().getDynaProperty("timestampproperty");
+        expectedType = java.sql.Timestamp.class;
+        assertEquals("Timestamp Class", expectedType, property.getType());
+        assertEquals("Timestamp Value", expectedType, 
firstRow.get(property.getName()).getClass());
+    }
+
+    /**
+     * A proxy ResultSet implementation that returns Timstamp for a date 
column.
+     *
+     * See issue# https://issues.apache.org/jira/browse/BEANUTILS-142 
+     */
+    private static class TestResultSetInconsistent extends  TestResultSet {
+
+        public TestResultSetInconsistent(ResultSetMetaData metaData) {
+            super(metaData);
+        }
+        /**
+         * Get an columns's value
+         * @param columnName Name of the column
+         * @return the column value
+         * @throws SQLException if an error occurs
+         */
+        public Object getObject(String columnName) throws SQLException {
+            if ("timestampProperty".equals(columnName)) {
+                return new CustomTimestamp();
+            } else {
+                return super.getObject(columnName);
+            }
+        }
+
     }
 
     /**
@@ -334,12 +391,20 @@
          * @throws SQLException if an error occurs
          */
         public String getColumnClassName(int columnIndex) throws SQLException {
-            String columnClassName = super.getColumnClassName(columnIndex);
-            if (java.sql.Date.class.getName().equals(columnClassName)) {
+            String columnName = getColumnName(columnIndex);
+            if (columnName.equals("dateProperty")) {
                 return java.sql.Timestamp.class.getName();
+            } else if (columnName.equals("timestampProperty")) {
+                return CustomTimestamp.class.getName();
             } else {
-                return columnClassName;
+                return super.getColumnClassName(columnIndex);
             }
+        }
+    }
+    private static class CustomTimestamp {
+        private long timestamp = new java.util.Date().getTime();
+        public String toString() {
+            return "CustomTimestamp[" + timestamp + "]";
         }
     }
 }

Modified: 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSet.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSet.java?view=diff&rev=556233&r1=556232&r2=556233
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSet.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSet.java
 Fri Jul 13 23:37:06 2007
@@ -78,19 +78,18 @@
      * @return A result set proxy
      */
     public static ResultSet createProxy() {
-        return TestResultSet.createProxy(TestResultSetMetaData.createProxy());
+        return TestResultSet.createProxy(new TestResultSet());
     }
 
     /**
      * Factory method for creating [EMAIL PROTECTED] ResultSet} proxies.
      *
-     * @param resultSetMetaData The result set meta data
+     * @param invocationHandler Invocation Handler
      * @return A result set proxy
      */
-    public static ResultSet createProxy(ResultSetMetaData resultSetMetaData) {
+    public static ResultSet createProxy(InvocationHandler invocationHandler) {
         ClassLoader classLoader = ResultSet.class.getClassLoader();
         Class[] interfaces = new Class[] { ResultSet.class };
-        InvocationHandler invocationHandler = new 
TestResultSet(resultSetMetaData);
         return (ResultSet)Proxy.newProxyInstance(classLoader, interfaces, 
invocationHandler);
     }
     
@@ -126,13 +125,13 @@
         } if ("getMetaData".equals(methodName)) {
             return getMetaData();
         } if ("getObject".equals(methodName)) {
-            String columnName = null;
-            if (args[0] instanceof Integer) {
-                columnName = 
resultSetMetaData.getColumnName(((Integer)args[0]).intValue());
-            } else {
-                columnName = (String)args[0];
-            }
-            return getObject(columnName);
+            return getObject(columnName(args[0]));
+        } if ("getDate".equals(methodName)) {
+            return getDate(columnName(args[0]));
+        } if ("getTime".equals(methodName)) {
+            return getTime(columnName(args[0]));
+        } if ("getTimestamp".equals(methodName)) {
+            return getTimestamp(columnName(args[0]));
         } if ("next".equals(methodName)) {
             return (next() ? Boolean.TRUE : Boolean.FALSE);
         } if ("updateObject".equals(methodName)) {
@@ -143,6 +142,13 @@
         throw new UnsupportedOperationException(methodName + " not 
implemented");
     }
 
+    private String columnName(Object arg) throws SQLException {
+        if (arg instanceof Integer) {
+            return resultSetMetaData.getColumnName(((Integer)arg).intValue());
+        } else {
+            return (String)arg;
+        }
+    }
 
     // ---------------------------------------------------- Implemented Methods
 
@@ -196,6 +202,17 @@
         }
     }
 
+    public Date getDate(String columnName) throws SQLException {
+        return (new Date(timestamp));
+    }
+
+    public Time getTime(String columnName) throws SQLException {
+        return (new Time(timestamp));
+    }
+
+    public Timestamp getTimestamp(String columnName) throws SQLException {
+        return (new Timestamp(timestamp));
+    }
 
     public boolean next() throws SQLException {
         if (row++ < 5) {
@@ -392,9 +409,6 @@
     }
 
 
-    public Date getDate(String columnName) throws SQLException {
-        throw new UnsupportedOperationException();
-    }
 
 
     public Date getDate(String columnName, Calendar cal) throws SQLException {
@@ -517,10 +531,6 @@
     }
 
 
-    public Time getTime(String columnName) throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
 
     public Time getTime(String columnName, Calendar cal) throws SQLException {
         throw new UnsupportedOperationException();
@@ -537,10 +547,6 @@
         throw new UnsupportedOperationException();
     }
 
-
-    public Timestamp getTimestamp(String columnName) throws SQLException {
-        throw new UnsupportedOperationException();
-    }
 
 
     public Timestamp getTimestamp(String columnName, Calendar cal)

Modified: 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSetMetaData.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSetMetaData.java?view=diff&rev=556233&r1=556232&r2=556233
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSetMetaData.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/TestResultSetMetaData.java
 Fri Jul 13 23:37:06 2007
@@ -24,6 +24,7 @@
 import java.lang.reflect.Proxy;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
+import java.sql.Types;
 
 
 /**
@@ -98,6 +99,8 @@
             return new Integer(getColumnCount());
         } if ("getColumnName".equals(methodName)) {
             return getColumnName(((Integer)args[0]).intValue());
+        } if ("getColumnType".equals(methodName)) {
+            return getColumnType(((Integer)args[0]).intValue());
         }
         
         throw new UnsupportedOperationException(methodName + " not 
implemented");
@@ -120,6 +123,42 @@
     }
 
 
+    public Integer getColumnType(int columnIndex) throws SQLException {
+        String columnName = getColumnName(columnIndex);
+        int sqlType = Types.OTHER;
+        if (columnName.equals("bigDecimalProperty")) {
+            sqlType = Types.DECIMAL;
+        } else if (columnName.equals("booleanProperty")) {
+            sqlType = Types.BOOLEAN;
+        } else if (columnName.equals("byteProperty")) {
+            sqlType = Types.TINYINT;
+        } else if (columnName.equals("dateProperty")) {
+            sqlType = Types.DATE;
+        } else if (columnName.equals("doubleProperty")) {
+            sqlType = Types.DOUBLE;
+        } else if (columnName.equals("floatProperty")) {
+            sqlType = Types.FLOAT;
+        } else if (columnName.equals("intProperty")) {
+            sqlType = Types.INTEGER;
+        } else if (columnName.equals("longProperty")) {
+            sqlType = Types.BIGINT;
+        } else if (columnName.equals("nullProperty")) {
+            sqlType = Types.VARCHAR;
+        } else if (columnName.equals("shortProperty")) {
+            sqlType = Types.SMALLINT;
+        } else if (columnName.equals("stringProperty")) {
+            sqlType = Types.VARCHAR;
+        } else if (columnName.equals("timeProperty")) {
+            sqlType = Types.TIME;
+        } else if (columnName.equals("timestampProperty")) {
+            sqlType = Types.TIMESTAMP;
+        } else {
+            sqlType = Types.OTHER;
+        }
+        return new Integer(sqlType);
+    }
+
+
     // -------------------------------------------------- Unimplemented Methods
 
 
@@ -134,11 +173,6 @@
 
 
     public String getColumnLabel(int columnIndex) throws SQLException {
-        throw new UnsupportedOperationException();
-    }
-
-
-    public int getColumnType(int columnIndex) throws SQLException {
         throw new UnsupportedOperationException();
     }
 



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

Reply via email to