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/20 22:29:10 UTC

svn commit: r1533968 - in /commons/proper/beanutils/branches/java5/src: main/java/org/apache/commons/beanutils/converters/ArrayConverter.java test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java

Author: oheger
Date: Sun Oct 20 20:29:10 2013
New Revision: 1533968

URL: http://svn.apache.org/r1533968
Log:
Generified ArrayConverter.

Modified:
    commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/converters/ArrayConverter.java
    commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java

Modified: commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/converters/ArrayConverter.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/converters/ArrayConverter.java?rev=1533968&r1=1533967&r2=1533968&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/converters/ArrayConverter.java (original)
+++ commons/proper/beanutils/branches/java5/src/main/java/org/apache/commons/beanutils/converters/ArrayConverter.java Sun Oct 20 20:29:10 2013
@@ -16,15 +16,16 @@
  */
 package org.apache.commons.beanutils.converters;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Collection;
+import java.io.IOException;
 import java.io.StreamTokenizer;
 import java.io.StringReader;
-import java.io.IOException;
 import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
 import org.apache.commons.beanutils.ConversionException;
 import org.apache.commons.beanutils.Converter;
 
@@ -53,7 +54,7 @@ import org.apache.commons.beanutils.Conv
  *         or by converting the first element in the array to a String - this
  *         is controlled by the {@link ArrayConverter#setOnlyFirstToString(boolean)}
  *         parameter.</li>
- *     <li><b>Multi Dimensional Arrays</b> - its possible to convert a <code>String</code>
+ *     <li><b>Multi Dimensional Arrays</b> - it is possible to convert a <code>String</code>
  *         to a multi-dimensional arrays, by embedding {@link ArrayConverter}
  *         within each other - see example below.</li>
  *     <li><b>Default Value</b></li>
@@ -121,12 +122,13 @@ import org.apache.commons.beanutils.Conv
  *    int[][] result = (int[][])matrixConverter.convert(int[][].class, matrixString);
  * </pre>
  *
+ * @param <D> the default type of this array converter
  * @version $Id$
  * @since 1.8.0
  */
-public class ArrayConverter extends AbstractConverter {
+public class ArrayConverter<D> extends AbstractConverter<D> {
 
-    private final Object defaultTypeInstance;
+    private final Class<D> defaultType;
     private final Converter elementConverter;
     private int defaultSize;
     private char delimiter    = ',';
@@ -145,7 +147,7 @@ public class ArrayConverter extends Abst
      * @param elementConverter Converter used to convert
      *  individual array elements.
      */
-    public ArrayConverter(Class defaultType, Converter elementConverter) {
+    public ArrayConverter(Class<D> defaultType, Converter elementConverter) {
         super();
         if (defaultType == null) {
             throw new IllegalArgumentException("Default type is missing");
@@ -156,7 +158,7 @@ public class ArrayConverter extends Abst
         if (elementConverter == null) {
             throw new IllegalArgumentException("Component Converter is missing.");
         }
-        this.defaultTypeInstance = Array.newInstance(defaultType.getComponentType(), 0);
+        this.defaultType = defaultType;
         this.elementConverter = elementConverter;
     }
 
@@ -172,7 +174,7 @@ public class ArrayConverter extends Abst
      * @param defaultSize Specifies the size of the default array value or if less
      *  than zero indicates that a <code>null</code> default value should be used.
      */
-    public ArrayConverter(Class defaultType, Converter elementConverter, int defaultSize) {
+    public ArrayConverter(Class<D> defaultType, Converter elementConverter, int defaultSize) {
         this(defaultType, elementConverter);
         this.defaultSize = defaultSize;
         Object defaultValue = null;
@@ -220,8 +222,8 @@ public class ArrayConverter extends Abst
      * @return The default type this <code>Converter</code> handles.
      */
     @Override
-    protected Class getDefaultType() {
-        return defaultTypeInstance.getClass();
+    protected Class<D> getDefaultType() {
+        return defaultType;
     }
 
     /**
@@ -235,12 +237,12 @@ public class ArrayConverter extends Abst
     protected String convertToString(Object value) throws Throwable {
 
         int size = 0;
-        Iterator iterator = null;
-        Class type = value.getClass();
+        Iterator<?> iterator = null;
+        Class<?> type = value.getClass();
         if (type.isArray()) {
             size = Array.getLength(value);
         } else {
-            Collection collection = convertToCollection(type, value);
+            Collection<?> collection = convertToCollection(type, value);
             size = collection.size();
             iterator = collection.iterator();
         }
@@ -254,7 +256,7 @@ public class ArrayConverter extends Abst
         }
 
         // Create a StringBuffer containing a delimited list of the values
-        StringBuffer buffer = new StringBuffer();
+        StringBuilder buffer = new StringBuilder();
         for (int i = 0; i < size; i++) {
             if (i > 0) {
                 buffer.append(delimiter);
@@ -279,7 +281,7 @@ public class ArrayConverter extends Abst
      * @throws Throwable if an error occurs converting to the specified type
      */
     @Override
-    protected Object convertToType(Class type, Object value) throws Throwable {
+    protected <T> T convertToType(Class<T> type, Object value) throws Throwable {
 
         if (!type.isArray()) {
             throw new ConversionException(toString(getClass())
@@ -289,17 +291,17 @@ public class ArrayConverter extends Abst
 
         // Handle the source
         int size = 0;
-        Iterator iterator = null;
+        Iterator<?> iterator = null;
         if (value.getClass().isArray()) {
             size = Array.getLength(value);
         } else {
-            Collection collection = convertToCollection(type, value);
+            Collection<?> collection = convertToCollection(type, value);
             size = collection.size();
             iterator = collection.iterator();
         }
 
         // Allocate a new Array
-        Class componentType = type.getComponentType();
+        Class<?> componentType = type.getComponentType();
         Object newArray = Array.newInstance(componentType, size);
 
         // Convert and set each element in the new Array
@@ -311,7 +313,11 @@ public class ArrayConverter extends Abst
             Array.set(newArray, i, element);
         }
 
-        return newArray;
+        @SuppressWarnings("unchecked")
+        // This is safe because T is an array type and newArray is an array of
+        // T's component type
+        T result = (T) newArray;
+        return result;
     }
 
     /**
@@ -346,14 +352,14 @@ public class ArrayConverter extends Abst
      * @param value value to be converted
      * @return Collection elements.
      */
-    protected Collection convertToCollection(Class type, Object value) {
+    protected Collection<?> convertToCollection(Class<?> type, Object value) {
         if (value instanceof Collection) {
-            return (Collection)value;
+            return (Collection<?>)value;
         }
         if (value instanceof Number ||
             value instanceof Boolean ||
             value instanceof java.util.Date) {
-            List list = new ArrayList(1);
+            List<Object> list = new ArrayList<Object>(1);
             list.add(value);
             return list;
         }
@@ -368,7 +374,7 @@ public class ArrayConverter extends Abst
      * @return The default value for the specified type.
      */
     @Override
-    protected Object getDefault(Class type) {
+    protected Object getDefault(Class<?> type) {
         if (type.equals(String.class)) {
             return null;
         }
@@ -393,7 +399,7 @@ public class ArrayConverter extends Abst
      */
     @Override
     public String toString() {
-        StringBuffer buffer = new StringBuffer();
+        StringBuilder buffer = new StringBuilder();
         buffer.append(toString(getClass()));
         buffer.append("[UseDefault=");
         buffer.append(isUseDefault());
@@ -425,7 +431,7 @@ public class ArrayConverter extends Abst
      * @throws NullPointerException if <code>svalue</code>
      *  is <code>null</code>
      */
-    private List parseElements(Class type, String value) {
+    private List<String> parseElements(Class<?> type, String value) {
 
         if (log().isDebugEnabled()) {
             log().debug("Parsing elements, delimiter=[" + delimiter + "], value=[" + value + "]");
@@ -450,13 +456,13 @@ public class ArrayConverter extends Abst
             }
 
             // Split comma-delimited tokens into a List
-            List list = null;
+            List<String> list = null;
             while (true) {
                 int ttype = st.nextToken();
                 if ((ttype == StreamTokenizer.TT_WORD) || (ttype > 0)) {
                     if (st.sval != null) {
                         if (list == null) {
-                            list = new ArrayList();
+                            list = new ArrayList<String>();
                         }
                         list.add(st.sval);
                     }
@@ -469,7 +475,7 @@ public class ArrayConverter extends Abst
             }
 
             if (list == null) {
-                list = Collections.EMPTY_LIST;
+                list = Collections.emptyList();
             }
             if (log().isDebugEnabled()) {
                 log().debug(list.size() + " elements parsed");

Modified: commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java
URL: http://svn.apache.org/viewvc/commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java?rev=1533968&r1=1533967&r2=1533968&view=diff
==============================================================================
--- commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java (original)
+++ commons/proper/beanutils/branches/java5/src/test/java/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java Sun Oct 20 20:29:10 2013
@@ -69,7 +69,7 @@ public class ArrayConverterTestCase exte
         IntegerConverter intConverter = new IntegerConverter(new Integer(0));
         intConverter.setPattern("#,###");
         intConverter.setLocale(Locale.US);
-        ArrayConverter arrayConverter = new ArrayConverter(int[].class, intConverter, 0);
+        ArrayConverter<int[]> arrayConverter = new ArrayConverter<int[]>(int[].class, intConverter, 0);
         arrayConverter.setAllowedChars(new char[] {',', '-'});
         arrayConverter.setDelimiter(';');
 
@@ -81,8 +81,8 @@ public class ArrayConverterTestCase exte
         long[]    longArray    = new long[] {intArray[0], intArray[1], intArray[2], intArray[3]};
         Long[]    LONGArray    = new Long[]    {new Long(intArray[0]),    new Long(intArray[1]),    new Long(intArray[2]),    new Long(intArray[3])};
         Integer[] IntegerArray = new Integer[] {new Integer(intArray[0]), new Integer(intArray[1]), new Integer(intArray[2]), new Integer(intArray[3])};
-        ArrayList strList = new ArrayList();
-        ArrayList longList = new ArrayList();
+        ArrayList<String> strList = new ArrayList<String>();
+        ArrayList<Long> longList = new ArrayList<Long>();
         for (int i = 0; i < strArray.length; i++) {
             strList.add(strArray[i]);
             longList.add(LONGArray[i]);
@@ -212,11 +212,11 @@ public class ArrayConverterTestCase exte
 
         // Configure Converter
         IntegerConverter intConverter = new IntegerConverter();
-        ArrayConverter arrayConverter = new ArrayConverter(int[].class, intConverter);
+        ArrayConverter<int[]> arrayConverter = new ArrayConverter<int[]>(int[].class, intConverter);
 
         // Test Data
         String[] array = new String[] {"10", "  11", "12  ", "  13  "};
-        ArrayList list = new ArrayList();
+        ArrayList<String> list = new ArrayList<String>();
         for (int i = 0; i < array.length; i++) {
             list.add(array[i]);
         }
@@ -280,14 +280,14 @@ public class ArrayConverterTestCase exte
         // Construct an array Converter for an integer array (i.e. int[]) using
         // an IntegerConverter as the element converter.
         // N.B. Uses the default comma (i.e. ",") as the delimiter between individual numbers
-        ArrayConverter arrayConverter = new ArrayConverter(int[].class, integerConverter);
+        ArrayConverter<int[]> arrayConverter = new ArrayConverter<int[]>(int[].class, integerConverter);
 
         // Construct a "Matrix" Converter which converts arrays of integer arrays using
         // the first (int[]) Converter as the element Converter.
         // N.B. Uses a semi-colon (i.e. ";") as the delimiter to separate the different sets of numbers.
         //      Also the delimiter for the above array Converter needs to be added to this
         //      array Converter's "allowed characters"
-        ArrayConverter matrixConverter = new ArrayConverter(int[][].class, arrayConverter);
+        ArrayConverter<int[][]> matrixConverter = new ArrayConverter<int[][]>(int[][].class, arrayConverter);
         matrixConverter.setDelimiter(';');
         matrixConverter.setAllowedChars(new char[] {','});
 
@@ -320,9 +320,9 @@ public class ArrayConverterTestCase exte
         int[]  oneArray   = new int[1];
         IntegerConverter intConverter = new IntegerConverter();
 
-        assertEquals("Null Default", null,   new ArrayConverter(int[].class, intConverter, -1).convert(int[].class, null));
-        checkArray("Zero Length",  zeroArray, new ArrayConverter(int[].class, intConverter, 0).convert(int[].class, null));
-        checkArray("One Length",   oneArray,  new ArrayConverter(Integer[].class, intConverter, 1).convert(int[].class, null));
+        assertEquals("Null Default", null,   new ArrayConverter<int[]>(int[].class, intConverter, -1).convert(int[].class, null));
+        checkArray("Zero Length",  zeroArray, new ArrayConverter<int[]>(int[].class, intConverter, 0).convert(int[].class, null));
+        checkArray("One Length",   oneArray,  new ArrayConverter<Integer[]>(Integer[].class, intConverter, 1).convert(int[].class, null));
     }
 
     /**
@@ -332,8 +332,8 @@ public class ArrayConverterTestCase exte
         int[]  zeroArray  = new int[0];
         IntegerConverter intConverter = new IntegerConverter();
 
-        checkArray("Empty String",  zeroArray, new ArrayConverter(int[].class, intConverter, -1).convert(int[].class, ""));
-        assertEquals("Default String",  null, new ArrayConverter(int[].class, intConverter).convert(String.class, null));
+        checkArray("Empty String",  zeroArray, new ArrayConverter<int[]>(int[].class, intConverter, -1).convert(int[].class, ""));
+        assertEquals("Default String",  null, new ArrayConverter<int[]>(int[].class, intConverter).convert(String.class, null));
     }
 
     /**
@@ -341,19 +341,19 @@ public class ArrayConverterTestCase exte
      */
     public void testErrors() {
         try {
-            new ArrayConverter(null, new DateConverter());
+            new ArrayConverter<Object>(null, new DateConverter());
             fail("Default Type missing - expected IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             // expected result
         }
         try {
-            new ArrayConverter(Boolean.class, new DateConverter());
+            new ArrayConverter<Boolean>(Boolean.class, new DateConverter());
             fail("Default Type not an array - expected IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             // expected result
         }
         try {
-            new ArrayConverter(int[].class, null);
+            new ArrayConverter<int[]>(int[].class, null);
             fail("Component Converter missing - expected IllegalArgumentException");
         } catch (IllegalArgumentException e) {
             // expected result
@@ -365,10 +365,10 @@ public class ArrayConverterTestCase exte
      */
     public void testUnderscore_BEANUTILS_302() {
         String value = "first_value,second_value";
-        ArrayConverter converter = new ArrayConverter(String[].class, new StringConverter());
+        ArrayConverter<String[]> converter = new ArrayConverter<String[]>(String[].class, new StringConverter());
 
         // test underscore not allowed (the default)
-        String[] result = (String[])converter.convert(String[].class, value);
+        String[] result = converter.convert(String[].class, value);
         assertNotNull("result.null", result);
         assertEquals("result.length", 4, result.length);
         assertEquals("result[0]", "first", result[0]);
@@ -380,7 +380,7 @@ public class ArrayConverterTestCase exte
         converter.setAllowedChars(new char[] {'.', '-', '_'});
 
         // test underscore allowed
-        result = (String[])converter.convert(String[].class, value);
+        result = converter.convert(String[].class, value);
         assertNotNull("result.null", result);
         assertEquals("result.length", 2, result.length);
         assertEquals("result[0]", "first_value", result[0]);