Repository: wicket Updated Branches: refs/heads/master 5877b8ff9 -> 003c72d4c
WICKET-6576 parse pattern support different from format pattern Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/003c72d4 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/003c72d4 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/003c72d4 Branch: refs/heads/master Commit: 003c72d4c043e6e87b05e0073b802f3c4bd47182 Parents: 5877b8f Author: Sven Meier <svenme...@apache.org> Authored: Mon Aug 6 23:12:42 2018 +0200 Committer: Sven Meier <svenme...@apache.org> Committed: Mon Aug 6 23:12:42 2018 +0200 ---------------------------------------------------------------------- .../wicket/examples/datetime/DateTimePage.html | 6 ++ .../wicket/examples/datetime/DateTimePage.java | 12 ++- .../html/form/datetime/LocalDateTextField.java | 91 ++++++++++++++------ .../form/datetime/LocalDateTextFieldTest.java | 26 ++++-- 4 files changed, 100 insertions(+), 35 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/003c72d4/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html index 7778689..19b021a 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.html @@ -27,6 +27,12 @@ <hr/> + <h3>LocalDateTextField formatting with dd-MM-yyyy and parsing with d-M-yyyy</h3> + <input wicket:id="date" type="text" /> + <br/> + + <hr/> + <h3>LocalDateTimeField (default time 00:00)</h3> <span wicket:id="datetime0"></span><br/> http://git-wip-us.apache.org/repos/asf/wicket/blob/003c72d4/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java ---------------------------------------------------------------------- diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java index de0f8ea..3548c09 100644 --- a/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java +++ b/wicket-examples/src/main/java/org/apache/wicket/examples/datetime/DateTimePage.java @@ -16,6 +16,7 @@ */ package org.apache.wicket.examples.datetime; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.ZoneId; @@ -30,6 +31,7 @@ import java.util.stream.Collectors; import org.apache.wicket.Session; import org.apache.wicket.examples.WicketExamplePage; import org.apache.wicket.examples.forminput.FormInputApplication; +import org.apache.wicket.extensions.markup.html.form.datetime.LocalDateTextField; import org.apache.wicket.extensions.markup.html.form.datetime.LocalDateTimeField; import org.apache.wicket.extensions.markup.html.form.datetime.LocalDateTimeTextField; import org.apache.wicket.extensions.markup.html.form.datetime.TimeField; @@ -68,6 +70,9 @@ public class DateTimePage extends WicketExamplePage private LocalTime time2 = LocalTime.of(22, 15); @SuppressWarnings("unused") + private LocalDate date = LocalDate.now(); + + @SuppressWarnings("unused") private LocalDateTime dateTime0 = LocalDateTime.now(); @SuppressWarnings("unused") @@ -126,6 +131,9 @@ public class DateTimePage extends WicketExamplePage } }); + final LocalDateTextField dateField = new LocalDateTextField("date", new PropertyModel<>(this, "date"), "dd-MM-yyyy", "d-M-yyyy"); + form.add(dateField); + final LocalDateTimeField datetimeField0 = new LocalDateTimeField("datetime0", new PropertyModel<>(this, "dateTime0")) { @@ -161,7 +169,7 @@ public class DateTimePage extends WicketExamplePage form.add(new Label("datetime1-label", zonedDateTime1)); IModel<ZonedDateTime> zonedDateTime2 = new PropertyModel<>(this, "dateTime2"); - LocalDateTimeTextField datetime2 = new LocalDateTimeTextField("datetime2", + LocalDateTimeTextField datetimeField2 = new LocalDateTimeTextField("datetime2", new ZonedToLocalDateTimeModel(zonedDateTime2) { private static final long serialVersionUID = 1L; @@ -178,7 +186,7 @@ public class DateTimePage extends WicketExamplePage return targetZone; } }, FormatStyle.SHORT, FormatStyle.SHORT); - form.add(datetime2); + form.add(datetimeField2); form.add(new Label("datetime2-label", zonedDateTime2)); final ZonedDateTimeField datetimeField3 = new ZonedDateTimeField("datetime3", http://git-wip-us.apache.org/repos/asf/wicket/blob/003c72d4/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextField.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextField.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextField.java index 68d46de..a26f2b1 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextField.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextField.java @@ -20,7 +20,9 @@ import java.time.LocalDate; import java.time.chrono.IsoChronology; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatterBuilder; +import java.time.format.DateTimeParseException; import java.time.format.FormatStyle; +import java.time.temporal.TemporalAccessor; import java.util.Locale; import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider; @@ -28,6 +30,7 @@ import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.model.IModel; import org.apache.wicket.util.convert.IConverter; import org.apache.wicket.util.convert.converter.LocalDateConverter; +import org.apache.wicket.util.string.Strings; /** * A TextField that is mapped to a <code>java.time.LocalDate</code> object and that uses java.time time to @@ -51,12 +54,42 @@ public class LocalDateTextField extends TextField<LocalDate> implements ITextFor * * @param id * the component id + * @param pattern + * the pattern to use + */ + public LocalDateTextField(String id, String pattern) + { + this(id, null, pattern); + } + + /** + * Construct with a pattern. + * + * @param id + * the component id * @param model * the model * @param pattern * the pattern to use */ - public LocalDateTextField(String id, IModel<LocalDate> model, String datePattern) + public LocalDateTextField(String id, IModel<LocalDate> model, String pattern) + { + this(id, model, pattern, pattern); + } + + /** + * Construct with pattern for formatting and parsing. + * + * @param id + * the component id + * @param model + * the model + * @param formatPattern + * the pattern to use for formatting + * @param parsePattern + * the pattern to use for parsing + */ + public LocalDateTextField(String id, IModel<LocalDate> model, String formatPattern, String parsePattern) { super(id, model, LocalDate.class); @@ -64,30 +97,52 @@ public class LocalDateTextField extends TextField<LocalDate> implements ITextFor private static final long serialVersionUID = 1L; @Override - public DateTimeFormatter getDateTimeFormatter(Locale locale) + protected DateTimeFormatter getDateTimeFormatter() { - return DateTimeFormatter.ofPattern(datePattern).withLocale(locale); + return DateTimeFormatter.ofPattern(formatPattern); + } + + /** + * Overwritten to support a custom parse pattern. + */ + @Override + public LocalDate convertToObject(final String value, Locale locale) + { + if (Strings.isEmpty(value)) + { + return null; + } + + DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(parsePattern).withLocale(locale); + TemporalAccessor temporalAccessor; + try { + temporalAccessor = dateTimeFormatter.parse(value); + } catch (DateTimeParseException ex) { + throw newConversionException("Cannot parse '" + value, value, locale); + } + + return createTemporal(temporalAccessor); } @Override public String getTextFormat(Locale locale) { - return datePattern; + return formatPattern; } }; } /** - * Construct with a pattern. + * Construct with a style. * * @param id * the component id - * @param pattern - * the pattern to use + * @param dateStyle + * the style to use */ - public LocalDateTextField(String id, String datePattern) + public LocalDateTextField(String id, FormatStyle dateStyle) { - this(id, null, datePattern); + this(id, null, dateStyle); } /** @@ -108,9 +163,9 @@ public class LocalDateTextField extends TextField<LocalDate> implements ITextFor private static final long serialVersionUID = 1L; @Override - public DateTimeFormatter getDateTimeFormatter(Locale locale) + protected DateTimeFormatter getDateTimeFormatter() { - return DateTimeFormatter.ofLocalizedDate(dateStyle).withLocale(locale); + return DateTimeFormatter.ofLocalizedDate(dateStyle); } @Override @@ -121,20 +176,6 @@ public class LocalDateTextField extends TextField<LocalDate> implements ITextFor }; } - - /** - * Construct with a style. - * - * @param id - * the component id - * @param dateStyle - * the style to use - */ - public LocalDateTextField(String id, FormatStyle dateStyle) - { - this(id, null, dateStyle); - } - /** * @return The specialized converter. * @see org.apache.wicket.Component#createConverter(java.lang.Class) http://git-wip-us.apache.org/repos/asf/wicket/blob/003c72d4/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextFieldTest.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextFieldTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextFieldTest.java index 1d50158..0026e7f 100644 --- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextFieldTest.java +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateTextFieldTest.java @@ -17,15 +17,12 @@ package org.apache.wicket.extensions.markup.html.form.datetime; import java.time.LocalDate; -import java.time.format.FormatStyle; -import java.util.Locale; import org.apache.wicket.MarkupContainer; import org.apache.wicket.markup.IMarkupResourceStreamProvider; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.model.Model; -import org.apache.wicket.util.convert.converter.LocalDateConverter; import org.apache.wicket.util.resource.IResourceStream; import org.apache.wicket.util.resource.StringResourceStream; import org.apache.wicket.util.tester.FormTester; @@ -52,12 +49,25 @@ public class LocalDateTextFieldTest extends WicketTestCase @Test public void dateNotNullTest() { - LocalDate date = LocalDate.of(2017, 02, 13); + LocalDate date = LocalDate.of(2017, 02, 03); TestPage page = new TestPage(null); tester.startPage(page); FormTester formTester = tester.newFormTester("form", false); - formTester.setValue("field", - new LocalDateConverter().convertToString(date, Locale.forLanguageTag("en-US"))); + formTester.setValue("field", "03-02-2017"); + formTester.submit(); + tester.assertNoErrorMessage(); + LocalDate d = page.field.getModelObject(); + assertEquals(date, d); + } + + @Test + public void dateParsePatternTest() + { + LocalDate date = LocalDate.of(2017, 02, 03); + TestPage page = new TestPage(null); + tester.startPage(page); + FormTester formTester = tester.newFormTester("form", false); + formTester.setValue("field", "3-2-2017"); formTester.submit(); tester.assertNoErrorMessage(); LocalDate d = page.field.getModelObject(); @@ -75,9 +85,9 @@ public class LocalDateTextFieldTest extends WicketTestCase Form<Void> form = new Form<>("form"); add(form); - form.add(field = new LocalDateTextField("field", Model.of(val), FormatStyle.SHORT)); + form.add(field = new LocalDateTextField("field", Model.of(val), "dd-MM-yyyy", "d-M-yyyy")); } - + @Override public IResourceStream getMarkupResourceStream(MarkupContainer container, Class<?> containerClass)