You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by vg...@apache.org on 2003/12/30 21:22:08 UTC

cvs commit: cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/validationruleimpl AbstractValidationRule.java RangeValidationRule.java

vgritsenko    2003/12/30 12:22:08

  Modified:    src/blocks/woody/java/org/apache/cocoon/woody/datatype/validationruleimpl
                        AbstractValidationRule.java
                        RangeValidationRule.java
  Log:
  Range is applicable not only to numbers, but to any comparables (example: dates).
  Reduce code duplication.
  Add evaluateComparable (increase code duplication).
  
  Revision  Changes    Path
  1.3       +34 -3     cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/validationruleimpl/AbstractValidationRule.java
  
  Index: AbstractValidationRule.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/validationruleimpl/AbstractValidationRule.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- AbstractValidationRule.java	13 Nov 2003 13:19:09 -0000	1.2
  +++ AbstractValidationRule.java	30 Dec 2003 20:22:08 -0000	1.3
  @@ -107,11 +107,42 @@
           } catch (CannotYetResolveWarning w) {
               return w;
           } catch (ExpressionException e) {
  -            return new ValidationError("Error evaluating \"" + exprName + "\" expression on \"" + ruleName + "\" validation rule", false);
  +            return new ValidationError("Error evaluating \"" + exprName + "\" expression on \"" +
  +                                       ruleName + "\" validation rule", false);
           }
  -        if (!(expressionResult instanceof BigDecimal))
  -            return new ValidationError("Got non-numeric result from \"" + exprName + "\" expression on \"" + ruleName + "\" validation rule", false);
  +        
  +        if (!(expressionResult instanceof BigDecimal)) {
  +            return new ValidationError("Got non-numeric result from \"" + exprName + "\" expression on \"" +
  +                                       ruleName + "\" validation rule", false);
  +        }
  +
           return expressionResult;
       }
   
  +    /**
  +     * Helper method for evaluating expressions whose result is comparable.
  +     *
  +     * @param exprName a name for the expression that's descriptive for the user, e.g. the name of the attribute in which it was defined
  +     * @param ruleName a descriptive name for the validation rule, usually the rule's element name
  +     * @return either a ValidationError (because expression evaluation failed) or a CannotYetResolveWarning
  +     * (because another, required field referenced in the expression has not yet a value), or a BigDecimal.
  +     */
  +    protected Object evaluateComparable(Expression expression, ExpressionContext expressionContext, String exprName, String ruleName) {
  +        Object expressionResult;
  +        try {
  +            expressionResult = expression.evaluate(expressionContext);
  +        } catch (CannotYetResolveWarning w) {
  +            return w;
  +        } catch (ExpressionException e) {
  +            return new ValidationError("Error evaluating \"" + exprName + "\" expression on \"" +
  +                                       ruleName + "\" validation rule", false);
  +        }
  +        
  +        if (!(expressionResult instanceof Comparable)) {
  +            return new ValidationError("Got non-comparable result from \"" + exprName + "\" expression on \"" +
  +                                       ruleName + "\" validation rule", false);
  +        }
  +
  +        return expressionResult;
  +    }
   }
  
  
  
  1.5       +52 -42    cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/validationruleimpl/RangeValidationRule.java
  
  Index: RangeValidationRule.java
  ===================================================================
  RCS file: /home/cvs/cocoon-2.1/src/blocks/woody/java/org/apache/cocoon/woody/datatype/validationruleimpl/RangeValidationRule.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- RangeValidationRule.java	13 Nov 2003 13:15:41 -0000	1.4
  +++ RangeValidationRule.java	30 Dec 2003 20:22:08 -0000	1.5
  @@ -50,14 +50,14 @@
   */
   package org.apache.cocoon.woody.datatype.validationruleimpl;
   
  +import java.math.BigDecimal;
  +
  +import org.apache.cocoon.woody.Constants;
   import org.apache.cocoon.woody.datatype.ValidationError;
   import org.apache.cocoon.woody.formmodel.CannotYetResolveWarning;
   import org.apache.cocoon.woody.util.I18nMessage;
  -import org.apache.cocoon.woody.Constants;
  -import org.outerj.expression.ExpressionContext;
   import org.outerj.expression.Expression;
  -
  -import java.math.BigDecimal;
  +import org.outerj.expression.ExpressionContext;
   
   /**
    * Checks numeric ranges. Works for Integer, Long and BigDecimal values.
  @@ -87,57 +87,67 @@
       }
   
       public ValidationError validate(Object value, ExpressionContext expressionContext) {
  -        BigDecimal decimal = null;
  -        if (value instanceof Integer)
  +        Comparable decimal;
  +        if (value instanceof Integer) {
               decimal = new BigDecimal(((Integer) value).intValue());
  -		else if (value instanceof Long)
  -			decimal = new BigDecimal(((Long) value).longValue()); 
  -        else
  -            decimal = (BigDecimal) value;
  -
  -        if (minExpr != null && maxExpr != null) {
  -            Object result = evaluateNumeric(minExpr, expressionContext, MIN_ATTR, RANGE_ELEM);
  -            if (result instanceof ValidationError)
  +        } else if (value instanceof Long) {
  +            decimal = new BigDecimal(((Long) value).longValue()); 
  +        } else {
  +            decimal = (Comparable) value;
  +        }
  +
  +        Comparable min = null; 
  +        if (minExpr != null) {
  +            Object result = evaluateComparable(minExpr, expressionContext, MIN_ATTR, RANGE_ELEM);
  +            if (result instanceof ValidationError) {
                   return (ValidationError) result;
  -            else if (result instanceof CannotYetResolveWarning)
  +            } else if (result instanceof CannotYetResolveWarning) {
                   return null;
  -            BigDecimal min = (BigDecimal) result;
  -
  -            result = evaluateNumeric(maxExpr, expressionContext, MAX_ATTR, RANGE_ELEM);
  -            if (result instanceof ValidationError)
  +            }
  +            min = (Comparable) result;
  +        }
  +        
  +        Comparable max = null;
  +        if (maxExpr != null) {
  +            Object result = evaluateComparable(maxExpr, expressionContext, MAX_ATTR, RANGE_ELEM);
  +            if (result instanceof ValidationError) {
                   return (ValidationError) result;
  -            else if (result instanceof CannotYetResolveWarning)
  +            } else if (result instanceof CannotYetResolveWarning) {
                   return null;
  -            BigDecimal max = (BigDecimal) result;
  +            }
  +            max = (Comparable) result;
  +        }
  +        
  +        if (min != null && max != null) {
  +            if (decimal.compareTo(min) < 0 || decimal.compareTo(max) > 0) {
  +                return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.range",
  +                                                                                 new String[]{min.toString(), max.toString()},
  +                                                                                 Constants.I18N_CATALOGUE));
  +            }
   
  -            if (decimal.compareTo(min) < 0 || decimal.compareTo(max) > 0)
  -                return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.range", new String[]{min.toString(), max.toString()}, Constants.I18N_CATALOGUE));
               return null;
  -        } else if (minExpr != null) {
  -            Object result = evaluateNumeric(minExpr, expressionContext, MIN_ATTR, RANGE_ELEM);
  -            if (result instanceof ValidationError)
  -                return (ValidationError) result;
  -            else if (result instanceof CannotYetResolveWarning)
  -                return null;
  -            BigDecimal min = (BigDecimal) result;
  -            if (decimal.compareTo(min) < 0)
  -                return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.min", new String[]{min.toString()}, Constants.I18N_CATALOGUE));
  +        } else if (min != null) {
  +            if (decimal.compareTo(min) < 0) {
  +                return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.min",
  +                                                                                 new String[]{min.toString()},
  +                                                                                 Constants.I18N_CATALOGUE));
  +            }
  +
               return null;
  -        } else if (maxExpr != null) {
  -            Object result = evaluateNumeric(maxExpr, expressionContext, MAX_ATTR, RANGE_ELEM);
  -            if (result instanceof ValidationError)
  -                return (ValidationError) result;
  -            else if (result instanceof CannotYetResolveWarning)
  -                return null;
  -            BigDecimal max = (BigDecimal) result;
  -            if (decimal.compareTo(max) > 0)
  -                return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.max", new String[]{max.toString()}, Constants.I18N_CATALOGUE));
  +        } else if (max != null) {
  +            if (decimal.compareTo(max) > 0) {
  +                return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.max",
  +                                                                                 new String[]{max.toString()},
  +                                                                                 Constants.I18N_CATALOGUE));
  +            }
  +
               return null;
           }
  +
           return null;
       }
   
       public boolean supportsType(Class clazz, boolean arrayType) {
  -        return (clazz.isAssignableFrom(Integer.class) || clazz.isAssignableFrom(Long.class) || clazz.isAssignableFrom(BigDecimal.class)) && !arrayType;
  +        return Comparable.class.isAssignableFrom(clazz) && !arrayType;
       }
   }