]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed #1867 further.
authorMarko Grönroos <magi@iki.fi>
Thu, 3 Jul 2008 13:10:11 +0000 (13:10 +0000)
committerMarko Grönroos <magi@iki.fi>
Thu, 3 Jul 2008 13:10:11 +0000 (13:10 +0000)
svn changeset:5030/svn branch:trunk

src/com/itmill/toolkit/data/Validator.java
src/com/itmill/toolkit/terminal/CompositeErrorMessage.java
src/com/itmill/toolkit/ui/AbstractComponent.java
src/com/itmill/toolkit/ui/AbstractField.java
src/com/itmill/toolkit/ui/Form.java

index fbdbef78cf7e236777b3da8ce7f397b97278f43b..b8381094ac8180003e74ce95bf8701c7faf6b3bd 100644 (file)
@@ -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);
+        }
+        
+    }
 }
index c1caf6942cd9fdd8166cb29ea4ed49e3b1132871..f42736084fc1d8cd80acce447dc2be571264ff4e 100644 (file)
@@ -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)
index f4db9214ed79a18fd877058cbc81d502215c9bc2..a4e662aa6494d70ee4c8dedfd5dd4aa39894ddc3 100644 (file)
@@ -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);
index 055b857b8193f3fdb987a3877cd955b910df3198..5d43a7d7280cc4493d91a66af9a8ed7f7bd5a030 100644 (file)
@@ -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);
             }
         }
 
index 5f0863ff515f92ec13a5dc99060158e9412f2723..266aa780d4d1e7c7cb24db9f81e25a1b6eea42db 100644 (file)
@@ -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 });
     }
 
     /*