1 16 package org.apache.cocoon.woody.datatype.validationruleimpl; 17 18 import java.math.BigDecimal ; 19 20 import org.apache.cocoon.woody.Constants; 21 import org.apache.cocoon.woody.datatype.ValidationError; 22 import org.apache.cocoon.woody.formmodel.CannotYetResolveWarning; 23 import org.apache.cocoon.woody.util.I18nMessage; 24 import org.outerj.expression.Expression; 25 import org.outerj.expression.ExpressionContext; 26 27 41 public class RangeValidationRule extends AbstractValidationRule { 42 private Expression minExpr; 43 private Expression maxExpr; 44 45 private static final String RANGE_ELEM = "range"; 46 private static final String MIN_ATTR = "min"; 47 private static final String MAX_ATTR = "max"; 48 49 50 public void setMinExpr(Expression minExpr) { 51 this.minExpr = minExpr; 52 } 53 54 public void setMaxExpr(Expression maxExpr) { 55 this.maxExpr = maxExpr; 56 } 57 58 public ValidationError validate(Object value, ExpressionContext expressionContext) { 59 Comparable decimal; 61 if (value instanceof Integer ) { 62 decimal = new BigDecimal (((Integer ) value).intValue()); 63 } else if (value instanceof Long ) { 64 decimal = new BigDecimal (((Long ) value).longValue()); 65 } else if (value instanceof Float ) { 66 decimal = new BigDecimal (((Float ) value).floatValue()); 67 } else if (value instanceof Double ) { 68 decimal = new BigDecimal (((Double ) value).doubleValue()); 69 } else { 70 decimal = (Comparable ) value; 71 } 72 73 Comparable min = null; 74 if (minExpr != null) { 75 Object result = evaluateComparable(minExpr, expressionContext, MIN_ATTR, RANGE_ELEM); 76 if (result instanceof ValidationError) { 77 return (ValidationError) result; 78 } else if (result instanceof CannotYetResolveWarning) { 79 return null; 80 } 81 min = (Comparable ) result; 82 } 83 84 Comparable max = null; 85 if (maxExpr != null) { 86 Object result = evaluateComparable(maxExpr, expressionContext, MAX_ATTR, RANGE_ELEM); 87 if (result instanceof ValidationError) { 88 return (ValidationError) result; 89 } else if (result instanceof CannotYetResolveWarning) { 90 return null; 91 } 92 max = (Comparable ) result; 93 } 94 95 if (min != null && max != null) { 96 if (decimal.compareTo(min) < 0 || decimal.compareTo(max) > 0) { 97 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.range", 98 new String []{min.toString(), max.toString()}, 99 Constants.I18N_CATALOGUE)); 100 } 101 102 return null; 103 } else if (min != null) { 104 if (decimal.compareTo(min) < 0) { 105 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.min", 106 new String []{min.toString()}, 107 Constants.I18N_CATALOGUE)); 108 } 109 110 return null; 111 } else if (max != null) { 112 if (decimal.compareTo(max) > 0) { 113 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.max", 114 new String []{max.toString()}, 115 Constants.I18N_CATALOGUE)); 116 } 117 118 return null; 119 } 120 121 return null; 122 } 123 124 public boolean supportsType(Class clazz, boolean arrayType) { 125 return Comparable .class.isAssignableFrom(clazz) && !arrayType; 126 } 127 } 128 | Popular Tags |