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]