Author: pbenedict
Date: Fri Nov 28 00:23:24 2008
New Revision: 721379

URL: http://svn.apache.org/viewvc?rev=721379&view=rev
Log:
STR-3168: Add port of EventActionDispatcher

Added:
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractEventMappingDispatcher.java
   (with props)
    
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletEventMappingDispatcher.java
   (with props)

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractEventMappingDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractEventMappingDispatcher.java?rev=721379&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractEventMappingDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/AbstractEventMappingDispatcher.java
 Fri Nov 28 00:23:24 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.action.ActionMapping;
+import org.apache.struts.chain.contexts.ActionContext;
+
+import java.util.StringTokenizer;
+
+/**
+ * This abstract class is a template for choosing the target method that is
+ * named in the list-encoded <code>parameter</code> attribute of the
+ * [EMAIL PROTECTED] ActionMapping} that matches a submission parameter. This 
is useful for
+ * developers who prefer to use many submit buttons, images, or submit links on
+ * a single form and whose related actions exist in a single action.
+ * <p>
+ * For utility purposes, you can use the <code>key=value</code> notation to
+ * alias methods so that they are exposed as different form element names, in
+ * the event of a naming conflict or otherwise. In this example, the
+ * <em>recalc</em> button (via a submission parameter) will invoke the
+ * <code>recalculate</code> method. The security-minded person may find this
+ * feature valuable to obfuscate and not expose the methods.
+ * <p>
+ * The <em>default</em> key is purely optional, but encouraged when nothing
+ * matches (such as the user pressing the enter key). If this is not specified
+ * and no parameters match the list of method keys, <code>null</code> is
+ * returned which means the <code>unspecified</code> method will be invoked.
+ * <p>
+ * The order of the parameters are guaranteed to be iterated in the order
+ * specified. If multiple buttons were accidently submitted, the first match in
+ * the list will be dispatched.
+ * 
+ * @version $Rev$
+ * @since Struts 1.4
+ */
+public abstract class AbstractEventMappingDispatcher extends 
AbstractMappingDispatcher {
+
+    /**
+     * The method key, if present, to use if other specified method keys do not
+     * match a request parameter.
+     */
+    protected static final String DEFAULT_METHOD_KEY = "default";
+
+    /**
+     * Determines whether the specified method key is a submission parameter.
+     * 
+     * @param context the current action context
+     * @param methodKey the method key
+     * @return <code>true</code> if match; otherwise <code>false</code>
+     * @see #resolveMethodName(ActionContext)
+     */
+    protected abstract boolean isSubmissionParameter(ActionContext context, 
String methodKey);
+
+    protected final String resolveMethodName(ActionContext context) {
+       // Obtain the mapping parameter
+       String parameter = super.resolveMethodName(context);
+       assert parameter != null;
+
+       // Parse it as a comma-separated list
+       StringTokenizer st = new StringTokenizer(parameter, ",");
+       String defaultMethodName = null;
+
+       while (st.hasMoreTokens()) {
+           String methodKey = st.nextToken().trim();
+           String methodName = methodKey;
+
+           // The key can either be a direct method name or an alias
+           // to a method as indicated by a "key=value" signature
+           int equals = methodKey.indexOf('=');
+           if (equals > -1) {
+               methodName = methodKey.substring(equals + 1).trim();
+               methodKey = methodKey.substring(0, equals).trim();
+           }
+
+           // Set the default if it passes by
+           if (methodKey.equals(DEFAULT_METHOD_KEY)) {
+               defaultMethodName = methodName;
+           }
+
+           // Is it a match?
+           if (isSubmissionParameter(context, methodKey)) {
+               return methodName;
+           }
+       }
+
+       return defaultMethodName;
+    }
+
+}

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

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

Added: 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletEventMappingDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletEventMappingDispatcher.java?rev=721379&view=auto
==============================================================================
--- 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletEventMappingDispatcher.java
 (added)
+++ 
struts/struts1/trunk/core/src/main/java/org/apache/struts/dispatcher/servlet/ServletEventMappingDispatcher.java
 Fri Nov 28 00:23:24 2008
@@ -0,0 +1,79 @@
+/*
+ * $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.ActionMapping;
+import org.apache.struts.chain.contexts.ActionContext;
+import org.apache.struts.chain.contexts.ServletActionContext;
+import org.apache.struts.dispatcher.AbstractEventMappingDispatcher;
+
+import java.lang.reflect.Method;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * This servlet-based dispatcher chooses the target method based on the
+ * <code>parameter</code> attribute of the [EMAIL PROTECTED] ActionMapping} 
that matches
+ * a submission parameter. This is useful for developers who prefer to use many
+ * submit buttons, images, or submit links on a single form and whose related
+ * actions exist in a single action.
+ * <p>
+ * To configure the use of this action in your configuration, create an entry
+ * like this:
+ * 
+ * <pre><code>
+ *   &lt;action path=&quot;/saveSubscription&quot;
+ *           type=&quot;org.example.SubscriptionAction&quot;
+ *           
dispatcher=&quot;org.apache.struts.dispatcher.servlet.ServletEventMappingDispatcher&quot;/&gt;
     
+ *           
parameter=&quot;save,back,recalc=recalculate,default=save&quot;/&gt;
+ *           name=&quot;subscriptionForm&quot;
+ *           scope=&quot;request&quot;
+ *           input=&quot;/subscription.jsp&quot;
+ * </code></pre>
+ * 
+ * where <code>parameter</code> contains three possible methods and one
+ * default method if nothing matches (such as the user pressing the enter key).
+ * 
+ * @version $Rev$
+ * @since Struts 1.4
+ */
+public class ServletEventMappingDispatcher extends 
AbstractEventMappingDispatcher {
+
+    private static final long serialVersionUID = 1L;
+
+    protected Object[] buildMethodArguments(ActionContext context, Method 
method) {
+       return 
ServletDispatchUtils.buildClassicExecuteArguments((ServletActionContext) 
context);
+    }
+
+    /**
+     * If the method key exists as a standalone parameter or with the image
+     * suffixes (.x/.y), the method name has been found.
+     */
+    protected boolean isSubmissionParameter(ActionContext context, String 
methodKey) {
+       HttpServletRequest request = ((ServletActionContext) 
context).getRequest();
+       return (request.getParameter(methodKey) != null) || 
(request.getParameter(methodKey + ".x") != null);
+    }
+
+    protected Method resolveMethod(ActionContext context, String methodName) 
throws NoSuchMethodException {
+       return ServletDispatchUtils.resolveClassicExecuteMethod(context, 
methodName);
+    }
+
+}

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

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


Reply via email to