Author: niallp Date: Fri Sep 16 20:34:41 2005 New Revision: 289694 URL: http://svn.apache.org/viewcvs?rev=289694&view=rev Log: Add support the new 'resource' and 'bundle' attributes for Variables in Commons Validator 1.2.0 (see Bug #32522). Variables can now be localized - for example the format of a date can be put in the message resources and the key specified in the validator config.
<field property="orderdate" depends="date"> <var resource="true" bundle="validation"> <var-name>datePattern</var-name> <var-value>orderdate.pattern</var-value> </var> <field> Also missing variables now cause validation to fail with a standard "System Error" message shown to the user and details of the problem logged. Previously validation just passed with no indication there was any kind of problem. Added: struts/core/trunk/src/java/org/apache/struts/validator/LocalStrings.properties (with props) Modified: struts/core/trunk/src/java/org/apache/struts/validator/FieldChecks.java struts/core/trunk/src/java/org/apache/struts/validator/Resources.java struts/core/trunk/src/java/org/apache/struts/validator/validwhen/ValidWhen.java struts/taglib/trunk/src/java/org/apache/struts/taglib/html/JavascriptValidatorTag.java Modified: struts/core/trunk/src/java/org/apache/struts/validator/FieldChecks.java URL: http://svn.apache.org/viewcvs/struts/core/trunk/src/java/org/apache/struts/validator/FieldChecks.java?rev=289694&r1=289693&r2=289694&view=diff ============================================================================== --- struts/core/trunk/src/java/org/apache/struts/validator/FieldChecks.java (original) +++ struts/core/trunk/src/java/org/apache/struts/validator/FieldChecks.java Fri Sep 16 20:34:41 2005 @@ -1,7 +1,7 @@ /* * $Id$ * - * Copyright 2000-2004 The Apache Software Foundation. + * Copyright 2000-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -34,8 +34,10 @@ import org.apache.commons.validator.Validator; import org.apache.commons.validator.ValidatorAction; import org.apache.commons.validator.util.ValidatorUtils; +import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.util.RequestUtils; +import org.apache.struts.util.MessageResources; /** * <p> @@ -57,6 +59,14 @@ */ private static final Log log = LogFactory.getLog(FieldChecks.class); + /** + * The message resources for this package. + */ + private static MessageResources sysmsgs = + MessageResources.getMessageResources( + "org.apache.struts.validator.LocalStrings"); + + public static final String FIELD_TEST_NULL = "NULL"; public static final String FIELD_TEST_NOTNULL = "NOTNULL"; public static final String FIELD_TEST_EQUAL = "EQUAL"; @@ -217,11 +227,13 @@ Validator validator, HttpServletRequest request) { - String mask = field.getVarValue("mask"); String value = null; value = evaluateBean(bean, field); try { + + String mask = Resources.getVarValue("mask", field, validator, request, true); + if (!GenericValidator.isBlankOrNull(value) && !GenericValidator.matchRegexp(value, mask)) { @@ -234,9 +246,10 @@ return true; } } catch (Exception e) { - log.error(e.getMessage(), e); + processFailure(errors, field, "mask", e); + return false; } - return true; + } @@ -736,8 +749,15 @@ Object result = null; String value = null; value = evaluateBean(bean, field); - String datePattern = field.getVarValue("datePattern"); - String datePatternStrict = field.getVarValue("datePatternStrict"); + boolean isStrict = false; + String datePattern = Resources.getVarValue("datePattern", field, validator, request, false); + if (GenericValidator.isBlankOrNull(datePattern)) { + datePattern = Resources.getVarValue("datePatternStrict", field, validator, request, false); + if (!GenericValidator.isBlankOrNull(datePattern)) { + isStrict = true; + } + } + Locale locale = RequestUtils.getUserLocale(request, null); if (GenericValidator.isBlankOrNull(value)) { @@ -745,12 +765,10 @@ } try { - if (datePattern != null && datePattern.length() > 0) { - result = GenericTypeValidator.formatDate(value, datePattern, false); - } else if (datePatternStrict != null && datePatternStrict.length() > 0) { - result = GenericTypeValidator.formatDate(value, datePatternStrict, true); - } else { + if (GenericValidator.isBlankOrNull(datePattern)) { result = GenericTypeValidator.formatDate(value, locale); + } else { + result = GenericTypeValidator.formatDate(value, datePattern, isStrict); } } catch (Exception e) { log.error(e.getMessage(), e); @@ -790,9 +808,15 @@ if (!GenericValidator.isBlankOrNull(value)) { try { + String minVar = Resources.getVarValue("min", field, validator, request, true); + String maxVar = Resources.getVarValue("max", field, validator, request, true); long longValue = Long.parseLong(value); - long min = Long.parseLong(field.getVarValue("min")); - long max = Long.parseLong(field.getVarValue("max")); + long min = Long.parseLong(minVar); + long max = Long.parseLong(maxVar); + if (min > max) { + throw new IllegalArgumentException(sysmsgs.getMessage( + "invalid.range", minVar, maxVar)); + } if (!GenericValidator.isInRange(longValue, min, max)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); @@ -800,7 +824,7 @@ return false; } } catch (Exception e) { - errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); + processFailure(errors, field, "longRange", e); return false; } } @@ -835,9 +859,15 @@ if (!GenericValidator.isBlankOrNull(value)) { try { + String minVar = Resources.getVarValue("min", field, validator, request, true); + String maxVar = Resources.getVarValue("max", field, validator, request, true); + int min = Integer.parseInt(minVar); + int max = Integer.parseInt(maxVar); int intValue = Integer.parseInt(value); - int min = Integer.parseInt(field.getVarValue("min")); - int max = Integer.parseInt(field.getVarValue("max")); + if (min > max) { + throw new IllegalArgumentException(sysmsgs.getMessage( + "invalid.range", minVar, maxVar)); + } if (!GenericValidator.isInRange(intValue, min, max)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); @@ -845,7 +875,7 @@ return false; } } catch (Exception e) { - errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); + processFailure(errors, field, "intRange", e); return false; } } @@ -879,9 +909,15 @@ if (!GenericValidator.isBlankOrNull(value)) { try { + String minVar = Resources.getVarValue("min", field, validator, request, true); + String maxVar = Resources.getVarValue("max", field, validator, request, true); double doubleValue = Double.parseDouble(value); - double min = Double.parseDouble(field.getVarValue("min")); - double max = Double.parseDouble(field.getVarValue("max")); + double min = Double.parseDouble(minVar); + double max = Double.parseDouble(maxVar); + if (min > max) { + throw new IllegalArgumentException(sysmsgs.getMessage( + "invalid.range", minVar, maxVar)); + } if (!GenericValidator.isInRange(doubleValue, min, max)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); @@ -889,7 +925,7 @@ return false; } } catch (Exception e) { - errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); + processFailure(errors, field, "doubleRange", e); return false; } } @@ -923,9 +959,15 @@ if (!GenericValidator.isBlankOrNull(value)) { try { + String minVar = Resources.getVarValue("min", field, validator, request, true); + String maxVar = Resources.getVarValue("max", field, validator, request, true); float floatValue = Float.parseFloat(value); - float min = Float.parseFloat(field.getVarValue("min")); - float max = Float.parseFloat(field.getVarValue("max")); + float min = Float.parseFloat(minVar); + float max = Float.parseFloat(maxVar); + if (min > max) { + throw new IllegalArgumentException(sysmsgs.getMessage( + "invalid.range", minVar, maxVar)); + } if (!GenericValidator.isInRange(floatValue, min, max)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); @@ -933,7 +975,7 @@ return false; } } catch (Exception e) { - errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); + processFailure(errors, field, "floatRange", e); return false; } } @@ -1039,7 +1081,8 @@ if (value != null) { try { - int max = Integer.parseInt(field.getVarValue("maxlength")); + String maxVar = Resources.getVarValue("maxlength", field, validator, request, true); + int max = Integer.parseInt(maxVar); if (!GenericValidator.maxLength(value, max)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); @@ -1047,7 +1090,7 @@ return false; } } catch (Exception e) { - errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); + processFailure(errors, field, "floatRange", e); return false; } } @@ -1082,7 +1125,8 @@ if (!GenericValidator.isBlankOrNull(value)) { try { - int min = Integer.parseInt(field.getVarValue("minlength")); + String minVar = Resources.getVarValue("minlength", field, validator, request, true); + int min = Integer.parseInt(minVar); if (!GenericValidator.minLength(value, min)) { errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); @@ -1090,7 +1134,7 @@ return false; } } catch (Exception e) { - errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); + processFailure(errors, field, "minlength", e); return false; } } @@ -1142,18 +1186,22 @@ } // Get the options and schemes Vars - boolean allowallschemes = "true".equalsIgnoreCase(field.getVarValue("allowallschemes")); + String allowallschemesVar = Resources.getVarValue("allowallschemes", field, validator, request, false); + boolean allowallschemes = "true".equalsIgnoreCase(allowallschemesVar); int options = allowallschemes ? UrlValidator.ALLOW_ALL_SCHEMES : 0; - if ("true".equalsIgnoreCase(field.getVarValue("allow2slashes"))) { + String allow2slashesVar = Resources.getVarValue("allow2slashes", field, validator, request, false); + if ("true".equalsIgnoreCase(allow2slashesVar)) { options += UrlValidator.ALLOW_2_SLASHES; } - if ("true".equalsIgnoreCase(field.getVarValue("nofragments"))) { + String nofragmentsVar = Resources.getVarValue("nofragments", field, validator, request, false); + if ("true".equalsIgnoreCase(nofragmentsVar)) { options += UrlValidator.NO_FRAGMENTS; } - String schemesVar = allowallschemes ? null : field.getVarValue("schemes"); + String schemesVar = allowallschemes ? null : + Resources.getVarValue("schemes", field, validator, request, false); // No options or schemes - use GenericValidator as default if (options == 0 && schemesVar == null) { @@ -1187,6 +1235,24 @@ errors.add(field.getKey(), Resources.getActionMessage(validator, request, va, field)); return false; } + } + + /** + * Process a validation failure. + */ + private static void processFailure(ActionMessages errors, + Field field, + String validator, + Throwable t) { + // Log the error + String logErrorMsg = sysmsgs.getMessage("validation.failed", + validator, field.getProperty(), t.toString()); + log.error(logErrorMsg); + + // Add general "system error" message to show to the user + String userErrorMsg = sysmsgs.getMessage("system.error"); + errors.add(field.getKey(), new ActionMessage(userErrorMsg, false)); + } /** Added: struts/core/trunk/src/java/org/apache/struts/validator/LocalStrings.properties URL: http://svn.apache.org/viewcvs/struts/core/trunk/src/java/org/apache/struts/validator/LocalStrings.properties?rev=289694&view=auto ============================================================================== --- struts/core/trunk/src/java/org/apache/struts/validator/LocalStrings.properties (added) +++ struts/core/trunk/src/java/org/apache/struts/validator/LocalStrings.properties Fri Sep 16 20:34:41 2005 @@ -0,0 +1,5 @@ +system.error=SYSTEM ERROR: Check logs for details. +validation.failed={0} validation failed for property {1}: {2} +variable.missing=Variable {0} is missing. +variable.resource.notfound=Key {1} not found for Variable {0} in bundle {2}. +invalid.range=Minimum value {0} is greater than maximum value {1} Propchange: struts/core/trunk/src/java/org/apache/struts/validator/LocalStrings.properties ------------------------------------------------------------------------------ svn:eol-style = native Modified: struts/core/trunk/src/java/org/apache/struts/validator/Resources.java URL: http://svn.apache.org/viewcvs/struts/core/trunk/src/java/org/apache/struts/validator/Resources.java?rev=289694&r1=289693&r2=289694&view=diff ============================================================================== --- struts/core/trunk/src/java/org/apache/struts/validator/Resources.java (original) +++ struts/core/trunk/src/java/org/apache/struts/validator/Resources.java Fri Sep 16 20:34:41 2005 @@ -1,7 +1,7 @@ /* * $Id$ * - * Copyright 2000-2004 The Apache Software Foundation. + * Copyright 2000-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,9 +26,12 @@ import org.apache.commons.validator.Arg; import org.apache.commons.validator.Field; import org.apache.commons.validator.Msg; +import org.apache.commons.validator.Var; import org.apache.commons.validator.Validator; import org.apache.commons.validator.ValidatorAction; import org.apache.commons.validator.ValidatorResources; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.apache.struts.Globals; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; @@ -47,6 +50,18 @@ public class Resources { /** + * The message resources for this package. + */ + private static MessageResources sysmsgs = + MessageResources.getMessageResources( + "org.apache.struts.validator.LocalStrings"); + + /** + * <p>Commons Logging instance.</p> + */ + private static Log log = LogFactory.getLog(Resources.class); + + /** * Resources key the <code>ServletContext</code> is stored under. */ private static String SERVLET_CONTEXT_PARAM = "javax.servlet.ServletContext"; @@ -126,6 +141,86 @@ } + /** + * Get the value of a variable. + * @param varName The variable name + * @param field the validator Field + * @param validator The Validator + * @param request the servlet request + * @param required Whether the variable is mandatory + * @return The variable's value + */ + public static String getVarValue(String varName, + Field field, + Validator validator, + HttpServletRequest request, + boolean required) { + + Var var = field.getVar(varName); + if (var == null) { + + String msg = sysmsgs.getMessage("variable.missing", varName); + if (required) { + throw new IllegalArgumentException(msg); + } + if (log.isDebugEnabled()) { + log.debug(field.getProperty() + ": " + msg); + } + return null; + } + + ServletContext application = (ServletContext)validator + .getParameterValue(SERVLET_CONTEXT_PARAM); + return getVarValue(var, application, request, required); + } + + /** + * Get the value of a variable. + * @param var the validator variable + * @param application The ServletContext + * @param request the servlet request + * @param required Whether the variable is mandatory + * @return The variables values + */ + public static String getVarValue(Var var, + ServletContext application, + HttpServletRequest request, + boolean required) { + + String varName = var.getName(); + String varValue = var.getValue(); + + // Non-resource variable + if (!var.isResource()) { + return varValue; + } + + // Get the message resources + String bundle = var.getBundle(); + MessageResources messages = + getMessageResources(application, request, bundle); + + // Retrieve variable's value from message resources + Locale locale = RequestUtils.getUserLocale(request, null); + String value = messages.getMessage(locale, varValue, null); + + // Not found in message resources + if (value == null && required) { + throw new IllegalArgumentException( + sysmsgs.getMessage("variable.resource.notfound", + varName, varValue, bundle)); + } + + if (log.isDebugEnabled()) { + log.debug("Var=[" + varName + "], " + + "bundle=[" + bundle + "], " + + "key=[" + varValue + "], " + + "value=[" + value + "]"); + } + + return value; + + } /** * Gets the <code>Locale</code> sensitive value based on the key passed in. Modified: struts/core/trunk/src/java/org/apache/struts/validator/validwhen/ValidWhen.java URL: http://svn.apache.org/viewcvs/struts/core/trunk/src/java/org/apache/struts/validator/validwhen/ValidWhen.java?rev=289694&r1=289693&r2=289694&view=diff ============================================================================== --- struts/core/trunk/src/java/org/apache/struts/validator/validwhen/ValidWhen.java (original) +++ struts/core/trunk/src/java/org/apache/struts/validator/validwhen/ValidWhen.java Fri Sep 16 20:34:41 2005 @@ -1,7 +1,7 @@ /* * $Id$ * - * Copyright 2003,2004 The Apache Software Foundation. + * Copyright 2003-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -31,6 +31,7 @@ import org.apache.struts.validator.Resources; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.apache.struts.util.MessageResources; /** * This class contains the validwhen validation that is used in the @@ -46,6 +47,13 @@ private static final Log log = LogFactory.getLog(ValidWhen.class); /** + * The message resources for this package. + */ + private static MessageResources sysmsgs = + MessageResources.getMessageResources( + "org.apache.struts.validator.LocalStrings"); + + /** * Returns true if <code>obj</code> is null or a String. */ private static boolean isString(Object obj) { @@ -103,11 +111,15 @@ value = ValidatorUtils.getValueAsString(bean, field.getProperty()); } - String test = field.getVarValue("test"); - if (test == null) { - String msg = "ValidWhen Error 'test' parameter is missing for field ' " + field.getKey() + "'"; - errors.add(field.getKey(), new ActionMessage(msg, false)); - log.error(msg); + String test = null; + try { + test = Resources.getVarValue("test", field, validator, request, true); + } catch(IllegalArgumentException ex) { + String logErrorMsg = sysmsgs.getMessage("validation.failed", + "validwhen", field.getProperty(), ex.toString()); + log.error(logErrorMsg); + String userErrorMsg = sysmsgs.getMessage("system.error"); + errors.add(field.getKey(), new ActionMessage(userErrorMsg, false)); return false; } @@ -116,10 +128,10 @@ try { lexer = new ValidWhenLexer(new StringReader(test)); } catch (Exception ex) { - String msg = "ValidWhenLexer Error for field ' " + field.getKey() + "' - " + ex; - errors.add(field.getKey(), new ActionMessage(msg + " - " + ex, false)); - log.error(msg); - log.debug(msg, ex); + String logErrorMsg = "ValidWhenLexer Error for field ' " + field.getKey() + "' - " + ex; + log.error(logErrorMsg); + String userErrorMsg = sysmsgs.getMessage("system.error"); + errors.add(field.getKey(), new ActionMessage(userErrorMsg, false)); return false; } @@ -128,10 +140,10 @@ try { parser = new ValidWhenParser(lexer); } catch (Exception ex) { - String msg = "ValidWhenParser Error for field ' " + field.getKey() + "' - " + ex; - errors.add(field.getKey(), new ActionMessage(msg, false)); - log.error(msg); - log.debug(msg, ex); + String logErrorMsg = "ValidWhenParser Error for field ' " + field.getKey() + "' - " + ex; + log.error(logErrorMsg); + String userErrorMsg = sysmsgs.getMessage("system.error"); + errors.add(field.getKey(), new ActionMessage(userErrorMsg, false)); return false; } @@ -146,14 +158,10 @@ } catch (Exception ex) { - // errors.add( - // field.getKey(), - // Resources.getActionMessage(validator, request, va, field)); - - String msg = "ValidWhen Error for field ' " + field.getKey() + "' - " + ex; - errors.add(field.getKey(), new ActionMessage(msg, false)); - log.error(msg); - log.debug(msg, ex); + String logErrorMsg = "ValidWhen Error for field ' " + field.getKey() + "' - " + ex; + log.error(logErrorMsg); + String userErrorMsg = sysmsgs.getMessage("system.error"); + errors.add(field.getKey(), new ActionMessage(userErrorMsg, false)); return false; } Modified: struts/taglib/trunk/src/java/org/apache/struts/taglib/html/JavascriptValidatorTag.java URL: http://svn.apache.org/viewcvs/struts/taglib/trunk/src/java/org/apache/struts/taglib/html/JavascriptValidatorTag.java?rev=289694&r1=289693&r2=289694&view=diff ============================================================================== --- struts/taglib/trunk/src/java/org/apache/struts/taglib/html/JavascriptValidatorTag.java (original) +++ struts/taglib/trunk/src/java/org/apache/struts/taglib/html/JavascriptValidatorTag.java Fri Sep 16 20:34:41 2005 @@ -1,7 +1,7 @@ /* * $Id$ * - * Copyright 2001-2004 The Apache Software Foundation. + * Copyright 2001-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -503,7 +503,7 @@ while (varsIterator.hasNext()) { String varName = (String) varsIterator.next(); Var var = (Var) vars.get(varName); - String varValue = var.getValue(); + String varValue = Resources.getVarValue(var, application, request, false); String jsType = var.getJsType(); // skip requiredif variables field, fieldIndexed, fieldTest, fieldValue --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]