Author: pbenedict Date: Sun Jul 1 20:19:22 2007 New Revision: 552390 URL: http://svn.apache.org/viewvc?view=rev&rev=552390 Log: STR-2611: Log form name and field when accessing property fails
Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/FieldChecks.java struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/LocalStrings.properties Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/FieldChecks.java URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/FieldChecks.java?view=diff&rev=552390&r1=552389&r2=552390 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/FieldChecks.java (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/FieldChecks.java Sun Jul 1 20:19:22 2007 @@ -20,6 +20,7 @@ */ package org.apache.struts.validator; +import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.validator.Field; @@ -37,7 +38,7 @@ import javax.servlet.http.HttpServletRequest; import java.io.Serializable; - +import java.util.Collection; import java.util.Locale; import java.util.StringTokenizer; @@ -66,6 +67,43 @@ public static final String FIELD_TEST_EQUAL = "EQUAL"; /** + * Convenience method for getting a value from a bean property as a + * <code>String</code>. If the property is a <code>String[]</code> or + * <code>Collection</code> and it is empty, an empty <code>String</code> + * "" is returned. Otherwise, property.toString() is returned. This method + * may return <code>null</code> if there was an error retrieving the + * property. + * <p> + * <b>NOTE</b>: This method is a port from Commons Validator + * <code>ValidatorUtils</code> because the original version swallows + * exceptions and thus cannot indicate to the caller that the bean + * property was invalid. This version will throw an exception. + * + * @param bean The bean object. + * @param property The name of the property to access. + * @return The value of the property. + * @throws Exception if an error occurs retrieving the property + */ + private static String getValueAsString(Object bean, String property) + throws Exception { + + Object value = PropertyUtils.getProperty(bean, property); + if (value == null) { + return null; + } + + if (value instanceof String[]) { + return ((String[]) value).length > 0 ? value.toString() : ""; + + } else if (value instanceof Collection) { + return ((Collection) value).isEmpty() ? "" : value.toString(); + + } else { + return value.toString(); + } + } + + /** * Checks if the field isn't null and length of the field is greater than * zero not including whitespace. * @@ -86,7 +124,12 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "required", e); + return false; + } if (GenericValidator.isBlankOrNull(value)) { errors.add(field.getKey(), @@ -121,7 +164,12 @@ String value = null; boolean required = false; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "requiredif", e); + return false; + } int i = 0; String fieldJoin = "AND"; @@ -224,9 +272,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - try { + value = evaluateBean(bean, field); + String mask = Resources.getVarValue("mask", field, validator, request, true); @@ -267,7 +315,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "byte", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -304,7 +357,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "byteLocale", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -325,15 +383,16 @@ /** * @param bean * @param field - * @return + * @return the + * @throws Exception if an error occurs accessing the bean property */ - private static String evaluateBean(Object bean, Field field) { + private static String evaluateBean(Object bean, Field field) throws Exception { String value; if (isString(bean)) { value = (String) bean; } else { - value = ValidatorUtils.getValueAsString(bean, field.getProperty()); + value = getValueAsString(bean, field.getProperty()); } return value; @@ -360,7 +419,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "short", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -397,7 +461,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "shortLocale", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -436,7 +505,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "integer", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -473,7 +547,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "integerLocale", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -512,7 +591,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "long", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -549,7 +633,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "longLocale", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -588,7 +677,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "float", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -625,7 +719,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "floatLocale", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -664,7 +763,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "double", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -701,7 +805,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "doubleLocale", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -748,7 +857,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "date", e); + return Boolean.FALSE; + } boolean isStrict = false; String datePattern = @@ -811,10 +925,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - - if (!GenericValidator.isBlankOrNull(value)) { - try { + try { + value = evaluateBean(bean, field); + if (!GenericValidator.isBlankOrNull(value)) { String minVar = Resources.getVarValue("min", field, validator, request, true); String maxVar = @@ -822,23 +935,23 @@ long longValue = Long.parseLong(value); 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)); - + return false; } - } catch (Exception e) { - processFailure(errors, field, validator.getFormName(), "longRange", e); - - return false; } + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "longRange", e); + + return false; } return true; @@ -865,10 +978,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - - if (!GenericValidator.isBlankOrNull(value)) { - try { + try { + value = evaluateBean(bean, field); + if (!GenericValidator.isBlankOrNull(value)) { String minVar = Resources.getVarValue("min", field, validator, request, true); String maxVar = @@ -888,11 +1000,11 @@ return false; } - } catch (Exception e) { - processFailure(errors, field, validator.getFormName(), "intRange", e); - - return false; } + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "intRange", e); + + return false; } return true; @@ -919,10 +1031,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - - if (!GenericValidator.isBlankOrNull(value)) { - try { + try { + value = evaluateBean(bean, field); + if (!GenericValidator.isBlankOrNull(value)) { String minVar = Resources.getVarValue("min", field, validator, request, true); String maxVar = @@ -942,11 +1053,11 @@ return false; } - } catch (Exception e) { - processFailure(errors, field, validator.getFormName(), "doubleRange", e); - - return false; } + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "doubleRange", e); + + return false; } return true; @@ -973,10 +1084,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - - if (!GenericValidator.isBlankOrNull(value)) { - try { + try { + value = evaluateBean(bean, field); + if (!GenericValidator.isBlankOrNull(value)) { String minVar = Resources.getVarValue("min", field, validator, request, true); String maxVar = @@ -984,23 +1094,23 @@ float floatValue = Float.parseFloat(value); 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)); - + return false; } - } catch (Exception e) { - processFailure(errors, field, validator.getFormName(), "floatRange", e); - - return false; } + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "floatRange", e); + + return false; } return true; @@ -1027,7 +1137,12 @@ Object result = null; String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "creditCard", e); + return Boolean.FALSE; + } if (GenericValidator.isBlankOrNull(value)) { return Boolean.TRUE; @@ -1063,7 +1178,12 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "email", e); + return false; + } if (!GenericValidator.isBlankOrNull(value) && !GenericValidator.isEmail(value)) { @@ -1097,10 +1217,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - - if (value != null) { - try { + try { + value = evaluateBean(bean, field); + if (value != null) { String maxVar = Resources.getVarValue("maxlength", field, validator, request, true); @@ -1122,11 +1241,11 @@ return false; } - } catch (Exception e) { - processFailure(errors, field, validator.getFormName(), "maxlength", e); - - return false; } + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "maxlength", e); + + return false; } return true; @@ -1153,10 +1272,9 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); - - if (!GenericValidator.isBlankOrNull(value)) { - try { + try { + value = evaluateBean(bean, field); + if (!GenericValidator.isBlankOrNull(value)) { String minVar = Resources.getVarValue("minlength", field, validator, request, true); @@ -1178,11 +1296,11 @@ return false; } - } catch (Exception e) { - processFailure(errors, field, validator.getFormName(), "minlength", e); - - return false; } + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "minlength", e); + + return false; } return true; @@ -1231,7 +1349,12 @@ HttpServletRequest request) { String value = null; - value = evaluateBean(bean, field); + try { + value = evaluateBean(bean, field); + } catch (Exception e) { + processFailure(errors, field, validator.getFormName(), "url", e); + return false; + } if (GenericValidator.isBlankOrNull(value)) { return true; @@ -1315,7 +1438,7 @@ sysmsgs.getMessage("validation.failed", validatorName, field.getProperty(), formName, t.toString()); - log.error(logErrorMsg); + log.error(logErrorMsg, t); // Add general "system error" message to show to the user String userErrorMsg = sysmsgs.getMessage("system.error"); Modified: struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/LocalStrings.properties URL: http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/LocalStrings.properties?view=diff&rev=552390&r1=552389&r2=552390 ============================================================================== --- struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/LocalStrings.properties (original) +++ struts/struts1/trunk/core/src/main/java/org/apache/struts/validator/LocalStrings.properties Sun Jul 1 20:19:22 2007 @@ -14,7 +14,7 @@ # limitations under the License. system.error=SYSTEM ERROR: Check logs for details. -validation.failed={0} validation failed for property {1} of form key {2}: {3} +validation.failed={0} validation failed for property \'{1}\' of form key \'{2}\': {3} 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}