View Javadoc

1   /*
2    * Copyright 2004-2008 the Seasar Foundation and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.seasar.cubby.validator.impl;
17  
18  import static org.seasar.cubby.CubbyConstants.ATTR_PARAMS;
19  import static org.seasar.cubby.CubbyConstants.ATTR_VALIDATION_FAIL;
20  import static org.seasar.cubby.validator.ValidationUtils.getValidation;
21  import static org.seasar.cubby.validator.ValidationUtils.getValidationRules;
22  
23  import java.lang.reflect.Method;
24  import java.util.Collection;
25  import java.util.Map;
26  
27  import javax.servlet.http.HttpServletRequest;
28  
29  import org.seasar.cubby.action.Action;
30  import org.seasar.cubby.action.ActionErrors;
31  import org.seasar.cubby.action.ActionResult;
32  import org.seasar.cubby.action.Validation;
33  import org.seasar.cubby.util.CubbyUtils;
34  import org.seasar.cubby.validator.ValidationException;
35  import org.seasar.cubby.validator.ValidationFailBehaviour;
36  import org.seasar.cubby.validator.ValidationPhase;
37  import org.seasar.cubby.validator.ValidationProcessor;
38  import org.seasar.cubby.validator.ValidationRule;
39  import org.seasar.cubby.validator.ValidationRules;
40  
41  /**
42   * 入力検証処理の実装です。
43   * 
44   * @author baba
45   * @since 1.0.0
46   */
47  public class ValidationProcessorImpl implements ValidationProcessor {
48  
49  	/**
50  	 * {@inheritDoc}
51  	 */
52  	public void process(final HttpServletRequest request, final Action action,
53  			final Class<? extends Action> actionClass, final Method method) {
54  		final Validation validation = getValidation(method);
55  		if (validation != null) {
56  			final Map<String, Object[]> params = CubbyUtils.getAttribute(
57  					request, ATTR_PARAMS);
58  			final ValidationRules validationRules = getValidationRules(action,
59  					validation.rules());
60  			final Object formBean = CubbyUtils.getFormBean(action, actionClass,
61  					method);
62  			validate(validationRules, params, formBean, action.getErrors());
63  		}
64  	}
65  
66  	/**
67  	 * すべてのフェーズに対する入力検証を実行します。
68  	 * 
69  	 * @param validationRules
70  	 *            入力検証ルールの集合
71  	 * @param params
72  	 *            リクエストパラメータ
73  	 * @param form
74  	 *            フォームオブジェクト
75  	 * @param errors
76  	 *            アクションのエラー
77  	 */
78  	public void validate(final ValidationRules validationRules,
79  			final Map<String, Object[]> params, final Object form,
80  			final ActionErrors errors) {
81  		for (ValidationPhase validationPhase : validationRules
82  				.getValidationPhases()) {
83  			validate(validationRules, validationPhase, params, form, errors);
84  		}
85  	}
86  
87  	/**
88  	 * 指定されたフェーズに対する入力検証を実行します。
89  	 * 
90  	 * @param validationRules
91  	 *            入力検証ルールの集合
92  	 * @param validationPhase
93  	 *            入力検証のフェーズ
94  	 * @param errors
95  	 *            アクションのエラー
96  	 * @param params
97  	 *            リクエストパラメータ
98  	 * @param form
99  	 *            フォームオブジェクト
100 	 */
101 	public void validate(final ValidationRules validationRules,
102 			final ValidationPhase validationPhase,
103 			final Map<String, Object[]> params, final Object form,
104 			final ActionErrors errors) {
105 		final Collection<ValidationRule> phaseValidationRules = validationRules
106 				.getPhaseValidationRules(validationPhase);
107 		for (final ValidationRule validationRule : phaseValidationRules) {
108 			validationRule.apply(params, form, errors);
109 		}
110 		if (!errors.isEmpty()) {
111 			throw new ValidationException();
112 		}
113 	}
114 
115 	/**
116 	 * {@inheritDoc}
117 	 */
118 	public ActionResult handleValidationException(final ValidationException e,
119 			final HttpServletRequest request, final Action action,
120 			final Method method) {
121 		request.setAttribute(ATTR_VALIDATION_FAIL, Boolean.TRUE);
122 		final ValidationFailBehaviour behaviour = e.getBehaviour();
123 		return behaviour.getActionResult(action, method);
124 	}
125 
126 }