Revision: 565
          http://svn.sourceforge.net/stripes/?rev=565&view=rev
Author:   bengunter
Date:     2007-06-04 08:24:49 -0700 (Mon, 04 Jun 2007)

Log Message:
-----------
Fixed STS-378: incorrect event handler invoked with ForwardResolution(Class<? 
extends ActionBean>, String)

Modified Paths:
--------------
    trunk/stripes/src/net/sourceforge/stripes/action/ForwardResolution.java
    
trunk/stripes/src/net/sourceforge/stripes/controller/AnnotatedClassActionResolver.java
    trunk/stripes/src/net/sourceforge/stripes/controller/StripesConstants.java

Modified: 
trunk/stripes/src/net/sourceforge/stripes/action/ForwardResolution.java
===================================================================
--- trunk/stripes/src/net/sourceforge/stripes/action/ForwardResolution.java     
2007-05-30 19:19:18 UTC (rev 564)
+++ trunk/stripes/src/net/sourceforge/stripes/action/ForwardResolution.java     
2007-06-04 15:24:49 UTC (rev 565)
@@ -41,6 +41,7 @@
 public class ForwardResolution extends OnwardResolution<ForwardResolution> 
implements Resolution {
     private boolean autoInclude = true;
     private static final Log log = Log.getInstance(ForwardResolution.class);
+    private String event;
 
     /**
      * Simple constructor that takes in the path to forward the user to.
@@ -71,6 +72,7 @@
      */
     public ForwardResolution(Class<? extends ActionBean> beanType, String 
event) {
         super(beanType, event);
+        this.event = event;
     }
 
     /**
@@ -94,6 +96,10 @@
 
         String path = getUrl(request.getLocale());
 
+        // Set event name as a request attribute
+        String oldEvent = (String) 
request.getAttribute(StripesConstants.REQ_ATTR_EVENT_NAME);
+        request.setAttribute(StripesConstants.REQ_ATTR_EVENT_NAME, event);
+
         // Figure out if we're inside an include, and use an include instead 
of a forward
         if (autoInclude && 
request.getAttribute(StripesConstants.REQ_ATTR_INCLUDE_PATH) != null) {
             log.trace("Including URL: ", path);
@@ -103,5 +109,8 @@
             log.trace("Forwarding to URL: ", path);
             request.getRequestDispatcher(path).forward(request, response);
         }
+
+        // Revert event name to its original value
+        request.setAttribute(StripesConstants.REQ_ATTR_EVENT_NAME, oldEvent);
     }
 }

Modified: 
trunk/stripes/src/net/sourceforge/stripes/controller/AnnotatedClassActionResolver.java
===================================================================
--- 
trunk/stripes/src/net/sourceforge/stripes/controller/AnnotatedClassActionResolver.java
      2007-05-30 19:19:18 UTC (rev 564)
+++ 
trunk/stripes/src/net/sourceforge/stripes/controller/AnnotatedClassActionResolver.java
      2007-06-04 15:24:49 UTC (rev 565)
@@ -386,13 +386,30 @@
      * @return String the name of the event submitted, or null if none can be 
found
      */
     public String getEventName(Class<? extends ActionBean> bean, 
ActionBeanContext context) {
-        String event = getEventNameFromRequestParams(bean, context);
+        String event = getEventNameFromRequestAttribute(bean, context);
+        if (event == null) event = getEventNameFromRequestParams(bean, 
context);
         if (event == null) event = getEventNameFromPath(bean, context);
         if (event == null) event = getEventNameFromEventNameParam(bean, 
context);
         return event;
     }
 
     /**
+        * Checks a special request attribute to get the event name. This 
attribute
+        * may be set when the presence of the original request parameters on a
+        * forwarded request makes it difficult to determine which event to 
fire.
+        * 
+        * @param bean the ActionBean type bound to the request
+        * @param context the ActionBeanContect for the current request
+        * @return the name of the event submitted, or null if none can be found
+        * @see StripesConstants#REQ_ATTR_EVENT_NAME
+        */
+       protected String getEventNameFromRequestAttribute(
+                       Class<? extends ActionBean> bean, ActionBeanContext 
context) {
+               return (String) context.getRequest().getAttribute(
+                               StripesConstants.REQ_ATTR_EVENT_NAME);
+       }
+
+    /**
      * Loops through the set of known events for the ActionBean to see if the 
event
      * names are present as parameter names in the request.  Returns the first 
event
      * name found in the request, or null if none is found.

Modified: 
trunk/stripes/src/net/sourceforge/stripes/controller/StripesConstants.java
===================================================================
--- trunk/stripes/src/net/sourceforge/stripes/controller/StripesConstants.java  
2007-05-30 19:19:18 UTC (rev 564)
+++ trunk/stripes/src/net/sourceforge/stripes/controller/StripesConstants.java  
2007-06-04 15:24:49 UTC (rev 565)
@@ -94,6 +94,12 @@
     String REQ_ATTR_CURRENT_FLASH_SCOPE = "__current_flash_scope";
 
     /**
+        * The name of a request attribute that is checked first to determine 
the
+        * name of the event that should fire.
+        */
+       String REQ_ATTR_EVENT_NAME = "__stripes_event_name";
+
+    /**
      * Request attribute key defined by the servlet spec for storing the 
included servlet
      * path when processing a server side include.
      */


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Stripes-development mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/stripes-development

Reply via email to