
com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil Maven / Gradle / Ivy
Go to download
XWork is an command-pattern framework that is used to power WebWork
as well as other applications. XWork provides an Inversion of Control
container, a powerful expression language, data type conversion,
validation, and pluggable configuration.
/*
* Copyright (c) 2002-2006 by OpenSymphony
* All rights reserved.
*/
package com.opensymphony.xwork2.interceptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.opensymphony.xwork2.ActionInvocation;
/**
* A utility class for invoking prefixed methods in action class.
*
* Interceptors that made use of this class are
*
* - DefaultWorkflowInterceptor
* - PrepareInterceptor
*
*
*
*
*
*
* In DefaultWorkflowInterceptor
* applies only when action implements {@link com.opensymphony.xwork2.Validateable}
*
* - if the action class have validate{MethodName}(), it will be invoked
* - else if the action class have validateDo{MethodName}(), it will be invoked
* - no matter if 1] or 2] is performed, if alwaysInvokeValidate property of the interceptor is "true" (which is by default "true"), validate() will be invoked.
*
*
*
*
*
*
*
* In PrepareInterceptor
* Applies only when action implements Preparable
*
* - if the action class have prepare{MethodName}(), it will be invoked
* - else if the action class have prepareDo(MethodName()}(), it will be invoked
* - no matter if 1] or 2] is performed, if alwaysinvokePrepare property of the interceptor is "true" (which is by default "true"), prepare() will be invoked.
*
*
*
*
* @author Philip Luppens
* @author tm_jee
* @version $Date: 2006-11-23 21:33:15 +0100 (Do, 23 Nov 2006) $ $Id: PrefixMethodInvocationUtil.java 1223 2006-11-23 20:33:15Z rainerh $
*/
public class PrefixMethodInvocationUtil {
private static final Log _log = LogFactory.getLog(PrefixMethodInvocationUtil.class);
/**
* This method will prefix actionInvocation
's ActionProxy
's
* method
with prefixes
before invoking the prefixed method.
* Order of the prefixes
is important, as this method will return once
* a prefixed method is found in the action class.
*
*
*
* For example, with
*
* invokePrefixMethod(actionInvocation, new String[] { "prepare", "prepareDo" });
*
*
* Assuming actionInvocation.getProxy(),getMethod()
returns "submit",
* the order of invocation would be as follows:-
*
* - prepareSubmit()
* - prepareDoSubmit()
*
*
* If prepareSubmit()
exists, it will be invoked and this method
* will return, prepareDoSubmit()
will NOT be invoked.
*
*
*
* On the other hand, if prepareDoSubmit()
does not exists, and
* prepareDoSubmit()
exists, it will be invoked.
*
*
*
* If none of those two methods exists, nothing will be invoked.
*
* @param actionInvocation
* @param prefixes
* @throws InvocationTargetException
* @throws IllegalAccessException
*/
public static void invokePrefixMethod(ActionInvocation actionInvocation, String[] prefixes) throws InvocationTargetException, IllegalAccessException {
Object action = actionInvocation.getAction();
String methodName = actionInvocation.getProxy().getMethod();
if (methodName == null) {
// TODO: clean me up
/* if null returns (possible according to the docs),
* use the default execute - this should be a static somewhere ?
*/
methodName = "execute";
}
Method method = getPrefixedMethod(prefixes, methodName, action);
if (method != null) {
method.invoke(action, new Object[0]);
}
}
/**
* This method returns a {@link Method} in action
. The method
* returned is found by searching for method in action
whose method name
* is equals to the result of appending each prefixes
* to methodName
. Only the first method found will be returned, hence
* the order of prefixes
is important. If none is found this method
* will return null.
*
* @param prefixes the prefixes to prefix the methodName
* @param methodName the method name to be prefixed with prefixes
* @param action the action class of which the prefixed method is to be search for.
* @return a {@link Method} if one is found, else null.
*/
public static Method getPrefixedMethod(String[] prefixes, String methodName, Object action) {
assert(prefixes != null);
String capitalizedMethodName = capitalizeMethodName(methodName);
for (int a=0; a< prefixes.length; a++) {
String prefixedMethodName = prefixes[a]+capitalizedMethodName;
try {
Method method = action.getClass().getMethod(prefixedMethodName, new Class[0]);
return method;
}
catch(NoSuchMethodException e) {
// hmm -- OK, try next prefix
if (_log.isDebugEnabled()) {
_log.debug("cannot find method ["+prefixedMethodName+"] in action ["+action+"]");
}
}
}
return null;
}
/**
* This method capitalized the first character of methodName
.
*
*
* eg.
*
* capitalizeMethodName("someMethod");
*
*
* will return "SomeMethod".
*
* @param methodName
* @return String
*/
public static String capitalizeMethodName(String methodName) {
assert(methodName != null);
return methodName = methodName.substring(0, 1).toUpperCase()
+ methodName.substring(1);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy