You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2013/10/26 21:45:11 UTC

svn commit: r1536029 - in /commons/proper/beanutils/branches/java5/src: main/java/org/apache/commons/beanutils/LazyDynaList.java test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java

Author: oheger
Date: Sat Oct 26 19:45:10 2013
New Revision: 1536029

URL: http://svn.apache.org/r1536029
Log:
Generified LazyDynaList.

This commit also fixes [BEANUTILS-447]; the toArray() method was reworked.
Again the generification is not ideal. It would have been better to use a type
parameter (like LazyDynaList<E>); however, the current implementation as a sub
class of ArrayList and the fact that the element type can change dynamically
makes this pretty hard.

Modified:
    commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/LazyDynaList.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java

Modified: commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/LazyDynaList.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/LazyDynaList.java?rev=1536029&r1=1536028&r2=1536029&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/LazyDynaList.java (original)
+++ commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/LazyDynaList.java Sat Oct 26 19:45:10 2013
@@ -16,11 +16,10 @@
  */
 package org.apache.commons.beanutils;
 
+import java.lang.reflect.Array;
 import java.util.ArrayList;
-import java.util.Map;
 import java.util.Collection;
-import java.util.Iterator;
-import java.lang.reflect.Array;
+import java.util.Map;
 
 /**
  * <h2><i>Lazy</i> DynaBean List.</h2>
@@ -159,7 +158,7 @@ import java.lang.reflect.Array;
  * @version $Id$
  * @since 1.8.0
  */
-public class LazyDynaList extends ArrayList {
+public class LazyDynaList extends ArrayList<Object> {
 
     /**
      * The DynaClass of the List's elements.
@@ -179,12 +178,12 @@ public class LazyDynaList extends ArrayL
     /**
      * The type of the List's elements.
      */
-    private Class elementType;
+    private Class<?> elementType;
 
     /**
      * The DynaBean type of the List's elements.
      */
-    private Class elementDynaBeanType;
+    private Class<?> elementDynaBeanType;
 
 
     // ------------------- Constructors ------------------------------
@@ -224,7 +223,7 @@ public class LazyDynaList extends ArrayL
      *
      * @param elementType The Type of the List's elements.
      */
-    public LazyDynaList(Class elementType) {
+    public LazyDynaList(Class<?> elementType) {
         super();
         setElementType(elementType);
     }
@@ -233,9 +232,9 @@ public class LazyDynaList extends ArrayL
      * Construct a  LazyDynaList populated with the
      * elements of a Collection.
      *
-     * @param collection The Collection to poulate the List from.
+     * @param collection The Collection to populate the List from.
      */
-    public LazyDynaList(Collection collection) {
+    public LazyDynaList(Collection<?> collection) {
         super(collection.size());
         addAll(collection);
     }
@@ -244,7 +243,7 @@ public class LazyDynaList extends ArrayL
      * Construct a  LazyDynaList populated with the
      * elements of an Array.
      *
-     * @param array The Array to poulate the List from.
+     * @param array The Array to populate the List from.
      */
     public LazyDynaList(Object[] array) {
         super(array.length);
@@ -299,7 +298,7 @@ public class LazyDynaList extends ArrayL
      * @return true if elements were added.
      */
     @Override
-    public boolean addAll(Collection collection) {
+    public boolean addAll(Collection<?> collection) {
 
         if (collection == null || collection.size() == 0) {
             return false;
@@ -307,9 +306,8 @@ public class LazyDynaList extends ArrayL
 
         ensureCapacity(size() + collection.size());
 
-        Iterator iterator = collection.iterator();
-        while (iterator.hasNext()) {
-            add(iterator.next());
+        for (Object e : collection) {
+            add(e);
         }
 
         return true;
@@ -329,7 +327,7 @@ public class LazyDynaList extends ArrayL
      * @return true if elements were added.
      */
     @Override
-    public boolean addAll(int index, Collection collection) {
+    public boolean addAll(int index, Collection<?> collection) {
 
         if (collection == null || collection.size() == 0) {
             return false;
@@ -337,7 +335,7 @@ public class LazyDynaList extends ArrayL
 
         ensureCapacity((index > size() ? index : size()) + collection.size());
 
-        // Call "tranform" with first element, before
+        // Call "transform" with first element, before
         // List is "grown" to ensure the correct DynaClass
         // is set.
         if (size() == 0) {
@@ -346,9 +344,9 @@ public class LazyDynaList extends ArrayL
 
         growList(index);
 
-        Iterator iterator = collection.iterator();
-        while (iterator.hasNext()) {
-            add(index++, iterator.next());
+        int currentIndex = index;
+        for (Object e : collection) {
+            add(currentIndex++, e);
         }
 
         return true;
@@ -435,36 +433,40 @@ public class LazyDynaList extends ArrayL
     /**
      * <p>Converts the List to an Array of the specified type.</p>
      *
+     * @param <T> The type of the array elements
      * @param model The model for the type of array to return
      * @return An Array of the elements in this List.
      */
     @Override
-    public Object[] toArray(Object[] model) {
+    public <T> T[] toArray(T[] model) {
 
-        // Allocate the Array
-        Class arrayType = model.getClass().getComponentType();
-        Object[] array = (Object[])Array.newInstance(arrayType, size());
-
-        if (size() == 0 && elementType == null) {
-            return new LazyDynaBean[0];
+        Class<?> arrayType = model.getClass().getComponentType();
+        if ((DynaBean.class.isAssignableFrom(arrayType))
+                || (size() == 0 && elementType == null)) {
+            return super.toArray(model);
         }
 
-        if ((DynaBean.class.isAssignableFrom(arrayType))) {
-            for (int i = 0; i < size(); i++) {
-                array[i] = get(i);
+        if ((arrayType.isAssignableFrom(elementType))) {
+            T[] array;
+            if (model.length >= size()) {
+                array = model;
+            } else {
+                @SuppressWarnings("unchecked")
+                // This is safe because we know the element type
+                T[] tempArray = (T[]) Array.newInstance(arrayType, size());
+                array = tempArray;
             }
-            return array;
-        }
 
-        if ((arrayType.isAssignableFrom(elementType))) {
             for (int i = 0; i < size(); i++) {
+                Object elem;
                 if (Map.class.isAssignableFrom(elementType)) {
-                    array[i] = ((LazyDynaMap)get(i)).getMap();
+                    elem = ((LazyDynaMap) get(i)).getMap();
                 } else if (DynaBean.class.isAssignableFrom(elementType)) {
-                    array[i] = get(i);
+                    elem = get(i);
                 } else {
-                    array[i] = ((WrapDynaBean)get(i)).getInstance();
+                    elem = ((WrapDynaBean) get(i)).getInstance();
                 }
+                Array.set(array, i, elem);
             }
             return array;
         }
@@ -504,7 +506,7 @@ public class LazyDynaList extends ArrayL
      * @exception IllegalArgumentException if the List already
      *            contains elements or the DynaClass is null.
      */
-    public void setElementType(Class elementType) {
+    public void setElementType(Class<?> elementType) {
 
         if (elementType == null) {
             throw new IllegalArgumentException("Element Type is missing");
@@ -529,7 +531,7 @@ public class LazyDynaList extends ArrayL
         // Create a DynaBean
         DynaBean dynaBean = null;
         if (Map.class.isAssignableFrom(elementType)) {
-            dynaBean = new LazyDynaMap((Map)object);
+            dynaBean = new LazyDynaMap((Map<?, ?>)object);
             this.elementDynaClass = dynaBean.getDynaClass();
         } else if (DynaBean.class.isAssignableFrom(elementType)) {
             dynaBean = (DynaBean)object;
@@ -623,14 +625,14 @@ public class LazyDynaList extends ArrayL
      *    <li>DynaBeans are unchanged.</li>
      * </li>
      *
-     * @param element The element to transformt.
+     * @param element The element to transformed.
      * @param The DynaBean to store in the List.
      */
     private DynaBean transform(Object element) {
 
         DynaBean dynaBean     = null;
-        Class newDynaBeanType = null;
-        Class newElementType  = null;
+        Class<?> newDynaBeanType = null;
+        Class<?> newElementType  = null;
 
         // Create a new element
         if (element == null) {
@@ -661,7 +663,7 @@ public class LazyDynaList extends ArrayL
             // Transform Object to a DynaBean
             newElementType = element.getClass();
             if (Map.class.isAssignableFrom(element.getClass())) {
-                dynaBean = new LazyDynaMap((Map)element);
+                dynaBean = new LazyDynaMap((Map<?, ?>)element);
             } else if (DynaBean.class.isAssignableFrom(element.getClass())) {
                 dynaBean = (DynaBean)element;
             } else {

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java?rev=1536029&r1=1536028&r2=1536029&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/LazyDynaListTestCase.java Sat Oct 26 19:45:10 2013
@@ -16,17 +16,18 @@
  */
 package org.apache.commons.beanutils;
 
-import java.util.List;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.TreeMap;
-import java.util.ArrayList;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
-import junit.framework.TestCase;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
 import junit.framework.Test;
+import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 /**
@@ -43,8 +44,8 @@ public class LazyDynaListTestCase extend
                                                new DynaProperty(BASIC_PROP1, String.class),
                                                new DynaProperty(BASIC_PROP2, HashMap.class)};
 
-    protected DynaClass treeMapDynaClass = new LazyDynaMap(new TreeMap());
-    protected DynaClass hashMapDynaClass = new LazyDynaMap(new HashMap());
+    protected DynaClass treeMapDynaClass = new LazyDynaMap(new TreeMap<String, Object>());
+    protected DynaClass hashMapDynaClass = new LazyDynaMap(new HashMap<String, Object>());
     protected DynaClass pojoDynaClass = new WrapDynaBean(new TestBean()).getDynaClass();
     protected DynaClass basicDynaClass = new BasicDynaClass("test", BasicDynaBean.class, properties);
 
@@ -174,15 +175,16 @@ public class LazyDynaListTestCase extend
     /**
      * Test Collection
      */
-    public void testCollection(LazyDynaList list, Class testClass, DynaClass testDynaClass, Object wrongBean) {
+    public void testCollection(LazyDynaList list, Class<?> testClass, DynaClass testDynaClass, Object wrongBean) {
 
         // ----- Create Collection & Array of Maps -----
         int size = 5;
-        List testList = new ArrayList(size);
-        TreeMap[] testArray = new TreeMap[size];
+        List<Object> testList = new ArrayList<Object>(size);
+        TreeMap<?, ?>[] testArray = new TreeMap[size];
         for (int i = 0; i < size; i++) {
-            testArray[i] = new TreeMap();
-            testArray[i].put("prop"+i, "val"+i);
+            TreeMap<String, Object> map = new TreeMap<String, Object>();
+            map.put("prop"+i, "val"+i);
+            testArray[i] = map;
             testList.add(testArray[i]);
         }
 
@@ -192,7 +194,7 @@ public class LazyDynaListTestCase extend
         assertEquals("1. check size", size, lazyList.size());
 
         DynaBean[] dynaArray = lazyList.toDynaBeanArray();
-        TreeMap[]  mapArray  = (TreeMap[])lazyList.toArray();
+        TreeMap<?, ?>[]  mapArray  = (TreeMap[])lazyList.toArray();
 
         // Check values
         assertEquals("2. check size", size, dynaArray.length);
@@ -226,13 +228,13 @@ public class LazyDynaListTestCase extend
      */
     public void testNullType() {
         LazyDynaList lazyList = new LazyDynaList();
-        lazyList.add(new HashMap());
+        lazyList.add(new HashMap<String, Object>());
     }
 
     /**
      * Test DynaBean Create
      */
-    private void dynaBeanTest(LazyDynaList list, Class testClass, DynaClass testDynaClass, Object wrongBean) {
+    private void dynaBeanTest(LazyDynaList list, Class<?> testClass, DynaClass testDynaClass, Object wrongBean) {
 
         // Test get(index) created correct DynaBean - Second
         Object dynaBean = list.get(1);
@@ -276,7 +278,7 @@ public class LazyDynaListTestCase extend
         }
 
         // Create Collection
-        List collection = new ArrayList();
+        List<Object> collection = new ArrayList<Object>();
         try {
             collection.add(testDynaClass.newInstance());
             collection.add(testDynaClass.newInstance());
@@ -339,7 +341,7 @@ public class LazyDynaListTestCase extend
     /**
      * Test Map Create
      */
-    private void mapTest(LazyDynaList list, Class testClass, Object wrongBean) {
+    private void mapTest(LazyDynaList list, Class<?> testClass, Object wrongBean) {
 
         // Test get(index) created correct DynaBean - First
         Object dynaBean = list.get(0);
@@ -355,7 +357,7 @@ public class LazyDynaListTestCase extend
         Object array = list.toArray();
         assertNotNull("5. Array Not Created", array);
         assertEquals("6. Not Map[]", testClass, array.getClass().getComponentType());
-        Map[] mapArray = (Map[])array;
+        Map<?, ?>[] mapArray = (Map[])array;
         assertEquals("7. Array Size Wrong", 1, mapArray.length);
 
         // Test get(index) created correct DynaBean - Third
@@ -388,7 +390,7 @@ public class LazyDynaListTestCase extend
     /**
      * Test Pojo Create
      */
-    private void pojoTest(LazyDynaList list, Class testClass, Object wrongBean) {
+    private void pojoTest(LazyDynaList list, Class<?> testClass, Object wrongBean) {
 
         // Test get(index) created correct DynaBean - First
         Object dynaBean = list.get(0);
@@ -568,4 +570,51 @@ public class LazyDynaListTestCase extend
 
     }
 
-}
\ No newline at end of file
+    /**
+     * Tests toArray() if the list contains DynaBean objects.
+     */
+    public void testToArrayDynaBeans() {
+        LazyDynaList list = new LazyDynaList(LazyDynaBean.class);
+        LazyDynaBean elem = new LazyDynaBean();
+        list.add(elem);
+        LazyDynaBean[] beans = new LazyDynaBean[1];
+        assertSame("Wrong array", beans, list.toArray(beans));
+        assertSame("Wrong element", elem, beans[0]);
+    }
+
+    /**
+     * Tests toArray() if the list contains maps.
+     */
+    public void testToArrayMapType() {
+        LazyDynaList list = new LazyDynaList(HashMap.class);
+        HashMap<String, Object> elem = new HashMap<String, Object>();
+        list.add(elem);
+        Map<?, ?>[] array = new Map[1];
+        assertSame("Wrong array", array, list.toArray(array));
+        assertEquals("Wrong element", elem, array[0]);
+    }
+
+    /**
+     * Tests toArray() for other bean elements.
+     */
+    public void testToArrayOtherType() {
+        LazyDynaList list = new LazyDynaList(TestBean.class);
+        TestBean elem = new TestBean();
+        list.add(elem);
+        TestBean[] array = new TestBean[1];
+        assertSame("Wrong array", array, list.toArray(array));
+        assertEquals("Wrong element", elem, array[0]);
+    }
+
+    /**
+     * Tests toArray() if the array's size does not fit the collection size.
+     */
+    public void testToArrayUnsufficientSize() {
+        LazyDynaList list = new LazyDynaList(LazyDynaBean.class);
+        LazyDynaBean elem = new LazyDynaBean();
+        list.add(elem);
+        LazyDynaBean[] array = (LazyDynaBean[]) list.toArray(new LazyDynaBean[0]);
+        assertEquals("Wrong array size", 1, array.length);
+        assertEquals("Wrong element", elem, array[0]);
+    }
+}