All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.opensymphony.xwork2.interceptor.PrefixMethodInvocationUtil Maven / Gradle / Ivy

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
package com.opensymphony.xwork2.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * 

* 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}

*
    *
  1. if the action class have validate{MethodName}(), it will be invoked
  2. *
  3. else if the action class have validateDo{MethodName}(), it will be invoked
  4. *
  5. 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.
  6. *
* * * * * * * In PrepareInterceptor *

Applies only when action implements Preparable

*
    *
  1. if the action class have prepare{MethodName}(), it will be invoked
  2. *
  3. else if the action class have prepareDo(MethodName()}(), it will be invoked
  4. *
  5. 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.
  6. *
* * * * @author Philip Luppens * @author tm_jee */ public class PrefixMethodInvocationUtil { private static final Logger LOG = LogManager.getLogger(PrefixMethodInvocationUtil.class); private static final String DEFAULT_INVOCATION_METHODNAME = "execute"; private static final Class[] EMPTY_CLASS_ARRAY = new Class[0]; /** *

* 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:- *

* *
    *
  1. prepareSubmit()
  2. *
  3. prepareDoSubmit()
  4. *
* *

* 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 the action invocation * @param prefixes prefixes for method names * @throws InvocationTargetException is thrown if invocation of a method failed. * @throws IllegalAccessException is thrown if invocation of a method failed. */ public static void invokePrefixMethod(ActionInvocation actionInvocation, String[] prefixes) throws InvocationTargetException, IllegalAccessException { Object action = actionInvocation.getAction(); String methodName = actionInvocation.getProxy().getMethod(); if (methodName == null) { // if null returns (possible according to the docs), use the default execute methodName = DEFAULT_INVOCATION_METHODNAME; } 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 (String prefixe : prefixes) { String prefixedMethodName = prefixe + capitalizedMethodName; try { return action.getClass().getMethod(prefixedMethodName, EMPTY_CLASS_ARRAY); } catch (NoSuchMethodException e) { // hmm -- OK, try next prefix LOG.debug("Cannot find method [{}] in action [{}]", prefixedMethodName, action); } } return null; } /** *

* This method capitalized the first character of methodName. *
* eg. capitalizeMethodName("someMethod"); will return "SomeMethod". *

* * @param methodName the method name * @return capitalized method name */ public static String capitalizeMethodName(String methodName) { assert(methodName != null); return methodName.substring(0, 1).toUpperCase() + methodName.substring(1); } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy