View Javadoc

1   package org.seasar.cubby.validator.impl;
2   
3   import java.util.Map;
4   
5   import org.seasar.cubby.action.Action;
6   import org.seasar.cubby.action.FormatPattern;
7   import org.seasar.cubby.action.Validation;
8   import org.seasar.cubby.util.CubbyUtils;
9   import org.seasar.cubby.validator.ActionValidator;
10  import org.seasar.cubby.validator.PropertyValidationRule;
11  import org.seasar.cubby.validator.ValidationContext;
12  import org.seasar.cubby.validator.ValidationRule;
13  import org.seasar.cubby.validator.ValidationRules;
14  import org.seasar.cubby.validator.Validator;
15  import org.seasar.framework.beans.BeanDesc;
16  import org.seasar.framework.beans.PropertyDesc;
17  import org.seasar.framework.beans.factory.BeanDescFactory;
18  
19  public class ActionValidatorImpl implements ActionValidator {
20  
21  	private FormatPattern formatPattern;
22  
23  	public void setFormatPattern(final FormatPattern formatPattern) {
24  		this.formatPattern = formatPattern;
25  	}
26  
27  	public boolean processValidation(final Validation valid, 
28  			final Action action, final Map<String,Object> params, 
29  			final Object form, final ValidationRules rules) 
30  	{
31  		if (valid == null) {
32  			return true;
33  		}
34  		validateAction(action, params, form, rules);
35  		return action.getErrors().isEmpty();
36  	}
37  
38  	@SuppressWarnings("unchecked")
39  	void validateAction(final Action action, final Map<String,Object> params, 
40  			final Object form, final ValidationRules rules) 
41  	{
42  		for (ValidationRule rule : rules.getRules()) {
43  			for (Validator v : rule.getValidators()) {
44  				validate(action, params, form, v, rule);
45  			}
46  		}
47  	}
48  
49  	void validate(final Action action, final Map<String, Object> params, 
50  			final Object form, final Validator validator, final ValidationRule rule) 
51  	{
52  		// TODO PropertyValidationRule以外の実装を認めていないので、そのうち修正
53  		PropertyValidationRule propRule = (PropertyValidationRule)rule;
54  		Object value = getPropertyValue(params, propRule.getPropertyName());
55  		ValidationContext ctx = createValidContext(action, params, form, rule, value);
56  		String error = validator.validate(ctx);
57  		if (error != null) {
58  			action.getErrors().addFieldError(propRule.getPropertyName(),
59  					error);
60  		}
61  	}
62  
63  	private ValidationContext createValidContext(final Action action, 
64  			final Map<String, Object> params, final Object form, final ValidationRule rule, Object value) 
65  	{
66  		// TODO PropertyValidationRule以外の実装を認めていないので、そのうち修正
67  		PropertyValidationRule propRule = (PropertyValidationRule)rule;
68  		String name = propRule.getPropertyNameKey();
69  		ValidationContext ctx = new ValidationContext(name, value, params, formatPattern);
70  		return ctx;
71  	}
72  
73  	Object getPropertyValue(final Map<String, Object> params, final String propertyName) {
74  		String[] props = propertyName.split("\\.");
75  		Object value = CubbyUtils.getParamsValue(params, props[0]);
76  		for (int i = 1; i < props.length; i++) {
77  			BeanDesc beanDesc = BeanDescFactory.getBeanDesc(value.getClass());
78  			PropertyDesc propertyDesc = beanDesc.getPropertyDesc(props[i]);
79  			value = propertyDesc.getValue(value);
80  		}
81  		return value;
82  	}
83  }