diff options
author | elmot <elmotelmot.vaadin.com> | 2017-07-27 12:32:15 +0300 |
---|---|---|
committer | elmot <elmotelmot.vaadin.com> | 2017-07-27 12:32:15 +0300 |
commit | 1f910006a2ccbbcc71ab46b02576a336201448c8 (patch) | |
tree | 76651b1e4613176a0f7ea2dad2f37dd27677639a | |
parent | 0517853905c10f5594adf799d9664f96bb863d78 (diff) | |
download | vaadin-framework-1f910006a2ccbbcc71ab46b02576a336201448c8.tar.gz vaadin-framework-1f910006a2ccbbcc71ab46b02576a336201448c8.zip |
Proper error clean, server-side parsing, fixes after review.
-rw-r--r-- | server/src/main/java/com/vaadin/ui/AbstractDateField.java | 29 | ||||
-rw-r--r-- | uitest/src/main/java/com/vaadin/tests/data/DateValidationUI.java | 14 |
2 files changed, 29 insertions, 14 deletions
diff --git a/server/src/main/java/com/vaadin/ui/AbstractDateField.java b/server/src/main/java/com/vaadin/ui/AbstractDateField.java index 82c0baf139..58b748e49b 100644 --- a/server/src/main/java/com/vaadin/ui/AbstractDateField.java +++ b/server/src/main/java/com/vaadin/ui/AbstractDateField.java @@ -212,7 +212,7 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster & T newDate; - if("".equals(newDateString)) { + if(newDateString==null || "".equals(newDateString)) { newDate = null; uiHasValidDateString = true; currentParseErrorMessage = null; @@ -225,17 +225,16 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster & if (hasChanges) { dateString = newDateString; - if (newDateString != null && !newDateString.isEmpty()) { String invalidDateString = (String) variables.get("lastInvalidDateString"); if (invalidDateString != null) { Result<T> parsedDate = handleUnparsableDateString(dateString); - uiHasValidDateString = false; - currentParseErrorMessage = parsedDate.getMessage().orElse("Parsing error"); - setComponentError(new UserError(getParseErrorMessage())); + parsedDate.ifOk(this::setValue); + if(parsedDate.isError()) { + currentParseErrorMessage = parsedDate.getMessage().orElse("Parsing error"); + setComponentError(new UserError(getParseErrorMessage())); + } } else { - uiHasValidDateString = true; - currentParseErrorMessage = null; setValue(newDate,true); } } else { @@ -546,7 +545,6 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster & .info("cannot parse " + design.attr("value") + " as date"); } - dateString = formatDate(value); doSetValue(date); } else { throw new RuntimeException("Cannot detect resoluton type " @@ -604,6 +602,8 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster & @Override protected void doSetValue(T value) { + uiHasValidDateString = true; + currentParseErrorMessage = null; // Also set the internal dateString if (value != null) { dateString = formatDate(value); @@ -705,12 +705,15 @@ public abstract class AbstractDateField<T extends Temporal & TemporalAdjuster & @Override public Validator<T> getDefaultValidator() { - return (Validator<T>) (value, context) -> { - if (currentParseErrorMessage != null) { - return ValidationResult.error(currentParseErrorMessage); + return new Validator<T>() { + @Override + public ValidationResult apply(T value, ValueContext context) { + if (currentParseErrorMessage != null) { + return ValidationResult.error(currentParseErrorMessage); + } + // Pass to range validator. + return getRangeValidator().apply(value, context); } - // Pass to range validator. - return getRangeValidator().apply(value, context); }; } } diff --git a/uitest/src/main/java/com/vaadin/tests/data/DateValidationUI.java b/uitest/src/main/java/com/vaadin/tests/data/DateValidationUI.java index c41fa198c1..907047d789 100644 --- a/uitest/src/main/java/com/vaadin/tests/data/DateValidationUI.java +++ b/uitest/src/main/java/com/vaadin/tests/data/DateValidationUI.java @@ -2,6 +2,7 @@ package com.vaadin.tests.data; import com.vaadin.annotations.Widgetset; import com.vaadin.data.Binder; +import com.vaadin.data.Result; import com.vaadin.server.VaadinRequest; import com.vaadin.tests.components.AbstractTestUI; import com.vaadin.ui.Button; @@ -10,6 +11,8 @@ import com.vaadin.ui.Label; import com.vaadin.ui.UI; import com.vaadin.ui.VerticalLayout; +import java.time.LocalDate; + /** * Created by elmot on 7/11/2017. */ @@ -19,7 +22,16 @@ public class DateValidationUI extends AbstractTestUI { protected void setup(VaadinRequest request) { final VerticalLayout layout = new VerticalLayout(); - DateField dateField = new DateField("Date"); + DateField dateField = new DateField("Date") { + @Override + protected Result<LocalDate> handleUnparsableDateString(String dateString) { + if (dateString.equalsIgnoreCase("Y2K")) { + return Result.ok(LocalDate.of(2000,1,1)); + } else { + return super.handleUnparsableDateString(dateString); + } + }; + }; dateField.setParseErrorMessage("Parse error"); dateField.setDateOutOfRangeMessage("Out of range"); layout.addComponent(dateField); |