Author: jafl
Date: Mon Jan 31 20:43:25 2011
New Revision: 1065764

URL: http://svn.apache.org/viewvc?rev=1065764&view=rev
Log:
WW-3490 clean up file uploads when action throws exception

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java?rev=1065764&r1=1065763&r2=1065764&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/Dispatcher.java
 Mon Jan 31 20:43:25 2011
@@ -80,6 +80,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.Enumeration;
 
 /**
  * A utility class the actual dispatcher delegates most of its tasks to. Each 
instance
@@ -715,6 +716,40 @@ public class Dispatcher {
     }
 
     /**
+     * Removes all the files created by MultiPartRequestWrapper.
+     *
+     * @param request the HttpServletRequest object.
+     * @see org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper
+     * @throws java.io.IOException on any error.
+     */
+    public void cleanUpRequest(HttpServletRequest request) throws IOException {
+        if (!(request instanceof MultiPartRequestWrapper)) {
+            return;
+        }
+
+        MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) 
request;
+
+        Enumeration fileParameterNames = multiWrapper.getFileParameterNames();
+        while (fileParameterNames != null && 
fileParameterNames.hasMoreElements()) {
+            String inputValue = (String) fileParameterNames.nextElement();
+            File[] files = multiWrapper.getFiles(inputValue);
+
+            for (File currentFile : files) {
+                if (LOG.isInfoEnabled()) {
+                    String msg = LocalizedTextUtil.findText(this.getClass(), 
"struts.messages.removing.file", Locale.ENGLISH, "no.message.found", new 
Object[]{inputValue, currentFile});
+                    LOG.info(msg);
+                }
+
+                if ((currentFile != null) && currentFile.isFile()) {
+                    if (!currentFile.delete()) {
+                        LOG.warn("Resource Leaking:  Could not remove uploaded 
file '" + currentFile.getCanonicalPath() + "'.");
+                    }
+                }
+            }
+        }
+    }
+
+    /**
      * Send an HTTP error response code.
      *
      * @param request  the HttpServletRequest object.

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java?rev=1065764&r1=1065763&r2=1065764&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/FilterDispatcher.java
 Mon Jan 31 20:43:25 2011
@@ -421,6 +421,7 @@ public class FilterDispatcher implements
             dispatcher.serviceAction(request, response, servletContext, 
mapping);
 
         } finally {
+            dispatcher.cleanUpRequest(request);
             try {
                 ActionContextCleanUp.cleanUp(req);
             } finally {

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java?rev=1065764&r1=1065763&r2=1065764&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/FileUploadInterceptor.java
 Mon Jan 31 20:43:25 2011
@@ -311,28 +311,7 @@ public class FileUploadInterceptor exten
         }
 
         // invoke action
-        String result = invocation.invoke();
-
-        // cleanup
-        fileParameterNames = multiWrapper.getFileParameterNames();
-        while (fileParameterNames != null && 
fileParameterNames.hasMoreElements()) {
-            String inputValue = (String) fileParameterNames.nextElement();
-            File[] files = multiWrapper.getFiles(inputValue);
-
-            for (File currentFile : files) {
-                if (LOG.isInfoEnabled()) {
-                    LOG.info(getTextMessage(action, 
"struts.messages.removing.file", new Object[]{inputValue, currentFile}, 
ac.getLocale()));
-                }
-
-                if ((currentFile != null) && currentFile.isFile()) {
-                    if (!currentFile.delete()) {
-                        LOG.warn("Resource Leaking:  Could not remove uploaded 
file '" + currentFile.getCanonicalPath() + "'.");
-                    }
-                }
-            }
-        }
-
-        return result;
+        return invocation.invoke();
     }
 
     /**


Reply via email to