Updated Branches:
  refs/heads/master bcbfeac26 -> 8b294488e

WICKET-4839 ConverterLocator should create a new instance for all date based 
converters


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/8b294488
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8b294488
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8b294488

Branch: refs/heads/master
Commit: 8b294488ed2e2954ffea8642cfd3e62db7a8b314
Parents: bcbfeac
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Mon Nov 5 09:03:12 2012 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Mon Nov 5 09:04:17 2012 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/ConverterLocator.java   |   49 +++++++--------
 .../org/apache/wicket/ConverterLocatorTest.java    |   46 ++++++++++++-
 2 files changed, 66 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8b294488/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
----------------------------------------------------------------------
diff --git a/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java 
b/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
index 5e48a83..6c85808 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
@@ -189,33 +189,32 @@ public class ConverterLocator implements IConverterLocator
        public final <C> IConverter<C> get(Class<C> c)
        {
                @SuppressWarnings("unchecked")
-               final IConverter<C> converter;
+               IConverter<C> converter = 
(IConverter<C>)classToConverter.get(c.getName());
 
-               // Date based converters work with thread unsafe DateFormats and
-               // a new instance should be created for each usage
-               if (Date.class.equals(c))
-               {
-                       converter = (IConverter<C>) new DateConverter();
-               }
-               else if  (java.sql.Date.class.equals(c))
-               {
-                       converter = (IConverter<C>) new SqlDateConverter();
-               }
-               else if (java.sql.Time.class.equals(c))
-               {
-                       converter = (IConverter<C>) new SqlTimeConverter();
-               }
-               else if (java.sql.Timestamp.class.equals(c))
-               {
-                       converter = (IConverter<C>) new SqlTimestampConverter();
-               }
-               else if (Calendar.class.equals(c))
-               {
-                       converter = (IConverter<C>) new CalendarConverter();
-               }
-               else
+               if (converter == null)
                {
-                       converter = 
(IConverter<C>)classToConverter.get(c.getName());
+                       // Date based converters work with thread unsafe 
DateFormats and
+                       // a new instance should be created for each usage
+                       if (Date.class.equals(c))
+                       {
+                               converter = (IConverter<C>) new DateConverter();
+                       }
+                       else if  (java.sql.Date.class.equals(c))
+                       {
+                               converter = (IConverter<C>) new 
SqlDateConverter();
+                       }
+                       else if (java.sql.Time.class.equals(c))
+                       {
+                               converter = (IConverter<C>) new 
SqlTimeConverter();
+                       }
+                       else if (java.sql.Timestamp.class.equals(c))
+                       {
+                               converter = (IConverter<C>) new 
SqlTimestampConverter();
+                       }
+                       else if (Calendar.class.equals(c))
+                       {
+                               converter = (IConverter<C>) new 
CalendarConverter();
+                       }
                }
                return converter;
        }

http://git-wip-us.apache.org/repos/asf/wicket/blob/8b294488/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
----------------------------------------------------------------------
diff --git 
a/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java 
b/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
index b1d0d60..870ece3 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
@@ -17,8 +17,11 @@
 package org.apache.wicket;
 
 import java.io.Serializable;
+import java.util.Date;
 import java.util.Locale;
 
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.convert.converter.DateConverter;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -29,10 +32,7 @@ import org.junit.Test;
  */
 public final class ConverterLocatorTest extends Assert
 {
-       /** Dutch locale for localized testing. */
-       private static final Locale DUTCH_LOCALE = new Locale("nl", "NL");
-
-       private final IConverterLocator locator = new ConverterLocator();
+       private final ConverterLocator locator = new ConverterLocator();
 
        /**
         * Test generalized conversion
@@ -57,4 +57,42 @@ public final class ConverterLocatorTest extends Assert
                        
locator.getConverter(Serializable.class).convertToObject("test", Locale.US));
                assertEquals("test", 
locator.getConverter(Object.class).convertToObject("test", Locale.US));
        }
+
+       /**
+        * Verifies that a new instance of date converter is returned
+        * if there is no custom converter registered.
+        *
+        * https://issues.apache.org/jira/browse/WICKET-4839
+        */
+       @Test
+       public void customDateConverter()
+       {
+
+               /**
+                * A custom converter that can override the default
+                * registered DateConverter
+                */
+               class CustomDateConverter extends DateConverter
+               {
+               }
+
+               IConverter<Date> dateConverter = 
locator.getConverter(Date.class);
+
+               // assert that a DateConverter is returned
+               assertSame(DateConverter.class, dateConverter.getClass());
+               assertNotSame(CustomDateConverter.class, 
dateConverter.getClass());
+
+               IConverter<Date> secondDateConverter = 
locator.getConverter(Date.class);
+
+               // assert that a new instance of DateConverter is returned
+               assertNotSame(dateConverter, secondDateConverter);
+
+               locator.set(Date.class, new CustomDateConverter());
+               dateConverter = locator.getConverter(Date.class);
+
+               // assert that the CustomDateConverter is returned
+               assertNotSame(DateConverter.class, dateConverter.getClass());
+               assertSame(CustomDateConverter.class, dateConverter.getClass());
+
+       }
 }
\ No newline at end of file

Reply via email to