View Javadoc

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   * 入力検証とフォームオブジェクトへの値のバインディングを行います。<br>
29   * 入力検証が成功した場合:<br>
30   * フォームオブジェクトへのバインドを行い、後のフィルターを実行します。<br>
31   * 入力検証が失敗した場合:<br>
32   * フォームオブジェクトへのバインドを行い、アクションメソッドに設定された{@link Validation#errorPage()}へフォワードします。
33   * またリクエスト中の入力検証エラーフラグがONになります。
34   * 
35   * @see CubbyConstants#ATTR_VALIDATION_FAIL 入力検証エラーフラグの属性名
36   * @author agata
37   * @since 1.0
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 }