1 16 package org.apache.cocoon.forms.datatype.validationruleimpl; 17 18 import java.math.BigDecimal ; 19 20 import org.apache.cocoon.forms.FormsConstants; 21 import org.apache.cocoon.forms.formmodel.CannotYetResolveWarning; 22 import org.apache.cocoon.forms.util.I18nMessage; 23 import org.apache.cocoon.forms.validation.ValidationError; 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 FormsConstants.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 FormsConstants.I18N_CATALOGUE)); 108 } 109 return null; 110 } else if (max != null) { 111 if (decimal.compareTo(max) > 0) { 112 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.numeric.max", 113 new String []{max.toString()}, 114 FormsConstants.I18N_CATALOGUE)); 115 } 116 return null; 117 } 118 return null; 119 } 120 121 public boolean supportsType(Class clazz, boolean arrayType) { 122 return Comparable .class.isAssignableFrom(clazz) && !arrayType; 123 } 124 } 125 | Popular Tags |