You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by ni...@apache.org on 2009/03/27 14:51:52 UTC

svn commit: r759140 - in /struts/struts2/trunk/plugins/portlet/src: main/java/org/apache/struts2/portlet/dispatcher/Jsr168Dispatcher.java test/java/org/apache/struts2/portlet/dispatcher/Jsr168DispatcherTest.java

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]);
-	}
 }