1 package org.seasar.cubby.interceptor;
2
3 import static org.seasar.cubby.CubbyConstants.ATTR_PARAMS;
4 import static org.seasar.cubby.CubbyConstants.ATTR_VALIDATION_FAIL;
5
6 import java.util.Collections;
7 import java.util.List;
8 import java.util.Map;
9
10 import javax.servlet.http.HttpServletRequest;
11
12 import org.aopalliance.intercept.MethodInterceptor;
13 import org.aopalliance.intercept.MethodInvocation;
14 import org.seasar.cubby.CubbyConstants;
15 import org.seasar.cubby.action.Action;
16 import org.seasar.cubby.action.Forward;
17 import org.seasar.cubby.action.Validation;
18 import org.seasar.cubby.controller.ActionContext;
19 import org.seasar.cubby.util.RequestHolder;
20 import org.seasar.cubby.validator.ActionValidator;
21 import org.seasar.cubby.validator.ValidationRule;
22 import org.seasar.cubby.validator.ValidationRules;
23 import org.seasar.framework.beans.BeanDesc;
24 import org.seasar.framework.beans.PropertyDesc;
25 import org.seasar.framework.beans.factory.BeanDescFactory;
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public class ValidationInterceptor implements MethodInterceptor {
40
41 private static final ValidationRules NULL_VALIDATION_RULES = new ValidationRules() {
42 public List<ValidationRule> getRules() {
43 return Collections.emptyList();
44 }
45 };
46
47 private ActionValidator validator;
48
49 private ActionContext context;
50
51 public ValidationInterceptor() {
52 }
53
54 public void setActionContext(final ActionContext context) {
55 this.context = context;
56 }
57
58 public void setActionValidatior(final ActionValidator actionValidator) {
59 this.validator = actionValidator;
60 }
61
62 public Object invoke(final MethodInvocation invocation) throws Throwable {
63 final HttpServletRequest request = RequestHolder.getRequest();
64
65 final Action controller = context.getAction();
66 final Validation validation = context.getValidation();
67 final ValidationRules rules = getValidationRules(context);
68 final Map<String, Object> params = getParams(request);
69
70 final boolean success = validator.processValidation(validation,
71 controller, params, context.getFormBean(), rules);
72
73 final Object result;
74 if (success) {
75 result = invocation.proceed();
76 } else {
77 request.setAttribute(ATTR_VALIDATION_FAIL, true);
78 String path = validation.errorPage();
79 result = new Forward(path);
80 }
81
82 return result;
83 }
84
85 private ValidationRules getValidationRules(ActionContext context) {
86 final Validation validation = context.getValidation();
87 final ValidationRules validationRules;
88 if (validation == null) {
89 validationRules = NULL_VALIDATION_RULES;
90 } else {
91 final Action action = context.getAction();
92 BeanDesc beanDesc = BeanDescFactory.getBeanDesc(action.getClass());
93 PropertyDesc propertyDesc = beanDesc.getPropertyDesc(validation
94 .rulesField());
95 validationRules = (ValidationRules) propertyDesc.getValue(action);
96 }
97 return validationRules;
98 }
99
100 @SuppressWarnings("unchecked")
101 private static Map<String, Object> getParams(
102 final HttpServletRequest request) {
103 return (Map<String, Object>) request.getAttribute(ATTR_PARAMS);
104 }
105
106 }