You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2018/08/06 21:19:53 UTC

wicket git commit: WICKET-6576 parse pattern

Repository: wicket
Updated Branches:
  refs/heads/wicket-8.x 2647daba6 -> 778fcef98


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

Branch: refs/heads/wicket-8.x
Commit: 778fcef9848057d9a7e9281b26fd8f24a03fe323
Parents: 2647dab
Author: Sven Meier <sv...@apache.org>
Authored: Mon Aug 6 23:12:42 2018 +0200
Committer: Sven Meier <sv...@apache.org>
Committed: Mon Aug 6 23:19:24 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/778fcef9/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/778fcef9/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/778fcef9/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/778fcef9/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)