rleland 01/03/27 08:16:53 Modified: src/share/org/apache/struts/action DispatchAction.java Log: This is definately a first, Struts wouldn't compile. Package name was incorrect corrected so it would compile ! ! ! Revision Changes Path 1.2 +592 -296 jakarta-struts/src/share/org/apache/struts/action/DispatchAction.java Index: DispatchAction.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/DispatchAction.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- DispatchAction.java 2001/03/23 22:21:34 1.1 +++ DispatchAction.java 2001/03/27 16:16:51 1.2 @@ -1,296 +1,592 @@ -/* - * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/DispatchAction.java,v 1.1 2001/03/23 22:21:34 craigmcc Exp $ - * $Revision: 1.1 $ - * $Date: 2001/03/23 22:21:34 $ - * - * ==================================================================== - * - * The Apache Software License, Version 1.1 - * - * Copyright (c) 1999-2001 The Apache Software Foundation. All rights - * reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * - * 3. The end-user documentation included with the redistribution, if - * any, must include the following acknowlegement: - * "This product includes software developed by the - * Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowlegement may appear in the software itself, - * if and wherever such third-party acknowlegements normally appear. - * - * 4. The names "The Jakarta Project", "Struts", and "Apache Software - * Foundation" must not be used to endorse or promote products derived - * from this software without prior written permission. For written - * permission, please contact [EMAIL PROTECTED] - * - * 5. Products derived from this software may not be called "Apache" - * nor may "Apache" appear in their names without prior written - * permission of the Apache Group. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR - * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF - * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT - * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * ==================================================================== - * - * This software consists of voluntary contributions made by many - * individuals on behalf of the Apache Software Foundation. For more - * information on the Apache Software Foundation, please see - * <http://www.apache.org/>. - * - */ - - -package org.apache.struts.actions; - - -import java.io.IOException; -import java.io.PrintWriter; -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 javax.servlet.http.HttpSession; -import org.apache.struts.action.Action; -import org.apache.struts.action.ActionForm; -import org.apache.struts.action.ActionForward; -import org.apache.struts.action.ActionMapping; -import org.apache.struts.util.MessageResources; - - -/** - * <p>An abstract <strong>Action</strong> that dispatches to a public - * method that is named by the request parameter whose name is specified - * by the <code>parameter</code> property of the corresponding - * ActionMapping. This Action is useful for developers who prefer to - * combine many similar actions into a single Action class, in order to - * simplify their application design.</p> - * - * <p>To configure the use of this action in your - * <code>struts-config.xml</code> file, create an entry like this:</p> - * - * <code> - * <action path="/saveSubscription" - * type="org.apache.struts.action.DispatchAction" - * name="subscriptionForm" - * scope="request" - * input="/subscription.jsp" - * parameter="method"/> - * </code> - * - * <p>which will use the value of the request parameter named "method" - * to pick the appropriate "perform" method, which must have the same - * signature (other than method name) of the standard Action.perform() - * method. For example, you might have the following three methods in the - * same action:</p> - * <ul> - * <li>public ActionForward delete(ActionMapping mapping, ActionForm form, - * HttpServletRequest request, HttpServletResponse response) - * throws IOException, ServletException</li> - * <li>public ActionForward insert(ActionMapping mapping, ActionForm form, - * HttpServletRequest request, HttpServletResponse response) - * throws IOException, ServletException</li> - * <li>public ActionForward update(ActionMapping mapping, ActionForm form, - * HttpServletRequest request, HttpServletResponse response) - * throws IOException, ServletException</li> - * </ul> - * <p>and call one of the methods with a URL like this:</p> - * <code> - * http://localhost:8080/myapp/saveSubscription.do?method=update - * </code> - * - * <p><strong>NOTE</strong> - All of the other mapping characteristics of - * this action must be shared by the various handlers. This places some - * constraints over what types of handlers may reasonably be packaged into - * the same <code>DispatchAction</code> subclass.</p> - * - * @author Niall Pemberton <[EMAIL PROTECTED]> - * @author Craig R. McClanahan - * @version $Revision: 1.1 $ $Date: 2001/03/23 22:21:34 $ - */ - -public abstract class DispatchAction extends Action { - - - // ----------------------------------------------------- Instance Variables - - - /** - * The Class instance of this <code>DispatchAction</code> class. - */ - protected Class clazz = this.getClass(); - - - /** - * The message resources for this package. - */ - protected static MessageResources messages = - MessageResources.getMessageResources - ("org.apache.struts.action.LocalStrings"); - - - /** - * The set of 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. - */ - protected HashMap methods = new HashMap(); - - - /** - * The set of argument type classes for the reflected method call. These - * are the same for all calls, so calculate them only once. - */ - protected Class types[] = { - ActionMapping.class, ActionForm.class, - HttpServletRequest.class, HttpServletResponse.class }; - - - // --------------------------------------------------------- Public Methods - - - /** - * Process the specified HTTP request, and create the corresponding HTTP - * response (or forward to another web component that will create it). - * Return an <code>ActionForward</code> instance describing where and how - * control should be forwarded, or <code>null</code> if the response has - * already been completed. - * - * @param mapping The ActionMapping used to select this instance - * @param actionForm The optional ActionForm bean for this request (if any) - * @param request The HTTP request we are processing - * @param response The HTTP response we are creating - * - * @exception IOException if an input/output error occurs - * @exception ServletException if a servlet exception occurs - */ - public ActionForward perform(ActionMapping mapping, - ActionForm form, - HttpServletRequest request, - HttpServletResponse response) - throws IOException, ServletException { - - // Identify the request parameter containing the method name - String parameter = mapping.getParameter(); - if (parameter == null) { - String message = - messages.getMessage("dispatch.handler", mapping.getPath()); - servlet.log(message); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - message); - return (null); - } - - // Identify the method name to be dispatched to - String name = request.getParameter(parameter); - if (name == null) { - String message = - messages.getMessage("dispatch.parameter", mapping.getPath(), - parameter); - servlet.log(message); - response.sendError(HttpServletResponse.SC_BAD_REQUEST, - message); - return (null); - } - - // Identify the method object to be dispatched to - Method method = null; - try { - method = getMethod(name); - } catch (NoSuchMethodException e) { - String message = - messages.getMessage("dispatch.method", mapping.getPath(), - name); - servlet.log(message); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - message); - return (null); - } - - // Dispatch to the specified method - ActionForward forward = null; - try { - Object args[] = { mapping, form, request, response }; - forward = (ActionForward) method.invoke(this, args); - } catch (ClassCastException e) { - String message = - messages.getMessage("dispatch.return", mapping.getPath(), - name); - servlet.log(message); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - message); - return (null); - } catch (IllegalAccessException e) { - String message = - messages.getMessage("dispatch.error", mapping.getPath(), - name); - servlet.log(message, e); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - message); - return (null); - } catch (InvocationTargetException e) { - String message = - messages.getMessage("dispatch.error", mapping.getPath(), - name); - servlet.log(message, e); - response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - message); - return (null); - } - - // Return the returned ActionForward instance - return (forward); - - } - - - // ----------------------------------------------------- Protected Methods - - - /** - * Introspect the current class to identify a method of the specified - * name that accepts the same parameter types as the <code>perform()</code> - * method does. - * - * @param name Name of the method to be introspected - * - * @exception NoSuchMethodException if no such method can be found - */ - protected Method getMethod(String name) - throws NoSuchMethodException { - - synchronized (methods) { - Method method = (Method) methods.get(name); - if (method == null) { - method = clazz.getMethod(name, types); - methods.put(name, method); - } - return (method); - } - - } - - -} +/* + + * $Header: /home/cvs/jakarta-struts/src/share/org/apache/struts/action/DispatchAction.java,v 1.2 2001/03/27 16:16:51 rleland Exp $ + + * $Revision: 1.2 $ + + * $Date: 2001/03/27 16:16:51 $ + + * + + * ==================================================================== + + * + + * The Apache Software License, Version 1.1 + + * + + * Copyright (c) 1999-2001 The Apache Software Foundation. All rights + + * reserved. + + * + + * Redistribution and use in source and binary forms, with or without + + * modification, are permitted provided that the following conditions + + * are met: + + * + + * 1. Redistributions of source code must retain the above copyright + + * notice, this list of conditions and the following disclaimer. + + * + + * 2. Redistributions in binary form must reproduce the above copyright + + * notice, this list of conditions and the following disclaimer in + + * the documentation and/or other materials provided with the + + * distribution. + + * + + * 3. The end-user documentation included with the redistribution, if + + * any, must include the following acknowlegement: + + * "This product includes software developed by the + + * Apache Software Foundation (http://www.apache.org/)." + + * Alternately, this acknowlegement may appear in the software itself, + + * if and wherever such third-party acknowlegements normally appear. + + * + + * 4. The names "The Jakarta Project", "Struts", and "Apache Software + + * Foundation" must not be used to endorse or promote products derived + + * from this software without prior written permission. For written + + * permission, please contact [EMAIL PROTECTED] + + * + + * 5. Products derived from this software may not be called "Apache" + + * nor may "Apache" appear in their names without prior written + + * permission of the Apache Group. + + * + + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED + + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + + * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR + + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF + + * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + + * SUCH DAMAGE. + + * ==================================================================== + + * + + * This software consists of voluntary contributions made by many + + * individuals on behalf of the Apache Software Foundation. For more + + * information on the Apache Software Foundation, please see + + * <http://www.apache.org/>. + + * + + */ + + + + + +package org.apache.struts.action; + + + + + +import java.io.IOException; + +import java.io.PrintWriter; + +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 javax.servlet.http.HttpSession; + +import org.apache.struts.action.Action; + +import org.apache.struts.action.ActionForm; + +import org.apache.struts.action.ActionForward; + +import org.apache.struts.action.ActionMapping; + +import org.apache.struts.util.MessageResources; + + + + + +/** + + * <p>An abstract <strong>Action</strong> that dispatches to a public + + * method that is named by the request parameter whose name is specified + + * by the <code>parameter</code> property of the corresponding + + * ActionMapping. This Action is useful for developers who prefer to + + * combine many similar actions into a single Action class, in order to + + * simplify their application design.</p> + + * + + * <p>To configure the use of this action in your + + * <code>struts-config.xml</code> file, create an entry like this:</p> + + * + + * <code> + + * <action path="/saveSubscription" + + * type="org.apache.struts.action.DispatchAction" + + * name="subscriptionForm" + + * scope="request" + + * input="/subscription.jsp" + + * parameter="method"/> + + * </code> + + * + + * <p>which will use the value of the request parameter named "method" + + * to pick the appropriate "perform" method, which must have the same + + * signature (other than method name) of the standard Action.perform() + + * method. For example, you might have the following three methods in the + + * same action:</p> + + * <ul> + + * <li>public ActionForward delete(ActionMapping mapping, ActionForm form, + + * HttpServletRequest request, HttpServletResponse response) + + * throws IOException, ServletException</li> + + * <li>public ActionForward insert(ActionMapping mapping, ActionForm form, + + * HttpServletRequest request, HttpServletResponse response) + + * throws IOException, ServletException</li> + + * <li>public ActionForward update(ActionMapping mapping, ActionForm form, + + * HttpServletRequest request, HttpServletResponse response) + + * throws IOException, ServletException</li> + + * </ul> + + * <p>and call one of the methods with a URL like this:</p> + + * <code> + + * http://localhost:8080/myapp/saveSubscription.do?method=update + + * </code> + + * + + * <p><strong>NOTE</strong> - All of the other mapping characteristics of + + * this action must be shared by the various handlers. This places some + + * constraints over what types of handlers may reasonably be packaged into + + * the same <code>DispatchAction</code> subclass.</p> + + * + + * @author Niall Pemberton <[EMAIL PROTECTED]> + + * @author Craig R. McClanahan + + * @version $Revision: 1.2 $ $Date: 2001/03/27 16:16:51 $ + + */ + + + +public abstract class DispatchAction extends Action { + + + + + + // ----------------------------------------------------- Instance Variables + + + + + + /** + + * The Class instance of this <code>DispatchAction</code> class. + + */ + + protected Class clazz = this.getClass(); + + + + + + /** + + * The message resources for this package. + + */ + + protected static MessageResources messages = + + MessageResources.getMessageResources + + ("org.apache.struts.action.LocalStrings"); + + + + + + /** + + * The set of 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. + + */ + + protected HashMap methods = new HashMap(); + + + + + + /** + + * The set of argument type classes for the reflected method call. These + + * are the same for all calls, so calculate them only once. + + */ + + protected Class types[] = { + + ActionMapping.class, ActionForm.class, + + HttpServletRequest.class, HttpServletResponse.class }; + + + + + + // --------------------------------------------------------- Public Methods + + + + + + /** + + * Process the specified HTTP request, and create the corresponding HTTP + + * response (or forward to another web component that will create it). + + * Return an <code>ActionForward</code> instance describing where and how + + * control should be forwarded, or <code>null</code> if the response has + + * already been completed. + + * + + * @param mapping The ActionMapping used to select this instance + + * @param actionForm The optional ActionForm bean for this request (if any) + + * @param request The HTTP request we are processing + + * @param response The HTTP response we are creating + + * + + * @exception IOException if an input/output error occurs + + * @exception ServletException if a servlet exception occurs + + */ + + public ActionForward perform(ActionMapping mapping, + + ActionForm form, + + HttpServletRequest request, + + HttpServletResponse response) + + throws IOException, ServletException { + + + + // Identify the request parameter containing the method name + + String parameter = mapping.getParameter(); + + if (parameter == null) { + + String message = + + messages.getMessage("dispatch.handler", mapping.getPath()); + + servlet.log(message); + + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + + message); + + return (null); + + } + + + + // Identify the method name to be dispatched to + + String name = request.getParameter(parameter); + + if (name == null) { + + String message = + + messages.getMessage("dispatch.parameter", mapping.getPath(), + + parameter); + + servlet.log(message); + + response.sendError(HttpServletResponse.SC_BAD_REQUEST, + + message); + + return (null); + + } + + + + // Identify the method object to be dispatched to + + Method method = null; + + try { + + method = getMethod(name); + + } catch (NoSuchMethodException e) { + + String message = + + messages.getMessage("dispatch.method", mapping.getPath(), + + name); + + servlet.log(message); + + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + + message); + + return (null); + + } + + + + // Dispatch to the specified method + + ActionForward forward = null; + + try { + + Object args[] = { mapping, form, request, response }; + + forward = (ActionForward) method.invoke(this, args); + + } catch (ClassCastException e) { + + String message = + + messages.getMessage("dispatch.return", mapping.getPath(), + + name); + + servlet.log(message); + + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + + message); + + return (null); + + } catch (IllegalAccessException e) { + + String message = + + messages.getMessage("dispatch.error", mapping.getPath(), + + name); + + servlet.log(message, e); + + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + + message); + + return (null); + + } catch (InvocationTargetException e) { + + String message = + + messages.getMessage("dispatch.error", mapping.getPath(), + + name); + + servlet.log(message, e); + + response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + + message); + + return (null); + + } + + + + // Return the returned ActionForward instance + + return (forward); + + + + } + + + + + + // ----------------------------------------------------- Protected Methods + + + + + + /** + + * Introspect the current class to identify a method of the specified + + * name that accepts the same parameter types as the <code>perform()</code> + + * method does. + + * + + * @param name Name of the method to be introspected + + * + + * @exception NoSuchMethodException if no such method can be found + + */ + + protected Method getMethod(String name) + + throws NoSuchMethodException { + + + + synchronized (methods) { + + Method method = (Method) methods.get(name); + + if (method == null) { + + method = clazz.getMethod(name, types); + + methods.put(name, method); + + } + + return (method); + + } + + + + } + + + + + +} +