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