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 42 public class ValueCountValidationRule extends AbstractValidationRule { 43 private Expression exactExpr; 44 private Expression minExpr; 45 private Expression maxExpr; 46 47 public void setExactExpr(Expression exactExpr) { 48 this.exactExpr = exactExpr; 49 } 50 51 public void setMinExpr(Expression minExpr) { 52 this.minExpr = minExpr; 53 } 54 55 public void setMaxExpr(Expression maxExpr) { 56 this.maxExpr = maxExpr; 57 } 58 59 public ValidationError validate(Object value, ExpressionContext expressionContext) { 60 Object [] array = (Object [])value; 61 62 if (exactExpr != null) { 63 Object result = evaluateNumeric(exactExpr, expressionContext, "exact", "value-count"); 64 if (result instanceof ValidationError) 65 return (ValidationError)result; 66 else if (result instanceof CannotYetResolveWarning) 67 return null; 68 int length = ((BigDecimal )result).intValue(); 69 if (array.length != length) 70 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.array.exact-valuecount", new String [] {String.valueOf(length)}, Constants.I18N_CATALOGUE)); 71 return null; 72 } else if (minExpr != null && maxExpr != null) { 73 Object result = evaluateNumeric(minExpr, expressionContext, "min", "value-count"); 74 if (result instanceof ValidationError) 75 return (ValidationError)result; 76 else if (result instanceof CannotYetResolveWarning) 77 return null; 78 int minLength = ((BigDecimal )result).intValue(); 79 80 result = evaluateNumeric(maxExpr, expressionContext, "max", "value-count"); 81 if (result instanceof ValidationError) 82 return (ValidationError)result; 83 else if (result instanceof CannotYetResolveWarning) 84 return null; 85 int maxLength = ((BigDecimal )result).intValue(); 86 87 if (array.length < minLength || array.length > maxLength) 88 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.array.range-valuecount", new String [] {String.valueOf(minLength), String.valueOf(maxLength)}, Constants.I18N_CATALOGUE)); 89 return null; 90 } else if (minExpr != null) { 91 Object result = evaluateNumeric(minExpr, expressionContext, "min", "value-count"); 92 if (result instanceof ValidationError) 93 return (ValidationError)result; 94 else if (result instanceof CannotYetResolveWarning) 95 return null; 96 int length = ((BigDecimal )result).intValue(); 97 if (array.length < length) 98 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.array.min-valuecount", new String [] {String.valueOf(length)}, Constants.I18N_CATALOGUE)); 99 return null; 100 } else if (maxExpr != null) { 101 Object result = evaluateNumeric(maxExpr, expressionContext, "max", "value-count"); 102 if (result instanceof ValidationError) 103 return (ValidationError)result; 104 else if (result instanceof CannotYetResolveWarning) 105 return null; 106 int length = ((BigDecimal )result).intValue(); 107 if (array.length > length) 108 return hasFailMessage() ? getFailMessage() : new ValidationError(new I18nMessage("validation.array.max-valuecount", new String [] {String.valueOf(length)}, Constants.I18N_CATALOGUE)); 109 return null; 110 } 111 return null; 112 } 113 114 public boolean supportsType(Class clazz, boolean arrayType) { 115 return arrayType; 116 } 117 } 118 | Popular Tags |