Author: niallp
Date: Sat May 19 23:39:21 2007
New Revision: 539832
URL: http://svn.apache.org/viewvc?view=rev&rev=539832
Log:
BEANUTILS-258 - add new convert() and lookup() methods to ConvertUtils that
utilize the capabilities of the improved Converter implementations. Also modify
BeanUtils to use the new methods.
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/BeanUtilsBean.java
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtils.java
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/BeanUtilsTestCase.java
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaBeanUtilsTestCase.java
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/BeanUtilsBean.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/BeanUtilsBean.java?view=diff&rev=539832&r1=539831&r2=539832
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/BeanUtilsBean.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/BeanUtilsBean.java
Sat May 19 23:39:21 2007
@@ -394,11 +394,7 @@
// Convert the specified value to the required type and store it
if (index >= 0) { // Destination must be indexed
- Converter converter =
getConvertUtils().lookup(type.getComponentType());
- if (converter != null) {
- log.trace(" USING CONVERTER " + converter);
- value = converter.convert(type.getComponentType(), value);
- }
+ value = getConvertUtils().convert(value, type.getComponentType());
try {
getPropertyUtils().setIndexedProperty(target, propName,
index, value);
@@ -418,11 +414,7 @@
(e, "Cannot set " + propName);
}
} else { // Destination must be simple
- Converter converter = getConvertUtils().lookup(type);
- if (converter != null) {
- log.trace(" USING CONVERTER " + converter);
- value = converter.convert(type, value);
- }
+ value = getConvertUtils().convert(value, type);
try {
getPropertyUtils().setSimpleProperty(target, propName, value);
} catch (NoSuchMethodException e) {
@@ -961,7 +953,13 @@
// Convert the specified value to the required type
Object newValue = null;
- if (type.isArray() && (index < 0)) { // Scalar value into array
+ Class sourceType = value == null ? null : value.getClass();
+ Class targetType = (type.isArray() && (index >= 0) ?
type.getComponentType() : type);
+ Converter converter = getConvertUtils().lookup(sourceType, targetType);
+ if (converter != null) {
+ newValue = converter.convert(targetType, value);
+ newValue = (targetType == String.class && newValue != null ?
newValue.toString() : newValue);
+ } else if (type.isArray() && (index < 0)) { // Scalar value into array
if (value == null) {
String values[] = new String[1];
values[0] = (String) value;
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtils.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtils.java?view=diff&rev=539832&r1=539831&r2=539832
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtils.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtils.java
Sat May 19 23:39:21 2007
@@ -261,6 +261,21 @@
}
+ /**
+ * <p>Convert the value to an object of the specified class (if
+ * possible).</p>
+ *
+ * @param value Value to be converted (may be null)
+ * @param targetType Class of the value to be converted to
+ * @return The converted value
+ *
+ * @exception ConversionException if thrown by an underlying Converter
+ */
+ public static Object convert(Object value, Class targetType) {
+
+ return ConvertUtilsBean.getInstance().convert(value, targetType);
+
+ }
/**
* <p>Remove all registered [EMAIL PROTECTED] Converter}s, and
re-establish the
@@ -310,6 +325,20 @@
}
+ /**
+ * Look up and return any registered [EMAIL PROTECTED] Converter} for the
specified
+ * source and destination class; if there is no registered Converter,
+ * return <code>null</code>.
+ *
+ * @param sourceType Class of the value being converted
+ * @param targetType Class of the value to be converted to
+ * @return The registered [EMAIL PROTECTED] Converter} or
<code>null</code> if not found
+ */
+ public static Converter lookup(Class sourceType, Class targetType) {
+
+ return ConvertUtilsBean.getInstance().lookup(sourceType, targetType);
+
+ }
/**
* <p>Register a custom [EMAIL PROTECTED] Converter} for the specified
destination
Modified:
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java?view=diff&rev=539832&r1=539831&r2=539832
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
Sat May 19 23:39:21 2007
@@ -27,6 +27,7 @@
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
+import java.util.Collection;
import java.util.Map;
import java.util.HashMap;
import org.apache.commons.beanutils.converters.BigDecimalConverter;
@@ -434,12 +435,10 @@
if (value == null) {
return ((String) null);
} else {
- Converter converter = lookup(String.class);
- return ((String) converter.convert(String.class, value));
+ return ((String)convert(value, String.class));
}
} else {
- Converter converter = lookup(String.class);
- return ((String) converter.convert(String.class, value));
+ return ((String)convert(value, String.class));
}
}
@@ -490,6 +489,10 @@
Class type = clazz;
if (clazz.isArray()) {
+ Converter converter = lookup(clazz);
+ if (converter != null) {
+ return converter.convert(clazz, values);
+ }
type = clazz.getComponentType();
}
if (log.isDebugEnabled()) {
@@ -513,6 +516,45 @@
/**
+ * <p>Convert the value to an object of the specified class (if
+ * possible).</p>
+ *
+ * @param value Value to be converted (may be null)
+ * @param targetType Class of the value to be converted to
+ * @return The converted value
+ *
+ * @exception ConversionException if thrown by an underlying Converter
+ */
+ public Object convert(Object value, Class targetType) {
+
+ Class sourceType = value == null ? null : value.getClass();
+
+ if (log.isDebugEnabled()) {
+ if (value == null) {
+ log.debug("Convert null value to type '" +
+ targetType.getName() + "'");
+ } else {
+ log.debug("Convert type '" + sourceType.getName() + "' value
'" + value +
+ "' to type '" + targetType.getName() + "'");
+ }
+ }
+
+ Object converted = value;
+ Converter converter = lookup(sourceType, targetType);
+ if (converter != null) {
+ if (log.isTraceEnabled()) {
+ log.trace(" Using converter " + converter);
+ }
+ converted = converter.convert(targetType, value);
+ }
+ if (targetType == String.class && value != null) {
+ converted = value.toString();
+ }
+ return converted;
+
+ }
+
+ /**
* Remove all registered [EMAIL PROTECTED] Converter}s, and re-establish
the
* standard Converters.
*/
@@ -614,6 +656,51 @@
}
+ /**
+ * Look up and return any registered [EMAIL PROTECTED] Converter} for the
specified
+ * source and destination class; if there is no registered Converter,
+ * return <code>null</code>.
+ *
+ * @param sourceType Class of the value being converted
+ * @param targetType Class of the value to be converted to
+ * @return The registered [EMAIL PROTECTED] Converter} or
<code>null</code> if not found
+ */
+ public Converter lookup(Class sourceType, Class targetType) {
+
+ if (targetType == null) {
+ throw new IllegalArgumentException("Target type is missing");
+ }
+
+ Converter converter = null;
+ // Convert --> String
+ if (targetType == String.class) {
+ if (sourceType != null) {
+ converter = lookup(sourceType);
+ if (converter == null && (sourceType.isArray() ||
+ Collection.class.isAssignableFrom(sourceType))) {
+ converter = lookup(String[].class);
+ }
+ }
+ if (converter == null) {
+ converter = lookup(String.class);
+ }
+ return converter;
+ }
+
+ // Convert --> String array
+ if (targetType == String[].class) {
+ if (sourceType != null && sourceType.isArray()) {
+ converter = lookup(sourceType);
+ }
+ if (converter == null) {
+ converter = lookup(String[].class);
+ }
+ } else {
+ converter = lookup(targetType);
+ }
+ return converter;
+
+ }
/**
* Register a custom [EMAIL PROTECTED] Converter} for the specified
destination
Modified:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/BeanUtilsTestCase.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/BeanUtilsTestCase.java?view=diff&rev=539832&r1=539831&r2=539832
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/BeanUtilsTestCase.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/BeanUtilsTestCase.java
Sat May 19 23:39:21 2007
@@ -794,9 +794,7 @@
assertTrue("stringArray of correct type",
newValue instanceof String[]);
assertEquals("stringArray length",
- 1, ((String[]) newValue).length);
- assertTrue("stringArray[0] is null",
- ((String[]) newValue)[0] == null);
+ 0, ((String[]) newValue).length);
PropertyUtils.setProperty(bean, "stringArray", oldValue);
// Indexed value into array
@@ -1298,13 +1296,6 @@
BeanUtilsBean beanUtils = new BeanUtilsBean(
new ConvertUtilsBean(),
new PropertyUtilsBean());
- beanUtils.getConvertUtils().register(
- new Converter () {
- public Object convert(Class type, Object value) {
- return "Spam, spam, spam, spam!";
- }
- },
- String.class);
TestBean bean = new TestBean();
String [] results = beanUtils.getArrayProperty(bean, "intArray");
@@ -1317,7 +1308,7 @@
for (int i=0, size=values.length ; i<size; i++) {
assertEquals(
"Value " + i + " incorrectly converted ",
- "Spam, spam, spam, spam!",
+ values[i] + "",
results[i]);
}
}
Modified:
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaBeanUtilsTestCase.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaBeanUtilsTestCase.java?view=diff&rev=539832&r1=539831&r2=539832
==============================================================================
---
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaBeanUtilsTestCase.java
(original)
+++
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/DynaBeanUtilsTestCase.java
Sat May 19 23:39:21 2007
@@ -907,9 +907,7 @@
assertTrue("stringArray of correct type",
newValue instanceof String[]);
assertEquals("stringArray length",
- 1, ((String[]) newValue).length);
- assertTrue("stringArray[0] is null",
- ((String[]) newValue)[0] == null);
+ 0, ((String[]) newValue).length);
PropertyUtils.setProperty(bean, "stringArray", oldValue);
// Indexed value into array
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]