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
