Author: niallp
Date: Fri Jul 13 21:19:21 2007
New Revision: 556221
URL: http://svn.apache.org/viewvc?view=rev&rev=556221
Log:
BEANUTILS-289 - JDBCDynaClass "lowerCase" option causes problems when using the
DynaProperty name to as the column name when accessing the ResultSet
- add a Cross Reference to JDBCDynaClass when the lower case DynaProperty name
is different from the column name
- provide lookup methods for column names and values
- modify RowSetDynaClass and ResultSetIterator to use the new methods
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/ResultSetDynaClass.java
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetIterator.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/DynaResultSetTestCase.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
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=556221&r1=556220&r2=556221
==============================================================================
---
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 21:19:21 2007
@@ -57,6 +57,12 @@
*/
protected Map propertiesMap = new HashMap();
+ /**
+ * Cross Refernece for column name --> dyna property name
+ * (needed when lowerCase option is true)
+ */
+ private Map columnNameXref;
+
// ------------------------------------------------------ DynaClass Methods
/**
@@ -158,11 +164,13 @@
int i)
throws SQLException {
- String name = null;
- if (lowerCase) {
- name = metadata.getColumnName(i).toLowerCase();
- } else {
- name = metadata.getColumnName(i);
+ String columnName = metadata.getColumnName(i);
+ String name = lowerCase ? columnName.toLowerCase() : columnName;
+ if (!name.equals(columnName)) {
+ if (columnNameXref == null) {
+ columnNameXref = new HashMap();
+ }
+ columnNameXref.put(name, columnName);
}
String className = null;
try {
@@ -213,6 +221,35 @@
propertiesMap.put(properties[i].getName(), properties[i]);
}
+ }
+
+ /**
+ * Get a column value from a [EMAIL PROTECTED] ResultSet} for the
specified name.
+ *
+ * @param resultSet The result set
+ * @param name The property name
+ * @return The value
+ * @throws SQLException if an error occurs
+ */
+ protected Object getObject(ResultSet resultSet, String name) throws
SQLException {
+
+ String columnName = getColumnName(name);
+ return resultSet.getObject(columnName);
+ }
+
+ /**
+ * Get the table column name for the specified property name.
+ *
+ * @param name The property name
+ * @return The column name (which can be different if the <i>lowerCase</i>
+ * option is used).
+ */
+ protected String getColumnName(String name) {
+ if (columnNameXref != null && columnNameXref.containsKey(name)) {
+ return (String)columnNameXref.get(name);
+ } else {
+ return name;
+ }
}
}
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetDynaClass.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetDynaClass.java?view=diff&rev=556221&r1=556220&r2=556221
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetDynaClass.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetDynaClass.java
Fri Jul 13 21:19:21 2007
@@ -166,6 +166,18 @@
}
+ /**
+ * Get a value from the [EMAIL PROTECTED] ResultSet} for the specified
+ * property name.
+ *
+ * @param name The property name
+ * @return The value
+ * @throws SQLException if an error occurs
+ */
+ public Object getObjectFromResultSet(String name) throws SQLException {
+ return getObject(getResultSet(), name);
+ }
+
// -------------------------------------------------------- Package Methods
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetIterator.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetIterator.java?view=diff&rev=556221&r1=556220&r2=556221
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetIterator.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ResultSetIterator.java
Fri Jul 13 21:19:21 2007
@@ -116,7 +116,7 @@
throw new IllegalArgumentException(name);
}
try {
- return (dynaClass.getResultSet().getObject(name));
+ return dynaClass.getObjectFromResultSet(name);
} catch (SQLException e) {
throw new RuntimeException
("get(" + name + "): SQLException: " + e);
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=556221&r1=556220&r2=556221
==============================================================================
---
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 21:19:21 2007
@@ -229,7 +229,7 @@
DynaBean bean = createDynaBean();
for (int i = 0; i < properties.length; i++) {
String name = properties[i].getName();
- Object value = resultSet.getObject(name);
+ Object value = getObject(resultSet, name);
if (value != null) {
Class type = properties[i].getType();
try {
Modified:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaResultSetTestCase.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaResultSetTestCase.java?view=diff&rev=556221&r1=556220&r2=556221
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaResultSetTestCase.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaResultSetTestCase.java
Fri Jul 13 21:19:21 2007
@@ -242,4 +242,63 @@
}
+ /**
+ * Test normal case column names (i.e. not converted to lower case)
+ */
+ public void testIteratorResultsNormalCase() {
+ ResultSetDynaClass dynaClass = null;
+ try {
+ dynaClass = new ResultSetDynaClass(TestResultSet.createProxy(),
false);
+ } catch (Exception e) {
+ fail("Error creating ResultSetDynaClass: " + e);
+ }
+
+ // Grab the third row
+ Iterator rows = dynaClass.iterator();
+ rows.next();
+ rows.next();
+ DynaBean row = (DynaBean) rows.next();
+
+ // Invalid argument test
+ try {
+ row.get("unknownProperty");
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // Expected result
+ }
+
+ // Verify property values
+
+ Object bigDecimalProperty = row.get("bigDecimalProperty");
+ assertNotNull("bigDecimalProperty exists", bigDecimalProperty);
+ assertTrue("bigDecimalProperty type",
+ bigDecimalProperty instanceof BigDecimal);
+ assertEquals("bigDecimalProperty value",
+ 123.45,
+ ((BigDecimal) bigDecimalProperty).doubleValue(),
+ 0.005);
+
+ Object intProperty = row.get("intProperty");
+ assertNotNull("intProperty exists", intProperty);
+ assertTrue("intProperty type",
+ intProperty instanceof Integer);
+ assertEquals("intProperty value",
+ 103,
+ ((Integer) intProperty).intValue());
+
+ Object nullProperty = row.get("nullProperty");
+ assertNull("nullProperty null", nullProperty);
+
+ Object stringProperty = row.get("stringProperty");
+ assertNotNull("stringProperty exists", stringProperty);
+ assertTrue("stringProperty type",
+ stringProperty instanceof String);
+ assertEquals("stringProperty value",
+ "This is a string",
+ (String) stringProperty);
+
+
+ }
+
+
}
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=556221&r1=556220&r2=556221
==============================================================================
---
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 21:19:21 2007
@@ -234,6 +234,62 @@
}
+ /**
+ * Test normal case column names (i.e. not converted to lower case)
+ */
+ public void testListResultsNormalCase() {
+ RowSetDynaClass dynaClass = null;
+ try {
+ dynaClass = new RowSetDynaClass(TestResultSet.createProxy(),
false);
+ } catch (Exception e) {
+ fail("Error creating RowSetDynaClass: " + e);
+ }
+
+ // Grab the third row
+ List rows = dynaClass.getRows();
+ DynaBean row = (DynaBean) rows.get(2);
+
+ // Invalid argument test
+ try {
+ row.get("unknownProperty");
+ fail("Did not throw IllegalArgumentException");
+ } catch (IllegalArgumentException e) {
+ // Expected result
+ }
+
+ // Verify property values
+
+ Object bigDecimalProperty = row.get("bigDecimalProperty");
+ assertNotNull("bigDecimalProperty exists", bigDecimalProperty);
+ assertTrue("bigDecimalProperty type",
+ bigDecimalProperty instanceof BigDecimal);
+ assertEquals("bigDecimalProperty value",
+ 123.45,
+ ((BigDecimal) bigDecimalProperty).doubleValue(),
+ 0.005);
+
+ Object intProperty = row.get("intProperty");
+ assertNotNull("intProperty exists", intProperty);
+ assertTrue("intProperty type",
+ intProperty instanceof Integer);
+ assertEquals("intProperty value",
+ 103,
+ ((Integer) intProperty).intValue());
+
+ Object nullProperty = row.get("nullProperty");
+ assertNull("nullProperty null", nullProperty);
+
+ Object stringProperty = row.get("stringProperty");
+ assertNotNull("stringProperty exists", stringProperty);
+ assertTrue("stringProperty type",
+ stringProperty instanceof String);
+ assertEquals("stringProperty value",
+ "This is a string",
+ (String) stringProperty);
+
+
+ }
+
public void testLimitedRows() throws Exception {
// created one with low limit
@@ -252,7 +308,7 @@
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("ResultSet Value", java.sql.Date.class,
resultSet.getObject("dateProperty").getClass());
RowSetDynaClass inconsistentDynaClass = new RowSetDynaClass(resultSet);
DynaBean firstRow = (DynaBean)inconsistentDynaClass.getRows().get(0);
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=556221&r1=556220&r2=556221
==============================================================================
---
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 21:19:21 2007
@@ -161,35 +161,35 @@
if (row > 5) {
throw new SQLException("No current row");
}
- if ("bigdecimalproperty".equals(columnName)) {
+ if ("bigDecimalProperty".equals(columnName)) {
return (new BigDecimal(123.45));
- } else if ("booleanproperty".equals(columnName)) {
+ } else if ("booleanProperty".equals(columnName)) {
if ((row % 2) == 0) {
return (Boolean.TRUE);
} else {
return (Boolean.FALSE);
}
- } else if ("byteproperty".equals(columnName)) {
+ } else if ("byteProperty".equals(columnName)) {
return (new Byte((byte) row));
- } else if ("dateproperty".equals(columnName)) {
+ } else if ("dateProperty".equals(columnName)) {
return (new Date(timestamp));
- } else if ("doubleproperty".equals(columnName)) {
+ } else if ("doubleProperty".equals(columnName)) {
return (new Double(321.0));
- } else if ("floatproperty".equals(columnName)) {
+ } else if ("floatProperty".equals(columnName)) {
return (new Float((float) 123.0));
- } else if ("intproperty".equals(columnName)) {
+ } else if ("intProperty".equals(columnName)) {
return (new Integer(100 + row));
- } else if ("longproperty".equals(columnName)) {
+ } else if ("longProperty".equals(columnName)) {
return (new Long(200 + row));
- } else if ("nullproperty".equals(columnName)) {
+ } else if ("nullProperty".equals(columnName)) {
return (null);
- } else if ("shortproperty".equals(columnName)) {
+ } else if ("shortProperty".equals(columnName)) {
return (new Short((short) (300 + row)));
- } else if ("stringproperty".equals(columnName)) {
+ } else if ("stringProperty".equals(columnName)) {
return ("This is a string");
- } else if ("timeproperty".equals(columnName)) {
+ } else if ("timeProperty".equals(columnName)) {
return (new Time(timestamp));
- } else if ("timestampproperty".equals(columnName)) {
+ } else if ("timestampProperty".equals(columnName)) {
return (new Timestamp(timestamp));
} else {
throw new SQLException("Unknown column name " + columnName);
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]