Author: nilsga
Date: Thu Dec 6 03:05:08 2007
New Revision: 601700
URL: http://svn.apache.org/viewvc?rev=601700&view=rev
Log:
WW-2347,WW-2348 - Make multipart form fields available in the parameter map.
Modified:
struts/struts2/trunk/plugins/portlet/pom.xml
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/pom.xml
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/plugins/portlet/pom.xml?rev=601700&r1=601699&r2=601700&view=diff
==============================================================================
--- struts/struts2/trunk/plugins/portlet/pom.xml (original)
+++ struts/struts2/trunk/plugins/portlet/pom.xml Thu Dec 6 03:05:08 2007
@@ -124,12 +124,24 @@
<groupId>org.springframework</groupId>
<artifactId>spring-mock</artifactId>
<version>2.0.7</version>
- <scope>test</scope>
+ <scope>test</scope>
</dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-portlet</artifactId>
+ <version>2.0.7</version>
+ <scope>test</scope>
+ </dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>2.0.7</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>commons-fileupload</groupId>
+ <artifactId>commons-fileupload</artifactId>
+ <version>1.1.1</version>
<scope>test</scope>
</dependency>
</dependencies>
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=601700&r1=601699&r2=601700&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
Thu Dec 6 03:05:08 2007
@@ -21,6 +21,7 @@
package org.apache.struts2.portlet.dispatcher;
import java.io.IOException;
+import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Locale;
@@ -50,6 +51,7 @@
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
+import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
import org.apache.struts2.portlet.PortletActionConstants;
import org.apache.struts2.portlet.PortletApplicationMap;
import org.apache.struts2.portlet.PortletRequestMap;
@@ -358,6 +360,11 @@
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());
+ }
}
// ServletActionContext
HashMap<String,Object> extraContext = new HashMap<String,Object>();
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=601700&r1=601699&r2=601700&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
Thu Dec 6 03:05:08 2007
@@ -20,6 +20,7 @@
*/
package org.apache.struts2.portlet.dispatcher;
+import java.io.File;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
@@ -36,19 +37,16 @@
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.WindowState;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-
-import junit.textui.TestRunner;
import org.apache.struts2.StrutsConstants;
-import org.apache.struts2.dispatcher.mapper.ActionMapper;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.portlet.PortletActionConstants;
import org.easymock.EasyMock;
import org.jmock.Mock;
import org.jmock.cglib.MockObjectTestCase;
import org.jmock.core.Constraint;
+import org.springframework.mock.web.portlet.MockActionRequest;
+import org.springframework.mock.web.portlet.MockActionResponse;
import org.springframework.mock.web.portlet.MockPortletConfig;
import org.springframework.mock.web.portlet.MockPortletContext;
@@ -57,7 +55,6 @@
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.ActionProxyFactory;
import com.opensymphony.xwork2.util.ValueStack;
-import com.opensymphony.xwork2.util.ValueStackFactory;
/**
* Jsr168DispatcherTest. Insert description.
@@ -65,6 +62,17 @@
*/
public class Jsr168DispatcherTest extends MockObjectTestCase implements
PortletActionConstants {
+ private final String MULTIPART_REQUEST =
"-----------------------------4827543632391\r\n"
+ + "Content-Disposition: form-data; name=\"upload\";
filename=\"test.txt\"\r\n"
+ + "Content-Type: text/plain\r\n"
+ + "\r\n"
+ + "This is a test file\r\n"
+ + "-----------------------------4827543632391\r\n"
+ + "Content-Disposition: form-data; name=\"caption\"\r\n"
+ + "\r\n"
+ + "TestCaption\r\n"
+ + "-----------------------------4827543632391--";
+
Jsr168Dispatcher dispatcher = null;
Mock mockConfig = null;
Mock mockCtx = null;
@@ -304,9 +312,24 @@
fail("Error occured");
}
}
-
- public static void main(String[] args) {
- TestRunner.run(Jsr168DispatcherTest.class);
+
+ 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(), new HashMap());
+ 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]);
}
-
}