blob: 878f628fba9fe752f12f2e79831ab071b0bb217e [file] [log] [blame]
/*
* $Id$
*
* 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 org.apache.struts.dispatcher;
import org.apache.struts.chain.contexts.ActionContext;
import java.lang.reflect.Method;
/**
* This abstract class is the stock template for resolving methods for a
* {@link Dispatcher}. The implementation handles methods that accept no
* arguments or only an {@link ActionContext} instance:
* <ul>
* <li><code><i>return_type</i> execute()</code></li>
* <li><code><i>return_type</i> execute(ActionContext context)</code></li>
* </ul>
*
* @version $Rev$
* @since Struts 1.4
*/
public abstract class AbstractMethodResolver implements MethodResolver {
/**
* The argument listing for a method without arguments.
*
* @see #EMPTY_ARGUMENT_TYPES
*/
protected static final Object[] EMPTY_ARGUMENTS = new Object[] {};
/**
* The type listing used for a method without arguments.
*
* @see #EMPTY_ARGUMENTS
*/
protected static final Class[] EMPTY_ARGUMENT_TYPES = new Class[] {};
/**
* The argument listing for a method accepting the {@link ActionContext}.
*/
private static final Class[] ACTION_CONTEXT_ARGUMENT_TYPES = new Class[] { ActionContext.class };
public Object[] buildArguments(ActionContext context, Method method) {
Class[] parameterTypes = method.getParameterTypes();
switch (parameterTypes.length) {
case 0:
return EMPTY_ARGUMENTS;
case 1:
if (parameterTypes[0].isInstance(context)) {
return new Object[] { context };
}
return null;
default:
return null;
}
}
public Method resolveMethod(ActionContext context, String methodName) throws NoSuchMethodException {
Class actionClass = context.getAction().getClass();
// Does the method accept nothing?
try {
return actionClass.getMethod(methodName, EMPTY_ARGUMENT_TYPES);
} catch (NoSuchMethodException e) {
// continue
}
// Does the method accept the action context?
return actionClass.getMethod(methodName, ACTION_CONTEXT_ARGUMENT_TYPES);
}
}