[cvs] expresso commit by rauld: Updated following Struts 1.2

JCorporate Ltd jcorp at jcorporate.com
Thu Feb 17 18:54:26 UTC 2005


Log Message:
-----------
Updated following Struts 1.2

Modified Files:
--------------
    expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/core/controller/validation:
        ExpressoFieldChecks.java

Revision Data
-------------
Index: ExpressoFieldChecks.java
===================================================================
RCS file: /home/javacorp/.cvs/expresso/expresso/expresso-web/WEB-INF/src/com/jcorporate/expresso/core/controller/validation/ExpressoFieldChecks.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/core/controller/validation/ExpressoFieldChecks.java -Lexpresso-web/WEB-INF/src/com/jcorporate/expresso/core/controller/validation/ExpressoFieldChecks.java -u -r1.8 -r1.9
--- expresso-web/WEB-INF/src/com/jcorporate/expresso/core/controller/validation/ExpressoFieldChecks.java
+++ expresso-web/WEB-INF/src/com/jcorporate/expresso/core/controller/validation/ExpressoFieldChecks.java
@@ -65,9 +65,6 @@
 package com.jcorporate.expresso.core.controller.validation;
 
 import java.io.Serializable;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.Date;
 import java.util.Locale;
 
 import javax.servlet.http.HttpServletRequest;
@@ -79,12 +76,14 @@
 import org.apache.commons.validator.GenericTypeValidator;
 import org.apache.commons.validator.GenericValidator;
 import org.apache.commons.validator.ValidatorAction;
-import org.apache.struts.action.ActionErrors;
 import org.apache.struts.validator.Resources;
 import org.apache.struts.util.RequestUtils;
 
 import com.jcorporate.expresso.core.controller.ControllerException;
 import com.jcorporate.expresso.core.controller.DefaultForm;
+import org.apache.commons.validator.UrlValidator;
+import org.apache.struts.action.ActionMessages;
+import java.util.StringTokenizer;
 
 /**
  * <p>
@@ -112,436 +111,457 @@
     public static final String FIELD_TEST_EQUAL = "EQUAL";
 
     /**
-     * Checks if the field isn't null and length of the field is greater than zero not
-     * including whitespace.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if
-     *                any validation errors occur.
-     * @param request Current request object.
-     * @return true if meets stated requirements, false otherwise.
-     */
-    public static boolean validateRequired(Object bean,
-                                           ValidatorAction va, Field field,
-                                           ActionErrors errors,
-                                           HttpServletRequest request) {
+         * Checks if the field isn't null and length of the field is greater than zero not
+         * including whitespace.
+         *
+         * @param bean The bean validation is being performed on.
+         * @param va The <code>ValidatorAction</code> that is currently being performed.
+         * @param field The <code>Field</code> object associated with the current
+         * field being validated.
+         * @param errors The <code>ActionMessages</code> object to add errors to if
+         * any validation errors occur.
+         * @param request Current request object.
+         * @return true if meets stated requirements, false otherwise.
+         */
+        public static boolean validateRequired(Object bean,
+                                               ValidatorAction va, Field field,
+                                               ActionMessages errors,
+                                               HttpServletRequest request) {
+
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
 
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+            if (GenericValidator.isBlankOrNull(value)) {
+                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+                return false;
+            } else {
+                return true;
+            }
 
-        if (GenericValidator.isBlankOrNull(value)) {
-            errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-            return false;
-        } else {
-            return true;
         }
 
-    }
+        /**
+         * Checks if the field isn't null based on the values of other fields.
+         *
+         * @param bean The bean validation is being performed on.
+         * @param va The <code>ValidatorAction</code> that is currently being
+         * performed.
+         * @param field The <code>Field</code> object associated with the current
+         * field being validated.
+         * @param errors The <code>ActionMessages</code> object to add errors to if
+         * any validation errors occur.
+         * @param validator The <code>Validator</code> instance, used to access
+         * other field values.
+         * @param request Current request object.
+         * @return true if meets stated requirements, false otherwise.
+         */
+        public static boolean validateRequiredIf(Object bean,
+                                                 ValidatorAction va, Field field,
+                                                 ActionMessages errors,
+                                                 org.apache.commons.validator.Validator validator,
+                                                 HttpServletRequest request) {
+
+            Object form = validator.getParameterValue(org.apache.commons.validator.Validator.BEAN_PARAM);
+            String value = null;
+            boolean required = false;
 
-    /**
-     * Checks if the field isn't null based on the values of other fields.
-     *
-     * @param bean      The bean validation is being performed on.
-     * @param va        The <code>ValidatorAction</code> that is currently being
-     *                  performed.
-     * @param field     The <code>Field</code> object associated with the current
-     *                  field being validated.
-     * @param errors    The <code>ActionErrors</code> object to add errors to if
-     *                  any validation errors occur.
-     * @param validator The <code>Validator</code> instance, used to access
-     *                  other field values.
-     * @param request   Current request object.
-     * @return true if meets stated requirements, false otherwise.
-     */
-    public static boolean validateRequiredIf(Object bean,
-                                             ValidatorAction va, Field field,
-                                             ActionErrors errors,
-                                             org.apache.commons.validator.
-            Validator validator,
-                                             HttpServletRequest request) {
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
 
-        Object form = validator.getParameterValue(org.apache.commons.validator.Validator.BEAN_PARAM);
-        // Replace DEPRECATED code:
-        // Object form = validator.getResource(org.apache.commons.validator.Validator.BEAN_KEY);
-        String value = null;
-        boolean required = false;
+            int i = 0;
+            String fieldJoin = "AND";
+            if (!GenericValidator.isBlankOrNull(field.getVarValue("fieldJoin"))) {
+                fieldJoin = field.getVarValue("fieldJoin");
+            }
 
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+            if (fieldJoin.equalsIgnoreCase("AND")) {
+                required = true;
+            }
 
-        int i = 0;
-        String fieldJoin = "AND";
-        if (!GenericValidator.isBlankOrNull(field.getVarValue("fieldJoin"))) {
-            fieldJoin = field.getVarValue("fieldJoin");
-        }
+            while (!GenericValidator.isBlankOrNull(field.getVarValue("field[" + i + "]"))) {
+                String dependProp = field.getVarValue("field[" + i + "]");
+                String dependTest = field.getVarValue("fieldTest[" + i + "]");
+                String dependTestValue = field.getVarValue("fieldValue[" + i + "]");
+                String dependIndexed = field.getVarValue("fieldIndexed[" + i + "]");
 
-        if (fieldJoin.equalsIgnoreCase("AND")) {
-            required = true;
-        }
+                if (dependIndexed == null) {
+                    dependIndexed = "false";
+                }
 
-        while (!GenericValidator.isBlankOrNull(field.getVarValue("field[" + i + "]"))) {
-            String dependProp = field.getVarValue("field[" + i + "]");
-            String dependTest = field.getVarValue("fieldTest[" + i + "]");
-            String dependTestValue = field.getVarValue("fieldValue[" + i + "]");
-            String dependIndexed = field.getVarValue("fieldIndexed[" + i + "]");
+                String dependVal = null;
+                boolean thisRequired = false;
+                if (field.isIndexed() && dependIndexed.equalsIgnoreCase("true")) {
+                    String key = field.getKey();
+                    if ((key.indexOf("[") > -1) && (key.indexOf("]") > -1)) {
+                        String ind = key.substring(0, key.indexOf(".") + 1);
+                        dependProp = ind + dependProp;
+                    }
+                }
 
-            if (dependIndexed == null) {
-                dependIndexed = "false";
-            }
+                dependVal = getValueAsString(form, dependProp);
+                if (dependTest.equals(FIELD_TEST_NULL)) {
+                    if ((dependVal != null) && (dependVal.length() > 0)) {
+                        thisRequired = false;
+                    } else {
+                        thisRequired = true;
+                    }
+                }
 
-            String dependVal = null;
-            boolean thisRequired = false;
-            if (field.isIndexed() && dependIndexed.equalsIgnoreCase("true")) {
-                String key = field.getKey();
-                if ((key.indexOf("[") > -1) && (key.indexOf("]") > -1)) {
-                    String ind = key.substring(0, key.indexOf(".") + 1);
-                    dependProp = ind + dependProp;
+                if (dependTest.equals(FIELD_TEST_NOTNULL)) {
+                    if ((dependVal != null) && (dependVal.length() > 0)) {
+                        thisRequired = true;
+                    } else {
+                        thisRequired = false;
+                    }
                 }
-            }
 
-            dependVal = getValueAsString(form, dependProp);
-            if (dependTest.equals(FIELD_TEST_NULL)) {
-                if ((dependVal != null) && (dependVal.length() > 0)) {
-                    thisRequired = false;
-                } else {
-                    thisRequired = true;
+                if (dependTest.equals(FIELD_TEST_EQUAL)) {
+                    thisRequired = dependTestValue.equalsIgnoreCase(dependVal);
                 }
-            }
 
-            if (dependTest.equals(FIELD_TEST_NOTNULL)) {
-                if ((dependVal != null) && (dependVal.length() > 0)) {
-                    thisRequired = true;
+                if (fieldJoin.equalsIgnoreCase("AND")) {
+                    required = required && thisRequired;
                 } else {
-                    thisRequired = false;
+                    required = required || thisRequired;
                 }
-            }
 
-            if (dependTest.equals(FIELD_TEST_EQUAL)) {
-                thisRequired = dependTestValue.equalsIgnoreCase(dependVal);
+                i++;
             }
 
-            if (fieldJoin.equalsIgnoreCase("AND")) {
-                required = required && thisRequired;
-            } else {
-                required = required || thisRequired;
-            }
+                    if (required) {
+                            if (GenericValidator.isBlankOrNull(value)) {
+                                    errors.add(
+                                            field.getKey(),
+                                            Resources.getActionMessage(request, va, field));
 
-            i++;
-        }
+                    return false;
 
-        if (required) {
-            if (GenericValidator.isBlankOrNull(value)) {
-                errors.add(field.getKey(),
-                        Resources.getActionMessage(request, va, field));
+                            } else {
+                                    return true;
+                            }
+                    }
+            return true;
+        }
 
-                return false;
+        /**
+         * Checks if the field matches the regular expression in the field's mask attribute.
+         *
+         * @param bean The bean validation is being performed on.
+         * @param va The <code>ValidatorAction</code> that is currently being
+         * performed.
+         * @param field The <code>Field</code> object associated with the current
+         * field being validated.
+         * @param errors   The <code>ActionMessages</code> object to add errors to if
+         * any validation errors occur.
+         * @param request Current request object.
+         * @return true if field matches mask, false otherwise.
+         */
+        public static boolean validateMask(Object bean,
+                                           ValidatorAction va, Field field,
+                                           ActionMessages errors,
+                                           HttpServletRequest request) {
 
+            String mask = field.getVarValue("mask");
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
             } else {
-                return true;
+                value = getValueAsString(bean, field.getProperty());
             }
-        }
-        return true;
-    }
-
-    /**
-     * Checks if the field matches the regular expression in the field's mask attribute.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being
-     *                performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if
-     *                any validation errors occur.
-     * @param request Current request object.
-     * @return true if field matches mask, false otherwise.
-     */
-    public static boolean validateMask(Object bean,
-                                       ValidatorAction va, Field field,
-                                       ActionErrors errors,
-                                       HttpServletRequest request) {
-
-        String mask = field.getVarValue("mask");
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
 
-        try {
-            if (!GenericValidator.isBlankOrNull(value)
+            try {
+                if (!GenericValidator.isBlankOrNull(value)
                     && !GenericValidator.matchRegexp(value, mask)) {
 
-                errors.add(field.getKey(),
+                    errors.add(
+                        field.getKey(),
                         Resources.getActionMessage(request, va, field));
 
-                return false;
-            } else {
-                return true;
+                    return false;
+                } else {
+                    return true;
+                }
+            } catch (Exception e) {
+                log.error(e.getMessage(), e);
             }
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
+            return true;
         }
-        return true;
-    }
 
-    /**
-     * Checks if the field can safely be converted to a byte primitive.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if
-     *                any validation errors occur.
-     * @param request Current request object.
-     * @return A Byte if valid, null otherwise.
-     */
-    public static Byte validateByte(Object bean,
-                                    ValidatorAction va, Field field,
-                                    ActionErrors errors,
-                                    HttpServletRequest request) {
-
-        Byte result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
+        /**
+         * Checks if the field can safely be converted to a byte primitive.
+         *
+         *@param bean The bean validation is being performed on.
+         *@param va The <code>ValidatorAction</code> that is currently being performed.
+         *@param field The <code>Field</code> object associated with the current
+         *field being validated.
+         *@param errors The <code>ActionMessages</code> object to add errors to if
+         *any validation errors occur.
+         *@param request Current request object.
+         *@return true if valid, false otherwise.
+         */
+        public static Object validateByte(Object bean,
+                                        ValidatorAction va, Field field,
+                                        ActionMessages errors,
+                                        HttpServletRequest request) {
+
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
+
             result = GenericTypeValidator.formatByte(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
+
+            return result == null ? Boolean.FALSE : result;
         }
 
-        return result;
-    }
 
-    /**
-     * Checks if the field can safely be converted to a short primitive.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if
-     *                any validation errors occur.
-     * @param request Current request object.
-     * @return A Short if valid, otherwise null.
-     */
-    public static Short validateShort(Object bean,
-                                      ValidatorAction va, Field field,
-                                      ActionErrors errors,
-                                      HttpServletRequest request) {
-        Short result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+        /**
+         * Checks if the field can safely be converted to a short primitive.
+         *
+         * @param bean The bean validation is being performed on.
+         * @param va The <code>ValidatorAction</code> that is currently being performed.
+         * @param field The <code>Field</code> object associated with the current
+         * field being validated.
+         * @param errors The <code>ActionMessages</code> object to add errors to if
+         * any validation errors occur.
+         * @param request Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateShort(Object bean,
+                                          ValidatorAction va, Field field,
+                                          ActionMessages errors,
+                                          HttpServletRequest request) {
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             result = GenericTypeValidator.formatShort(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
+
+            return result == null ? Boolean.FALSE : result;
         }
 
-        return result;
-    }
 
-    /**
-     * Checks if the field can safely be converted to an int primitive.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return An Integer if valid, a null otherwise.
-     */
-    public static Integer validateInteger(Object bean,
-                                          ValidatorAction va, Field field,
-                                          ActionErrors errors,
-                                          HttpServletRequest request) {
-        Integer result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+        /**
+         * Checks if the field can safely be converted to an int primitive.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateInteger(Object bean,
+                                              ValidatorAction va, Field field,
+                                              ActionMessages errors,
+                                              HttpServletRequest request) {
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             result = GenericTypeValidator.formatInt(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
+
+            return result == null ? Boolean.FALSE : result;
         }
 
-        return result;
-    }
 
-    /**
-     * Checks if the field can safely be converted to a long primitive.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return A Long if valid, a null otherwise.
-     */
-    public static Long validateLong(Object bean,
-                                    ValidatorAction va, Field field,
-                                    ActionErrors errors,
-                                    HttpServletRequest request) {
-        Long result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+        /**
+         * Checks if the field can safely be converted to a long primitive.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateLong(Object bean,
+                                        ValidatorAction va, Field field,
+                                        ActionMessages errors,
+                                        HttpServletRequest request) {
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             result = GenericTypeValidator.formatLong(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
+
+            return result == null ? Boolean.FALSE : result;
         }
 
-        return result;
-    }
 
-    /**
-     * Checks if the field can safely be converted to a float primitive.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return A Float if valid, a null otherwise.
-     */
-    public static Float validateFloat(Object bean,
-                                      ValidatorAction va, Field field,
-                                      ActionErrors errors,
-                                      HttpServletRequest request) {
-        Float result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+        /**
+         * Checks if the field can safely be converted to a float primitive.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateFloat(Object bean,
+                                          ValidatorAction va, Field field,
+                                          ActionMessages errors,
+                                          HttpServletRequest request) {
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             result = GenericTypeValidator.formatFloat(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
+
+            return result == null ? Boolean.FALSE : result;
         }
 
-        return result;
-    }
 
-    /**
-     * Checks if the field can safely be converted to a double primitive.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return A Double if valid, a null otherwise.
-     */
-    public static Double validateDouble(Object bean,
-                                        ValidatorAction va, Field field,
-                                        ActionErrors errors,
-                                        HttpServletRequest request) {
-        Double result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+        /**
+         *  Checks if the field can safely be converted to a double primitive.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateDouble(Object bean,
+                                            ValidatorAction va, Field field,
+                                            ActionMessages errors,
+                                            HttpServletRequest request) {
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             result = GenericTypeValidator.formatDouble(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
+
+            return result == null ? Boolean.FALSE : result;
         }
 
-        return result;
-    }
 
-    /**
-     * Checks if the field is a valid date. If the field has a datePattern variable,
-     * that will be used to format <code>java.text.SimpleDateFormat</code>. If the
-     * field has a datePatternStrict variable, that will be used to format <code>java.text.SimpleDateFormat</code>
-     * and the length will be checked so '2/12/1999' will not pass validation with
-     * the format 'MM/dd/yyyy' because the month isn't two digits. If no datePattern
-     * variable is specified, then the field gets the DateFormat.SHORT format for
-     * the locale. The setLenient method is set to <code>false</code> for all variations.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return A Date if valid, a null if blank or invalid.
-     */
-    public static Date validateDate(Object bean,
-                                    ValidatorAction va, Field field,
-                                    ActionErrors errors,
-                                    HttpServletRequest request) {
-
-        Date result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
-        String datePattern = field.getVarValue("datePattern");
-        String datePatternStrict = field.getVarValue("datePatternStrict");
-        Locale locale = RequestUtils.getUserLocale( request, null );
+        /**
+         *  Checks if the field is a valid date. If the field has a datePattern variable,
+         *  that will be used to format <code>java.text.SimpleDateFormat</code>. If the
+         *  field has a datePatternStrict variable, that will be used to format <code>java.text.SimpleDateFormat</code>
+         *  and the length will be checked so '2/12/1999' will not pass validation with
+         *  the format 'MM/dd/yyyy' because the month isn't two digits. If no datePattern
+         *  variable is specified, then the field gets the DateFormat.SHORT format for
+         *  the locale. The setLenient method is set to <code>false</code> for all variations.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateDate(Object bean,
+                                        ValidatorAction va, Field field,
+                                        ActionMessages errors,
+                                        HttpServletRequest request) {
+
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+            String datePattern = field.getVarValue("datePattern");
+            String datePatternStrict = field.getVarValue("datePatternStrict");
+            Locale locale = RequestUtils.getUserLocale(request, null);
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             try {
                 if (datePattern != null && datePattern.length() > 0) {
                     result = GenericTypeValidator.formatDate(value, datePattern, false);
@@ -557,389 +577,407 @@
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
-        }
-
-        return result;
-    }
-
-    /**
-     * Checks if a fields value is within a range (min &amp; max specified in the
-     * vars attribute).
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if in range, false otherwise.
-     * @deprecated As of Struts 1.1, replaced by {@link #validateIntRange(java.lang.Object,org.apache.commons.validator.ValidatorAction,org.apache.commons.validator.Field,org.apache.struts.action.ActionErrors,javax.servlet.http.HttpServletRequest)}
-     */
-    public static boolean validateRange(Object bean,
-                                        ValidatorAction va, Field field,
-                                        ActionErrors errors,
-                                        HttpServletRequest request) {
-        return validateIntRange(bean, va, field, errors, request);
-    }
 
-    /**
-     * Checks if a fields value is within a range (min &amp; max specified in the
-     * vars attribute).
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if in range, false otherwise.
-     */
-    public static boolean validateIntRange(Object bean,
-                                           ValidatorAction va, Field field,
-                                           ActionErrors errors,
-                                           HttpServletRequest request) {
-
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
+            return result == null ? Boolean.FALSE : result;
         }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
-            try {
-                int intValue = Integer.parseInt(value);
-                int min = Integer.parseInt(field.getVarValue("min"));
-                int max = Integer.parseInt(field.getVarValue("max"));
-
-                if (!GenericValidator.isInRange(intValue, min, max)) {
-                    errors.add(field.getKey(),
-                            Resources.getActionMessage(request, va, field));
+        /**
+         * Checks if a fields value is within a range (min &amp; max specified in the
+         * vars attribute).
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return True if in range, false otherwise.
+         */
+        public static boolean validateIntRange(Object bean,
+                                               ValidatorAction va, Field field,
+                                               ActionMessages errors,
+                                               HttpServletRequest request) {
+
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
 
+            if (!GenericValidator.isBlankOrNull(value)) {
+                try {
+                    int intValue = Integer.parseInt(value);
+                    int min = Integer.parseInt(field.getVarValue("min"));
+                    int max = Integer.parseInt(field.getVarValue("max"));
+
+                    if (!GenericValidator.isInRange(intValue, min, max)) {
+                        errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+
+                        return false;
+                    }
+                } catch (Exception e) {
+                    errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
                     return false;
                 }
-            } catch (Exception e) {
-                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-                return false;
             }
-        }
 
-        return true;
-    }
-
-    /**
-     * Checks if a fields value is within a range (min &amp; max specified in the
-     * vars attribute).
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if in range, false otherwise.
-     */
-    public static boolean validateDoubleRange(Object bean,
-                                              ValidatorAction va, Field field,
-                                              ActionErrors errors,
-                                              HttpServletRequest request) {
-
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
+            return true;
         }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
-            try {
-                double doubleValue = Double.parseDouble(value);
-                double min = Double.parseDouble(field.getVarValue("min"));
-                double max = Double.parseDouble(field.getVarValue("max"));
-
-                if (!GenericValidator.isInRange(doubleValue, min, max)) {
-                    errors.add(field.getKey(),
-                            Resources.getActionMessage(request, va, field));
+        /**
+         *  Checks if a fields value is within a range (min &amp; max specified in the
+         *  vars attribute).
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return          True if in range, false otherwise.
+         */
+        public static boolean validateDoubleRange(Object bean,
+                                                  ValidatorAction va, Field field,
+                                                  ActionMessages errors,
+                                                  HttpServletRequest request) {
+
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
 
+            if (!GenericValidator.isBlankOrNull(value)) {
+                try {
+                    double doubleValue = Double.parseDouble(value);
+                    double min = Double.parseDouble(field.getVarValue("min"));
+                    double max = Double.parseDouble(field.getVarValue("max"));
+
+                    if (!GenericValidator.isInRange(doubleValue, min, max)) {
+                        errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+
+                        return false;
+                    }
+                } catch (Exception e) {
+                    errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
                     return false;
                 }
-            } catch (Exception e) {
-                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-                return false;
             }
-        }
-
-        return true;
-    }
 
-    /**
-     * Checks if a fields value is within a range (min &amp; max specified in the
-     * vars attribute).
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if in range, false otherwise.
-     */
-    public static boolean validateFloatRange(Object bean,
-                                             ValidatorAction va, Field field,
-                                             ActionErrors errors,
-                                             HttpServletRequest request) {
-
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
+            return true;
         }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
-            try {
-                float floatValue = Float.parseFloat(value);
-                float min = Float.parseFloat(field.getVarValue("min"));
-                float max = Float.parseFloat(field.getVarValue("max"));
-
-                if (!GenericValidator.isInRange(floatValue, min, max)) {
-                    errors.add(field.getKey(),
-                            Resources.getActionMessage(request, va, field));
+        /**
+         *  Checks if a fields value is within a range (min &amp; max specified in the
+         *  vars attribute).
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return True if in range, false otherwise.
+         */
+        public static boolean validateFloatRange(Object bean,
+                                                 ValidatorAction va, Field field,
+                                                 ActionMessages errors,
+                                                 HttpServletRequest request) {
+
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
 
+            if (!GenericValidator.isBlankOrNull(value)) {
+                try {
+                    float floatValue = Float.parseFloat(value);
+                    float min = Float.parseFloat(field.getVarValue("min"));
+                    float max = Float.parseFloat(field.getVarValue("max"));
+
+                    if (!GenericValidator.isInRange(floatValue, min, max)) {
+                        errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+
+                        return false;
+                    }
+                } catch (Exception e) {
+                    errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
                     return false;
                 }
-            } catch (Exception e) {
-                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-                return false;
             }
+
+            return true;
         }
 
-        return true;
-    }
 
-    /**
-     * Checks if the field is a valid credit card number.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return The credit card as a Long, a null if invalid, blank, or null.
-     */
-    public static Long validateCreditCard(Object bean,
-                                          ValidatorAction va, Field field,
-                                          ActionErrors errors,
-                                          HttpServletRequest request) {
+        /**
+         *  Checks if the field is a valid credit card number.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return true if valid, false otherwise.
+         */
+        public static Object validateCreditCard(Object bean,
+                                              ValidatorAction va, Field field,
+                                              ActionMessages errors,
+                                              HttpServletRequest request) {
 
-        Long result = null;
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+            Object result = null;
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (GenericValidator.isBlankOrNull(value)) {
+                return Boolean.TRUE;
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
             result = GenericTypeValidator.formatCreditCard(value);
 
             if (result == null) {
                 errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
             }
-        }
-
-        return result;
-    }
 
-    /**
-     * Checks if a field has a valid e-mail address.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if valid, false otherwise.
-     */
-    public static boolean validateEmail(Object bean,
-                                        ValidatorAction va, Field field,
-                                        ActionErrors errors,
-                                        HttpServletRequest request) {
+            return result == null ? Boolean.FALSE : result;
 
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
         }
 
-        if (!GenericValidator.isBlankOrNull(value) &&
-                !GenericValidator.isEmail(value)) {
-            errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-            return false;
-        } else {
-            return true;
-        }
-    }
 
-    /**
-     * Checks if the field's length is less than or equal to the maximum value.
-     * A <code>Null</code> will be considered an error.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if stated conditions met.
-     */
-    public static boolean validateMaxLength(Object bean,
+        /**
+         *  Checks if a field has a valid e-mail address.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return True if valid, false otherwise.
+         */
+        public static boolean validateEmail(Object bean,
                                             ValidatorAction va, Field field,
-                                            ActionErrors errors,
+                                            ActionMessages errors,
                                             HttpServletRequest request) {
 
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (!GenericValidator.isBlankOrNull(value) && !GenericValidator.isEmail(value)) {
+                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+                return false;
+            } else {
+                return true;
+            }
         }
 
-        if (value != null) {
-            try {
-                int max = Integer.parseInt(field.getVarValue("maxlength"));
 
-                if (!GenericValidator.maxLength(value, max)) {
-                    errors.add(field.getKey(),
-                            Resources.getActionMessage(request, va, field));
+        /**
+         *  Checks if the field's length is less than or equal to the maximum value.
+         *  A <code>Null</code> will be considered an error.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return True if stated conditions met.
+         */
+        public static boolean validateMaxLength(Object bean,
+                                                ValidatorAction va, Field field,
+                                                ActionMessages errors,
+                                                HttpServletRequest request) {
+
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (value != null) {
+                try {
+                    int max = Integer.parseInt(field.getVarValue("maxlength"));
+
+                    if (!GenericValidator.maxLength(value, max)) {
+                        errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
 
+                        return false;
+                    }
+                } catch (Exception e) {
+                    errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
                     return false;
                 }
-            } catch (Exception e) {
-                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-                return false;
             }
+
+            return true;
         }
 
-        return true;
-    }
 
-    /**
-     * Checks if the field's length is greater than or equal to the minimum value.
-     * A <code>Null</code> will be considered an error.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if stated conditions met.
-     */
-    public static boolean validateMinLength(Object bean,
+        /**
+         * Checks if the field's length is greater than or equal to the minimum value.
+         * A <code>Null</code> will be considered an error.
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return True if stated conditions met.
+         */
+        public static boolean validateMinLength(Object bean,
+                                                ValidatorAction va, Field field,
+                                                ActionMessages errors,
+                                                HttpServletRequest request) {
+
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
+
+            if (!GenericValidator.isBlankOrNull(value)) {
+                try {
+                    int min = Integer.parseInt(field.getVarValue("minlength"));
+
+                    if (!GenericValidator.minLength(value, min)) {
+                        errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+
+                        return false;
+                    }
+                } catch (Exception e) {
+                    errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+                    return false;
+                }
+            }
+
+            return true;
+        }
+
+        /**
+         * Checks if a field has a valid url. Four optional variables can be
+         * specified to configure url validation.
+         * <ul>
+         *    <li>Variable <code>allow2slashes</code> can be set to <code>true</code> or
+         *        <code>false</code> to control whether two slashes are allowed -
+         *        default is <code>false</code> (i.e. two slashes are NOT allowed).</li>
+         *    <li>Variable <code>nofragments</code> can be set to <code>true</code> or
+         *        <code>false</code> to control whether fragments are allowed -
+         *        default is <code>false</code> (i.e. fragments ARE allowed).</li>
+         *    <li>Variable <code>allowallschemes</code> can be set to <code>true</code> or
+         *        <code>false</code> to control if all schemes are allowed - default
+         *        is <code>false</code> (i.e. all schemes are NOT allowed).</li>
+         *    <li>Variable <code>schemes</code> can be set to a comma delimited list of
+         *        valid schemes. This value is ignored if <code>allowallschemes</code>
+         *        is set to <code>true</code>. Default schemes allowed are "http",
+         *        "https" and "ftp" if this variable is not specified.</li>
+         * </ul>
+         *
+         * @param  bean     The bean validation is being performed on.
+         * @param  va       The <code>ValidatorAction</code> that is currently being performed.
+         * @param  field    The <code>Field</code> object associated with the current
+         *      field being validated.
+         * @param  errors   The <code>ActionMessages</code> object to add errors to if any
+         *      validation errors occur.
+         * @param  request  Current request object.
+         * @return True if valid, false otherwise.
+         */
+        public static boolean validateUrl(Object bean,
                                             ValidatorAction va, Field field,
-                                            ActionErrors errors,
+                                            ActionMessages errors,
                                             HttpServletRequest request) {
 
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+            String value = null;
+            if (isString(bean)) {
+                value = (String) bean;
+            } else {
+                value = getValueAsString(bean, field.getProperty());
+            }
 
-        if (!GenericValidator.isBlankOrNull(value)) {
-            try {
-                int min = Integer.parseInt(field.getVarValue("minlength"));
+            if (GenericValidator.isBlankOrNull(value)) {
+                return true;
+            }
 
-                if (!GenericValidator.minLength(value, min)) {
-                    errors.add(field.getKey(),
-                            Resources.getActionMessage(request, va, field));
+            // Get the options and schemes Vars
+            boolean allowallschemes = "true".equalsIgnoreCase(field.getVarValue("allowallschemes"));
+            int options = allowallschemes ? UrlValidator.ALLOW_ALL_SCHEMES : 0;
+
+            if ("true".equalsIgnoreCase(field.getVarValue("allow2slashes"))) {
+              options += UrlValidator.ALLOW_2_SLASHES;
+            }
 
+            if ("true".equalsIgnoreCase(field.getVarValue("nofragments"))) {
+              options += UrlValidator.NO_FRAGMENTS;
+            }
+
+            String schemesVar = allowallschemes ? null : field.getVarValue("schemes");
+
+            // No options or schemes - use GenericValidator as default
+            if (options == 0 && schemesVar == null) {
+                if (GenericValidator.isUrl(value)) {
+                    return true;
+                } else {
+                    errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
                     return false;
                 }
-            } catch (Exception e) {
-                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-                return false;
             }
-        }
 
-        return true;
-    }
+            // Parse comma delimited list of schemes into a String[]
+            String[] schemes = null;
+            if (schemesVar != null) {
 
-    /**
-     * Checks if a field is a valid url. Does not currently
-     * honor Struts URL checking options such as allowallschemes
-     * and nofragment.
-     *
-     * @param bean    The bean validation is being performed on.
-     * @param va      The <code>ValidatorAction</code> that is currently being
-     *                performed.
-     * @param field   The <code>Field</code> object associated with the current
-     *                field being validated.
-     * @param errors  The <code>ActionErrors</code> object to add errors to if any
-     *                validation errors occur.
-     * @param request Current request object.
-     * @return True if valid, false otherwise.
-     * author Chris DiGiano
-     */
-    public static boolean validateURL(Object bean, ValidatorAction va,
-                                      Field field, ActionErrors errors,
-                                      HttpServletRequest request) {
-
-        String value = null;
-        if (isString(bean)) {
-            value = (String) bean;
-        } else {
-            value = getValueAsString(bean, field.getProperty());
-        }
+              StringTokenizer st = new StringTokenizer(schemesVar, ",");
+              schemes = new String[st.countTokens()];
 
-        if (!GenericValidator.isBlankOrNull(value) && !isURL(value)) {
-            errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
-            return false;
-        } else {
-            return true;
-        }
-    }
+              int i = 0;
+              while (st.hasMoreTokens()) {
+                  schemes[i++] = st.nextToken().trim();
+              }
 
-    /**
-     * Determine if the given <code>value</code> is formatted as a proper URL.
-     *
-     * @param value
-     * @return
-     * author Chris DiGiano
-     */
-    private static boolean isURL(String value) {
-        try {
-            new URI(value);
-        } catch (URISyntaxException e) {
-            return false;
-        }
-        return true;
-    }
+            }
 
-//Utility methods
+            // Create UrlValidator and validate with options/schemes
+            UrlValidator urlValidator = new UrlValidator(schemes, options);
+            if (urlValidator.isValid(value)) {
+                return true;
+            } else {
+                errors.add(field.getKey(), Resources.getActionMessage(request, va, field));
+                return false;
+            }
+        }
 
-    /**
-     * Return <code>true</code> if the specified object is a String or a <code>null</code>
-     * value.
-     *
-     * @param o Object to be tested
-     * @return The string value
-     */
-    protected static boolean isString(Object o) {
-        return (o == null) ? true : String.class.isInstance(o);
+        /**
+         *  Return <code>true</code> if the specified object is a String or a <code>null</code>
+         *  value.
+         *
+         * @param o Object to be tested
+         * @return The string value
+         */
+        protected static boolean isString(Object o) {
+            return (o == null) ? true : String.class.isInstance(o);
     }
 
     /**


More information about the cvs mailing list