001: /*
002: * Copyright (c) 2002-2006 by OpenSymphony
003: * All rights reserved.
004: */
005: package com.opensymphony.xwork.validator;
006:
007: import com.opensymphony.xwork.ActionInvocation;
008: import com.opensymphony.xwork.interceptor.MethodFilterInterceptor;
009:
010: /**
011: * <!-- START SNIPPET: description -->
012: *
013: * This interceptor runs the action through the standard validation framework, which in turn checks the action against
014: * any validation rules (found in files such as <i>ActionClass-validation.xml</i>) and adds field-level and action-level
015: * error messages (provided that the action implements {@link com.opensymphony.xwork.ValidationAware}). This interceptor
016: * is often one of the last (or second to last) interceptors applied in a stack, as it assumes that all values have
017: * already been set on the action.
018: *
019: * <p/>This interceptor does nothing if the name of the method being invoked is specified in the <b>excludeMethods</b>
020: * parameter. <b>excludeMethods</b> accepts a comma-delimited list of method names. For example, requests to
021: * <b>foo!input.action</b> and <b>foo!back.action</b> will be skipped by this interceptor if you set the
022: * <b>excludeMethods</b> parameter to "input, back".
023: *
024: * <p/>Note that this has nothing to do with the {@link com.opensymphony.xwork.Validateable} interface and simply adds
025: * error messages to the action. The workflow of the action request does not change due to this interceptor. Rather,
026: * this interceptor is often used in conjuction with the <b>workflow</b> interceptor.
027: *
028: * <p/>
029: *
030: * <b>NOTE:</b> As this method extends off MethodFilterInterceptor, it is capable of
031: * deciding if it is applicable only to selective methods in the action class. See
032: * <code>MethodFilterInterceptor</code> for more info.
033: *
034: * <!-- END SNIPPET: description -->
035: *
036: * <p/> <u>Interceptor parameters:</u>
037: *
038: * <!-- START SNIPPET: parameters -->
039: *
040: * <ul>
041: *
042: * <li>None</li>
043: *
044: * </ul>
045: *
046: * <!-- END SNIPPET: parameters -->
047: *
048: * <p/> <u>Extending the interceptor:</u>
049: *
050: * <p/>
051: *
052: * <!-- START SNIPPET: extending -->
053: *
054: * There are no known extension points for this interceptor.
055: *
056: * <!-- END SNIPPET: extending -->
057: *
058: * <p/> <u>Example code:</u>
059: *
060: * <pre>
061: * <!-- START SNIPPET: example -->
062: *
063: * <action name="someAction" class="com.examples.SomeAction">
064: * <interceptor-ref name="params"/>
065: * <interceptor-ref name="validation"/>
066: * <interceptor-ref name="workflow"/>
067: * <result name="success">good_result.ftl</result>
068: * </action>
069: *
070: * <-- in the following case myMethod of the action class will not
071: * get validated -->
072: * <action name="someAction" class="com.examples.SomeAction">
073: * <interceptor-ref name="params"/>
074: * <interceptor-ref name="validation">
075: * <param name="excludeMethods">myMethod</param>
076: * </interceptor-ref>
077: * <interceptor-ref name="workflow"/>
078: * <result name="success">good_result.ftl</result>
079: * </action>
080: *
081: *
082: * <!-- END SNIPPET: example -->
083: * </pre>
084: *
085: * @author Jason Carreira
086: * @author Rainer Hermanns
087: * @author <a href='mailto:the_mindstorm[at]evolva[dot]ro'>Alexandru Popescu</a>
088: * @see ActionValidatorManager
089: * @see com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor
090: *
091: * @version $Date: 2006-03-18 05:42:54 +0100 (Sa, 18 Mrz 2006) $ $Id: ValidationInterceptor.java 904 2006-03-18 04:42:54Z tmjee $
092: */
093: public class ValidationInterceptor extends MethodFilterInterceptor {
094: /**
095: * Gets the current action and its context and calls {@link DefaultActionValidatorManager#validate(Object, String)}.
096: *
097: * @param invocation the execution state of the Action.
098: * @throws Exception if an error occurs validating the action.
099: */
100: protected void doBeforeInvocation(ActionInvocation invocation)
101: throws Exception {
102: Object action = invocation.getAction();
103: String context = invocation.getProxy().getActionName();
104:
105: if (log.isDebugEnabled()) {
106: log.debug("Validating "
107: + invocation.getProxy().getNamespace() + "/"
108: + invocation.getProxy().getActionName()
109: + " with method "
110: + invocation.getProxy().getMethod() + ".");
111: }
112:
113: ActionValidatorManagerFactory.getInstance().validate(action,
114: context);
115: }
116:
117: protected String doIntercept(ActionInvocation invocation)
118: throws Exception {
119: doBeforeInvocation(invocation);
120:
121: return invocation.invoke();
122: }
123: }
|