Author: jdonnerstag Date: Sun Apr 17 15:47:15 2011 New Revision: 1094162 URL: http://svn.apache.org/viewvc?rev=1094162&view=rev Log: fixed org.apache.wicket.util.lang.PropertyResolverConverter Type Erasure leads to Sloppy Typing Issue: WICKET-3441
Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java Modified: wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java?rev=1094162&r1=1094161&r2=1094162&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java (original) +++ wicket/trunk/wicket-core/src/main/java/org/apache/wicket/util/lang/PropertyResolverConverter.java Sun Apr 17 15:47:15 2011 @@ -47,11 +47,15 @@ public class PropertyResolverConverter i } /** + * @param <T> + * target type + * @param <I> + * input object's type * @param object * @param clz * @return The converted object */ - public Object convert(Object object, Class<?> clz) + public <T, I> Object convert(I object, Class<T> clz) { if (object == null) { @@ -61,14 +65,14 @@ public class PropertyResolverConverter i { return object; } - IConverter converter = converterSupplier.getConverter(clz); + IConverter<T> converter = converterSupplier.getConverter(clz); if (object instanceof String) { return converter.convertToObject((String)object, locale); } else if (clz == String.class) { - return converter.convertToString(object, locale); + return convertToString(object, locale); } else { @@ -81,8 +85,17 @@ public class PropertyResolverConverter i // ignore that try it the other way } // go through string to convert to the right object. - String tmp = converter.convertToString(object, locale); + String tmp = convertToString(object, locale); return converter.convertToObject(tmp, locale); } } + + protected <C> String convertToString(C object, Locale locale) + { + @SuppressWarnings("unchecked") + Class<C> type = (Class<C>)object.getClass(); + + IConverter<C> converterForObj = converterSupplier.getConverter(type); + return converterForObj.convertToString(object, locale); + } } Modified: wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java URL: http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java?rev=1094162&r1=1094161&r2=1094162&view=diff ============================================================================== --- wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java (original) +++ wicket/trunk/wicket-core/src/test/java/org/apache/wicket/util/lang/PropertyResolverTest.java Sun Apr 17 15:47:15 2011 @@ -19,6 +19,8 @@ package org.apache.wicket.util.lang; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -26,9 +28,12 @@ import java.util.Map; import java.util.Vector; import org.apache.wicket.ConverterLocator; +import org.apache.wicket.IConverterLocator; import org.apache.wicket.WicketRuntimeException; import org.apache.wicket.WicketTestCase; import org.apache.wicket.util.convert.ConversionException; +import org.apache.wicket.util.convert.IConverter; +import org.apache.wicket.util.convert.converter.AbstractConverter; /** * @author jcompagner @@ -610,7 +615,7 @@ public class PropertyResolverTest extend private static final long serialVersionUID = 1L; @Override - public Object convert(Object object, Class<?> clz) + public <T, I> Object convert(I object, java.lang.Class<T> clz) { return null; } @@ -623,4 +628,79 @@ public class PropertyResolverTest extend assertTrue(e.getMessage().toLowerCase().contains("name")); } } + + /** + * WICKET-3441 + */ + public void testDateToStringConverting() + { + IConverterLocator converterLocator = new ConverterLocator(); + Locale locale = Locale.GERMAN; + PropertyResolverConverter converter = new PropertyResolverConverter(converterLocator, + locale); + + Calendar calDate = Calendar.getInstance(); + calDate.clear(); + calDate.set(2011, Calendar.APRIL, 17); + Date date = calDate.getTime(); + + Object actual = converter.convert(date, String.class); + String expected = converterLocator.getConverter(Date.class).convertToString(date, locale); + assertEquals(expected, actual); + } + + /** + * WICKET-3441 + */ + public void testDateToLongConverting() + { + ConverterLocator converterLocator = new ConverterLocator(); + final IConverter<Date> dateConverter = converterLocator.get(Date.class); + IConverter<Long> customLongConverter = new AbstractConverter<Long>() + { + private static final long serialVersionUID = 1L; + + public Long convertToObject(String value, Locale locale) + { + Date date = dateConverter.convertToObject(value, locale); + return date != null ? date.getTime() : null; + } + + @Override + public String convertToString(Long value, Locale locale) + { + Date date; + if (value != null) + { + date = new Date(); + date.setTime(value); + } + else + { + date = null; + } + + return dateConverter.convertToString(date, locale); + } + + @Override + protected Class<Long> getTargetType() + { + return Long.class; + } + }; + converterLocator.set(Long.class, customLongConverter); + converterLocator.set(Long.TYPE, customLongConverter); + + PropertyResolverConverter converter = new PropertyResolverConverter(converterLocator, + Locale.ENGLISH); + + Calendar calDate = Calendar.getInstance(); + calDate.clear(); + calDate.set(2011, Calendar.APRIL, 17); + Date date = calDate.getTime(); + + Object actual = converter.convert(date, Long.class); + assertEquals(date.getTime(), actual); + } }