Author: wesw
Date: Wed Jun 3 21:24:43 2009
New Revision: 781566
URL: http://svn.apache.org/viewvc?rev=781566&view=rev
Log:
first import, still need to create a struts-plugin.xml file that maps the
beans.
Added:
struts/sandbox/trunk/src/main/java/org/apache/struts2/fileupload/EnhancedJakartaMultiPartRequest.java
Added:
struts/sandbox/trunk/src/main/java/org/apache/struts2/fileupload/EnhancedJakartaMultiPartRequest.java
URL:
http://svn.apache.org/viewvc/struts/sandbox/trunk/src/main/java/org/apache/struts2/fileupload/EnhancedJakartaMultiPartRequest.java?rev=781566&view=auto
==============================================================================
---
struts/sandbox/trunk/src/main/java/org/apache/struts2/fileupload/EnhancedJakartaMultiPartRequest.java
(added)
+++
struts/sandbox/trunk/src/main/java/org/apache/struts2/fileupload/EnhancedJakartaMultiPartRequest.java
Wed Jun 3 21:24:43 2009
@@ -0,0 +1,189 @@
+/*
+ * $Id$
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.struts2.fileupload;
+
+import org.apache.struts2.dispatcher.multipart.MultiPartRequest;
+import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest;
+import org.apache.commons.fileupload.ProgressListener;
+import org.apache.commons.fileupload.FileItemFactory;
+import org.apache.commons.fileupload.FileItem;
+import org.apache.commons.fileupload.FileUploadException;
+import org.apache.commons.fileupload.FileUpload;
+import org.apache.commons.fileupload.RequestContext;
+import org.apache.commons.fileupload.portlet.PortletFileUpload;
+import org.apache.commons.fileupload.servlet.ServletFileUpload;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.List;
+import java.util.ArrayList;
+
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
+import com.opensymphony.xwork2.inject.Inject;
+
+/**
+ * Using Jakarta Commons File Upload, handle multipart requests. This class
+ * acts mostly the same as the original JakartaMultiPartRequest.
+ *
+ * @author WesW
+ */
+public class EnhancedJakartaMultiPartRequest
+ extends JakartaMultiPartRequest
+ implements MultiPartRequest {
+
+ static final Logger LOG = LoggerFactory.getLogger(MultiPartRequest.class);
+
+ protected ProgressListener progressListener;
+ protected FileItemFactory fileItemFactory;
+ protected boolean portletUpload;
+
+ /**
+ *
+ * @param progressListener
+ */
+ @Inject(FileUploadConstants.PROGRESS_LISTENER)
+ public void setProgressListener(ProgressListener progressListener) {
+ this.progressListener = progressListener;
+ }
+
+ /**
+ *
+ * @param fileItemFactory
+ */
+ @Inject(FileUploadConstants.FILE_ITEM_FACTORY)
+ public void setFileItemFactory(FileItemFactory fileItemFactory) {
+ this.fileItemFactory = fileItemFactory;
+ }
+
+ /**
+ *
+ * @param portletUpload
+ */
+ @Inject(FileUploadConstants.IS_PORTLET)
+ public void setPortletUpload(String portletUpload) {
+ this.portletUpload = "true".equalsIgnoreCase(portletUpload);
+ }
+
+ /**
+ *
+ * @param request
+ * @param saveDir
+ * @throws IOException
+ */
+ public void parse(HttpServletRequest request, String saveDir) throws
IOException {
+ // Parse the request mostly copy/paste from JakartaMuliPartRequest
+ try {
+
+ FileUpload upload ;
+ if (portletUpload) {
+ upload = new PortletFileUpload(fileItemFactory);
+ }
+ else {
+ upload = new ServletFileUpload(fileItemFactory);
+ }
+
+ upload.setSizeMax(maxSize);
+ upload.setProgressListener(progressListener);
+
+ List items = upload.parseRequest(createRequestContext(request));
+
+ 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 = request.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>();
+ }
+
+ values.add(item);
+ files.put(item.getFieldName(), values);
+ }
+ }
+ } catch (FileUploadException e) {
+ LOG.warn("Unable to parse request", e);
+ errors.add(e.getMessage());
+ }
+ }
+
+ /**
+ * Creates a RequestContext needed by Jakarta Commons Upload.
+ * (copy/pasta from JakartaMultiPartRequest)
+ *
+ * @param req the request.
+ * @return a new request context.
+ */
+ private RequestContext createRequestContext(final HttpServletRequest req) {
+ return new RequestContext() {
+ public String getCharacterEncoding() {
+ return req.getCharacterEncoding();
+ }
+
+ public String getContentType() {
+ return req.getContentType();
+ }
+
+ public int getContentLength() {
+ return req.getContentLength();
+ }
+
+ public InputStream getInputStream() throws IOException {
+ InputStream in = req.getInputStream();
+ if (in == null) {
+ throw new IOException("Missing content in the request");
+ }
+ return req.getInputStream();
+ }
+ };
+ }
+}