Author: britter
Date: Wed Jul 16 16:55:17 2014
New Revision: 1611088

URL: http://svn.apache.org/r1611088
Log:
DBUTILS-114: Order of columns not retained in BasicRowProcessor with HashMap. 
Thanks to Michael Osipov.

Modified:
    commons/proper/dbutils/trunk/src/changes/changes.xml
    
commons/proper/dbutils/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java
    
commons/proper/dbutils/trunk/src/test/java/org/apache/commons/dbutils/BasicRowProcessorTest.java

Modified: commons/proper/dbutils/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/changes/changes.xml?rev=1611088&r1=1611087&r2=1611088&view=diff
==============================================================================
--- commons/proper/dbutils/trunk/src/changes/changes.xml (original)
+++ commons/proper/dbutils/trunk/src/changes/changes.xml Wed Jul 16 16:55:17 
2014
@@ -44,6 +44,9 @@ The <action> type attribute can be add,u
   </properties>
   <body>
     <release version="1.6" date="TBA" description="Bugfixes and addition of 
insert methods">
+      <action dev="britter" type="fix" issue="DBUTILS-114" due-to="Michael 
Osipov">
+        Order of columns not retained in BasicRowProcessor with HashMap
+      </action>
       <action dev="britter" type="fix" issue="DBUTILS-118" due-to="Feysal 
Rujbally, Daniele Cremonini">
         BeanProcessor not returning nanoseconds
       </action>

Modified: 
commons/proper/dbutils/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java?rev=1611088&r1=1611087&r2=1611088&view=diff
==============================================================================
--- 
commons/proper/dbutils/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java
 (original)
+++ 
commons/proper/dbutils/trunk/src/main/java/org/apache/commons/dbutils/BasicRowProcessor.java
 Wed Jul 16 16:55:17 2014
@@ -20,6 +20,7 @@ import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
 import java.sql.SQLException;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -140,14 +141,19 @@ public class BasicRowProcessor implement
     }
 
     /**
-     * Convert a <code>ResultSet</code> row into a <code>Map</code>.  This
-     * implementation returns a <code>Map</code> with case insensitive column
-     * names as keys.  Calls to <code>map.get("COL")</code> and
-     * <code>map.get("col")</code> return the same value.
-     * @see org.apache.commons.dbutils.RowProcessor#toMap(java.sql.ResultSet)
+     * Convert a <code>ResultSet</code> row into a <code>Map</code>.
+     *
+     * <p>
+     * This implementation returns a <code>Map</code> with case insensitive 
column names as keys. Calls to
+     * <code>map.get("COL")</code> and <code>map.get("col")</code> return the 
same value. Furthermore this implementation
+     * will return an ordered map, that preserves the ordering of the columns 
in the ResultSet, so that iterating over
+     * the entry set of the returned map will return the first column of the 
ResultSet, then the second and so forth.
+     * </p>
+     *
      * @param rs ResultSet that supplies the map data
-     * @throws SQLException if a database access error occurs
      * @return the newly created Map
+     * @throws SQLException if a database access error occurs
+     * @see org.apache.commons.dbutils.RowProcessor#toMap(java.sql.ResultSet)
      */
     @Override
     public Map<String, Object> toMap(ResultSet rs) throws SQLException {
@@ -176,12 +182,12 @@ public class BasicRowProcessor implement
      * achieve the case insensitive lookup.
      *
      * <p>Note: This implementation does not allow <tt>null</tt>
-     * for key, whereas {@link HashMap} does, because of the code:
+     * for key, whereas {@link LinkedHashMap} does, because of the code:
      * <pre>
      * key.toString().toLowerCase()
      * </pre>
      */
-    private static class CaseInsensitiveHashMap extends HashMap<String, 
Object> {
+    private static class CaseInsensitiveHashMap extends LinkedHashMap<String, 
Object> {
         /**
          * The internal mapping from lowercase keys to the real keys.
          *

Modified: 
commons/proper/dbutils/trunk/src/test/java/org/apache/commons/dbutils/BasicRowProcessorTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbutils/trunk/src/test/java/org/apache/commons/dbutils/BasicRowProcessorTest.java?rev=1611088&r1=1611087&r2=1611088&view=diff
==============================================================================
--- 
commons/proper/dbutils/trunk/src/test/java/org/apache/commons/dbutils/BasicRowProcessorTest.java
 (original)
+++ 
commons/proper/dbutils/trunk/src/test/java/org/apache/commons/dbutils/BasicRowProcessorTest.java
 Wed Jul 16 16:55:17 2014
@@ -20,6 +20,7 @@ import java.sql.SQLException;
 import java.text.DateFormat;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -137,4 +138,24 @@ public class BasicRowProcessorTest exten
         assertFalse(this.rs.next());
     }
 
+    public void testToMapOrdering() throws SQLException {
+
+        assertTrue(this.rs.next());
+        Map<String, Object> m = processor.toMap(this.rs);
+
+        Iterator<String> itr = m.keySet().iterator();
+        assertEquals("one", itr.next());
+        assertEquals("two", itr.next());
+        assertEquals("three", itr.next());
+        assertEquals("notInBean", itr.next());
+        assertEquals("intTest", itr.next());
+        assertEquals("integerTest", itr.next());
+        assertEquals("nullObjectTest", itr.next());
+        assertEquals("nullPrimitiveTest", itr.next());
+        assertEquals("notDate", itr.next());
+        assertEquals("columnProcessorDoubleTest", itr.next());
+
+        assertFalse(itr.hasNext());
+    }
+
 }


Reply via email to