Author: niallp
Date: Tue Jun 26 22:34:15 2007
New Revision: 551047

URL: http://svn.apache.org/viewvc?view=rev&rev=551047
Log:
BEANUTILS-258 Improve ConvertUtilsBean's new convert(Object, Class) method - if 
the registered Converter cannot handle conversion to String then try using the 
registered String converter, before trying the Object's toString() method. 
Highlighted by the problems BeanUtils changes caused to Betwixt - thanks to 
Martin van den Bemt - see http://tinyurl.com/26ahat

Modified:
    
jakarta/commons/proper/beanutils/trunk/src/java/org/apache/commons/beanutils/ConvertUtilsBean.java
    
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/ConvertUtilsTestCase.java

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=551047&r1=551046&r2=551047
==============================================================================
--- 
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
 Tue Jun 26 22:34:15 2007
@@ -544,7 +544,23 @@
         }
         if (targetType == String.class && converted != null && 
                 !(converted instanceof String)) {
-            converted = converted.toString();
+
+            // NOTE: For backwards compatibility, if the Converter
+            //       doesn't handle  conversion-->String then
+            //       use the registered String Converter
+            converter = lookup(String.class);
+            if (converter != null) {
+                if (log.isTraceEnabled()) {
+                    log.trace("  Using converter " + converter);
+                }
+                converted = converter.convert(String.class, converted);
+            }
+
+            // If the object still isn't a String, use toString() method
+            if (converted != null && !(converted instanceof String)) {
+                converted = converted.toString();
+            }
+
         }
         return converted;
 

Modified: 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/ConvertUtilsTestCase.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/ConvertUtilsTestCase.java?view=diff&rev=551047&r1=551046&r2=551047
==============================================================================
--- 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/ConvertUtilsTestCase.java
 (original)
+++ 
jakarta/commons/proper/beanutils/trunk/src/test/org/apache/commons/beanutils/ConvertUtilsTestCase.java
 Tue Jun 26 22:34:15 2007
@@ -614,23 +614,46 @@
     }
 
     public void testConvertToString() throws Exception {
+        Converter dummyConverter = new Converter() {
+            public Object convert(Class type, Object value) {
+                return value;
+            }
+        };
 
-        ConvertUtilsBean utils = new ConvertUtilsBean();
+        Converter fooConverter = new Converter() {
+            public Object convert(Class type, Object value) {
+                return "Foo-Converter";
+            }
+        };
 
-        // Register a DateConverter using Locale.US
         DateConverter dateConverter = new DateConverter();
         dateConverter.setLocale(Locale.US);
+
+        ConvertUtilsBean utils = new ConvertUtilsBean();
         utils.register(dateConverter, java.util.Date.class);
+        utils.register(fooConverter, String.class);
 
+        // Convert using registerd DateConverter
         java.util.Date today = new java.util.Date();
         DateFormat fmt = new SimpleDateFormat("M/d/yy"); /* US Short Format */
         String expected = fmt.format(today);
-
-        assertEquals("date M/d/yy", expected, utils.convert(today, 
String.class));
+        assertEquals("DateConverter M/d/yy", expected, utils.convert(today, 
String.class));
         
-        // Remove the registered DateConverter
+        // Date converter doesn't do String conversion - use String Converter
+        utils.register(dummyConverter, java.util.Date.class);
+        assertEquals("Date Converter doesn't do String conversion", 
"Foo-Converter", utils.convert(today, String.class));
+        
+        // No registered Date converter - use String Converter
         utils.deregister(java.util.Date.class);
-        assertEquals("Date.toString()", today.toString(), utils.convert(today, 
String.class));
+        assertEquals("No registered Date converter", "Foo-Converter", 
utils.convert(today, String.class));
+        
+        // String Converter doesn't do Strings!!!
+        utils.register(dummyConverter, String.class);
+        assertEquals("String Converter doesn't do Strings!!!", 
today.toString(), utils.convert(today, String.class));
+        
+        // No registered Date or String converter - use Object's toString()
+        utils.deregister(String.class);
+        assertEquals("Object's toString()", today.toString(), 
utils.convert(today, String.class));
         
     }
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to