You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ni...@apache.org on 2007/05/20 03:13:30 UTC
svn commit: r539812 - in /jakarta/commons/proper/beanutils/trunk/src:
java/org/apache/commons/beanutils/converters/ArrayConverter.java
test/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java
Author: niallp
Date: Sat May 19 18:13:29 2007
New Revision: 539812
URL: http://svn.apache.org/viewvc?view=rev&rev=539812
Log:
BEANUTILS-242 - number of small improvements:
- add handling for conversion to String of Collections and non-arrays
- make conversion to String configurable (either first element or delimited list)
- improve conversion to array for primitive and date values
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java
Modified: jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java?view=diff&rev=539812&r1=539811&r2=539812
==============================================================================
--- jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java (original)
+++ jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/converters/ArrayConverter.java Sat May 19 18:13:29 2007
@@ -105,6 +105,7 @@
private int defaultSize;
private char delimiter = ',';
private char[] allowedChars = new char[] {'.', '-'};
+ private boolean onlyFirstToString = true;
// ----------------------------------------------------------- Constructors
@@ -171,6 +172,19 @@
}
/**
+ * Indicates whether converting to a String should create
+ * a delimited list or just convert the first value.
+ *
+ * @param onlyFirstToString <code>true</code> converts only
+ * the first value in the array to a String, <code>false</code>
+ * converts all values in the array into a delimited list (default
+ * is <code>true</code>
+ */
+ public void setOnlyFirstToString(boolean onlyFirstToString) {
+ this.onlyFirstToString = onlyFirstToString;
+ }
+
+ /**
* Convert the input object into a String.
*
* @param value The value to be converted.
@@ -178,25 +192,35 @@
*/
protected String convertToString(Object value) {
+ int size = 0;
+ Iterator iterator = null;
Class type = value.getClass();
- if (!type.isArray()) {
- throw new ConversionException(toString(getClass())
- + " cannot handle conversion from '"
- + toString(type) + "' to String (not an array).");
+ if (type.isArray()) {
+ size = Array.getLength(value);
+ } else if (value instanceof Collection) {
+ Collection collection = (Collection)value;
+ size = collection.size();
+ iterator = collection.iterator();
+ } else {
+ Object converted = elementConverter.convert(String.class, value);
+ return (converted == null ? (String)getDefault(String.class) : converted.toString());
}
- int size = Array.getLength(value);
if (size == 0) {
return (String)getDefault(String.class);
}
+ if (onlyFirstToString) {
+ size = 1;
+ }
+
// Create a StringBuffer containing a delimited list of the values
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < size; i++) {
if (i > 0) {
buffer.append(delimiter);
}
- Object element = Array.get(value, i);
+ Object element = iterator == null ? Array.get(value, i) : iterator.next();
element = elementConverter.convert(String.class, element);
if (element != null) {
buffer.append(element);
@@ -230,12 +254,7 @@
if (value.getClass().isArray()) {
size = Array.getLength(value);
} else {
- Collection collection = null;
- if (value instanceof Collection) {
- collection = (Collection)value;
- } else {
- collection = parseElements(type, value.toString().trim());
- }
+ Collection collection = convertToCollection(type, value);
size = collection.size();
iterator = collection.iterator();
}
@@ -254,6 +273,28 @@
}
return newArray;
+ }
+
+ /**
+ * Convert an Object into a Collection.
+ *
+ * @param type The type to convert the value to
+ * @param value value to be converted
+ * @return List of parsed elements.
+ */
+ protected Collection convertToCollection(Class type, Object value) {
+ if (value instanceof Collection) {
+ return (Collection)value;
+ }
+ if (value instanceof Number ||
+ value instanceof Boolean ||
+ value instanceof java.util.Date) {
+ List list = new ArrayList(1);
+ list.add(value);
+ return list;
+ }
+
+ return parseElements(type, value.toString());
}
/**
Modified: jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java
URL: http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java?view=diff&rev=539812&r1=539811&r2=539812
==============================================================================
--- jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java (original)
+++ jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/converters/ArrayConverterTestCase.java Sat May 19 18:13:29 2007
@@ -131,6 +131,14 @@
fail(msg + " failed " + e);
}
+ // Long --> int[]
+ try {
+ msg = "Long --> int[]";
+ checkArray(msg, new int[] {LONGArray[0].intValue()}, arrayConverter.convert(int[].class, LONGArray[0]));
+ } catch (Exception e) {
+ fail(msg + " failed " + e);
+ }
+
// LONG[] --> int[]
try {
msg = "LONG[] --> int[]";
@@ -139,14 +147,39 @@
fail(msg + " failed " + e);
}
- // LONG[] --> String
+ // Long --> String
+ try {
+ msg = "Long --> String";
+ assertEquals(msg, LONGArray[0] + "", arrayConverter.convert(String.class, LONGArray[0]));
+ } catch (Exception e) {
+ fail(msg + " failed " + e);
+ }
+
+ // LONG[] --> String (first)
try {
- msg = "LONG[] --> String";
+ msg = "LONG[] --> String (first)";
+ assertEquals(msg, LONGArray[0] + "", arrayConverter.convert(String.class, LONGArray));
+ } catch (Exception e) {
+ fail(msg + " failed " + e);
+ }
+
+ // LONG[] --> String (all)
+ try {
+ msg = "LONG[] --> String (all)";
+ arrayConverter.setOnlyFirstToString(false);
assertEquals(msg, stringB, arrayConverter.convert(String.class, LONGArray));
} catch (Exception e) {
fail(msg + " failed " + e);
}
+ // Collection of Long --> String
+ try {
+ msg = "Collection of Long --> String";
+ assertEquals(msg, stringB, arrayConverter.convert(String.class, longList));
+ } catch (Exception e) {
+ fail(msg + " failed " + e);
+ }
+
// LONG[] --> String[]
try {
msg = "long[] --> String[]";
@@ -323,12 +356,6 @@
new ArrayConverter(int[].class, null);
fail("Component Converter missing - expected IllegalArgumentException");
} catch (IllegalArgumentException e) {
- // expected result
- }
- try {
- new ArrayConverter(int[].class, new IntegerConverter()).convert(String.class, "ABC");
- fail("Non-array to String, expected ConversionException");
- } catch (ConversionException e) {
// expected result
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org