1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.seasar.cubby.plugins;
18
19 import static org.seasar.cubby.CubbyConstants.ATTR_CONVERSION_FAILURES;
20 import static org.seasar.cubby.CubbyConstants.ATTR_PARAMS;
21 import static org.seasar.cubby.CubbyConstants.ATTR_VALIDATION_FAIL;
22 import static org.seasar.cubby.validator.ValidationUtils.getValidation;
23 import static org.seasar.cubby.validator.ValidationUtils.getValidationRules;
24
25 import java.lang.reflect.InvocationTargetException;
26 import java.util.List;
27 import java.util.Map;
28
29 import javax.servlet.http.HttpServletRequest;
30
31 import org.seasar.cubby.action.ActionContext;
32 import org.seasar.cubby.action.ActionResult;
33 import org.seasar.cubby.action.Validation;
34 import org.seasar.cubby.internal.controller.ConversionFailure;
35 import org.seasar.cubby.internal.controller.RequestParameterBinder;
36 import org.seasar.cubby.internal.controller.impl.RequestParameterBinderImpl;
37 import org.seasar.cubby.internal.util.RequestUtils;
38 import org.seasar.cubby.plugin.AbstractPlugin;
39 import org.seasar.cubby.plugin.ActionInvocation;
40 import org.seasar.cubby.validator.ValidationException;
41 import org.seasar.cubby.validator.ValidationFailBehaviour;
42 import org.seasar.cubby.validator.ValidationRules;
43
44
45
46
47
48
49 public class ValidationPlugin extends AbstractPlugin {
50
51
52 private final RequestParameterBinder requestParameterBinder = new RequestParameterBinderImpl();
53
54
55
56
57
58
59
60 @Override
61 public ActionResult invokeAction(final ActionInvocation invocation)
62 throws Exception {
63 final HttpServletRequest request = invocation.getRequest();
64 final Map<String, Object[]> parameterMap = RequestUtils.getAttribute(
65 request, ATTR_PARAMS);
66
67 final ActionContext actionContext = invocation.getActionContext();
68 final Object formBean = actionContext.getFormBean();
69
70 if (formBean != null) {
71 final List<ConversionFailure> conversionFailures = requestParameterBinder
72 .bind(parameterMap, formBean, actionContext);
73 request.setAttribute(ATTR_CONVERSION_FAILURES, conversionFailures);
74 }
75
76 try {
77 final Validation validation = getValidation(actionContext
78 .getActionMethod());
79 if (validation != null) {
80 final ValidationRules validationRules = getValidationRules(
81 actionContext.getAction(), validation.rules());
82 validationRules.validate(parameterMap, formBean, actionContext
83 .getActionErrors());
84 }
85 try {
86 return invocation.proceed();
87 } catch (final InvocationTargetException e) {
88 final Throwable cause = e.getCause();
89 if (cause instanceof ValidationException) {
90 throw (ValidationException) cause;
91 }
92 throw e;
93 }
94 } catch (final ValidationException e) {
95 request.setAttribute(ATTR_VALIDATION_FAIL, Boolean.TRUE);
96 final ValidationFailBehaviour behaviour = e.getBehaviour();
97 return behaviour.getValidationErrorActionResult(actionContext);
98 }
99 }
100
101 }