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]);
+ }
+}