From 75924e5597b7c70f15cbe59e73cb250150df53cb Mon Sep 17 00:00:00 2001
From: Henri Sara
Date: Sat, 12 Nov 2011 12:18:27 +0200
Subject: [PATCH] #7930 Eliminate Validator.isValid()
Eliminate the redundant method Validator.isValid(). Validator.validate()
does the same but throws an exception including the validation error
message.
Migration:
- replace implementations of isValid() with internalIsValid() in custom
subclasses of AbstractValidator
- use Validator.validate() and catch exceptions rather than call
Validator.isValid()
- note that AbstractField still provides an isValid() method that is
internally based on validate()
---
src/com/vaadin/data/Validator.java | 19 +++-----
.../validator/AbstractStringValidator.java | 3 +-
.../data/validator/AbstractValidator.java | 45 ++++++++++++++++++-
.../data/validator/CompositeValidator.java | 32 -------------
.../vaadin/data/validator/NullValidator.java | 11 -----
.../data/validator/StringLengthValidator.java | 3 +-
src/com/vaadin/ui/AbstractField.java | 25 +++--------
src/com/vaadin/ui/DateField.java | 11 ++---
src/com/vaadin/ui/Form.java | 16 +------
.../tests/server/TestSerialization.java | 4 +-
.../datefield/RequiredInvalidDateField.java | 4 +-
.../tree/TreeKeyboardNavigationScrolls.java | 9 +---
.../TreeKeyboardNavigationValidators.java | 9 +---
.../com/vaadin/tests/tickets/Ticket1804.java | 8 +---
.../com/vaadin/tests/tickets/Ticket1900.java | 8 +---
.../com/vaadin/tests/tickets/Ticket20.java | 27 ++---------
.../com/vaadin/tests/tickets/Ticket2107.java | 6 +--
.../com/vaadin/tests/tickets/Ticket2179.java | 8 +---
.../com/vaadin/tests/tickets/Ticket2998.java | 13 ++----
.../com/vaadin/tests/tickets/Ticket736.java | 42 ++++-------------
.../com/vaadin/tests/tickets/Ticket846.java | 20 +--------
.../tests/util/AlwaysFailValidator.java | 18 ++++++++
.../validation/EmptyFieldErrorIndicators.java | 8 +---
23 files changed, 121 insertions(+), 228 deletions(-)
create mode 100644 tests/testbench/com/vaadin/tests/util/AlwaysFailValidator.java
diff --git a/src/com/vaadin/data/Validator.java b/src/com/vaadin/data/Validator.java
index b1dc5ffc14..60ac058cfc 100644
--- a/src/com/vaadin/data/Validator.java
+++ b/src/com/vaadin/data/Validator.java
@@ -29,6 +29,13 @@ import com.vaadin.terminal.gwt.server.AbstractApplicationServlet;
*
* Validators must not have any side effects.
*
+ *
+ * Since Vaadin 7, the method isValid(Object) does not exist in the interface -
+ * {@link #validate(Object)} should be used instead, and the exception caught
+ * where applicable. Concrete classes implementing {@link Validator} can still
+ * internally implement and use isValid(Object) for convenience or to ease
+ * migration from earlier Vaadin versions.
+ *
*
* @author IT Mill Ltd.
* @version
@@ -49,18 +56,6 @@ public interface Validator extends Serializable {
*/
public void validate(Object value) throws Validator.InvalidValueException;
- /**
- * Tests if the given value is valid. This method must be symmetric with
- * {@link #validate(Object)} so that {@link #validate(Object)} throws an
- * error iff this method returns false.
- *
- * @param value
- * the value to check
- * @return true if the value is valid, false
- * otherwise.
- */
- public boolean isValid(Object value);
-
/**
* Exception that is thrown by a {@link Validator} when a value is invalid.
*
diff --git a/src/com/vaadin/data/validator/AbstractStringValidator.java b/src/com/vaadin/data/validator/AbstractStringValidator.java
index 90778e16b1..3b7ef75419 100644
--- a/src/com/vaadin/data/validator/AbstractStringValidator.java
+++ b/src/com/vaadin/data/validator/AbstractStringValidator.java
@@ -51,7 +51,8 @@ public abstract class AbstractStringValidator extends AbstractValidator {
* @return true if the value (or its toString()) is a valid string, false
* otherwise
*/
- public boolean isValid(Object value) {
+ @Override
+ protected boolean internalIsValid(Object value) {
if (value == null) {
return true;
}
diff --git a/src/com/vaadin/data/validator/AbstractValidator.java b/src/com/vaadin/data/validator/AbstractValidator.java
index ee2fee893c..a43e8f7f7a 100644
--- a/src/com/vaadin/data/validator/AbstractValidator.java
+++ b/src/com/vaadin/data/validator/AbstractValidator.java
@@ -21,6 +21,11 @@ import com.vaadin.data.Validator;
* {@link InvalidValueException#getHtmlMessage()} and throw such exceptions from
* {@link #validate(Object)}.
*
+ *
+ * Since Vaadin 7, subclasses can either implement {@link #validate(Object)}
+ * directly or implement {@link #internalIsValid(Object)} when migrating legacy
+ * applications. To check validity, {@link #validate(Object)} should be used.
+ *
*
* @author IT Mill Ltd.
* @version
@@ -47,8 +52,46 @@ public abstract class AbstractValidator implements Validator {
this.errorMessage = errorMessage;
}
+ /**
+ * Since Vaadin 7, subclasses of AbstractValidator should override
+ * {@link #internalIsValid(Object)} or {@link #validate(Object)} instead of
+ * {@link #isValid(Object)}. {@link #validate(Object)} should be used to
+ * check values.
+ *
+ * This method may disappear in future Vaadin versions.
+ *
+ * @param value
+ * @return true if the value is valid
+ * @deprecated override {@link #internalIsValid(Object)} or
+ * {@link #validate(Object)} instead of {@link #isValid(Object)}
+ * and use {@link #validate(Object)} to check value validity
+ */
+ @Deprecated
+ protected final boolean isValid(Object value) {
+ try {
+ validate(value);
+ return true;
+ } catch (InvalidValueException e) {
+ return false;
+ }
+ }
+
+ /**
+ * Internally check the validity of a value. This method can be overridden
+ * in subclasses if customization of the error message is not needed -
+ * otherwise, subclasses should override {@link #validate(Object)} instead.
+ *
+ * This method should not be called from outside the validator class itself.
+ *
+ * @param value
+ * @return
+ */
+ protected boolean internalIsValid(Object value) {
+ return false;
+ }
+
public void validate(Object value) throws InvalidValueException {
- if (!isValid(value)) {
+ if (!internalIsValid(value)) {
String message = errorMessage.replace("{0}", String.valueOf(value));
throw new InvalidValueException(message);
}
diff --git a/src/com/vaadin/data/validator/CompositeValidator.java b/src/com/vaadin/data/validator/CompositeValidator.java
index 8fa01affba..aa6c533cf1 100644
--- a/src/com/vaadin/data/validator/CompositeValidator.java
+++ b/src/com/vaadin/data/validator/CompositeValidator.java
@@ -126,38 +126,6 @@ public class CompositeValidator extends AbstractValidator {
"The validator is in unsupported operation mode");
}
- /**
- * Checks the validity of the the given value. The value is valid, if:
- *
- *
MODE_AND: All of the sub-validators are valid
- *
MODE_OR: Any of the sub-validators are valid
- *
- *
- * @param value
- * the value to check.
- */
- public boolean isValid(Object value) {
- switch (mode) {
- case MODE_AND:
- for (Validator v : validators) {
- if (!v.isValid(value)) {
- return false;
- }
- }
- return true;
-
- case MODE_OR:
- for (Validator v : validators) {
- if (v.isValid(value)) {
- return true;
- }
- }
- return false;
- }
- throw new IllegalStateException(
- "The valitor is in unsupported operation mode");
- }
-
/**
* Gets the mode of the validator.
*
diff --git a/src/com/vaadin/data/validator/NullValidator.java b/src/com/vaadin/data/validator/NullValidator.java
index b1af263ef7..06869066a2 100644
--- a/src/com/vaadin/data/validator/NullValidator.java
+++ b/src/com/vaadin/data/validator/NullValidator.java
@@ -50,17 +50,6 @@ public class NullValidator implements Validator {
}
}
- /**
- * Tests if the given value is valid.
- *
- * @param value
- * the value to validate.
- * @returns true for valid value, otherwise false.
- */
- public boolean isValid(Object value) {
- return onlyNullAllowed ? value == null : value != null;
- }
-
/**
* Returns true if nulls are allowed otherwise
* false.
diff --git a/src/com/vaadin/data/validator/StringLengthValidator.java b/src/com/vaadin/data/validator/StringLengthValidator.java
index ff9a50e2cb..e73a1f618c 100644
--- a/src/com/vaadin/data/validator/StringLengthValidator.java
+++ b/src/com/vaadin/data/validator/StringLengthValidator.java
@@ -61,7 +61,8 @@ public class StringLengthValidator extends AbstractValidator {
* the value to validate.
* @return true for valid value, otherwise false.
*/
- public boolean isValid(Object value) {
+ @Override
+ protected boolean internalIsValid(Object value) {
if (value == null) {
return allowNull;
}
diff --git a/src/com/vaadin/ui/AbstractField.java b/src/com/vaadin/ui/AbstractField.java
index bde34c979c..0d819d01c4 100644
--- a/src/com/vaadin/ui/AbstractField.java
+++ b/src/com/vaadin/ui/AbstractField.java
@@ -730,32 +730,21 @@ public abstract class AbstractField extends AbstractComponent implements
* empty. If the field is empty it is considered valid if it is not required
* and invalid otherwise. Validators are never checked for empty fields.
*
+ * In most cases, {@link #validate()} should be used instead of
+ * {@link #isValid()} to also get the error message.
+ *
* @return true if all registered validators claim that the
* current value is valid or if the field is empty and not required,
* false otherwise.
*/
public boolean isValid() {
- if (isEmpty()) {
- if (isRequired()) {
- return false;
- } else {
- return true;
- }
- }
-
- if (validators == null) {
+ try {
+ validate();
return true;
+ } catch (InvalidValueException e) {
+ return false;
}
-
- final Object value = getValue();
- for (final Iterator i = validators.iterator(); i.hasNext();) {
- if (!(i.next()).isValid(value)) {
- return false;
- }
- }
-
- return true;
}
/**
diff --git a/src/com/vaadin/ui/DateField.java b/src/com/vaadin/ui/DateField.java
index 17ef83d839..4d83502f65 100644
--- a/src/com/vaadin/ui/DateField.java
+++ b/src/com/vaadin/ui/DateField.java
@@ -752,18 +752,13 @@ public class DateField extends AbstractField implements
}
/**
- * Tests the current value against registered validators if the field is not
- * empty. Note that DateField is considered empty (value == null) and
+ * Validates the current value against registered validators if the field is
+ * not empty. Note that DateField is considered empty (value == null) and
* invalid if it contains text typed in by the user that couldn't be parsed
* into a Date value.
*
- * @see com.vaadin.ui.AbstractField#isValid()
+ * @see com.vaadin.ui.AbstractField#validate()
*/
- @Override
- public boolean isValid() {
- return uiHasValidDateString && super.isValid();
- }
-
@Override
public void validate() throws InvalidValueException {
/*
diff --git a/src/com/vaadin/ui/Form.java b/src/com/vaadin/ui/Form.java
index b7ba23aee3..d7d762fcb9 100644
--- a/src/com/vaadin/ui/Form.java
+++ b/src/com/vaadin/ui/Form.java
@@ -968,21 +968,7 @@ public class Form extends AbstractField