From dba9b5093433c717c2ddacba996384371aa6bd76 Mon Sep 17 00:00:00 2001 From: Lukasz Lenart Date: Thu, 8 Apr 2010 17:01:16 +0000 Subject: [PATCH] Huge parse method refactoring and generifying git-svn-id: https://svn.apache.org/repos/asf/struts/struts2/trunk@932009 13f79535-47bb-0310-9956-ffa450edef68 --- .../multipart/JakartaMultiPartRequest.java | 162 ++++++++++-------- .../FileUploadInterceptorTest.java | 31 ++-- 2 files changed, 102 insertions(+), 91 deletions(-) diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java index f1ba96350..e19bd7116 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java @@ -21,18 +21,9 @@ package org.apache.struts2.dispatcher.multipart; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.servlet.http.HttpServletRequest; - +import com.opensymphony.xwork2.inject.Inject; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.FileUploadException; import org.apache.commons.fileupload.RequestContext; @@ -41,9 +32,17 @@ import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; import org.apache.struts2.StrutsConstants; -import com.opensymphony.xwork2.inject.Inject; -import com.opensymphony.xwork2.util.logging.Logger; -import com.opensymphony.xwork2.util.logging.LoggerFactory; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.UnsupportedEncodingException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Multipart form data request adapter for Jakarta Commons Fileupload package. @@ -62,7 +61,7 @@ public class JakartaMultiPartRequest implements MultiPartRequest { protected List errors = new ArrayList(); protected long maxSize; - + @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE) public void setMaxSize(String maxSize) { this.maxSize = Long.parseLong(maxSize); @@ -73,72 +72,87 @@ public class JakartaMultiPartRequest implements MultiPartRequest { * multipart classes (see class description). * * @param saveDir the directory to save off the file - * @param servletRequest the request containing the multipart + * @param request the request containing the multipart * @throws java.io.IOException is thrown if encoding fails. */ - public void parse(HttpServletRequest servletRequest, String saveDir) - throws IOException { + public void parse(HttpServletRequest request, String saveDir) throws IOException { + try { + processUpload(request, saveDir); + } catch (FileUploadException e) { + LOG.warn("Unable to parse request", e); + errors.add(e.getMessage()); + } + } + + private void processUpload(HttpServletRequest request, String saveDir) throws FileUploadException, UnsupportedEncodingException { + for (FileItem item : parseRequest(request, saveDir)) { + if (LOG.isDebugEnabled()) { + LOG.debug("Found item " + item.getFieldName()); + } + if (item.isFormField()) { + processNormalFormField(item, request.getCharacterEncoding()); + } else { + processFileField(item); + } + } + } + + private void processFileField(FileItem item) { + LOG.debug("Item is a file upload"); + + // Skip file uploads that don't have a file name - meaning that no file was selected. + if (item.getName() == null || item.getName().trim().length() < 1) { + LOG.debug("No file has been uploaded for the field: " + item.getFieldName()); + return; + } + + List values; + if (files.get(item.getFieldName()) != null) { + values = files.get(item.getFieldName()); + } else { + values = new ArrayList(); + } + + values.add(item); + files.put(item.getFieldName(), values); + } + + private void processNormalFormField(FileItem item, String charset) throws UnsupportedEncodingException { + LOG.debug("Item is a normal form field"); + List values; + if (params.get(item.getFieldName()) != null) { + values = params.get(item.getFieldName()); + } else { + values = new ArrayList(); + } + + // note: see http://jira.opensymphony.com/browse/WW-633 + // basically, in some cases the charset may be null, so + // we're just going to try to "other" method (no idea if this + // will work) + if (charset != null) { + values.add(item.getString(charset)); + } else { + values.add(item.getString()); + } + params.put(item.getFieldName(), values); + } + + private List parseRequest(HttpServletRequest servletRequest, String saveDir) throws FileUploadException { + DiskFileItemFactory fac = createDiskFileItemFactory(saveDir); + ServletFileUpload upload = new ServletFileUpload(fac); + upload.setSizeMax(maxSize); + return upload.parseRequest(createRequestContext(servletRequest)); + } + + private DiskFileItemFactory createDiskFileItemFactory(String saveDir) { DiskFileItemFactory fac = new DiskFileItemFactory(); // Make sure that the data is written to file fac.setSizeThreshold(0); if (saveDir != null) { fac.setRepository(new File(saveDir)); } - - // Parse the request - try { - ServletFileUpload upload = new ServletFileUpload(fac); - upload.setSizeMax(maxSize); - - List items = upload.parseRequest(createRequestContext(servletRequest)); - - for (Object item1 : items) { - FileItem item = (FileItem) item1; - if (LOG.isDebugEnabled()) LOG.debug("Found item " + item.getFieldName()); - if (item.isFormField()) { - LOG.debug("Item is a normal form field"); - List values; - if (params.get(item.getFieldName()) != null) { - values = params.get(item.getFieldName()); - } else { - values = new ArrayList(); - } - - // note: see http://jira.opensymphony.com/browse/WW-633 - // basically, in some cases the charset may be null, so - // we're just going to try to "other" method (no idea if this - // will work) - String charset = servletRequest.getCharacterEncoding(); - if (charset != null) { - values.add(item.getString(charset)); - } else { - values.add(item.getString()); - } - params.put(item.getFieldName(), values); - } else { - LOG.debug("Item is a file upload"); - - // Skip file uploads that don't have a file name - meaning that no file was selected. - if (item.getName() == null || item.getName().trim().length() < 1) { - LOG.debug("No file has been uploaded for the field: " + item.getFieldName()); - continue; - } - - List values; - if (files.get(item.getFieldName()) != null) { - values = files.get(item.getFieldName()); - } else { - values = new ArrayList(); - } - - values.add(item); - files.put(item.getFieldName(), values); - } - } - } catch (FileUploadException e) { - LOG.warn("Unable to parse request", e); - errors.add(e.getMessage()); - } + return fac; } /* (non-Javadoc) diff --git a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java index d8bd7f061..2390f1eff 100644 --- a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java +++ b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java @@ -21,6 +21,19 @@ package org.apache.struts2.interceptor; +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.ActionSupport; +import com.opensymphony.xwork2.ValidationAwareSupport; +import com.opensymphony.xwork2.mock.MockActionInvocation; +import com.opensymphony.xwork2.util.ClassLoaderUtil; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.struts2.ServletActionContext; +import org.apache.struts2.StrutsTestCase; +import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest; +import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; +import org.springframework.mock.web.MockHttpServletRequest; + +import javax.servlet.http.HttpServletRequest; import java.io.File; import java.io.IOException; import java.net.URI; @@ -30,22 +43,6 @@ import java.util.List; import java.util.Locale; import java.util.Map; -import javax.servlet.http.HttpServletRequest; - -import org.apache.struts2.ServletActionContext; -import org.apache.struts2.StrutsTestCase; -import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest; -import org.apache.struts2.dispatcher.multipart.MultiPartRequest; -import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; -import org.apache.commons.fileupload.servlet.ServletFileUpload; -import org.springframework.mock.web.MockHttpServletRequest; - -import com.opensymphony.xwork2.util.ClassLoaderUtil; -import com.opensymphony.xwork2.ActionContext; -import com.opensymphony.xwork2.ActionSupport; -import com.opensymphony.xwork2.ValidationAwareSupport; -import com.opensymphony.xwork2.mock.MockActionInvocation; - /** * Test case for FileUploadInterceptor. @@ -183,7 +180,7 @@ public class FileUploadInterceptorTest extends StrutsTestCase { Map param = new HashMap(); ActionContext.getContext().setParameters(param); - ActionContext.getContext().put(ServletActionContext.HTTP_REQUEST, createMultipartRequest((HttpServletRequest) req, 2000)); + ActionContext.getContext().put(ServletActionContext.HTTP_REQUEST, createMultipartRequest(req, 2000)); interceptor.intercept(mai);