Author: nilsga
Date: Fri Mar 27 13:51:52 2009
New Revision: 759140

URL: http://svn.apache.org/viewvc?rev=759140&view=rev
Log:
WW-2997 MultiPart parameters was not passed to the action mapping lookup.

Modified:
    
struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
    
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java

Modified: 
struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java?rev=759140&r1=759139&r2=759140&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
 (original)
+++ 
struts/struts2/trunk/plugins/portlet/src/main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java
 Fri Mar 27 13:51:52 2009
@@ -295,8 +295,7 @@
         LOG.debug("Entering processAction");
         resetActionContext();
         try {
-            serviceAction(request, response, getActionMapping(request),
-                    getRequestMap(request), getParameterMap(request),
+            serviceAction(request, response, getRequestMap(request), 
getParameterMap(request),
                     getSessionMap(request), getApplicationMap(),
                     portletNamespace, EVENT_PHASE);
             LOG.debug("Leaving processAction");
@@ -320,8 +319,7 @@
         if(!request.getWindowState().equals(WindowState.MINIMIZED)) {
         try {
             // Check to see if an event set the render to be included directly
-            serviceAction(request, response, getActionMapping(request),
-                    getRequestMap(request), getParameterMap(request),
+            serviceAction(request, response, getRequestMap(request), 
getParameterMap(request),
                     getSessionMap(request), getApplicationMap(),
                     portletNamespace, RENDER_PHASE);
             LOG.debug("Leaving render");
@@ -337,7 +335,7 @@
     private void resetActionContext() {
         ActionContext.setContext(null);
     }
-
+    
     /**
      * Merges all application and portlet attributes into a single
      * <tt>HashMap</tt> to represent the entire <tt>Action</tt> context.
@@ -355,27 +353,17 @@
      */
     public HashMap<String, Object> createContextMap(Map<String, Object> 
requestMap, Map<String, String[]> parameterMap,
             Map<String, Object> sessionMap, Map<String, Object> 
applicationMap, PortletRequest request,
-            PortletResponse response, PortletConfig portletConfig, Integer 
phase) throws IOException {
+            PortletResponse response, HttpServletRequest servletRequest, 
HttpServletResponse servletResponse, ServletContext servletContext, 
PortletConfig portletConfig, Integer phase) throws IOException {
 
         // TODO Must put http request/response objects into map for use with
-       HttpServletResponse dummyResponse = new 
PortletServletResponse(response);
-       HttpServletRequest dummyRequest = new PortletServletRequest(request, 
getPortletContext());
-       container.inject(dummyRequest);
-       ServletContext dummyServletContext = new 
PortletServletContext(getPortletContext());
-       if(EVENT_PHASE.equals(phase)) {
-               dummyRequest = dispatcherUtils.wrapRequest(dummyRequest, 
dummyServletContext);
-               if(dummyRequest instanceof MultiPartRequestWrapper) {
-                       // Multipart request. Request parameters are encoded in 
the multipart data,
-                       // so we need to manually add them to the parameter map.
-                       parameterMap.putAll(dummyRequest.getParameterMap());
-               }
-       }
+       container.inject(servletRequest);
+       
         // ServletActionContext
         HashMap<String, Object> extraContext = new HashMap<String, Object>();
         // The dummy servlet objects. Eases reuse of existing interceptors 
that uses the servlet objects.
-        extraContext.put(StrutsStatics.HTTP_REQUEST, dummyRequest);
-        extraContext.put(StrutsStatics.HTTP_RESPONSE, dummyResponse);
-        extraContext.put(StrutsStatics.SERVLET_CONTEXT, dummyServletContext);
+        extraContext.put(StrutsStatics.HTTP_REQUEST, servletRequest);
+        extraContext.put(StrutsStatics.HTTP_RESPONSE, servletResponse);
+        extraContext.put(StrutsStatics.SERVLET_CONTEXT, servletContext);
         // End dummy servlet objects
         extraContext.put(ActionContext.PARAMETERS, parameterMap);
         extraContext.put(ActionContext.SESSION, sessionMap);
@@ -419,7 +407,6 @@
      *
      * @param request the HttpServletRequest object.
      * @param response the HttpServletResponse object.
-     * @param mapping the action mapping.
      * @param requestMap a Map of request attributes.
      * @param parameterMap a Map of request parameters.
      * @param sessionMap a Map of all session attributes.
@@ -428,18 +415,32 @@
      * @param phase The portlet phase (render or action, see
      *        {...@link PortletActionConstants})
      */
-    public void serviceAction(PortletRequest request, PortletResponse response,
-            ActionMapping mapping, Map<String, Object> requestMap, Map<String, 
String[]> parameterMap,
+    public void serviceAction(PortletRequest request, PortletResponse 
response, Map<String, Object> requestMap, Map<String, String[]> parameterMap,
             Map<String, Object> sessionMap, Map<String, Object> 
applicationMap, String portletNamespace,
             Integer phase) throws PortletException {
         LOG.debug("serviceAction");
-        String actionName = mapping.getName();
-        String namespace = mapping.getNamespace();
         Dispatcher.setInstance(dispatcherUtils);
+        String actionName = null;
+        String namespace = null;
         try {
+            ServletContext servletContext = new 
PortletServletContext(getPortletContext());
+            HttpServletRequest servletRequest = new 
PortletServletRequest(request, getPortletContext());
+            HttpServletResponse servletResponse = new 
PortletServletResponse(response);
+            if(EVENT_PHASE.equals(phase)) {
+               servletRequest = dispatcherUtils.wrapRequest(servletRequest, 
servletContext);
+                       if(servletRequest instanceof MultiPartRequestWrapper) {
+                               // Multipart request. Request parameters are 
encoded in the multipart data,
+                               // so we need to manually add them to the 
parameter map.
+                               
parameterMap.putAll(servletRequest.getParameterMap());
+                       }
+               }
+            container.inject(servletRequest);
+            ActionMapping mapping = getActionMapping(request, servletRequest);
+            actionName = mapping.getName();
+            namespace = mapping.getNamespace();
             HashMap<String, Object> extraContext = 
createContextMap(requestMap, parameterMap,
-                    sessionMap, applicationMap, request, response,
-                    getPortletConfig(), phase);
+                    sessionMap, applicationMap, request, response, 
servletRequest, servletResponse,
+                    servletContext, getPortletConfig(), phase);
             extraContext.put(PortletActionConstants.ACTION_MAPPING, mapping);
             LOG.debug("Creating action proxy for name = " + actionName
                     + ", namespace = " + namespace);
@@ -479,24 +480,22 @@
      * @param request the PortletRequest object.
      * @return the namespace of the action.
      */
-    protected ActionMapping getActionMapping(final PortletRequest request) {
+    protected ActionMapping getActionMapping(final PortletRequest 
portletRequest, final HttpServletRequest servletRequest) {
         ActionMapping mapping = null;
         String actionPath = null;
-        if (resetAction(request)) {
-            mapping = (ActionMapping) actionMap.get(request.getPortletMode());
+        if (resetAction(portletRequest)) {
+            mapping = (ActionMapping) 
actionMap.get(portletRequest.getPortletMode());
         } else {
-            actionPath = request.getParameter(ACTION_PARAM);
+            actionPath = servletRequest.getParameter(ACTION_PARAM);
             if (StringUtils.isEmpty(actionPath)) {
-                mapping = (ActionMapping) actionMap.get(request
+                mapping = (ActionMapping) actionMap.get(portletRequest
                         .getPortletMode());
             } else {
                 
                 // Use the usual action mapper, but it is expecting an action 
extension
                 // on the uri, so we add the default one, which should be ok 
as the
                 // portlet is a portlet first, a servlet second
-                PortletServletRequest httpRequest = new 
PortletServletRequest(request, getPortletContext());
-                container.inject(httpRequest);
-                mapping = actionMapper.getMapping(httpRequest, 
dispatcherUtils.getConfigurationManager());
+                mapping = actionMapper.getMapping(servletRequest, 
dispatcherUtils.getConfigurationManager());
             }
         }
         

Modified: 
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java?rev=759140&r1=759139&r2=759140&view=diff
==============================================================================
--- 
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
 (original)
+++ 
struts/struts2/trunk/plugins/portlet/src/test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java
 Fri Mar 27 13:51:52 2009
@@ -319,24 +319,4 @@
                dispatcher.render((RenderRequest) mockRequest.proxy(), 
(RenderResponse) mockResponse.proxy());
        }
 
-       public void 
testMultipartRequest_parametersAreCopiedToActionInvocation() throws Exception {
-               MockPortletContext ctx = new MockPortletContext();
-               ctx.setAttribute("javax.servlet.context.tempdir", new 
File("target").getAbsoluteFile());
-               MockActionRequest request = new MockActionRequest(ctx);
-               request.setContent(MULTIPART_REQUEST.getBytes("US-ASCII"));
-               request.setContentType("multipart/form-data; 
boundary=---------------------------4827543632391");
-               request.setProperty("Content-Length", "" + 
MULTIPART_REQUEST.length());
-               MockActionResponse response = new MockActionResponse();
-               Map<String, Object> requestMap = new HashMap<String, Object>();
-               Map<String, String[]> paramMap = new HashMap<String, 
String[]>();
-               Map<String, Object> sessionMap = new HashMap<String, Object>();
-               Map<String, Object> applicationMap = new HashMap<String, 
Object>();
-               initPortletConfig(new HashMap<String, String>(), new 
HashMap<String, Object>());
-               MockPortletConfig config = new MockPortletConfig(ctx);
-               dispatcher.init(config);
-               dispatcher.createContextMap(requestMap, paramMap, sessionMap, 
applicationMap, request, response, config,
-                               PortletActionConstants.EVENT_PHASE);
-               assertNotNull("Caption was not found in parameter map!", 
paramMap.get("caption"));
-               assertEquals("TestCaption", paramMap.get("caption")[0]);
-       }
 }


Reply via email to