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