Author: lukaszlenart Date: Thu Apr 8 17:01:16 2010 New Revision: 932009 URL: http://svn.apache.org/viewvc?rev=932009&view=rev Log: Huge parse method refactoring and generifying
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java?rev=932009&r1=932008&r2=932009&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java Thu Apr 8 17:01:16 2010 @@ -21,9 +21,22 @@ package org.apache.struts2.dispatcher.multipart; +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; +import org.apache.commons.fileupload.disk.DiskFileItem; +import org.apache.commons.fileupload.disk.DiskFileItemFactory; +import org.apache.commons.fileupload.servlet.ServletFileUpload; +import org.apache.struts2.StrutsConstants; + +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; @@ -31,20 +44,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.servlet.http.HttpServletRequest; - -import org.apache.commons.fileupload.FileItem; -import org.apache.commons.fileupload.FileUploadException; -import org.apache.commons.fileupload.RequestContext; -import org.apache.commons.fileupload.disk.DiskFileItem; -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; - /** * Multipart form data request adapter for Jakarta Commons Fileupload package. */ @@ -62,7 +61,7 @@ public class JakartaMultiPartRequest imp protected List<String> errors = new ArrayList<String>(); 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 imp * 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 { - DiskFileItemFactory fac = new DiskFileItemFactory(); - // Make sure that the data is written to file - fac.setSizeThreshold(0); - if (saveDir != null) { - fac.setRepository(new File(saveDir)); + 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()); } + } - // Parse the request - try { - ServletFileUpload upload = new ServletFileUpload(fac); - upload.setSizeMax(maxSize); + 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); + } + } + } - List items = upload.parseRequest(createRequestContext(servletRequest)); + private void processFileField(FileItem item) { + LOG.debug("Item is a file upload"); - 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<String> values; - if (params.get(item.getFieldName()) != null) { - values = params.get(item.getFieldName()); - } else { - values = new ArrayList<String>(); - } - - // 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<FileItem> values; - if (files.get(item.getFieldName()) != null) { - values = files.get(item.getFieldName()); - } else { - values = new ArrayList<FileItem>(); - } + // 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; + } - values.add(item); - files.put(item.getFieldName(), values); - } - } - } catch (FileUploadException e) { - LOG.warn("Unable to parse request", e); - errors.add(e.getMessage()); + List<FileItem> values; + if (files.get(item.getFieldName()) != null) { + values = files.get(item.getFieldName()); + } else { + values = new ArrayList<FileItem>(); + } + + 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<String> values; + if (params.get(item.getFieldName()) != null) { + values = params.get(item.getFieldName()); + } else { + values = new ArrayList<String>(); + } + + // 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<FileItem> 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)); } + return fac; } /* (non-Javadoc) Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java?rev=932009&r1=932008&r2=932009&view=diff ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java Thu Apr 8 17:01:16 2010 @@ -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 e 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);