You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by lu...@apache.org on 2016/11/25 18:17:56 UTC

[01/14] struts git commit: Introduces a dedicated class to represent an uploaded file

Repository: struts
Updated Branches:
  refs/heads/master 6d623ebb5 -> 32341681e


Introduces a dedicated class to represent an uploaded file


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/fe05ca20
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/fe05ca20
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/fe05ca20

Branch: refs/heads/master
Commit: fe05ca20951ecda86e147dbf5272709412df820d
Parents: 6f7fcaa
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Nov 21 11:04:24 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Nov 21 11:04:24 2016 +0100

----------------------------------------------------------------------
 .../dispatcher/multipart/UploadedFile.java      | 39 ++++++++++++++++++++
 1 file changed, 39 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/fe05ca20/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
new file mode 100644
index 0000000..e6a77a8
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
@@ -0,0 +1,39 @@
+/*
+ * 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.dispatcher.multipart;
+
+/**
+ * Virtual representation of a uploaded file used by {@link MultiPartRequest}
+ */
+public interface UploadedFile<T> {
+
+    Long length();
+
+    String getName();
+
+    boolean isFile();
+
+    boolean delete();
+
+    String getAbsolutePath();
+
+    T getContent();
+
+}


[03/14] struts git commit: Adjusts interceptor to use the new class

Posted by lu...@apache.org.
Adjusts interceptor to use the new class


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/407cd582
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/407cd582
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/407cd582

Branch: refs/heads/master
Commit: 407cd58279c61a8c9487aae3e42a99fcfe8352b9
Parents: 45edbcb
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Nov 21 11:05:47 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Nov 21 11:05:47 2016 +0100

----------------------------------------------------------------------
 .../interceptor/FileUploadInterceptor.java      |  9 ++--
 .../interceptor/FileUploadInterceptorTest.java  | 56 ++++++++++++++++----
 2 files changed, 50 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/407cd582/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java b/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
index be97a31..b9f5cb6 100644
--- a/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
+++ b/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
@@ -34,6 +34,7 @@ import org.apache.struts2.ServletActionContext;
 import org.apache.struts2.dispatcher.LocalizedMessage;
 import org.apache.struts2.dispatcher.Parameter;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
 import org.apache.struts2.util.ContentTypeMatcher;
 
 import javax.servlet.http.HttpServletRequest;
@@ -280,9 +281,9 @@ public class FileUploadInterceptor extends AbstractInterceptor {
 
                 if (isNonEmpty(fileName)) {
                     // get a File object for the uploaded File
-                    File[] files = multiWrapper.getFiles(inputName);
+                    UploadedFile[] files = multiWrapper.getFiles(inputName);
                     if (files != null && files.length > 0) {
-                        List<File> acceptedFiles = new ArrayList<>(files.length);
+                        List<UploadedFile> acceptedFiles = new ArrayList<>(files.length);
                         List<String> acceptedContentTypes = new ArrayList<>(files.length);
                         List<String> acceptedFileNames = new ArrayList<>(files.length);
                         String contentTypeName = inputName + "ContentType";
@@ -298,7 +299,7 @@ public class FileUploadInterceptor extends AbstractInterceptor {
 
                         if (!acceptedFiles.isEmpty()) {
                             Map<String, Parameter> newParams = new HashMap<>();
-                            newParams.put(inputName, new Parameter.File(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()])));
+                            newParams.put(inputName, new Parameter.File(inputName, acceptedFiles.toArray(new UploadedFile[acceptedFiles.size()])));
                             newParams.put(contentTypeName, new Parameter.File(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()])));
                             newParams.put(fileNameName, new Parameter.File(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()])));
                             ac.getParameters().appendAll(newParams);
@@ -332,7 +333,7 @@ public class FileUploadInterceptor extends AbstractInterceptor {
      *                    logging.
      * @return true if the proposed file is acceptable by contentType and size.
      */
-    protected boolean acceptFile(Object action, File file, String filename, String contentType, String inputName, ValidationAware validation) {
+    protected boolean acceptFile(Object action, UploadedFile file, String filename, String contentType, String inputName, ValidationAware validation) {
         boolean fileIsAcceptable = false;
 
         // If it's null the upload failed

http://git-wip-us.apache.org/repos/asf/struts/blob/407cd582/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
----------------------------------------------------------------------
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 6668b4c..87251cd 100644
--- a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
+++ b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
@@ -33,7 +33,9 @@ import org.apache.struts2.StrutsInternalTestCase;
 import org.apache.struts2.TestAction;
 import org.apache.struts2.dispatcher.HttpParameters;
 import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest;
+import org.apache.struts2.dispatcher.multipart.JakartaUploadedFile;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
 import org.springframework.mock.web.MockHttpServletRequest;
 
 import javax.servlet.http.HttpServletRequest;
@@ -53,6 +55,38 @@ import java.util.Map;
  */
 public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
+    public static final UploadedFile EMPTY_FILE = new UploadedFile() {
+        @Override
+        public Long length() {
+            return 0L;
+        }
+
+        @Override
+        public String getName() {
+            return "";
+        }
+
+        @Override
+        public boolean isFile() {
+            return false;
+        }
+
+        @Override
+        public boolean delete() {
+            return false;
+        }
+
+        @Override
+        public String getAbsolutePath() {
+            return null;
+        }
+
+        @Override
+        public byte[] getContent() {
+            return new byte[0];
+        }
+    };
+
     private FileUploadInterceptor interceptor;
     private File tempDir;
     private TestAction action;
@@ -60,7 +94,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
     public void testAcceptFileWithEmptyAllowedTypesAndExtensions() throws Exception {
         // when allowed type is empty
         ValidationAwareSupport validation = new ValidationAwareSupport();
-        boolean ok = interceptor.acceptFile(action, new File(""), "filename", "text/plain", "inputName", validation);
+        boolean ok = interceptor.acceptFile(action, EMPTY_FILE, "filename", "text/plain", "inputName", validation);
 
         assertTrue(ok);
         assertTrue(validation.getFieldErrors().isEmpty());
@@ -72,7 +106,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         // when file is of allowed types
         ValidationAwareSupport validation = new ValidationAwareSupport();
-        boolean ok = interceptor.acceptFile(action, new File(""), "filename.txt", "text/plain", "inputName", validation);
+        boolean ok = interceptor.acceptFile(action, EMPTY_FILE, "filename.txt", "text/plain", "inputName", validation);
 
         assertTrue(ok);
         assertTrue(validation.getFieldErrors().isEmpty());
@@ -80,7 +114,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         // when file is not of allowed types
         validation = new ValidationAwareSupport();
-        boolean notOk = interceptor.acceptFile(action, new File(""), "filename.html", "text/html", "inputName", validation);
+        boolean notOk = interceptor.acceptFile(action, EMPTY_FILE, "filename.html", "text/html", "inputName", validation);
 
         assertFalse(notOk);
         assertFalse(validation.getFieldErrors().isEmpty());
@@ -92,7 +126,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
         interceptor.setAllowedTypes("text/*");
 
         ValidationAwareSupport validation = new ValidationAwareSupport();
-        boolean ok = interceptor.acceptFile(action, new File(""), "filename.txt", "text/plain", "inputName", validation);
+        boolean ok = interceptor.acceptFile(action, EMPTY_FILE, "filename.txt", "text/plain", "inputName", validation);
 
         assertTrue(ok);
         assertTrue(validation.getFieldErrors().isEmpty());
@@ -100,7 +134,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         interceptor.setAllowedTypes("text/h*");
         validation = new ValidationAwareSupport();
-        boolean notOk = interceptor.acceptFile(action, new File(""), "filename.html", "text/plain", "inputName", validation);
+        boolean notOk = interceptor.acceptFile(action, EMPTY_FILE, "filename.html", "text/plain", "inputName", validation);
 
         assertFalse(notOk);
         assertFalse(validation.getFieldErrors().isEmpty());
@@ -112,7 +146,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         // when file is of allowed extensions
         ValidationAwareSupport validation = new ValidationAwareSupport();
-        boolean ok = interceptor.acceptFile(action, new File(""), "filename.txt", "text/plain", "inputName", validation);
+        boolean ok = interceptor.acceptFile(action, EMPTY_FILE, "filename.txt", "text/plain", "inputName", validation);
 
         assertTrue(ok);
         assertTrue(validation.getFieldErrors().isEmpty());
@@ -120,7 +154,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         // when file is not of allowed extensions
         validation = new ValidationAwareSupport();
-        boolean notOk = interceptor.acceptFile(action, new File(""), "filename.html", "text/html", "inputName", validation);
+        boolean notOk = interceptor.acceptFile(action, EMPTY_FILE, "filename.html", "text/html", "inputName", validation);
 
         assertFalse(notOk);
         assertFalse(validation.getFieldErrors().isEmpty());
@@ -129,7 +163,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
         //test with multiple extensions
         interceptor.setAllowedExtensions(".txt,.lol");
         validation = new ValidationAwareSupport();
-        ok = interceptor.acceptFile(action, new File(""), "filename.lol", "text/plain", "inputName", validation);
+        ok = interceptor.acceptFile(action, EMPTY_FILE, "filename.lol", "text/plain", "inputName", validation);
 
         assertTrue(ok);
         assertTrue(validation.getFieldErrors().isEmpty());
@@ -164,7 +198,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
         URL url = ClassLoaderUtil.getResource("log4j2.xml", FileUploadInterceptorTest.class);
         File file = new File(new URI(url.toString()));
         assertTrue("log4j2.xml should be in src/test folder", file.exists());
-        boolean notOk = interceptor.acceptFile(action, file, "filename", "text/html", "inputName", validation);
+        boolean notOk = interceptor.acceptFile(action, new JakartaUploadedFile(file), "filename", "text/html", "inputName", validation);
 
         assertFalse(notOk);
         assertFalse(validation.getFieldErrors().isEmpty());
@@ -263,7 +297,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         HttpParameters parameters = mai.getInvocationContext().getParameters();
         assertTrue(parameters.getNames().size() == 3);
-        File[] files = (File[]) parameters.get("file").getObject();
+        UploadedFile[] files = (UploadedFile[]) parameters.get("file").getObject();
         String[] fileContentTypes = parameters.get("fileContentType").getMultipleValues();
         String[] fileRealFilenames = parameters.get("fileFileName").getMultipleValues();
 
@@ -323,7 +357,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
 
         HttpParameters parameters = mai.getInvocationContext().getParameters();
         assertEquals(3, parameters.getNames().size());
-        File[] files = (File[]) parameters.get("file").getObject();
+        UploadedFile[] files = (UploadedFile[]) parameters.get("file").getObject();
         String[] fileContentTypes = parameters.get("fileContentType").getMultipleValues();
         String[] fileRealFilenames = parameters.get("fileFileName").getMultipleValues();
 


[12/14] struts git commit: Merge branch 'master' into WW-4717

Posted by lu...@apache.org.
Merge branch 'master' into WW-4717


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/ae5605ff
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/ae5605ff
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/ae5605ff

Branch: refs/heads/master
Commit: ae5605ff8872daa08f12c84fb7a2b30f5f57e8ea
Parents: 4de8309 6d623eb
Author: Lukasz Lenart <lu...@apache.org>
Authored: Wed Nov 23 15:15:15 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Wed Nov 23 15:15:15 2016 +0100

----------------------------------------------------------------------
 assembly/src/main/assembly/all.xml              |   1 +
 assembly/src/main/assembly/lib.xml              |   1 +
 assembly/src/main/assembly/min-lib.xml          |   5 +-
 core/pom.xml                                    |   8 -
 .../interceptor/ParameterFilterInterceptor.java |   2 +-
 .../interceptor/ParametersInterceptor.java      |   4 +-
 .../AnnotationParameterFilterInterceptor.java   |   4 +-
 .../xwork2/util/finder/DefaultClassFinder.java  | 580 ------------------
 .../struts2/dispatcher/HttpParameters.java      | 100 +++-
 .../interceptor/CheckboxInterceptor.java        |   2 +-
 .../interceptor/DateTextFieldInterceptor.java   |   2 +-
 .../interceptor/MultiselectInterceptor.java     |   2 +-
 .../opensymphony/xwork2/ActionContextTest.java  |   2 +-
 .../ParameterFilterInterceptorTest.java         |   2 +-
 .../ParameterRemoverInterceptorTest.java        |   6 +-
 .../StaticParametersInterceptorTest.java        |   2 +-
 ...nnotationParameterFilterInterceptorTest.java |   8 +-
 .../struts2/components/ActionComponentTest.java |   2 +-
 .../interceptor/CheckboxInterceptorTest.java    |  16 +-
 .../DateTextFieldInterceptorTest.java           |   4 +-
 .../interceptor/FileUploadInterceptorTest.java  |   4 +-
 .../interceptor/MultiselectInterceptorTest.java |   6 +-
 .../apache/struts2/views/jsp/ActionTagTest.java |   4 +-
 plugins/convention/pom.xml                      |  10 +
 .../struts2/convention/DefaultClassFinder.java  | 583 +++++++++++++++++++
 pom.xml                                         |   7 +-
 26 files changed, 722 insertions(+), 645 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/ae5605ff/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
----------------------------------------------------------------------
diff --cc core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
index 1cea2d7,a7df38f..5ac4bc2
--- a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
+++ b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
@@@ -296,8 -262,8 +296,8 @@@ public class FileUploadInterceptorTest 
          assertTrue(!action.hasErrors());
  
          HttpParameters parameters = mai.getInvocationContext().getParameters();
-         assertTrue(parameters.getNames().size() == 3);
+         assertTrue(parameters.keySet().size() == 3);
 -        File[] files = (File[]) parameters.get("file").getObject();
 +        UploadedFile[] files = (UploadedFile[]) parameters.get("file").getObject();
          String[] fileContentTypes = parameters.get("fileContentType").getMultipleValues();
          String[] fileRealFilenames = parameters.get("fileFileName").getMultipleValues();
  
@@@ -356,8 -322,8 +356,8 @@@
          interceptor.intercept(mai);
  
          HttpParameters parameters = mai.getInvocationContext().getParameters();
-         assertEquals(3, parameters.getNames().size());
+         assertEquals(3, parameters.keySet().size());
 -        File[] files = (File[]) parameters.get("file").getObject();
 +        UploadedFile[] files = (UploadedFile[]) parameters.get("file").getObject();
          String[] fileContentTypes = parameters.get("fileContentType").getMultipleValues();
          String[] fileRealFilenames = parameters.get("fileFileName").getMultipleValues();
  


[11/14] struts git commit: Extracts one base class

Posted by lu...@apache.org.
Extracts one base class


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/4de8309d
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/4de8309d
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/4de8309d

Branch: refs/heads/master
Commit: 4de8309d0aebb75d409119f2d4a6d06491dda2b4
Parents: de51e79
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 20:02:22 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 20:02:22 2016 +0100

----------------------------------------------------------------------
 .../multipart/AbstractMultiPartRequest.java     | 112 +++++++++++++++++++
 .../multipart/JakartaMultiPartRequest.java      |  45 +-------
 .../JakartaStreamMultiPartRequest.java          |  90 +--------------
 .../multipart/PellMultiPartRequest.java         |  27 +----
 4 files changed, 118 insertions(+), 156 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/4de8309d/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java
new file mode 100644
index 0000000..a8037ed
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/AbstractMultiPartRequest.java
@@ -0,0 +1,112 @@
+package org.apache.struts2.dispatcher.multipart;
+
+import com.opensymphony.xwork2.LocaleProvider;
+import com.opensymphony.xwork2.inject.Inject;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.apache.struts2.StrutsConstants;
+import org.apache.struts2.dispatcher.LocalizedMessage;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+/**
+ * Abstract class with some helper methods, it should be used
+ * when starting development of another implementation of {@link MultiPartRequest}
+ */
+public abstract class AbstractMultiPartRequest implements MultiPartRequest {
+
+    private static final Logger LOG = LogManager.getLogger(AbstractMultiPartRequest.class);
+
+    /**
+     * Defines the internal buffer size used during streaming operations.
+     */
+    public static final int BUFFER_SIZE = 10240;
+
+    /**
+     * Internal list of raised errors to be passed to the the Struts2 framework.
+     */
+    protected List<LocalizedMessage> errors = new ArrayList<>();
+
+    /**
+     * Specifies the maximum size of the entire request.
+     */
+    protected int maxSize;
+    protected boolean maxSizeProvided;
+
+    /**
+     * Specifies the buffer size to use during streaming.
+     */
+    protected int bufferSize = BUFFER_SIZE;
+
+    protected String defaultEncoding;
+
+    /**
+     * Localization to be used regarding errors.
+     */
+    protected Locale defaultLocale = Locale.ENGLISH;
+
+    /**
+     * @param bufferSize Sets the buffer size to be used.
+     */
+    @Inject(value = StrutsConstants.STRUTS_MULTIPART_BUFFERSIZE, required = false)
+    public void setBufferSize(String bufferSize) {
+        this.bufferSize = Integer.parseInt(bufferSize);
+    }
+
+    @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
+    public void setDefaultEncoding(String enc) {
+        this.defaultEncoding = enc;
+    }
+
+    /**
+     * @param maxSize Injects the Struts multiple part maximum size.
+     */
+    @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
+    public void setMaxSize(String maxSize) {
+        this.maxSizeProvided = true;
+        this.maxSize = Integer.parseInt(maxSize);
+    }
+
+    /**
+     * @param provider Injects the Struts locale provider.
+     */
+    @Inject
+    public void setLocaleProvider(LocaleProvider provider) {
+        defaultLocale = provider.getLocale();
+    }
+
+    /**
+     * @param request Inspect the servlet request and set the locale if one wasn't provided by
+     * the Struts2 framework.
+     */
+    protected void setLocale(HttpServletRequest request) {
+        if (defaultLocale == null) {
+            defaultLocale = request.getLocale();
+        }
+    }
+
+    /**
+     * Build error message.
+     *
+     * @param e the Throwable/Exception
+     * @param args arguments
+     * @return error message
+     */
+    protected LocalizedMessage buildErrorMessage(Throwable e, Object[] args) {
+        String errorKey = "struts.messages.upload.error." + e.getClass().getSimpleName();
+        LOG.debug("Preparing error message for key: [{}]", errorKey);
+
+        return new LocalizedMessage(this.getClass(), errorKey, e.getMessage(), args);
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getErrors()
+    */
+    public List<LocalizedMessage> getErrors() {
+        return errors;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/4de8309d/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java
----------------------------------------------------------------------
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 30ec33d..02de7f2 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,8 +21,6 @@
 
 package org.apache.struts2.dispatcher.multipart;
 
-import com.opensymphony.xwork2.LocaleProvider;
-import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.LocalizedTextUtil;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileUploadBase;
@@ -33,7 +31,6 @@ import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.dispatcher.LocalizedMessage;
 
 import javax.servlet.http.HttpServletRequest;
@@ -46,7 +43,7 @@ import java.util.*;
 /**
  * Multipart form data request adapter for Jakarta Commons Fileupload package.
  */
-public class JakartaMultiPartRequest implements MultiPartRequest {
+public class JakartaMultiPartRequest extends AbstractMultiPartRequest {
 
     static final Logger LOG = LogManager.getLogger(JakartaMultiPartRequest.class);
 
@@ -56,22 +53,6 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
     // maps parameter name -> List of param values
     protected Map<String, List<String>> params = new HashMap<>();
 
-    // any errors while processing this request
-    protected List<LocalizedMessage> errors = new ArrayList<>();
-
-    protected long maxSize;
-    private Locale defaultLocale = Locale.ENGLISH;
-
-    @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
-    public void setMaxSize(String maxSize) {
-        this.maxSize = Long.parseLong(maxSize);
-    }
-
-    @Inject
-    public void setLocaleProvider(LocaleProvider provider) {
-        defaultLocale = provider.getLocale();
-    }
-
     /**
      * Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's
      * multipart classes (see class description).
@@ -86,15 +67,14 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
             processUpload(request, saveDir);
         } catch (FileUploadException e) {
             LOG.warn("Request exceeded size limit!", e);
-            LocalizedMessage errorMessage = null;
-            
+            LocalizedMessage errorMessage;
             if(e instanceof FileUploadBase.SizeLimitExceededException) {
                 FileUploadBase.SizeLimitExceededException ex = (FileUploadBase.SizeLimitExceededException) e;
                 errorMessage = buildErrorMessage(e, new Object[]{ex.getPermittedSize(), ex.getActualSize()});
             } else {
                 errorMessage = buildErrorMessage(e, new Object[]{});
             }
-            
+
             if (!errors.contains(errorMessage)) {
                 errors.add(errorMessage);
             }
@@ -107,18 +87,6 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
         }
     }
 
-    protected void setLocale(HttpServletRequest request) {
-        if (defaultLocale == null) {
-            defaultLocale = request.getLocale();
-        }
-    }
-
-    protected LocalizedMessage buildErrorMessage(Throwable e, Object[] args) {
-        String errorKey = "struts.messages.upload.error." + e.getClass().getSimpleName();
-        LOG.debug("Preparing error message for key: [{}]", errorKey);
-        return new LocalizedMessage(this.getClass(), errorKey, e.getMessage(), args);
-    }
-
     protected void processUpload(HttpServletRequest request, String saveDir) throws FileUploadException, UnsupportedEncodingException {
         for (FileItem item : parseRequest(request, saveDir)) {
             LOG.debug("Found file item: [{}]", item.getFieldName());
@@ -313,13 +281,6 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
         return null;
     }
 
-    /* (non-Javadoc)
-     * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getErrors()
-     */
-    public List<LocalizedMessage> getErrors() {
-        return errors;
-    }
-
     /**
      * Returns the canonical name of the given file.
      *

http://git-wip-us.apache.org/repos/asf/struts/blob/4de8309d/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
index 63760e6..11b5a0d 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
@@ -1,8 +1,5 @@
 package org.apache.struts2.dispatcher.multipart;
 
-import com.opensymphony.xwork2.LocaleProvider;
-import com.opensymphony.xwork2.inject.Inject;
-import com.opensymphony.xwork2.util.LocalizedTextUtil;
 import org.apache.commons.fileupload.FileItemIterator;
 import org.apache.commons.fileupload.FileItemStream;
 import org.apache.commons.fileupload.FileUploadBase;
@@ -11,7 +8,6 @@ import org.apache.commons.fileupload.servlet.ServletFileUpload;
 import org.apache.commons.fileupload.util.Streams;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.struts2.StrutsConstants;
 import org.apache.struts2.dispatcher.LocalizedMessage;
 
 import javax.servlet.http.HttpServletRequest;
@@ -27,16 +23,11 @@ import java.util.*;
  * @author Chris Cranford
  * @since 2.3.18
  */
-public class JakartaStreamMultiPartRequest implements MultiPartRequest {
+public class JakartaStreamMultiPartRequest extends AbstractMultiPartRequest {
 
     static final Logger LOG = LogManager.getLogger(JakartaStreamMultiPartRequest.class);
 
     /**
-     * Defines the internal buffer size used during streaming operations.
-     */
-    private static final int BUFFER_SIZE = 10240;
-
-    /**
      * Map between file fields and file data.
      */
     private Map<String, List<FileInfo>> fileInfos = new HashMap<>();
@@ -46,55 +37,6 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
      */
     private Map<String, List<String>> parameters = new HashMap<>();
 
-    /**
-     * Internal list of raised errors to be passed to the the Struts2 framework.
-     */
-    private List<LocalizedMessage> errors = new ArrayList<>();
-
-    /**
-     * Internal list of non-critical messages to be passed to the Struts2 framework.
-     */
-    private List<String> messages = new ArrayList<>();
-
-    /**
-     * Specifies the maximum size of the entire request.
-     */
-    private Long maxSize;
-
-    /**
-     * Specifies the buffer size to use during streaming.
-     */
-    private int bufferSize = BUFFER_SIZE;
-
-    /**
-     * Localization to be used regarding errors.
-     */
-    private Locale defaultLocale = Locale.ENGLISH;
-
-    /**
-     * @param maxSize Injects the Struts multiple part maximum size.
-     */
-    @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
-    public void setMaxSize(String maxSize) {
-        this.maxSize = Long.parseLong(maxSize);
-    }
-
-    /**
-     * @param bufferSize Sets the buffer size to be used.
-     */
-    @Inject(value = StrutsConstants.STRUTS_MULTIPART_BUFFERSIZE, required = false)
-    public void setBufferSize(String bufferSize) {
-        this.bufferSize = Integer.parseInt(bufferSize);
-    }
-
-    /**
-     * @param provider Injects the Struts locale provider.
-     */
-    @Inject
-    public void setLocaleProvider(LocaleProvider provider) {
-        defaultLocale = provider.getLocale();
-    }
-
     /* (non-Javadoc)
      * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#cleanUp()
      */
@@ -129,13 +71,6 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
     }
 
     /* (non-Javadoc)
-     * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getErrors()
-     */
-    public List<LocalizedMessage> getErrors() {
-        return errors;
-    }
-
-    /* (non-Javadoc)
      * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFile(java.lang.String)
      */
     public UploadedFile[] getFile(String fieldName) {
@@ -239,16 +174,6 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
     }
 
     /**
-      * @param request Inspect the servlet request and set the locale if one wasn't provided by
-     * the Struts2 framework.
-     */
-    protected void setLocale(HttpServletRequest request) {
-        if (defaultLocale == null) {
-            defaultLocale = request.getLocale();
-        }
-    }
-
-    /**
      * Processes the upload.
      *
      * @param request the servlet request
@@ -493,19 +418,6 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
     }
 
     /**
-     * Build error message.
-     *
-     * @param e the Throwable/Exception
-     * @param args arguments
-     * @return error message
-     */
-    private LocalizedMessage buildErrorMessage(Throwable e, Object[] args) {
-        String errorKey = "struts.message.upload.error." + e.getClass().getSimpleName();
-        LOG.debug("Preparing error message for key: [{}]", errorKey);
-        return new LocalizedMessage(this.getClass(), errorKey, e.getMessage(), args);
-    }
-
-    /**
      * Internal data structure used to store a reference to information needed
      * to later pass post processing data to the <code>FileUploadInterceptor</code>.
      *

http://git-wip-us.apache.org/repos/asf/struts/blob/4de8309d/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
index 40526e0..18bce32 100644
--- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
+++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
@@ -21,20 +21,15 @@
 
 package org.apache.struts2.dispatcher.multipart;
 
-import com.opensymphony.xwork2.inject.Inject;
 import com.opensymphony.xwork2.util.LocalizedTextUtil;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 import http.utils.multipartrequest.ServletMultipartRequest;
-import org.apache.struts2.StrutsConstants;
-import org.apache.struts2.dispatcher.LocalizedMessage;
 
 import javax.servlet.http.HttpServletRequest;
-import java.io.File;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Enumeration;
 import java.util.List;
 import java.util.Locale;
@@ -44,26 +39,12 @@ import java.util.Locale;
  * Multipart form data request adapter for Jason Pell's multipart utils package.
  *
  */
-public class PellMultiPartRequest implements MultiPartRequest {
+public class PellMultiPartRequest extends AbstractMultiPartRequest {
 
     private static final Logger LOG = LogManager.getLogger(PellMultiPartRequest.class);
+
     private ServletMultipartRequest multi;
 
-    private String defaultEncoding;
-    private boolean maxSizeProvided;
-    private int maxSize;
-    
-    @Inject(StrutsConstants.STRUTS_I18N_ENCODING)
-    public void setDefaultEncoding(String enc) {
-        this.defaultEncoding = enc;
-    }
-    
-    @Inject(StrutsConstants.STRUTS_MULTIPART_MAXSIZE)
-    public void setMaxSize(String maxSize) {
-    	this.maxSizeProvided = true;
-        this.maxSize = Integer.parseInt(maxSize);
-    }
-    
     /**
      * Creates a new request wrapper to handle multi-part data using methods adapted from Jason Pell's
      * multipart classes (see class description).
@@ -132,10 +113,6 @@ public class PellMultiPartRequest implements MultiPartRequest {
         return values.toArray(new String[values.size()]);
     }
 
-    public List<LocalizedMessage> getErrors() {
-        return Collections.emptyList();
-    }
-
     /**
      * Sets the encoding for the uploaded params.  This needs to be set if you are using character sets other than
      * ASCII.


[05/14] struts git commit: Reverts back to pure File

Posted by lu...@apache.org.
Reverts back to pure File


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/ec5fba7a
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/ec5fba7a
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/ec5fba7a

Branch: refs/heads/master
Commit: ec5fba7af9d62ac8a84dc1cd43d3bfee65dccca3
Parents: dca41a3
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 09:38:20 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 09:38:20 2016 +0100

----------------------------------------------------------------------
 .../struts2/showcase/fileupload/FileUploadAction.java       | 7 +++----
 .../fileupload/MultipleFileUploadUsingArrayAction.java      | 9 ++++-----
 .../fileupload/MultipleFileUploadUsingListAction.java       | 9 ++++-----
 3 files changed, 11 insertions(+), 14 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/ec5fba7a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
index 0568a51..6005306 100644
--- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
@@ -21,7 +21,6 @@
 package org.apache.struts2.showcase.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
 
@@ -33,7 +32,7 @@ public class FileUploadAction extends ActionSupport {
 	private static final long serialVersionUID = 5156288255337069381L;
 
 	private String contentType;
-	private UploadedFile upload;
+	private File upload;
 	private String fileName;
 	private String caption;
 
@@ -69,11 +68,11 @@ public class FileUploadAction extends ActionSupport {
 
 	// since we are using <s:file name="upload" ... /> the File itself will be
 	// obtained through getter/setter of <file-tag-name>
-	public UploadedFile getUpload() {
+	public File getUpload() {
 		return upload;
 	}
 
-	public void setUpload(UploadedFile upload) {
+	public void setUpload(File upload) {
 		this.upload = upload;
 	}
 

http://git-wip-us.apache.org/repos/asf/struts/blob/ec5fba7a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
index 183b2b3..b1a5985 100644
--- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
@@ -22,7 +22,6 @@
 package org.apache.struts2.showcase.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
 
@@ -33,7 +32,7 @@ import java.io.File;
  */
 public class MultipleFileUploadUsingArrayAction extends ActionSupport {
 
-	private UploadedFile[] uploads;
+	private File[] uploads;
 	private String[] uploadFileNames;
 	private String[] uploadContentTypes;
 
@@ -41,7 +40,7 @@ public class MultipleFileUploadUsingArrayAction extends ActionSupport {
 	public String upload() throws Exception {
 		System.out.println("\n\n upload2");
 		System.out.println("files:");
-		for (UploadedFile u : uploads) {
+		for (File u : uploads) {
 			System.out.println("*** " + u + "\t" + u.length());
 		}
 		System.out.println("filenames:");
@@ -56,11 +55,11 @@ public class MultipleFileUploadUsingArrayAction extends ActionSupport {
 		return SUCCESS;
 	}
 
-	public UploadedFile[] getUpload() {
+	public File[] getUpload() {
 		return this.uploads;
 	}
 
-	public void setUpload(UploadedFile[] upload) {
+	public void setUpload(File[] upload) {
 		this.uploads = upload;
 	}
 

http://git-wip-us.apache.org/repos/asf/struts/blob/ec5fba7a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
index 5327ae7..7b4325e 100644
--- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
@@ -22,7 +22,6 @@
 package org.apache.struts2.showcase.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
-import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -35,16 +34,16 @@ import java.util.List;
  */
 public class MultipleFileUploadUsingListAction extends ActionSupport {
 
-	private List<UploadedFile> uploads = new ArrayList<>();
+	private List<File> uploads = new ArrayList<>();
 	private List<String> uploadFileNames = new ArrayList<>();
 	private List<String> uploadContentTypes = new ArrayList<>();
 
 
-	public List<UploadedFile> getUpload() {
+	public List<File> getUpload() {
 		return this.uploads;
 	}
 
-	public void setUpload(List<UploadedFile> uploads) {
+	public void setUpload(List<File> uploads) {
 		this.uploads = uploads;
 	}
 
@@ -68,7 +67,7 @@ public class MultipleFileUploadUsingListAction extends ActionSupport {
 
 		System.out.println("\n\n upload1");
 		System.out.println("files:");
-		for (UploadedFile u : uploads) {
+		for (File u : uploads) {
 			System.out.println("*** " + u + "\t" + u.length());
 		}
 		System.out.println("filenames:");


[10/14] struts git commit: Drops unused code

Posted by lu...@apache.org.
Drops unused code


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/de51e797
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/de51e797
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/de51e797

Branch: refs/heads/master
Commit: de51e7971847b8e501a6d6efe076ee506a62ecb4
Parents: 6280feb
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 18:03:14 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 18:03:14 2016 +0100

----------------------------------------------------------------------
 .../multipart/JakartaStreamMultiPartRequest.java       | 13 -------------
 1 file changed, 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/de51e797/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
index 49ca2be..63760e6 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
@@ -506,19 +506,6 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
     }
 
     /**
-     * Build action message.
-     *
-     * @param e the Throwable/Exception
-     * @param args arguments
-     * @return action message
-     */
-    private String buildMessage(Throwable e, Object[] args) {
-        String messageKey = "struts.message.upload.message." + e.getClass().getSimpleName();
-        LOG.debug("Preparing message for key: [{}]", messageKey);
-        return LocalizedTextUtil.findText(this.getClass(), messageKey, defaultLocale, e.getMessage(), args);
-    }
-
-    /**
      * Internal data structure used to store a reference to information needed
      * to later pass post processing data to the <code>FileUploadInterceptor</code>.
      *


[04/14] struts git commit: Updates examples

Posted by lu...@apache.org.
Updates examples


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/dca41a39
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/dca41a39
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/dca41a39

Branch: refs/heads/master
Commit: dca41a39bf61917def9288e0436b8ccff410dd31
Parents: 407cd58
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Nov 21 11:05:56 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Nov 21 11:05:56 2016 +0100

----------------------------------------------------------------------
 .../struts2/showcase/fileupload/FileUploadAction.java  |  7 ++++---
 .../fileupload/MultipleFileUploadUsingArrayAction.java |  9 +++++----
 .../fileupload/MultipleFileUploadUsingListAction.java  | 13 +++++++------
 3 files changed, 16 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/dca41a39/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
index 6005306..0568a51 100644
--- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/FileUploadAction.java
@@ -21,6 +21,7 @@
 package org.apache.struts2.showcase.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
 
@@ -32,7 +33,7 @@ public class FileUploadAction extends ActionSupport {
 	private static final long serialVersionUID = 5156288255337069381L;
 
 	private String contentType;
-	private File upload;
+	private UploadedFile upload;
 	private String fileName;
 	private String caption;
 
@@ -68,11 +69,11 @@ public class FileUploadAction extends ActionSupport {
 
 	// since we are using <s:file name="upload" ... /> the File itself will be
 	// obtained through getter/setter of <file-tag-name>
-	public File getUpload() {
+	public UploadedFile getUpload() {
 		return upload;
 	}
 
-	public void setUpload(File upload) {
+	public void setUpload(UploadedFile upload) {
 		this.upload = upload;
 	}
 

http://git-wip-us.apache.org/repos/asf/struts/blob/dca41a39/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
index b1a5985..183b2b3 100644
--- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingArrayAction.java
@@ -22,6 +22,7 @@
 package org.apache.struts2.showcase.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
 
@@ -32,7 +33,7 @@ import java.io.File;
  */
 public class MultipleFileUploadUsingArrayAction extends ActionSupport {
 
-	private File[] uploads;
+	private UploadedFile[] uploads;
 	private String[] uploadFileNames;
 	private String[] uploadContentTypes;
 
@@ -40,7 +41,7 @@ public class MultipleFileUploadUsingArrayAction extends ActionSupport {
 	public String upload() throws Exception {
 		System.out.println("\n\n upload2");
 		System.out.println("files:");
-		for (File u : uploads) {
+		for (UploadedFile u : uploads) {
 			System.out.println("*** " + u + "\t" + u.length());
 		}
 		System.out.println("filenames:");
@@ -55,11 +56,11 @@ public class MultipleFileUploadUsingArrayAction extends ActionSupport {
 		return SUCCESS;
 	}
 
-	public File[] getUpload() {
+	public UploadedFile[] getUpload() {
 		return this.uploads;
 	}
 
-	public void setUpload(File[] upload) {
+	public void setUpload(UploadedFile[] upload) {
 		this.uploads = upload;
 	}
 

http://git-wip-us.apache.org/repos/asf/struts/blob/dca41a39/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
----------------------------------------------------------------------
diff --git a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
index 56e5875..5327ae7 100644
--- a/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
+++ b/apps/showcase/src/main/java/org/apache/struts2/showcase/fileupload/MultipleFileUploadUsingListAction.java
@@ -22,6 +22,7 @@
 package org.apache.struts2.showcase.fileupload;
 
 import com.opensymphony.xwork2.ActionSupport;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
 import java.util.ArrayList;
@@ -34,16 +35,16 @@ import java.util.List;
  */
 public class MultipleFileUploadUsingListAction extends ActionSupport {
 
-	private List<File> uploads = new ArrayList<File>();
-	private List<String> uploadFileNames = new ArrayList<String>();
-	private List<String> uploadContentTypes = new ArrayList<String>();
+	private List<UploadedFile> uploads = new ArrayList<>();
+	private List<String> uploadFileNames = new ArrayList<>();
+	private List<String> uploadContentTypes = new ArrayList<>();
 
 
-	public List<File> getUpload() {
+	public List<UploadedFile> getUpload() {
 		return this.uploads;
 	}
 
-	public void setUpload(List<File> uploads) {
+	public void setUpload(List<UploadedFile> uploads) {
 		this.uploads = uploads;
 	}
 
@@ -67,7 +68,7 @@ public class MultipleFileUploadUsingListAction extends ActionSupport {
 
 		System.out.println("\n\n upload1");
 		System.out.println("files:");
-		for (File u : uploads) {
+		for (UploadedFile u : uploads) {
 			System.out.println("*** " + u + "\t" + u.length());
 		}
 		System.out.println("filenames:");


[13/14] struts git commit: Fixes issue with NPE

Posted by lu...@apache.org.
Fixes issue with NPE


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/1ff8a88a
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/1ff8a88a
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/1ff8a88a

Branch: refs/heads/master
Commit: 1ff8a88a9df4b5cb9ffbdbb21028dc61d3236b01
Parents: ae5605f
Author: Lukasz Lenart <lu...@apache.org>
Authored: Thu Nov 24 14:52:18 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Thu Nov 24 14:52:18 2016 +0100

----------------------------------------------------------------------
 .../conversion/UploadedFileConverter.java       | 20 ++++++++++++--------
 1 file changed, 12 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/1ff8a88a/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java b/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
index 8ceac31..69d3c62 100644
--- a/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
+++ b/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
@@ -36,18 +36,22 @@ public class UploadedFileConverter extends DefaultTypeConverter {
     @Override
     public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType) {
         if (File.class.equals(toType)) {
-            LOG.warn("Converting {} into {}, consider switching to {} and do not access {} directly!",
+            LOG.debug("Converting {} into {}, consider switching to {} and do not access {} directly!",
                     File.class.getName(), UploadedFile.class.getName(), UploadedFile.class.getName(), File.class.getName());
 
+            Object obj;
             if (value.getClass().isArray() && Array.getLength(value) == 1) {
-                Object obj = Array.get(value, 0);
-                if (obj instanceof UploadedFile) {
-                    UploadedFile file = (UploadedFile) obj;
-                    if (file.getContent() instanceof File) {
-                        return file.getContent();
-                    }
-                    return new File(file.getAbsolutePath());
+                obj = Array.get(value, 0);
+            } else {
+                obj = value;
+            }
+
+            if (obj instanceof UploadedFile) {
+                UploadedFile file = (UploadedFile) obj;
+                if (file.getContent() instanceof File) {
+                    return file.getContent();
                 }
+                return new File(file.getAbsolutePath());
             }
         }
 


[14/14] struts git commit: Adds unit test to cover converter's logic

Posted by lu...@apache.org.
Adds unit test to cover converter's logic


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/32341681
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/32341681
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/32341681

Branch: refs/heads/master
Commit: 32341681ed420b4d042b35f712a6172dcab874f2
Parents: 1ff8a88
Author: Lukasz Lenart <lu...@apache.org>
Authored: Thu Nov 24 14:52:34 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Thu Nov 24 14:52:34 2016 +0100

----------------------------------------------------------------------
 .../conversion/UploadedFileConverterTest.java   | 70 ++++++++++++++++++++
 1 file changed, 70 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/32341681/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java
----------------------------------------------------------------------
diff --git a/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java b/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java
new file mode 100644
index 0000000..9b83b72
--- /dev/null
+++ b/core/src/test/java/org/apache/struts2/conversion/UploadedFileConverterTest.java
@@ -0,0 +1,70 @@
+package org.apache.struts2.conversion;
+
+import org.apache.struts2.dispatcher.multipart.StrutsUploadedFile;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.lang.reflect.Member;
+import java.util.Collections;
+import java.util.Map;
+
+import static org.fest.assertions.Assertions.assertThat;
+
+public class UploadedFileConverterTest {
+
+    private Map<String, Object> context;
+    private Class target;
+    private Member member;
+    private String propertyName;
+    private File tempFile;
+
+    @Before
+    public void setUp() throws Exception {
+        context = Collections.emptyMap();
+        target = File.class;
+        member = File.class.getMethod("length");
+        propertyName = "ignore";
+        tempFile = File.createTempFile("struts", "test");
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        tempFile.delete();
+    }
+
+    @Test
+    public void convertUploadedFileToFile() throws Exception {
+        // given
+        UploadedFileConverter ufc = new UploadedFileConverter();
+        UploadedFile uploadedFile = new StrutsUploadedFile(tempFile);
+
+        // when
+        Object result = ufc.convertValue(context, target, member, propertyName, uploadedFile, File.class);
+
+        // then
+        assertThat(result).isInstanceOf(File.class);
+        File file = (File) result;
+        assertThat(file.length()).isEqualTo(tempFile.length());
+        assertThat(file.getAbsolutePath()).isEqualTo(tempFile.getAbsolutePath());
+    }
+
+    @Test
+    public void convertUploadedFileArrayToFile() throws Exception {
+        // given
+        UploadedFileConverter ufc = new UploadedFileConverter();
+        UploadedFile[] uploadedFile = new UploadedFile[] { new StrutsUploadedFile(tempFile) };
+
+        // when
+        Object result = ufc.convertValue(context, target, member, propertyName, uploadedFile, File.class);
+
+        // then
+        assertThat(result).isInstanceOf(File.class);
+        File file = (File) result;
+        assertThat(file.length()).isEqualTo(tempFile.length());
+        assertThat(file.getAbsolutePath()).isEqualTo(tempFile.getAbsolutePath());
+    }
+
+}
\ No newline at end of file


[08/14] struts git commit: Adds WARN to avoid using java.io.File

Posted by lu...@apache.org.
Adds WARN to avoid using java.io.File


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e152c15f
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e152c15f
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e152c15f

Branch: refs/heads/master
Commit: e152c15f78d2052737f0ed3d95fd8f54979a4557
Parents: 3fd9096
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 17:44:02 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 17:44:02 2016 +0100

----------------------------------------------------------------------
 .../org/apache/struts2/conversion/UploadedFileConverter.java  | 7 +++++++
 1 file changed, 7 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/e152c15f/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java b/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
index 15b0d85..8ceac31 100644
--- a/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
+++ b/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
@@ -20,6 +20,8 @@
 package org.apache.struts2.conversion;
 
 import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.apache.struts2.dispatcher.multipart.UploadedFile;
 
 import java.io.File;
@@ -29,9 +31,14 @@ import java.util.Map;
 
 public class UploadedFileConverter extends DefaultTypeConverter {
 
+    private static final Logger LOG = LogManager.getLogger(UploadedFileConverter.class);
+
     @Override
     public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType) {
         if (File.class.equals(toType)) {
+            LOG.warn("Converting {} into {}, consider switching to {} and do not access {} directly!",
+                    File.class.getName(), UploadedFile.class.getName(), UploadedFile.class.getName(), File.class.getName());
+
             if (value.getClass().isArray() && Array.getLength(value) == 1) {
                 Object obj = Array.get(value, 0);
                 if (obj instanceof UploadedFile) {


[09/14] struts git commit: Reduces code duplication

Posted by lu...@apache.org.
Reduces code duplication


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/6280feb4
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/6280feb4
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/6280feb4

Branch: refs/heads/master
Commit: 6280feb4266f5f8906b72d48a292a81939c8d151
Parents: e152c15
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 17:56:56 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 17:56:56 2016 +0100

----------------------------------------------------------------------
 .../multipart/JakartaMultiPartRequest.java      |  2 +-
 .../JakartaStreamMultiPartRequest.java          | 11 +---
 .../multipart/JakartaUploadedFile.java          | 61 --------------------
 .../multipart/StrutsUploadedFile.java           | 61 ++++++++++++++++++++
 .../interceptor/FileUploadInterceptorTest.java  |  4 +-
 .../multipart/PellMultiPartRequest.java         |  2 +-
 .../dispatcher/multipart/PellUploadedFile.java  | 61 --------------------
 7 files changed, 66 insertions(+), 136 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java
----------------------------------------------------------------------
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 900733c..30ec33d 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
@@ -240,7 +240,7 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
                     LOG.error("Cannot write uploaded empty file to disk: {}", storeLocation.getAbsolutePath(), e);
                 }
             }
-            fileList.add(new JakartaUploadedFile(storeLocation));
+            fileList.add(new StrutsUploadedFile(storeLocation));
         }
 
         return fileList.toArray(new UploadedFile[fileList.size()]);

http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
index a6e15b8..49ca2be 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
@@ -135,15 +135,6 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
         return errors;
     }
 
-    /**
-     * Allows interceptor to fetch non-critical messages that can be passed to the action.
-     *
-     * @return list of string messages
-     */
-    public List<String> getMesssages() {
-        return messages;
-    }
-
     /* (non-Javadoc)
      * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFile(java.lang.String)
      */
@@ -155,7 +146,7 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
 
         List<UploadedFile> files = new ArrayList<>(infos.size());
         for (FileInfo fileInfo : infos) {
-            files.add(new JakartaUploadedFile(fileInfo.getFile()));
+            files.add(new StrutsUploadedFile(fileInfo.getFile()));
         }
 
         return files.toArray(new UploadedFile[files.size()]);

http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
deleted file mode 100644
index 3dfdea6..0000000
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.dispatcher.multipart;
-
-import java.io.File;
-
-public class JakartaUploadedFile implements UploadedFile {
-
-    private File file;
-
-    public JakartaUploadedFile(File file) {
-        this.file = file;
-    }
-
-    @Override
-    public Long length() {
-        return file.length();
-    }
-
-    @Override
-    public String getName() {
-        return file.getName();
-    }
-
-    @Override
-    public boolean isFile() {
-        return file.isFile();
-    }
-
-    @Override
-    public boolean delete() {
-        return file.delete();
-    }
-
-    @Override
-    public String getAbsolutePath() {
-        return file.getAbsolutePath();
-    }
-
-    @Override
-    public File getContent() {
-        return file;
-    }
-}

http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java
new file mode 100644
index 0000000..a185780
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/StrutsUploadedFile.java
@@ -0,0 +1,61 @@
+/*
+ * 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.dispatcher.multipart;
+
+import java.io.File;
+
+public class StrutsUploadedFile implements UploadedFile {
+
+    private File file;
+
+    public StrutsUploadedFile(File file) {
+        this.file = file;
+    }
+
+    @Override
+    public Long length() {
+        return file.length();
+    }
+
+    @Override
+    public String getName() {
+        return file.getName();
+    }
+
+    @Override
+    public boolean isFile() {
+        return file.isFile();
+    }
+
+    @Override
+    public boolean delete() {
+        return file.delete();
+    }
+
+    @Override
+    public String getAbsolutePath() {
+        return file.getAbsolutePath();
+    }
+
+    @Override
+    public File getContent() {
+        return file;
+    }
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
----------------------------------------------------------------------
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 87251cd..1cea2d7 100644
--- a/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
+++ b/core/src/test/java/org/apache/struts2/interceptor/FileUploadInterceptorTest.java
@@ -33,7 +33,7 @@ import org.apache.struts2.StrutsInternalTestCase;
 import org.apache.struts2.TestAction;
 import org.apache.struts2.dispatcher.HttpParameters;
 import org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest;
-import org.apache.struts2.dispatcher.multipart.JakartaUploadedFile;
+import org.apache.struts2.dispatcher.multipart.StrutsUploadedFile;
 import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper;
 import org.apache.struts2.dispatcher.multipart.UploadedFile;
 import org.springframework.mock.web.MockHttpServletRequest;
@@ -198,7 +198,7 @@ public class FileUploadInterceptorTest extends StrutsInternalTestCase {
         URL url = ClassLoaderUtil.getResource("log4j2.xml", FileUploadInterceptorTest.class);
         File file = new File(new URI(url.toString()));
         assertTrue("log4j2.xml should be in src/test folder", file.exists());
-        boolean notOk = interceptor.acceptFile(action, new JakartaUploadedFile(file), "filename", "text/html", "inputName", validation);
+        boolean notOk = interceptor.acceptFile(action, new StrutsUploadedFile(file), "filename", "text/html", "inputName", validation);
 
         assertFalse(notOk);
         assertFalse(validation.getFieldErrors().isEmpty());

http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
index 1acfe46..40526e0 100644
--- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
+++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
@@ -93,7 +93,7 @@ public class PellMultiPartRequest implements MultiPartRequest {
     }
 
     public UploadedFile[] getFile(String fieldName) {
-        return new UploadedFile[]{ new PellUploadedFile(multi.getFile(fieldName)) };
+        return new UploadedFile[]{ new StrutsUploadedFile(multi.getFile(fieldName)) };
     }
 
     public String[] getFileNames(String fieldName) {

http://git-wip-us.apache.org/repos/asf/struts/blob/6280feb4/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
----------------------------------------------------------------------
diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
deleted file mode 100644
index b51c987..0000000
--- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.dispatcher.multipart;
-
-import java.io.File;
-
-public class PellUploadedFile implements UploadedFile {
-
-    private File file;
-
-    public PellUploadedFile(File file) {
-        this.file = file;
-    }
-
-    @Override
-    public Long length() {
-        return file.length();
-    }
-
-    @Override
-    public String getName() {
-        return file.getName();
-    }
-
-    @Override
-    public boolean isFile() {
-        return file.isFile();
-    }
-
-    @Override
-    public boolean delete() {
-        return file.delete();
-    }
-
-    @Override
-    public String getAbsolutePath() {
-        return file.getAbsolutePath();
-    }
-
-    @Override
-    public File getContent() {
-        return file;
-    }
-}


[07/14] struts git commit: Adds default converter to handle converstion of internal file representation to File

Posted by lu...@apache.org.
Adds default converter to handle converstion of internal file representation to File


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/3fd90966
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/3fd90966
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/3fd90966

Branch: refs/heads/master
Commit: 3fd909668af694214500c7b3b02054a5ea7f4bb1
Parents: e867934
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 09:41:13 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 09:41:13 2016 +0100

----------------------------------------------------------------------
 .../conversion/UploadedFileConverter.java       | 50 ++++++++++++++++++++
 .../xwork-default-conversion.properties         |  1 +
 2 files changed, 51 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/3fd90966/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java b/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
new file mode 100644
index 0000000..15b0d85
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/conversion/UploadedFileConverter.java
@@ -0,0 +1,50 @@
+/*
+ * 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.conversion;
+
+import com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;
+import org.apache.struts2.dispatcher.multipart.UploadedFile;
+
+import java.io.File;
+import java.lang.reflect.Array;
+import java.lang.reflect.Member;
+import java.util.Map;
+
+public class UploadedFileConverter extends DefaultTypeConverter {
+
+    @Override
+    public Object convertValue(Map<String, Object> context, Object target, Member member, String propertyName, Object value, Class toType) {
+        if (File.class.equals(toType)) {
+            if (value.getClass().isArray() && Array.getLength(value) == 1) {
+                Object obj = Array.get(value, 0);
+                if (obj instanceof UploadedFile) {
+                    UploadedFile file = (UploadedFile) obj;
+                    if (file.getContent() instanceof File) {
+                        return file.getContent();
+                    }
+                    return new File(file.getAbsolutePath());
+                }
+            }
+        }
+
+        return super.convertValue(context, target, member, propertyName, value, toType);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/3fd90966/core/src/main/resources/xwork-default-conversion.properties
----------------------------------------------------------------------
diff --git a/core/src/main/resources/xwork-default-conversion.properties b/core/src/main/resources/xwork-default-conversion.properties
new file mode 100644
index 0000000..43d0fe9
--- /dev/null
+++ b/core/src/main/resources/xwork-default-conversion.properties
@@ -0,0 +1 @@
+java.io.File=org.apache.struts2.conversion.UploadedFileConverter


[06/14] struts git commit: Drops generic

Posted by lu...@apache.org.
Drops generic


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/e8679348
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/e8679348
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/e8679348

Branch: refs/heads/master
Commit: e86793482a9e40eb8315655df672fb32ac6cf77c
Parents: ec5fba7
Author: Lukasz Lenart <lu...@apache.org>
Authored: Tue Nov 22 09:38:31 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Tue Nov 22 09:38:31 2016 +0100

----------------------------------------------------------------------
 .../apache/struts2/dispatcher/multipart/JakartaUploadedFile.java | 2 +-
 .../org/apache/struts2/dispatcher/multipart/UploadedFile.java    | 4 ++--
 .../apache/struts2/dispatcher/multipart/PellUploadedFile.java    | 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/e8679348/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
index 5461b9d..3dfdea6 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
@@ -21,7 +21,7 @@ package org.apache.struts2.dispatcher.multipart;
 
 import java.io.File;
 
-public class JakartaUploadedFile implements UploadedFile<File> {
+public class JakartaUploadedFile implements UploadedFile {
 
     private File file;
 

http://git-wip-us.apache.org/repos/asf/struts/blob/e8679348/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
index e6a77a8..7efe285 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/UploadedFile.java
@@ -22,7 +22,7 @@ package org.apache.struts2.dispatcher.multipart;
 /**
  * Virtual representation of a uploaded file used by {@link MultiPartRequest}
  */
-public interface UploadedFile<T> {
+public interface UploadedFile {
 
     Long length();
 
@@ -34,6 +34,6 @@ public interface UploadedFile<T> {
 
     String getAbsolutePath();
 
-    T getContent();
+    Object getContent();
 
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/e8679348/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
----------------------------------------------------------------------
diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
index a1d9e4a..b51c987 100644
--- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
+++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
@@ -21,7 +21,7 @@ package org.apache.struts2.dispatcher.multipart;
 
 import java.io.File;
 
-public class PellUploadedFile implements UploadedFile<File> {
+public class PellUploadedFile implements UploadedFile {
 
     private File file;
 


[02/14] struts git commit: Uses the new class in implementation of MultiPartRequest

Posted by lu...@apache.org.
Uses the new class in implementation of MultiPartRequest


Project: http://git-wip-us.apache.org/repos/asf/struts/repo
Commit: http://git-wip-us.apache.org/repos/asf/struts/commit/45edbcbe
Tree: http://git-wip-us.apache.org/repos/asf/struts/tree/45edbcbe
Diff: http://git-wip-us.apache.org/repos/asf/struts/diff/45edbcbe

Branch: refs/heads/master
Commit: 45edbcbe45d303240af998687387d12a9e15733e
Parents: fe05ca2
Author: Lukasz Lenart <lu...@apache.org>
Authored: Mon Nov 21 11:05:33 2016 +0100
Committer: Lukasz Lenart <lu...@apache.org>
Committed: Mon Nov 21 11:05:33 2016 +0100

----------------------------------------------------------------------
 .../multipart/JakartaMultiPartRequest.java      |  8 +--
 .../JakartaStreamMultiPartRequest.java          |  8 +--
 .../multipart/JakartaUploadedFile.java          | 61 ++++++++++++++++++++
 .../dispatcher/multipart/MultiPartRequest.java  | 26 ++++-----
 .../multipart/MultiPartRequestWrapper.java      |  2 +-
 .../multipart/PellMultiPartRequest.java         |  8 +--
 .../dispatcher/multipart/PellUploadedFile.java  | 61 ++++++++++++++++++++
 7 files changed, 148 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaMultiPartRequest.java
----------------------------------------------------------------------
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 32890c6..900733c 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
@@ -223,14 +223,14 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
     /* (non-Javadoc)
      * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFile(java.lang.String)
      */
-    public File[] getFile(String fieldName) {
+    public UploadedFile[] getFile(String fieldName) {
         List<FileItem> items = files.get(fieldName);
 
         if (items == null) {
             return null;
         }
 
-        List<File> fileList = new ArrayList<>(items.size());
+        List<UploadedFile> fileList = new ArrayList<>(items.size());
         for (FileItem fileItem : items) {
             File storeLocation = ((DiskFileItem) fileItem).getStoreLocation();
             if (fileItem.isInMemory() && storeLocation != null && !storeLocation.exists()) {
@@ -240,10 +240,10 @@ public class JakartaMultiPartRequest implements MultiPartRequest {
                     LOG.error("Cannot write uploaded empty file to disk: {}", storeLocation.getAbsolutePath(), e);
                 }
             }
-            fileList.add(storeLocation);
+            fileList.add(new JakartaUploadedFile(storeLocation));
         }
 
-        return fileList.toArray(new File[fileList.size()]);
+        return fileList.toArray(new UploadedFile[fileList.size()]);
     }
 
     /* (non-Javadoc)

http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
index b1aa563..a6e15b8 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaStreamMultiPartRequest.java
@@ -147,18 +147,18 @@ public class JakartaStreamMultiPartRequest implements MultiPartRequest {
     /* (non-Javadoc)
      * @see org.apache.struts2.dispatcher.multipart.MultiPartRequest#getFile(java.lang.String)
      */
-    public File[] getFile(String fieldName) {
+    public UploadedFile[] getFile(String fieldName) {
         List<FileInfo> infos = fileInfos.get(fieldName);
         if (infos == null) {
             return null;
         }
 
-        List<File> files = new ArrayList<>(infos.size());
+        List<UploadedFile> files = new ArrayList<>(infos.size());
         for (FileInfo fileInfo : infos) {
-            files.add(fileInfo.getFile());
+            files.add(new JakartaUploadedFile(fileInfo.getFile()));
         }
 
-        return files.toArray(new File[files.size()]);
+        return files.toArray(new UploadedFile[files.size()]);
     }
 
     /* (non-Javadoc)

http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
new file mode 100644
index 0000000..5461b9d
--- /dev/null
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/JakartaUploadedFile.java
@@ -0,0 +1,61 @@
+/*
+ * 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.dispatcher.multipart;
+
+import java.io.File;
+
+public class JakartaUploadedFile implements UploadedFile<File> {
+
+    private File file;
+
+    public JakartaUploadedFile(File file) {
+        this.file = file;
+    }
+
+    @Override
+    public Long length() {
+        return file.length();
+    }
+
+    @Override
+    public String getName() {
+        return file.getName();
+    }
+
+    @Override
+    public boolean isFile() {
+        return file.isFile();
+    }
+
+    @Override
+    public boolean delete() {
+        return file.delete();
+    }
+
+    @Override
+    public String getAbsolutePath() {
+        return file.getAbsolutePath();
+    }
+
+    @Override
+    public File getContent() {
+        return file;
+    }
+}

http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequest.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequest.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequest.java
index a230a60..22ffe8e 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequest.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequest.java
@@ -36,14 +36,14 @@ import java.util.List;
  */
 public interface MultiPartRequest {
 
-    public void parse(HttpServletRequest request, String saveDir) throws IOException;
+    void parse(HttpServletRequest request, String saveDir) throws IOException;
     
     /**
      * Returns an enumeration of the parameter names for uploaded files
      *
      * @return an enumeration of the parameter names for uploaded files
      */
-    public Enumeration<String> getFileParameterNames();
+    Enumeration<String> getFileParameterNames();
 
     /**
      * Returns the content type(s) of the file(s) associated with the specified field name
@@ -54,16 +54,16 @@ public interface MultiPartRequest {
      * @return an array of content encoding for the specified input field name or <tt>null</tt> if
      *         no content type was specified.
      */
-    public String[] getContentType(String fieldName);
+    String[] getContentType(String fieldName);
 
     /**
-     * Returns a {@link java.io.File} object for the filename specified or <tt>null</tt> if no files
+     * Returns a {@link UploadedFile} object for the filename specified or <tt>null</tt> if no files
      * are associated with the given field name.
      *
      * @param fieldName input field name
-     * @return a File[] object for files associated with the specified input field name
+     * @return a UploadedFile[] object for files associated with the specified input field name
      */
-    public File[] getFile(String fieldName);
+    UploadedFile[] getFile(String fieldName);
 
     /**
      * Returns a String[] of file names for files associated with the specified input field name
@@ -71,7 +71,7 @@ public interface MultiPartRequest {
      * @param fieldName input field name
      * @return a String[] of file names for files associated with the specified input field name
      */
-    public String[] getFileNames(String fieldName);
+    String[] getFileNames(String fieldName);
 
     /**
      * Returns the file system name(s) of files associated with the given field name or
@@ -80,7 +80,7 @@ public interface MultiPartRequest {
      * @param fieldName input field name
      * @return the file system name(s) of files associated with the given field name
      */
-    public String[] getFilesystemName(String fieldName);
+    String[] getFilesystemName(String fieldName);
 
     /**
      * Returns the specified request parameter.
@@ -88,14 +88,14 @@ public interface MultiPartRequest {
      * @param name the name of the parameter to get
      * @return the parameter or <tt>null</tt> if it was not found.
      */
-    public String getParameter(String name);
+    String getParameter(String name);
 
     /**
      * Returns an enumeration of String parameter names.
      *
      * @return an enumeration of String parameter names.
      */
-    public Enumeration<String> getParameterNames();
+    Enumeration<String> getParameterNames();
 
     /**
      * Returns a list of all parameter values associated with a parameter name. If there is only
@@ -104,7 +104,7 @@ public interface MultiPartRequest {
      * @param name the name of the parameter.
      * @return an array of all values associated with the parameter name.
      */
-    public String[] getParameterValues(String name);
+    String[] getParameterValues(String name);
 
     /**
      * Returns a list of error messages that may have occurred while processing the request.
@@ -115,11 +115,11 @@ public interface MultiPartRequest {
      *
      * @return a list of Strings that represent various errors during parsing
      */
-    public List<LocalizedMessage> getErrors();
+    List<LocalizedMessage> getErrors();
 
     /**
      * Cleans up all uploaded file, should be called at the end of request
      */
-    public void cleanUp();
+    void cleanUp();
 
 }

http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java
----------------------------------------------------------------------
diff --git a/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java b/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java
index 05798e3..4f55621 100644
--- a/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java
+++ b/core/src/main/java/org/apache/struts2/dispatcher/multipart/MultiPartRequestWrapper.java
@@ -143,7 +143,7 @@ public class MultiPartRequestWrapper extends StrutsRequestWrapper {
      * @param fieldName input field name
      * @return a File[] object for files associated with the specified input field name
      */
-    public File[] getFiles(String fieldName) {
+    public UploadedFile[] getFiles(String fieldName) {
         if (multi == null) {
             return null;
         }

http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
----------------------------------------------------------------------
diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
index 4a5f7c0..1acfe46 100644
--- a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
+++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellMultiPartRequest.java
@@ -92,8 +92,8 @@ public class PellMultiPartRequest implements MultiPartRequest {
         return new String[]{multi.getContentType(fieldName)};
     }
 
-    public File[] getFile(String fieldName) {
-        return new File[]{multi.getFile(fieldName)};
+    public UploadedFile[] getFile(String fieldName) {
+        return new UploadedFile[]{ new PellUploadedFile(multi.getFile(fieldName)) };
     }
 
     public String[] getFileNames(String fieldName) {
@@ -174,8 +174,8 @@ public class PellMultiPartRequest implements MultiPartRequest {
         Enumeration fileParameterNames = multi.getFileParameterNames();
         while (fileParameterNames != null && fileParameterNames.hasMoreElements()) {
             String inputValue = (String) fileParameterNames.nextElement();
-            File[] files = getFile(inputValue);
-            for (File currentFile : files) {
+            UploadedFile[] files = getFile(inputValue);
+            for (UploadedFile currentFile : files) {
                 if (LOG.isInfoEnabled()) {
                     String msg = LocalizedTextUtil.findText(this.getClass(), "struts.messages.removing.file", Locale.ENGLISH,
                             "no.message.found", new Object[]{inputValue, currentFile});

http://git-wip-us.apache.org/repos/asf/struts/blob/45edbcbe/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
----------------------------------------------------------------------
diff --git a/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
new file mode 100644
index 0000000..a1d9e4a
--- /dev/null
+++ b/plugins/pell-multipart/src/main/java/org/apache/struts2/dispatcher/multipart/PellUploadedFile.java
@@ -0,0 +1,61 @@
+/*
+ * 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.dispatcher.multipart;
+
+import java.io.File;
+
+public class PellUploadedFile implements UploadedFile<File> {
+
+    private File file;
+
+    public PellUploadedFile(File file) {
+        this.file = file;
+    }
+
+    @Override
+    public Long length() {
+        return file.length();
+    }
+
+    @Override
+    public String getName() {
+        return file.getName();
+    }
+
+    @Override
+    public boolean isFile() {
+        return file.isFile();
+    }
+
+    @Override
+    public boolean delete() {
+        return file.delete();
+    }
+
+    @Override
+    public String getAbsolutePath() {
+        return file.getAbsolutePath();
+    }
+
+    @Override
+    public File getContent() {
+        return file;
+    }
+}