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;
17  
18  import java.util.ArrayList;
19  import java.util.Arrays;
20  import java.util.Collection;
21  import java.util.Collections;
22  import java.util.HashMap;
23  import java.util.List;
24  import java.util.Map;
25  
26  import org.seasar.cubby.action.ActionResult;
27  import org.seasar.cubby.action.Forward;
28  import org.seasar.cubby.exception.ActionRuntimeException;
29  import org.seasar.framework.util.StringUtil;
30  
31  /**
32   * 入力検証を保持するクラスです。
33   * 
34   * @author agata
35   * @author baba
36   * @since 1.0.0
37   */
38  public abstract class DefaultValidationRules implements ValidationRules {
39  
40  	/** データ型を検証するフェーズ。 */
41  	public static final ValidationPhase DATA_TYPE = new ValidationPhase();
42  
43  	/** データ上の制約を検証するフェーズ。 */
44  	public static final ValidationPhase DATA_CONSTRAINT = new ValidationPhase();
45  
46  	/** 入力検証のフェーズとそれに対応する入力検証ルールのリスト。 */
47  	private final Map<ValidationPhase, List<ValidationRule>> phaseValidationRulesMap = new HashMap<ValidationPhase, List<ValidationRule>>();
48  
49  	/** メッセージキーのプリフィックス。 */
50  	private final String resourceKeyPrefix;
51  
52  	/** 入力検証のフェーズ。 */
53  	private static final List<ValidationPhase> VALIDATION_PHASES = Arrays
54  			.asList(new ValidationPhase[] { DATA_TYPE, DATA_CONSTRAINT });
55  
56  	/**
57  	 * メッセージキーのプリフィックスなしのコンストラクタ。
58  	 */
59  	public DefaultValidationRules() {
60  		this(null);
61  	}
62  
63  	/**
64  	 * メッセージキーのプリフィックス付きのコンストラクタ。
65  	 * 
66  	 * @param resourceKeyPrefix
67  	 *            メッセージキーのプリフィックス
68  	 */
69  	public DefaultValidationRules(final String resourceKeyPrefix) {
70  		this.resourceKeyPrefix = resourceKeyPrefix;
71  		initialize();
72  	}
73  
74  	/**
75  	 * 初期化メソッド。
76  	 * <p>
77  	 * このメソッドをサブクラスでオーバーライドして各項目の入力検証ルールを追加します。
78  	 * </p>
79  	 */
80  	protected abstract void initialize();
81  
82  	/**
83  	 * 入力検証ルールを追加します。
84  	 * 
85  	 * @param validationPhase
86  	 *            指定された入力検証ルールを実行するフェーズ
87  	 * @param validationRule
88  	 *            入力検証ルール
89  	 */
90  	protected void add(final ValidationPhase validationPhase,
91  			final ValidationRule validationRule) {
92  		if (!this.phaseValidationRulesMap.containsKey(validationPhase)) {
93  			this.phaseValidationRulesMap.put(validationPhase,
94  					new ArrayList<ValidationRule>());
95  		}
96  		final List<ValidationRule> validationRules = this.phaseValidationRulesMap
97  				.get(validationPhase);
98  		validationRules.add(validationRule);
99  	}
100 
101 	/**
102 	 * 最初のフェーズに入力検証ルールを追加します。
103 	 * 
104 	 * @param validationRule
105 	 *            入力検証ルール
106 	 */
107 	protected void add(final ValidationRule validationRule) {
108 		this.add(getValidationPhases().get(0), validationRule);
109 	}
110 
111 	/**
112 	 * 最初のフェーズに入力検証を追加します。
113 	 * <p>
114 	 * 項目名のメッセージキーとしてパラメータ名が使用されます。
115 	 * </p>
116 	 * 
117 	 * @param paramName
118 	 *            パラメータ名
119 	 * @param validators
120 	 *            入力検証
121 	 */
122 	protected void add(final String paramName, final Validator... validators) {
123 		this.add(paramName, paramName, validators);
124 	}
125 
126 	/**
127 	 * 項目名のメッセージキーを指定して、最初のフェーズに入力検証を追加します。
128 	 * 
129 	 * @param paramName
130 	 *            パラメータ名
131 	 * @param paramNameMessageKey
132 	 *            項目名のメッセージキー
133 	 * @param validators
134 	 *            入力検証
135 	 */
136 	protected void add(final String paramName,
137 			final String paramNameMessageKey, final Validator... validators) {
138 		this.add(getValidationPhases().get(0),
139 				new FieldValidationRule(paramName,
140 						makePropertyNameKey(paramNameMessageKey), validators));
141 	}
142 
143 	/**
144 	 * 指定された {@link ValidationRules} に定義された入力検証ルールをすべて追加します。
145 	 * 
146 	 * @param validationRules
147 	 *            追加する入力検証ルールの集合
148 	 */
149 	protected void addAll(final ValidationRules validationRules) {
150 		for (final ValidationPhase validationPhase : validationRules
151 				.getValidationPhases()) {
152 			final Collection<ValidationRule> phaseValidationRules = validationRules
153 					.getPhaseValidationRules(validationPhase);
154 			for (final ValidationRule validationRule : phaseValidationRules) {
155 				this.add(validationPhase, validationRule);
156 			}
157 		}
158 	}
159 
160 	/**
161 	 * メッセージキーを作成します。
162 	 * <p>
163 	 * キーのプリフィックスが指定されていた場合、メッセージキーに付加します。
164 	 * </p>
165 	 * 
166 	 * @param messageKey
167 	 *            メッセージキー
168 	 * @return 作成後のメッセージキー
169 	 */
170 	private String makePropertyNameKey(final String messageKey) {
171 		if (this.resourceKeyPrefix == null) {
172 			return messageKey;
173 		} else {
174 			return this.resourceKeyPrefix + messageKey;
175 		}
176 	}
177 
178 	/**
179 	 * {@inheritDoc}
180 	 * <p>
181 	 * 指定されたエラーページへ遷移する {@link Forward} を返します。
182 	 * </p>
183 	 */
184 	public ActionResult fail(final String errorPage) {
185 		if (StringUtil.isEmpty(errorPage)) {
186 			throw new ActionRuntimeException("ECUB0106");
187 		}
188 		return new Forward(errorPage);
189 	}
190 
191 	/**
192 	 * {@inheritDoc}
193 	 * <p>
194 	 * デフォルトでは以下の順序です。
195 	 * <ul>
196 	 * <li>{@link #DATA_TYPE}</li>
197 	 * <li>{@link #DATA_CONSTRAINT}</li>
198 	 * </ul>
199 	 * これを変更してフェーズの追加などをしたい場合はこのメソッドをオーバーライドしてください。
200 	 * </p>
201 	 */
202 	public List<ValidationPhase> getValidationPhases() {
203 		return VALIDATION_PHASES;
204 	}
205 
206 	/**
207 	 * {@inheritDoc}
208 	 */
209 	public Collection<ValidationRule> getPhaseValidationRules(
210 			final ValidationPhase validationPhase) {
211 		final Collection<ValidationRule> phaseValidationRules;
212 		if (this.phaseValidationRulesMap.containsKey(validationPhase)) {
213 			phaseValidationRules = this.phaseValidationRulesMap
214 					.get(validationPhase);
215 		} else {
216 			phaseValidationRules = Collections.emptyList();
217 		}
218 		return phaseValidationRules;
219 	}
220 
221 	/**
222 	 * {@inheritDoc}
223 	 * 
224 	 * @deprecated {@link #addAll(ValidationRules)} を使用してください。
225 	 */
226 	@Deprecated
227 	public List<ValidationRule> getRules() {
228 		return phaseValidationRulesMap.get(getValidationPhases().get(0));
229 	}
230 
231 	public boolean isFail(String name) {
232 		return false;
233 	}
234 
235 	public boolean isFail(ValidationRule rule) {
236 		return false;
237 	}
238 
239 }