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
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
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 }