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