From: Marko Grönroos Date: Thu, 3 Jul 2008 13:10:11 +0000 (+0000) Subject: Fixed #1867 further. X-Git-Tag: 6.7.0.beta1~4493 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=af895f9596858e252685bf73f61ecdbd4d656c6e;p=vaadin-framework.git Fixed #1867 further. svn changeset:5030/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/data/Validator.java b/src/com/itmill/toolkit/data/Validator.java index fbdbef78cf..b8381094ac 100644 --- a/src/com/itmill/toolkit/data/Validator.java +++ b/src/com/itmill/toolkit/data/Validator.java @@ -146,4 +146,16 @@ public interface Validator { } } + + public class EmptyValueException extends Validator.InvalidValueException { + /** + * Serial generated by eclipse. + */ + private static final long serialVersionUID = -4488988853486652602L; + + public EmptyValueException(String message) { + super(message); + } + + } } diff --git a/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java b/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java index c1caf6942c..f42736084f 100644 --- a/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java +++ b/src/com/itmill/toolkit/terminal/CompositeErrorMessage.java @@ -107,6 +107,27 @@ public class CompositeErrorMessage implements ErrorMessage { public Iterator iterator() { return errors.iterator(); } + + /** + * Checks recursively if one of the error messages of the composite message + * is given class or contains one inside further composition. + * + * @param exceptionClass Class to search for. + * @return true if an error message of the given class was found inside. + */ + public boolean hasErrorMessageClass(Class exceptionClass) { + for (Iterator i = iterator(); i.hasNext();) { + ErrorMessage msg = (ErrorMessage) i.next(); + if (exceptionClass.isInstance(msg)) + return true; + if (msg instanceof CompositeErrorMessage) { + boolean recursionResult = ((CompositeErrorMessage)msg).hasErrorMessageClass(exceptionClass); + if (recursionResult) + return true; // Was found + } + } + return false; + } /** * @see com.itmill.toolkit.terminal.Paintable#paint(com.itmill.toolkit.terminal.PaintTarget) diff --git a/src/com/itmill/toolkit/ui/AbstractComponent.java b/src/com/itmill/toolkit/ui/AbstractComponent.java index f4db9214ed..a4e662aa64 100644 --- a/src/com/itmill/toolkit/ui/AbstractComponent.java +++ b/src/com/itmill/toolkit/ui/AbstractComponent.java @@ -13,8 +13,10 @@ import java.util.Locale; import java.util.Map; import com.itmill.toolkit.Application; +import com.itmill.toolkit.data.Validator.EmptyValueException; import com.itmill.toolkit.event.EventRouter; import com.itmill.toolkit.event.MethodEventSource; +import com.itmill.toolkit.terminal.CompositeErrorMessage; import com.itmill.toolkit.terminal.ErrorMessage; import com.itmill.toolkit.terminal.PaintException; import com.itmill.toolkit.terminal.PaintTarget; @@ -624,7 +626,12 @@ public abstract class AbstractComponent implements Component, MethodEventSource final ErrorMessage error = getErrorMessage(); if (error != null) { - error.paint(target); + // Do not display empty value errors for + // empty required fields. + if (!(error instanceof EmptyValueException || + (error instanceof CompositeErrorMessage && + ((CompositeErrorMessage)error).hasErrorMessageClass(EmptyValueException.class)))) + error.paint(target); } } else { target.addAttribute("invisible", true); diff --git a/src/com/itmill/toolkit/ui/AbstractField.java b/src/com/itmill/toolkit/ui/AbstractField.java index 055b857b81..5d43a7d728 100644 --- a/src/com/itmill/toolkit/ui/AbstractField.java +++ b/src/com/itmill/toolkit/ui/AbstractField.java @@ -617,18 +617,6 @@ public abstract class AbstractField extends AbstractComponent implements Field, return true; } - public class EmptyValueException extends Validator.InvalidValueException { - /** - * Serial generated by eclipse. - */ - private static final long serialVersionUID = -4488988853486652602L; - - public EmptyValueException(String message) { - super(message); - } - - } - /** * Checks the validity of the Validatable by validating the field with all * attached validators. @@ -643,7 +631,7 @@ public abstract class AbstractField extends AbstractComponent implements Field, if (isRequired()) { if (isEmpty()) { - throw new EmptyValueException(requiredError); + throw new Validator.EmptyValueException(requiredError); } } diff --git a/src/com/itmill/toolkit/ui/Form.java b/src/com/itmill/toolkit/ui/Form.java index 5f0863ff51..266aa780d4 100644 --- a/src/com/itmill/toolkit/ui/Form.java +++ b/src/com/itmill/toolkit/ui/Form.java @@ -15,8 +15,10 @@ import com.itmill.toolkit.data.Item; import com.itmill.toolkit.data.Property; import com.itmill.toolkit.data.Validatable; import com.itmill.toolkit.data.Validator; +import com.itmill.toolkit.data.Validator.EmptyValueException; import com.itmill.toolkit.data.Validator.InvalidValueException; import com.itmill.toolkit.data.util.BeanItem; +import com.itmill.toolkit.terminal.CompositeErrorMessage; import com.itmill.toolkit.terminal.ErrorMessage; import com.itmill.toolkit.terminal.PaintException; import com.itmill.toolkit.terminal.PaintTarget; @@ -169,6 +171,17 @@ public class Form extends AbstractField implements Item.Editor, Buffered, Item, if (formFooter != null) { formFooter.paint(target); } + + // AbstractComponent.paint() does not paint EmptyValueExceptions and + // filters them out, but Form wants to paint them, so we have to + // see if the error was skipped. + // Efficiency note: also AbstractComponent.paint() calls + // getErrorMessage(), which is a bit heavy call. + final ErrorMessage error = getErrorMessage(); + if (error instanceof EmptyValueException || + (error instanceof CompositeErrorMessage && + ((CompositeErrorMessage)error).hasErrorMessageClass(EmptyValueException.class))) + error.paint(target); } /** @@ -182,22 +195,39 @@ public class Form extends AbstractField implements Item.Editor, Buffered, Item, * validation fails also on empty errors. */ public ErrorMessage getErrorMessage() { + // Reimplement the checking of validation error by using + // getErrorMessage() recursively instead of validate(). + ErrorMessage validationError = null; for (final Iterator i = propertyIds.iterator(); i.hasNext();) { try { AbstractComponent field = (AbstractComponent) fields.get(i .next()); - ErrorMessage e = field.getErrorMessage(); - if (e != null) { + validationError = field.getErrorMessage(); + if (validationError != null) { // Skip empty errors - if ("".equals(e.toString())) { + if (validationError.toString().isEmpty()) continue; - } - return e; + break; } } catch (ClassCastException ignored) { } } - return null; + + // The rest is reimplementation of the latter part of + // AbstractField.getErrorMessage() + + // Check if there are any systems errors + final ErrorMessage superError = super.getErrorMessage(); + + // Return if there are no errors at all + if (superError == null && validationError == null + && currentBufferedSourceException == null) { + return null; + } + + // Throw combination of the error types + return new CompositeErrorMessage(new ErrorMessage[] { superError, + validationError, currentBufferedSourceException }); } /*