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