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.Validation;
7   import org.seasar.cubby.controller.CubbyConfiguration;
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 CubbyConfiguration cubbyConfiguration;
22  
23  	public void setCubbyConfiguration(
24  			final CubbyConfiguration cubbyConfiguration) {
25  		this.cubbyConfiguration = cubbyConfiguration;
26  	}
27  
28  	public boolean processValidation(final Validation valid,
29  			final Action action, final Map<String, Object> params,
30  			final Object form, final ValidationRules rules) {
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  		for (ValidationRule rule : rules.getRules()) {
42  			for (Validator v : rule.getValidators()) {
43  				validate(action, params, form, v, rule);
44  			}
45  		}
46  	}
47  
48  	void validate(final Action action, final Map<String, Object> params,
49  			final Object form, final Validator validator,
50  			final ValidationRule rule) {
51  		// TODO PropertyValidationRule以外の実装を認めていないので、そのうち修正
52  		PropertyValidationRule propRule = (PropertyValidationRule) rule;
53  		Object value = getPropertyValue(params, propRule.getPropertyName());
54  		ValidationContext ctx = createValidContext(action, params, form, rule,
55  				value);
56  		String error = validator.validate(ctx);
57  		if (error != null) {
58  			action.getErrors().addFieldError(propRule.getPropertyName(), error);
59  		}
60  	}
61  
62  	private ValidationContext createValidContext(final Action action,
63  			final Map<String, Object> params, final Object form,
64  			final ValidationRule rule, Object value) {
65  		// TODO PropertyValidationRule以外の実装を認めていないので、そのうち修正
66  		PropertyValidationRule propRule = (PropertyValidationRule) rule;
67  		String name = propRule.getPropertyNameKey();
68  		ValidationContext ctx = new ValidationContext(name, value, params,
69  				cubbyConfiguration.getFormatPattern());
70  		return ctx;
71  	}
72  
73  	Object getPropertyValue(final Map<String, Object> params,
74  			final String propertyName) {
75  		String[] props = propertyName.split("\\.");
76  		Object value = CubbyUtils.getParamsValue(params, props[0]);
77  		for (int i = 1; i < props.length; i++) {
78  			BeanDesc beanDesc = BeanDescFactory.getBeanDesc(value.getClass());
79  			PropertyDesc propertyDesc = beanDesc.getPropertyDesc(props[i]);
80  			value = propertyDesc.getValue(value);
81  		}
82  		return value;
83  	}
84  }