1 16 package org.apache.cocoon.woody.datatype.validationruleimpl; 17 18 import org.apache.cocoon.woody.datatype.ValidationError; 19 import org.apache.cocoon.woody.formmodel.CannotYetResolveWarning; 20 import org.apache.cocoon.woody.util.I18nMessage; 21 import org.apache.cocoon.woody.Constants; 22 import org.outerj.expression.ExpressionContext; 23 import org.outerj.expression.Expression; 24 25 import java.math.BigDecimal ; 26 27 40 public class LengthValidationRule extends AbstractValidationRule { 41 private Expression exactExpr; 42 private Expression minExpr; 43 private Expression maxExpr; 44 45 public void setExactExpr(Expression exactExpr) { 46 this.exactExpr = exactExpr; 47 } 48 49 public void setMinExpr(Expression minExpr) { 50 this.minExpr = minExpr; 51 } 52 53 public void setMaxExpr(Expression maxExpr) { 54 this.maxExpr = maxExpr; 55 } 56 57 public ValidationError validate(Object value, ExpressionContext expressionContext) { 58 String string = (String )value; 59 60 if (exactExpr != null) { 61 Object result = evaluateNumeric(exactExpr, expressionContext, "exact", "length"); 62 if (result instanceof ValidationError) 63 return (ValidationError)result; 64 else if (result instanceof CannotYetResolveWarning) 65 return null; 66 int length = ((BigDecimal )result).intValue(); 67 if (string.length() != length) 68 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.string.exact-length", new String [] {String.valueOf(length)}, Constants.I18N_CATALOGUE)); 69 return null; 70 } else if (minExpr != null && maxExpr != null) { 71 Object result = evaluateNumeric(minExpr, expressionContext, "min", "length"); 72 if (result instanceof ValidationError) 73 return (ValidationError)result; 74 else if (result instanceof CannotYetResolveWarning) 75 return null; 76 int minLength = ((BigDecimal )result).intValue(); 77 78 result = evaluateNumeric(maxExpr, expressionContext, "max", "length"); 79 if (result instanceof ValidationError) 80 return (ValidationError)result; 81 else if (result instanceof CannotYetResolveWarning) 82 return null; 83 int maxLength = ((BigDecimal )result).intValue(); 84 85 if (string.length() < minLength || string.length() > maxLength) 86 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.string.range-length", new String [] {String.valueOf(minLength), String.valueOf(maxLength)}, Constants.I18N_CATALOGUE)); 87 return null; 88 } else if (minExpr != null) { 89 Object result = evaluateNumeric(minExpr, expressionContext, "min", "length"); 90 if (result instanceof ValidationError) 91 return (ValidationError)result; 92 else if (result instanceof CannotYetResolveWarning) 93 return null; 94 int length = ((BigDecimal )result).intValue(); 95 if (string.length() < length) 96 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.string.min-length", new String [] {String.valueOf(length)}, Constants.I18N_CATALOGUE)); 97 return null; 98 } else if (maxExpr != null) { 99 Object result = evaluateNumeric(maxExpr, expressionContext, "max", "length"); 100 if (result instanceof ValidationError) 101 return (ValidationError)result; 102 else if (result instanceof CannotYetResolveWarning) 103 return null; 104 int length = ((BigDecimal )result).intValue(); 105 if (string.length() > length) 106 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.string.max-length", new String [] {String.valueOf(length)}, Constants.I18N_CATALOGUE)); 107 return null; 108 } 109 return null; 110 } 111 112 public boolean supportsType(Class clazz, boolean arrayType) { 113 return clazz.isAssignableFrom(String .class) && !arrayType; 114 } 115 } 116 | Popular Tags |