Updated Branches:
  refs/heads/master 304448028 -> 8dbd7d810

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/8dbd7d81
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/8dbd7d81
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/8dbd7d81

Branch: refs/heads/master
Commit: 8dbd7d8104d00cb53fd7d049adc9ddee7ca51e10
Parents: 3044480
Author: Martin Tzvetanov Grigorov <[email protected]>
Authored: Tue Nov 6 10:24:25 2012 +0200
Committer: Martin Tzvetanov Grigorov <[email protected]>
Committed: Tue Nov 6 10:24:25 2012 +0200

----------------------------------------------------------------------
 .../java/org/apache/wicket/ConverterLocator.java   |   35 ++-----------
 .../org/apache/wicket/ConverterLocatorTest.java    |   40 ---------------
 .../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(+), 75 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/8dbd7d81/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 6c85808..eb9c7ac 100644
--- a/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
+++ b/wicket-core/src/main/java/org/apache/wicket/ConverterLocator.java
@@ -174,6 +174,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());
        }
 
        /**
@@ -188,35 +193,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/8dbd7d81/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 870ece3..45527ec 100644
--- a/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
+++ b/wicket-core/src/test/java/org/apache/wicket/ConverterLocatorTest.java
@@ -17,11 +17,8 @@
 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;
 
@@ -58,41 +55,4 @@ public final class ConverterLocatorTest extends Assert
                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

http://git-wip-us.apache.org/repos/asf/wicket/blob/8dbd7d81/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 c2f16a1..cfa173a 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
@@ -73,7 +73,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/8dbd7d81/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 c86c508..54f02c7 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
@@ -75,7 +75,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/8dbd7d81/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 43433f3..340e73c 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
@@ -44,7 +44,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);
@@ -71,7 +71,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/8dbd7d81/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 432c1ac..83b682f 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
@@ -88,7 +88,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);
@@ -119,7 +119,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