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);
+       }
 }


Reply via email to