Author: pbenedict
Date: Tue Nov 25 14:33:33 2008
New Revision: 720628

URL: http://svn.apache.org/viewvc?rev=720628&view=rev
Log:
STR-3168: Introduce new dispatcher package

Added:
    struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java
   (with props)
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java
   (with props)
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java
   (with props)
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java
   (contents, props changed)
      - copied, changed from r718127, 
struts/struts1/trunk/core/src/main/java/org/apache/struts/action/Dispatcher.java
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java
   (with props)
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java
   (with props)
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java
   (with props)
Removed:
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/action/Dispatcher.java
Modified:
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/Constants.java
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/ExecuteDispatcher.java
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java
    
struts/struts1/trunk/extras/src/main/java/org/apache/struts/actions/ActionDispatcher.java

Modified: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/Constants.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/Constants.java?rev=720628&r1=720627&r2=720628&view=diff
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/Constants.java 
(original)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/Constants.java 
Tue Nov 25 14:33:33 2008
@@ -20,7 +20,7 @@
  */
 package org.apache.struts.chain;
 
-import org.apache.struts.action.Dispatcher;
+import org.apache.struts.dispatcher.Dispatcher;
 
 
 /**

Modified: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/ExecuteDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/ExecuteDispatcher.java?rev=720628&r1=720627&r2=720628&view=diff
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/ExecuteDispatcher.java
 (original)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/chain/commands/ExecuteDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -22,12 +22,12 @@
 
 import org.apache.struts.action.Action;
 import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.Dispatcher;
 import org.apache.struts.chain.Constants;
 import org.apache.struts.chain.commands.util.ClassUtils;
 import org.apache.struts.chain.contexts.ActionContext;
 import org.apache.struts.config.ActionConfig;
 import org.apache.struts.config.ForwardConfig;
+import org.apache.struts.dispatcher.Dispatcher;
 
 import java.util.HashMap;
 import java.util.Map;
@@ -89,7 +89,7 @@
        }
 
        // Dispatch
-       Object result = dispatcher.dispatchAction(context);
+       Object result = dispatcher.dispatch(context);
        processDispatchResult(result, context);
        return CONTINUE_PROCESSING;
     }

Modified: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java?rev=720628&r1=720627&r2=720628&view=diff
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java
 (original)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/config/ActionConfig.java
 Tue Nov 25 14:33:33 2008
@@ -252,7 +252,7 @@
     protected String catalog = null;
     
     /**
-     * The name of the [EMAIL PROTECTED] org.apache.struts.action.Dispatcher} 
implementation
+     * The name of the [EMAIL PROTECTED] 
org.apache.struts.dispatcher.Dispatcher} implementation
      * that will dispatch to the end point of this action.
      * 
      * @since Struts 1.4
@@ -889,7 +889,7 @@
 
     /**
      * Retrieves the fully-qualified class name of the 
-     * [EMAIL PROTECTED] org.apache.struts.action.Dispatcher} implementation 
that will 
+     * [EMAIL PROTECTED] org.apache.struts.dispatcher.Dispatcher} 
implementation that will 
      * dispatch to the this action.
      *  
      * @return the dispatcher class name or <code>null</code>
@@ -902,7 +902,7 @@
 
     /**
      * Stores the fully-qualified class name of the 
-     * [EMAIL PROTECTED] org.apache.struts.action.Dispatcher} implementation 
that will 
+     * [EMAIL PROTECTED] org.apache.struts.dispatcher.Dispatcher} 
implementation that will 
      * dispatch to the this action.
      * 
      * @param dispatcher the dispatcher class name

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java?rev=720628&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -0,0 +1,302 @@
+/*
+ * $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.Globals;
+import org.apache.struts.action.Action;
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.config.ActionConfig;
+import org.apache.struts.util.MessageResources;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * TODO
+ * 
+ * @version $Rev$
+ * @since Struts 1.4
+ */
+public abstract class AbstractDispatcher implements Dispatcher {
+
+    // Package constants
+    static final String KEY_DISPATCH_ERROR = "dispatch.error";
+    static final String KEY_MISSING_METHOD = "dispatch.method.user";
+    static final String KEY_MISSING_HANDLER_PROPERTY = "dispatch.handler";
+    static final String KEY_WRONG_RETURN_TYPE = "dispatch.return";
+    static final String KEY_MISSING_NAMED_METHOD = "dispatch.method";
+    static final String KEY_MISSING_PARAMETER = "dispatch.parameter";
+    static final String KEY_RECURSIVE_DISPATCH = "dispatch.recursive";
+    static final String LOCAL_STRINGS = 
"org.apache.struts.actions.LocalStrings";
+
+    /**
+     * The name of the <code>cancelled</code> method.
+     * 
+     * @see #cancelled(ActionContext)
+     * @see ActionContext#getCancelled()
+     */
+    public static final String CANCELLED_METHOD_NAME = "cancelled";
+
+    /**
+     * The name of the <code>unspecified</code> method.
+     * 
+     * @see #unspecified(ActionContext)
+     */
+    public static final String UNSPECIFIED_METHOD_NAME = "unspecified";
+
+    /**
+     * The message resources for this package.
+     */
+    static MessageResources messages = 
MessageResources.getMessageResources(LOCAL_STRINGS);
+
+    /**
+     * Commons Logging instance.
+     */
+    protected final Log log;
+
+    /**
+     * The dictionary of [EMAIL PROTECTED] Method} objects we have 
introspected for this
+     * class, keyed by method name. This collection is populated as different
+     * methods are called, so that introspection needs to occur only once per
+     * method name.
+     */
+    private final HashMap methods;
+
+    /**
+     * Construct an instance of this class from the supplied parameters.
+     * 
+     * @param actionInstance the action instance to be invoked
+     * @see #ActionDispatcher(Action, int)
+     */
+    public AbstractDispatcher() {
+       log = LogFactory.getLog(getClass());
+       methods = new HashMap();
+    }
+
+    protected Object cancelled(ActionContext context) throws Exception {
+       Method method = getMethod(context, CANCELLED_METHOD_NAME);
+       return dispatchMethod(context, method, CANCELLED_METHOD_NAME);
+    }
+
+    public Object dispatch(ActionContext context) throws Exception {
+       // Process cancelled requests
+       if (isCancelled(context)) {
+           try {
+               return cancelled(context);
+           } catch (NoSuchMethodException e) {
+               // expected and ignore
+           }
+       }
+
+       // Ensure there is a valid method name to call.
+       // This may be null if the user hacks the query string.
+       String methodName = resolveMethodName(context);
+       if (methodName == null) {
+           return unspecified(context);
+       }
+
+       // Identify the method object to be dispatched to
+       Method method;
+       try {
+           method = getMethod(context, methodName);
+       } catch (NoSuchMethodException e) {
+           String path = context.getActionConfig().getPath();
+           String message = messages.getMessage(KEY_MISSING_NAMED_METHOD, 
path, methodName);
+           log.error(message, e);
+
+           String userMsg = messages.getMessage(KEY_MISSING_METHOD, path);
+           NoSuchMethodException e2 = new NoSuchMethodException(userMsg);
+           e2.initCause(e);
+           throw e2;
+       }
+
+       // Invoke the named method and return its result
+       return dispatchMethod(context, method, methodName);
+    }
+
+    /**
+     * Dispatch to the specified method.
+     * 
+     * @param method The method to invoke
+     * @param name The name of the method to invoke
+     * @param mapping The ActionMapping used to select this instance
+     * @param form The optional ActionForm bean for this request (if any)
+     * @param request The non-HTTP request we are processing
+     * @param response The non-HTTP response we are creating
+     * 
+     * @return The forward to which control should be transferred, or
+     *         <code>null</code> if the response has been completed.
+     * @throws Exception if the application business logic throws an exception.
+     * @see #dispatchMethod(ActionMapping, ActionForm, HttpServletRequest,
+     *      HttpServletResponse, String)
+     */
+    protected abstract Object dispatchMethod(ActionContext context, Method 
method, String name) throws Exception;
+
+    /**
+     * Retrieves the name of the method to fallback upon if no value can be
+     * obtained from the parameter. The default implementation returns
+     * [EMAIL PROTECTED] #UNSPECIFIED_METHOD_NAME}.
+     * 
+     * @return the fallback method name; can be <code>null</code>
+     * @see #UNSPECIFIED_METHOD_NAME
+     */
+    protected String getFallbackMethodName() {
+       return UNSPECIFIED_METHOD_NAME;
+    }
+
+    /**
+     * Introspect the action to identify a method of the specified name that
+     * will receive the invocation of this dispatch. This implementation caches
+     * the method instance for subsequent invocations.
+     * 
+     * @param methodName the name of the method to be introspected
+     * @return the method of the specified name
+     * @throws NoSuchMethodException if no such method can be found
+     * @see #resolveMethod(ActionContext, String)
+     */
+    protected final Method getMethod(ActionContext context, String methodName) 
throws NoSuchMethodException {
+       synchronized (methods) {
+           String key = context.getAction().getClass().getName() + ":" + 
methodName;
+           Method method = (Method) methods.get(key);
+
+           if (method == null) {
+               method = resolveMethod(methodName, context);
+               methods.put(key, method);
+           }
+
+           return method;
+       }
+    }
+
+    protected final Object invoke(Object target, Method method, Object[] args, 
String path, String name)
+           throws Exception {
+       try {
+           return method.invoke(target, args);
+       } catch (IllegalAccessException e) {
+           String message = messages.getMessage(KEY_DISPATCH_ERROR, path, 
name);
+           log.error(message, e);
+           throw e;
+       } catch (InvocationTargetException e) {
+           // Rethrow the target exception if possible so that the
+           // exception handling machinery can deal with it
+           Throwable t = e.getTargetException();
+           if (t instanceof Exception) {
+               throw ((Exception) t);
+           } else {
+               String message = messages.getMessage(KEY_DISPATCH_ERROR, path, 
name);
+               log.error(message, e);
+               throw new ServletException(t);
+           }
+       }
+    }
+
+    /**
+     * Determines whether the current form's cancel button was pressed. This
+     * method will check if the [EMAIL PROTECTED] Globals#CANCEL_KEY} request 
attribute has
+     * been set, which normally occurs if the cancel button generated by
+     * <strong>CancelTag</strong> was pressed by the user in the current
+     * request. If <code>true</code>, validation performed by the
+     * <code>validate()</code> method of the form; otherwise it will have been
+     * skipped by the controller servlet.
+     * 
+     * @param context the current action context
+     * @return <code>true</code> if the cancel button was pressed;
+     *         <code>false</code> otherwise
+     * @see org.apache.struts.taglib.html.CancelTag
+     */
+    protected boolean isCancelled(ActionContext context) {
+       Boolean cancelled = context.getCancelled();
+       return (cancelled != null) && cancelled.booleanValue();
+    }
+
+    /**
+     * Decides the appropriate method instance for the specified method name.
+     * Implementations may introspect for any desired method signature. The
+     * resolution is only needed if [EMAIL PROTECTED] #getMethod(String)} does 
not find a
+     * match in its method cache.
+     * 
+     * @param methodName the method name to use for introspection
+     * @param context the current action context
+     * @return the method to invoke
+     * @throws NoSuchMethodException if an appropriate method cannot be found
+     * @see #getMethod(String)
+     * @see #invoke(Object, Method, Object[], String, String)
+     */
+    protected abstract Method resolveMethod(String methodName, ActionContext 
context) throws NoSuchMethodException;
+
+    /**
+     * Decides the method name that can handle the request.
+     * 
+     * @param context the current action context
+     * @return the method name or <code>null</code> if no name can be resolved
+     */
+    protected abstract String resolveMethodName(ActionContext context);
+
+    /**
+     * Invoked when a method cannot be resolved. The default behavior delegates
+     * to the fallback method, if specified; otherwise throw an
+     * [EMAIL PROTECTED] IllegalStateException}. Subclasses should override 
this to
+     * provide custom handling such as sending an HTTP 404 error.
+     * 
+     * @param context the current action context
+     * @throws NoSuchMethodException if the fallback method name is specified
+     *         but the corresponding method does not exist
+     * @throws IllegalStateException always unless supressed by subclass
+     * @see #getFallbackMethodName()
+     */
+    protected Object unspecified(ActionContext context) throws Exception {
+       // Is the fallback method present?
+       Method method = null;
+       String name = getFallbackMethodName();
+       if (name != null) {
+           try {
+               method = getMethod(context, name);
+           } catch (NoSuchMethodException e) {
+               String msg = messages.getMessage(KEY_MISSING_METHOD, name);
+               NoSuchMethodException e2 = new NoSuchMethodException(msg);
+               e2.initCause(e);
+               throw e2;
+           }
+       }
+
+       // Dispatch if fallback is available
+       if (method != null) {
+           return dispatchMethod(context, method, name);
+       }
+
+       // Otherwise the dispatch has failed
+       ActionConfig config = context.getActionConfig();
+       String msg = messages.getMessage(KEY_MISSING_PARAMETER, 
config.getPath(), config.getParameter());
+       log.error(msg);
+       throw new IllegalStateException(msg);
+    }
+
+}

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractDispatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java?rev=720628&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -0,0 +1,54 @@
+/*
+ * $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.action.ActionMapping;
+import org.apache.struts.chain.contexts.ActionContext;
+
+/**
+ * <p>
+ * This abstract class is a template for choosing the target method based on 
the
+ * <code>parameter</code> attribute of the [EMAIL PROTECTED] ActionMapping}.
+ * </p>
+ * 
+ * @version $Rev$
+ * @since Struts 1.4
+ */
+public abstract class AbstractMappingDispatcher extends AbstractDispatcher {
+
+    protected String resolveMethodName(ActionContext context) {
+       // Null out an empty string parameter
+       ActionMapping mapping = (ActionMapping) context.getActionConfig();
+       String parameter = mapping.getParameter();
+       if ("".equals(parameter)) {
+           parameter = null;
+       }
+
+       if ((parameter == null)) {
+           String message = messages.getMessage(KEY_MISSING_HANDLER_PROPERTY, 
mapping.getPath());
+           log.error(message);
+           throw new IllegalStateException(message);
+       }
+
+       return parameter;
+    }
+
+}

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractMappingDispatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java?rev=720628&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -0,0 +1,107 @@
+/*
+ * $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;
+
+/**
+ * <p>
+ * This abstract class is a template for choosing the target method based on a
+ * servlet request parameter. It is based upon the functionality of
+ * <code>org.apache.struts.actions.DispatchAction</code>.
+ * </p>
+ * <p>
+ * To configure the use of this dispatcher in your configuration, create an
+ * entry like below. The dispatcher will use the value of the request parameter
+ * named "method" (or whatever specified) to pick the appropriate method on the
+ * action.
+ * </p>
+ * 
+ * <code>
+ * &lt;action path=&quot;/saveSubscription&quot; 
+ *            
dispatcher=&quot;org.apache.struts.dispatcher.servlet.ServletParameterDispatcher&quot;
+ *            name=&quot;subscriptionForm&quot; 
+ *            scope=&quot;request&quot; 
+ *            input=&quot;/subscription.jsp&quot;
+ *            parameter=&quot;method&quot;/&gt;
+ * </code>
+ * <p>
+ * 
+ * @version $Rev$
+ * @since Struts 1.4
+ */
+public abstract class AbstractParameterDispatcher extends AbstractDispatcher {
+
+    /**
+     * The default parameter name if no parameter is set.
+     * 
+     * @see #getDefaultParameterName()
+     */
+    protected static final String DEFAULT_PARAMETER_NAME = "method";
+
+    /**
+     * Retrieves the name of the parameter to fallback upon if the action
+     * configuration did not set the <code>parameter</code> attribute. The
+     * default implementation returns [EMAIL PROTECTED] 
#DEFAULT_PARAMETER_NAME}.
+     * 
+     * @return the fallback parameter name; can be <code>null</code>
+     * @see #DEFAULT_PARAMETER_NAME
+     * @see #getParameter(ActionContext)
+     */
+    protected String getDefaultParameterName() {
+       return DEFAULT_PARAMETER_NAME;
+    }
+
+    /**
+     * Retrieves the parameter name whose value will identity the intended
+     * method to dispatch. The value is not necessarily a method name, but a 
key
+     * that can resolve to one. The default implementation returns the 
mapping's
+     * <code>parameter</code> attribute; otherwise fallback to the default
+     * parameter name.
+     * 
+     * @param context the action context
+     * @return the mapping's parameter name
+     * @see #getDefaultParameterName()
+     */
+    protected String getParameter(ActionContext context) {
+       String parameter = context.getActionConfig().getParameter();
+       if ((parameter != null) && (parameter.trim().length() > 0)) {
+           return parameter;
+       }
+       return getDefaultParameterName();
+    }
+
+    protected final String resolveMethodName(ActionContext context) {
+       String parameter = getParameter(context);
+       if ("".equals(parameter)) {
+           parameter = null;
+       }
+
+       if (parameter != null) {
+           return resolveParameterValue(context, parameter);
+       }
+
+       return null;
+    }
+
+    protected abstract String resolveParameterValue(ActionContext context, 
String parameter);
+
+}

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractParameterDispatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Copied: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java
 (from r718127, 
struts/struts1/trunk/core/src/main/java/org/apache/struts/action/Dispatcher.java)
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java?p2=struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java&p1=struts/struts1/trunk/core/src/main/java/org/apache/struts/action/Dispatcher.java&r1=718127&r2=720628&rev=720628&view=diff
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/action/Dispatcher.java
 (original)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -18,15 +18,16 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.struts.action;
+package org.apache.struts.dispatcher;
 
+import org.apache.struts.action.Action;
 import org.apache.struts.chain.contexts.ActionContext;
 
 /**
  * This interface defines an intermediate handler that determines what method 
to
- * execute in an [EMAIL PROTECTED] Action}. Unlike the classical execute 
signature, it is
- * up to the implementation to determine the particular arguments and return
- * type.
+ * execute in an [EMAIL PROTECTED] Action}. Unlike the classical 
<code>execute</code>
+ * signature, it is up to the dispatcher implementation to determine the
+ * particular arguments and return type.
  * 
  * @version $Rev$
  * @since Struts 1.4
@@ -42,6 +43,6 @@
      *         signature
      * @throws Exception if an exception occurs
      */
-    Object dispatchAction(ActionContext context) throws Exception;
+    Object dispatch(ActionContext context) throws Exception;
 
 }

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/Dispatcher.java
------------------------------------------------------------------------------
    svn:mergeinfo = 

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java?rev=720628&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java
 Tue Nov 25 14:33:33 2008
@@ -0,0 +1,67 @@
+/*
+ * $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.servlet;
+
+import org.apache.struts.action.ActionForm;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.chain.contexts.ServletActionContext;
+import org.apache.struts.config.ActionConfig;
+
+import java.lang.reflect.Method;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+final class ServletDispatchUtils {
+
+    /**
+     * The set of argument type classes for the reflected method call. These 
are
+     * the same for all calls, so calculate them only once.
+     * 
+     * @see org.apache.struts.action.Action#execute(ActionMapping, ActionForm,
+     *      javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+     */
+    public static final Class[] SERVLET_EXECUTE_SIGNATURE = { 
ActionMapping.class, ActionForm.class,
+           HttpServletRequest.class, HttpServletResponse.class };
+
+    public static Object[] buildClassicExecuteArguments(ServletActionContext 
context) throws Exception {
+       ActionConfig mapping = context.getActionConfig();
+       ActionForm form = context.getActionForm();
+       HttpServletRequest request = context.getRequest();
+       HttpServletResponse response = context.getResponse();
+       return new Object[] { mapping, form, request, response };
+    }
+
+    /**
+     * Obtains the method instance with the classic <code>execute</code>
+     * servlet signature.
+     * 
+     * @return [EMAIL PROTECTED]
+     * @throws [EMAIL PROTECTED]
+     * @see #SERVLET_EXECUTE_SIGNATURE
+     */
+    public static Method resolveClassicExecuteMethod(ActionContext context, 
String name) throws NoSuchMethodException {
+       Class actionClass = context.getAction().getClass();
+       return actionClass.getMethod(name, SERVLET_EXECUTE_SIGNATURE);
+    }
+
+}

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletDispatchUtils.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java?rev=720628&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -0,0 +1,43 @@
+/*
+ * $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.servlet;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.chain.contexts.ServletActionContext;
+import org.apache.struts.dispatcher.AbstractMappingDispatcher;
+
+import java.lang.reflect.Method;
+
+public class ServletMappingDispatcher extends AbstractMappingDispatcher {
+
+    protected Object dispatchMethod(ActionContext context, Method method, 
String name) throws Exception {
+       Action target = context.getAction();
+       Object[] args = 
ServletDispatchUtils.buildClassicExecuteArguments((ServletActionContext) 
context);
+       String path = context.getActionConfig().getPath();
+       return invoke(target, method, args, path, name);
+    }
+
+    protected Method resolveMethod(String methodName, ActionContext context) 
throws NoSuchMethodException {
+       return ServletDispatchUtils.resolveClassicExecuteMethod(context, 
methodName);
+    }
+
+}

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletMappingDispatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java?rev=720628&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -0,0 +1,48 @@
+/*
+ * $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.servlet;
+
+import org.apache.struts.action.Action;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.chain.contexts.ServletActionContext;
+import org.apache.struts.dispatcher.AbstractParameterDispatcher;
+
+import java.lang.reflect.Method;
+
+public class ServletParameterDispatcher extends AbstractParameterDispatcher {
+
+    protected Object dispatchMethod(ActionContext context, Method method, 
String name) throws Exception {
+       Action target = context.getAction();
+       Object[] args = 
ServletDispatchUtils.buildClassicExecuteArguments((ServletActionContext) 
context);
+       String path = context.getActionConfig().getPath();
+       return invoke(target, method, args, path, name);
+    }
+
+    protected Method resolveMethod(String methodName, ActionContext context) 
throws NoSuchMethodException {
+       return ServletDispatchUtils.resolveClassicExecuteMethod(context, 
methodName);
+    }
+
+    protected String resolveParameterValue(ActionContext context, String 
parameter) {
+       ServletActionContext servletContext = (ServletActionContext) context;
+       return (String) servletContext.getParam().get(parameter);
+    }
+
+}

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletParameterDispatcher.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Modified: 
struts/struts1/trunk/extras/src/main/java/org/apache/struts/actions/ActionDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/extras/src/main/java/org/apache/struts/actions/ActionDispatcher.java?rev=720628&r1=720627&r2=720628&view=diff
==============================================================================
--- 
struts/struts1/trunk/extras/src/main/java/org/apache/struts/actions/ActionDispatcher.java
 (original)
+++ 
struts/struts1/trunk/extras/src/main/java/org/apache/struts/actions/ActionDispatcher.java
 Tue Nov 25 14:33:33 2008
@@ -27,9 +27,9 @@
 import org.apache.struts.action.ActionForm;
 import org.apache.struts.action.ActionForward;
 import org.apache.struts.action.ActionMapping;
-import org.apache.struts.action.Dispatcher;
 import org.apache.struts.chain.contexts.ActionContext;
 import org.apache.struts.chain.contexts.ServletActionContext;
+import org.apache.struts.dispatcher.Dispatcher;
 import org.apache.struts.util.MessageResources;
 
 import javax.servlet.ServletException;
@@ -504,7 +504,7 @@
     /**
      * @since Struts 1.4
      */
-    public Object dispatchAction(ActionContext context) throws Exception {
+    public Object dispatch(ActionContext context) throws Exception {
         ServletActionContext servletContext = (ServletActionContext) context;
         return execute((ActionMapping) context.getActionConfig(), 
context.getActionForm(),
             servletContext.getRequest(), servletContext.getResponse());


Reply via email to