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

Use DateFormat#clone() to make sure that the converter doesn't use a pooled 
instance of DateFormat.


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

Branch: refs/heads/wicket-1.5.x
Commit: f8aa7d18e91d273825f57d40e2d7dc8048590cca
Parents: 031b5eb
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Tue Nov 6 10:27:01 2012 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Tue Nov 6 10:27:01 2012 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/ConverterLocator.java   |   36 ++----------
 .../org/apache/wicket/ConverterLocatorTest.java    |   43 ---------------
 .../util/convert/converter/DateConverter.java      |    2 +-
 .../util/convert/converter/SqlDateConverter.java   |    2 +-
 .../util/convert/converter/SqlTimeConverter.java   |    4 +-
 .../convert/converter/SqlTimestampConverter.java   |    4 +-
 6 files changed, 12 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/f8aa7d18/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 3d62ac1..e1068de 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
@@ -169,6 +169,11 @@ public class ConverterLocator implements IConverterLocator
                set(Short.TYPE, ShortConverter.INSTANCE);
                set(Short.class, ShortConverter.INSTANCE);
                set(BigDecimal.class, new BigDecimalConverter());
+               set(Date.class, new DateConverter());
+               set(java.sql.Date.class, new SqlDateConverter());
+               set(java.sql.Time.class, new SqlTimeConverter());
+               set(java.sql.Timestamp.class, new SqlTimestampConverter());
+               set(Calendar.class, new CalendarConverter());
        }
 
        /**
@@ -183,36 +188,7 @@ public class ConverterLocator implements IConverterLocator
         */
        public final <C> IConverter<C> get(Class<C> c)
        {
-               @SuppressWarnings("unchecked")
-               IConverter<C> converter = 
(IConverter<C>)classToConverter.get(c.getName());
-
-               if (converter == null)
-               {
-                       // 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;
+               return (IConverter<C>)classToConverter.get(c.getName());
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/f8aa7d18/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 94f3bc6..26f2144 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
@@ -16,11 +16,8 @@
  */
 package org.apache.wicket;
 
-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;
 
@@ -46,44 +43,4 @@ public final class ConverterLocatorTest extends Assert
                // default converter
                
assertNotNull(locator.getConverter(String.class).convertToObject("", 
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()
-       {
-               final ConverterLocator locator = new ConverterLocator();
-
-               /**
-                * 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

http://git-wip-us.apache.org/repos/asf/wicket/blob/f8aa7d18/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DateConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DateConverter.java
 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DateConverter.java
index 1248b20..2120909 100644
--- 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DateConverter.java
+++ 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/DateConverter.java
@@ -72,7 +72,7 @@ public class DateConverter extends AbstractConverter<Date>
                        locale = Locale.getDefault();
                }
 
-               return DateFormat.getDateInstance(DateFormat.SHORT, locale);
+               return (DateFormat) 
DateFormat.getDateInstance(DateFormat.SHORT, locale).clone();
        }
 
        /**

http://git-wip-us.apache.org/repos/asf/wicket/blob/f8aa7d18/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlDateConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlDateConverter.java
 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlDateConverter.java
index bbc5d2f..6c0b35f 100644
--- 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlDateConverter.java
+++ 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlDateConverter.java
@@ -74,7 +74,7 @@ public class SqlDateConverter extends AbstractConverter<Date>
                        locale = Locale.getDefault();
                }
 
-               return DateFormat.getDateInstance(DateFormat.SHORT, locale);
+               return (DateFormat) 
DateFormat.getDateInstance(DateFormat.SHORT, locale).clone();
        }
 
        @Override

http://git-wip-us.apache.org/repos/asf/wicket/blob/f8aa7d18/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimeConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimeConverter.java
 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimeConverter.java
index fb9e6bd..f55dffd 100644
--- 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimeConverter.java
+++ 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimeConverter.java
@@ -43,7 +43,7 @@ public class SqlTimeConverter extends AbstractConverter<Time>
                {
                        locale = Locale.getDefault();
                }
-               DateFormat format = 
DateFormat.getTimeInstance(DateFormat.SHORT, locale);
+               DateFormat format = (DateFormat) 
DateFormat.getTimeInstance(DateFormat.SHORT, locale).clone();
                try
                {
                        Date date = format.parse(value);
@@ -70,7 +70,7 @@ public class SqlTimeConverter extends AbstractConverter<Time>
                {
                        locale = Locale.getDefault();
                }
-               DateFormat format = 
DateFormat.getTimeInstance(DateFormat.SHORT, locale);
+               DateFormat format = (DateFormat) 
DateFormat.getTimeInstance(DateFormat.SHORT, locale).clone();
                return format.format(time);
        }
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/f8aa7d18/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimestampConverter.java
----------------------------------------------------------------------
diff --git 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimestampConverter.java
 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimestampConverter.java
index cfeb181..6eb93d4 100644
--- 
a/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimestampConverter.java
+++ 
b/wicket-util/src/main/java/org/apache/wicket/util/convert/converter/SqlTimestampConverter.java
@@ -87,7 +87,7 @@ public class SqlTimestampConverter extends 
AbstractConverter<Timestamp>
                        locale = Locale.getDefault();
                }
 
-               DateFormat format = DateFormat.getDateTimeInstance(dateFormat, 
timeFormat, locale);
+               DateFormat format = (DateFormat) 
DateFormat.getDateTimeInstance(dateFormat, timeFormat, locale).clone();
                try
                {
                        Date date = format.parse(value);
@@ -118,7 +118,7 @@ public class SqlTimestampConverter extends 
AbstractConverter<Timestamp>
                        locale = Locale.getDefault();
                }
 
-               DateFormat format = DateFormat.getDateTimeInstance(dateFormat, 
timeFormat, locale);
+               DateFormat format = (DateFormat) 
DateFormat.getDateTimeInstance(dateFormat, timeFormat, locale).clone();
                return format.format(timestamp);
        }
 

Reply via email to