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