You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by jo...@apache.org on 2010/06/21 10:29:23 UTC

svn commit: r956490 [1/2] - in /commons/sandbox/commons-fileupload2: ./ .settings/ src/changes/ src/java/org/apache/commons/fileupload2/ src/java/org/apache/commons/fileupload2/disk/ src/java/org/apache/commons/fileupload2/impl/ src/java/org/apache/com...

Author: jochen
Date: Mon Jun 21 08:29:22 2010
New Revision: 956490

URL: http://svn.apache.org/viewvc?rev=956490&view=rev
Log:
Finished work on the test suite, first documentation draft.

Added:
    commons/sandbox/commons-fileupload2/.settings/org.maven.ide.eclipse.prefs
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptor.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptorFactory.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/portlet/PortletFileTracker.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/servlet/ServletFileTracker.java
    commons/sandbox/commons-fileupload2/src/site/apt/
    commons/sandbox/commons-fileupload2/src/site/apt/customizing.apt
    commons/sandbox/commons-fileupload2/src/site/apt/index.apt
    commons/sandbox/commons-fileupload2/src/site/apt/streaming.apt
    commons/sandbox/commons-fileupload2/src/site/apt/using.apt
    commons/sandbox/commons-fileupload2/src/site/fml/
    commons/sandbox/commons-fileupload2/src/site/fml/faq.fml
Removed:
    commons/sandbox/commons-fileupload2/build-gump.xml
    commons/sandbox/commons-fileupload2/build.xml
    commons/sandbox/commons-fileupload2/gump.xml
    commons/sandbox/commons-fileupload2/maven.xml
    commons/sandbox/commons-fileupload2/project.properties
    commons/sandbox/commons-fileupload2/project.xml
Modified:
    commons/sandbox/commons-fileupload2/.classpath
    commons/sandbox/commons-fileupload2/.project
    commons/sandbox/commons-fileupload2/pom.xml
    commons/sandbox/commons-fileupload2/src/changes/changes.xml
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/EventListener.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/StoredFileItem.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItemStore.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/MemoryFileItem.java
    commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/util/Streams.java
    commons/sandbox/commons-fileupload2/src/site/site.xml
    commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/DefaultFileItemTest.java
    commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/ProgressListenerTest.java
    commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/SizesTest.java
    commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/StreamingTest.java

Modified: commons/sandbox/commons-fileupload2/.classpath
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/.classpath?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/.classpath (original)
+++ commons/sandbox/commons-fileupload2/.classpath Mon Jun 21 08:29:22 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="src" path="src/java"/>
-	<classpathentry kind="src" path="src/test"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="src" output="target/classes" path="src/java"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>

Modified: commons/sandbox/commons-fileupload2/.project
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/.project?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/.project (original)
+++ commons/sandbox/commons-fileupload2/.project Mon Jun 21 08:29:22 2010
@@ -11,12 +11,12 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.devzuz.q.maven.jdt.core.mavenIncrementalBuilder</name>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
 			<arguments>
 			</arguments>
 		</buildCommand>

Added: commons/sandbox/commons-fileupload2/.settings/org.maven.ide.eclipse.prefs
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/.settings/org.maven.ide.eclipse.prefs?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/.settings/org.maven.ide.eclipse.prefs (added)
+++ commons/sandbox/commons-fileupload2/.settings/org.maven.ide.eclipse.prefs Mon Jun 21 08:29:22 2010
@@ -0,0 +1,9 @@
+#Mon Jun 07 12:00:59 CEST 2010
+activeProfiles=
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+skipCompilerPlugin=true
+version=1

Modified: commons/sandbox/commons-fileupload2/pom.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/pom.xml?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/pom.xml (original)
+++ commons/sandbox/commons-fileupload2/pom.xml Mon Jun 21 08:29:22 2010
@@ -204,8 +204,8 @@
     </dependency>
     <dependency>
     	<groupId>org.apache.james</groupId>
-    	<artifactId>apache-mime4j</artifactId>
-    	<version>0.6</version>
+    	<artifactId>apache-mime4j-core</artifactId>
+    	<version>0.7-SNAPSHOT</version>
     	<type>jar</type>
     	<scope>compile</scope>
     </dependency>

Modified: commons/sandbox/commons-fileupload2/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/changes/changes.xml?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/changes/changes.xml (original)
+++ commons/sandbox/commons-fileupload2/src/changes/changes.xml Mon Jun 21 08:29:22 2010
@@ -37,424 +37,13 @@ The <action> type attribute can be add,u
 
   <properties>
     <title>Release Notes</title>
-    <author email="martinc@apache.org">Martin Cooper</author>
   </properties>
 
   <body>
-    <release version="1.3-SNAPSHOT" date="Not yet released">
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-160"
-          due-to="Stepan Koltsov" due-to-email="yozh@mx1.ru">
-        Temporary files have not been deleted, if an error
-        occurred in FileUploadBase.parseRequest();
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-158"
-          due-to="Stepan Koltsov" due-to-email="yozh@mx1.ru">
-        Fixed example in MultipartStream Javadocs.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-157"
-          due-to="Paul Spurr" due-to-email="pspurr@gmail.com">
-        Ensured, that the ProgressListener is called for all
-        items.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-156">
-        Made the ProgressNotifier public.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-155"
-          due-to="J&#246;rg Heinicke" due-to-email="joerg.heinicke@gmx.de">
-        Multiple documentation fixes.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-152"
-          due-to="Duzakropka" due-to-email="duzakropka.@gmail.com">
-        Fixed the error message for FileSizeLimitExceededException
-        from "too many characters" to "too many bytes".
-      </action>
-      <action dev="jochen" type="add" issue="FILEUPLOAD-154">
-        A FileSizeLimitExceededException does now contain the
-        file and field name of the item, which caused the problem.
-      </action>
-    </release>
-
-    <release version="1.2.1" date="2008-01-18">
+    <release version="2.0-SNAPSHOT" date="Not yet released">
       <action dev="jochen" type="fix">
-        Upgrade to commons-io-1.4-SNAPSHOT, in order to use the new
-        FileCleaningTracker and fix issues with FileCleaner.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-129">
-        Made the MockHttpServletRequest comply to the servlet 2.4 specification
-        by applying
-        http://www.sourcelabs.com/dashboards/sash-1.2/patches/commons-fileupload-1.1-1/SUP-520.diff
-      </action>
-      <action dev="jochen" type="add" issue="FILEUPLOAD-130"
-          due-to="Michael Macaluso" due-to-email="michael.public@wavecorp.com">
-        Added support for accessing the file item headers.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-116"
-          due-to="Amichai Rothman" due-to-email="amichai2@amichais.net">
-        A MalformedStreamException is now thrown, if the size of an items
-        headers exceeds HEADER_PART_SIZE_MAX;
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-134"
-          due-to="Thomas Vandahl" due-to-email="tv@apache.org">
-        DiskFileItem.toString() could throw an NPE.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-135"
-          due-to="Alexander Sova" due-to-email="bird@noir.crocodile.org">
-        Short files could cause an unexpected end of the item stream.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-145">
-        A FileSizeLimitExceededException was deferred until the complete
-        file has been uploaded. Additionally, the FileSizeLimitException
-        is now thrown immediately, if the attachments headers contain
-        a content-length value, which exceeds the configured limit.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-153"
-          due-to="Gary Gregory" due-to-email="ggregory@seagullsw.com">
-        Fixed a classpath problem when building with Sun JDK 1.3.1
-        and Ant.
+        Rewrite, based on Apache Mime4J.
       </action>
     </release>
-
-	<release version="1.2" date="2007-02-13">
-      <action dev="jochen" type="fix" due-to="Aaron Freeman"
-           due-to-email="aaron@sendthisfile.com">
-        Made Streams.asString static.
-      </action>
-	  <action dev="jochen" type="update" issue="FILEUPLOAD-109">
-	    Eliminated duplicate code.
-	  </action>
-	  <action dev="jochen" type="add" issue="FILEUPLOAD-112">
-	    Added a streaming API.
-	  </action>
-	  <action dev="jochen" type="fix" issue="FILEUPLOAD-93">
-	    Eliminated the necessity of a content-length header.
-	  </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-108"
-          due-to="Amichai Rothman" due-to-email="amichai2@amichais.net">
-        Eliminated the limitation of a maximum size for a single
-        header line. (The total size of all headers is already
-        limited, so there's no need for another limit.)      
-      </action>
-      <action dev="jochen" type="add" issue="FILEUPLOAD-87">
-        Added the ProgressListener, which allows to implement a
-        progress bar.
-      </action>
-      <action dev="jochen" type="add" issue="FILEUPLOAD-111"
-          due-to="Amichai Rothman" due-to-email="amichai2@amichais.net">
-        Added support for header continuation lines.
-      </action>
-      <action dev="jochen" type="add" issue="FILEUPLOAD-88"
-          due-to="Andrey Aristarkhov" due-to-email="aristarkhov@bitechnology.ru">
-        It is now possible to limit the actual file size and not
-        the request size.
-      </action>
-      <action dev="jochen" type="add" issue="FILEUPLOAD-120"
-          due-to="Henry Yandell" due-to-email="bayard@apache.org">
-        Added the FileCleanerCleanup as an example for how to close
-        down the FileCleaner's reaper thread nicely.
-      </action>
-      <action dev="jochen" type="fix" issue="FILEUPLOAD-123">
-        A descriptive NPE is now thrown, if the FileItemFactory
-        has not been set.
-      </action>
-	</release>
-
-    <release version="1.1.1" date="2006-06-08" description="Bugfix release">
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-20">
-        Cache disk file item size when it is moved to a new location.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-30">
-        File names were being inadvertently converted to lower case.
-      </action>
-
-    </release>
-
-    <release version="1.1" date="2005-12-24" description="Portlet support, substantial refactoring and numerous bug fixes">
-
-      <action dev="martinc" type="update">
-        Updates for FileUpload 1.1-RC1.
-      </action>
-
-      <action dev="martinc" type="add">
-        Added release notes for FileUpload 1.1.
-      </action>
-
-      <action dev="martinc" type="update">
-        Update the User Guide to document the "right" way of using FileUpload
-        1.1, rather than the older, and thus deprecated, ways that are
-        compatible with FileUpload 1.0.
-      </action>
-
-      <action dev="martinc" type="add">
-        Add this change log, including all changes since the Commons FileUpload
-        1.0 release.
-      </action>
-
-      <action dev="martinc" type="update">
-        Update Commons IO dependency to version 1.1.
-      </action>
-
-      <action dev="martinc" type="add">
-        Add custom PMD configuration.
-      </action>
-
-      <action dev="martinc" type="update">
-        Make inner exception classes static, which they should have been all
-        along.
-      </action>
-
-      <action dev="martinc" type="fix">
-        Fix Checkstyle warnings.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-29" due-to="Rahul Akolkar">
-        Remove Javadoc warnings.
-      </action>
-
-      <action dev="martinc" type="update">
-        Build updates:
-        <ul>
-          <li>
-            Include NOTICE.txt in the jar file and distributions.
-          </li>
-          <li>
-            Include xdocs in source distribution.
-          </li>
-          <li>
-            Create MD5 checksums for distributions.
-          </li>
-        </ul>
-      </action>
-
-      <action dev="martinc" type="add">
-        Add custom Checkstyle configuration.
-      </action>
-
-      <action dev="martinc" type="update">
-        Update dependencies in POM, and add comments and scope.
-      </action>
-
-      <action dev="martinc" type="update">
-        Standardise on @throws instead of having a mixture of that and
-        @exception.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-50" due-to="Niall Pemberton">
-        Make DiskFileItem serializable. Thanks to Niall Pemberton for the
-        suggestion and patch.
-      </action>
-
-      <action dev="martinc" type="update">
-        Make the temporary file names unique across class loaders, not just
-        within them, by including a UID in the file name.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-77">
-        Include the actual and permitted sizes in both the exception message
-        and the exception itself.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-13">
-        If an explicit header encoding is not specified, use the one from the
-        appropriate context (i.e. ServletRequest or ActionRequest).
-      </action>
-
-      <action dev="martinc" type="add">
-        Add getCharacterEncoding to the request context.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-83">
-        Null check and case insensitivity fixes.
-      </action>
-
-      <action dev="martinc" type="update">
-        Web site updates:
-        <ul>
-          <li>
-            Add detail pages for Source Repository and Issue Tracking, based on
-            those for IO and Validator.
-          </li>
-          <li>
-            Improvements to FileUpload home page, based on similar recent
-            changes to IO and Validator home pages.
-          </li>
-          <li>
-            The Bugzilla component name has a space in it. Fix the URLs.
-          </li>
-          <li>
-            Add an FAQ page, using the Maven plugin to generate it.
-          </li>
-        </ul>
-      </action>
-
-      <action dev="dion" type="fix" issue="COMMONSSITE-2">
-        Fixes to POMs
-      </action>
-
-      <action dev="mrdon" type="update">
-        Setting source and target for Java 1.3
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-37">
-        Fix typos in Javadoc code examples.
-      </action>
-
-      <action dev="martinc" type="fix">
-        Fix typos in exception messages.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-5">
-        Obtain request content type from container instead of headers.
-      </action>
-
-      <action dev="sullis" type="update">
-        New mock objects from Jetspeed-2, and new FileUpload test cases.
-      </action>
-
-      <action dev="sullis" type="add">
-        added toString() methods
-      </action>
-
-      <action dev="martinc" type="add">
-        Fix up the existing package.html file and add new ones for the newly
-        introduced packages. Fairly minimal, but with a link to the user guide.
-      </action>
-
-      <action dev="martinc" type="update">
-        Substantial refactoring and additions:
-        <ul>
-          <li>
-            The core package is now independent of servlet / portlet / other
-            distinctions, as well as persistence schemes, other than deprecated
-            classes and methods retained for backwards compatibility.
-          </li>
-          <li>
-            Servlet specific functionality has been moved to a new 'servlet'
-            package. Existing users should migrate to this as soon as possible,
-            since the servlet specific functionality in the generic package
-            will be removed in the release after FileUpload 1.1.
-          </li>
-          <li>
-            Support for portlets (JSR 168) has been added, in a new 'portlet'
-            package. This is not well tested at this point, and feedback would
-            be very much appreciated. (This also resolves bug #23620.)
-          </li>
-          <li>
-            The disk-based file item implementation has been moved into a 'disk'
-            package, and renamed from Default* to Disk* to reflect what it
-            really is. The Default* classes have been retained in the top level
-            package for backwards compatibility, but are now deprecated, and
-            will be removed in the release after FileUpload 1.1.
-          </li>
-          <li>
-            The isMultipartRequest method is an unfortunate casualty of this
-            refactoring. That method should really be moved to ServletFileUpload,
-            but since the method is static, it can only exist in either
-            FileUploadBase or ServletFileUpload. Backwards compatibility dictates
-            the former for now, but the latter is the desired state, which
-            implies some future breakage. Fair warning...
-          </li>
-        </ul>
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-4">
-        Specify the encoding (ISO-8859-1) when converting the boundary to a
-        byte array.
-      </action>
-
-      <action dev="martinc" type="update">
-        Convert to Sun coding guidelines.
-      </action>
-
-      <action dev="martinc" type="update">
-        DeferredFileOutputStream moved to Commons IO.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-16" due-to="Justin Sampson">
-        Workaround for Mac IE5 bug. Thanks to Justin Sampson for the patch and
-        tests for this vexing issue.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-104">
-        Handle unquoted header parameters.
-      </action>
-
-      <action dev="martinc" type="add" issue="FILEUPLOAD-78">
-        Some documentation on interaction with virus scanners.
-      </action>
-
-      <action dev="martinc" type="add" issue="FILEUPLOAD-31" due-to="Justin Sampson">
-        More unit tests from Justin Sampson.
-      </action>
-
-      <action dev="martinc" type="update" issue="FILEUPLOAD-95">
-        Use FileCleaner from Commons IO to clean up temp files, rather than
-        File.deleteOnExit(), which can cause serious problems in long-running
-        processes.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-53">
-        Check that HTTP method is POST as part of multipart check.
-      </action>
-
-      <action dev="martinc" type="add">
-        Switch to Commons IO version of DeferredFileOutputStream. Adding IO as
-        a dependency will allow us to take advantage of other classes in that
-        component to fix additional FileUpload bugs.
-      </action>
-
-      <action dev="martinc" type="add" issue="FILEUPLOAD-40">
-        handle quoted boundary specification.
-      </action>
-
-      <action dev="martinc" type="add" issue="FILEUPLOAD-18">
-        use case-independent comparisons for encoding types.
-      </action>
-
-      <action dev="martinc" type="fix">
-        Fix comments to avoid break iterator complaints.
-      </action>
-
-      <action dev="martinc" type="fix" due-to="Yuji Yamano">
-        Fix typos in comments.
-      </action>
-
-      <action dev="martinc" type="add" issue="FILEUPLOAD-101" due-to="Oleg Kalnichevski">
-        Add support for character sets specified for individual parts.
-      </action>
-
-      <action dev="scolebourne" type="update">
-        Change to Apache License 2.0
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-22">
-        Correct the comment for the no-args constructor to reflect the fact
-        that a factory needs to be set before parsing uploads.
-      </action>
-
-      <action dev="martinc" type="update">
-        Collapse some all but duplicated code.
-      </action>
-
-      <action dev="jmcnally" type="fix" issue="FILEUPLOAD-72">
-        Fix example showing FileItem.write to use a File object.
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-21" due-to="Peter Chase">
-        Check for null before attempting to close streams in write().
-      </action>
-
-      <action dev="martinc" type="fix" issue="FILEUPLOAD-67" due-to="Paul Dalton">
-        Correction to sample code in the docs.
-      </action>
-
-    </release>
-
-    <release version="1.0" date="2003-06-26" description="Initial release">
-    </release>
-  
-    
   </body>
-
 </document>

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/EventListener.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/EventListener.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/EventListener.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/EventListener.java Mon Jun 21 08:29:22 2010
@@ -99,7 +99,8 @@ public interface EventListener {
     /**
      * Called to indicate that a new {@link FileItem} was found
      * and is being parsed.
-     * @return The number of bytes, after which {@link #parsingItem(FileUpload, UploadRequest, FileItem, long)}
+     * @return The number of bytes (between 0 and {@link Integer#MAX_VALUE},
+     *   after which {@link #parsingItem(FileUpload, UploadRequest, FileItem, long)}
      *   should be called. May be {@link #NO_PARSING_ITEM_CALLS}, in
      *   which case the method won't be invoked at all.
      * @see #parsingItem(FileUpload, UploadRequest, FileItem, long)
@@ -145,7 +146,8 @@ public interface EventListener {
      * at all, because {@link #endItem(FileUpload, UploadRequest, FileItem, long)} will
      * be invoked immediately. However, you can rely on the fact that the
      * method won't be invoked more than 2 times.
-     * @return The number of bytes, after which {@link #parsingItem(FileUpload, UploadRequest, FileItem, long)}
+     * @return The number of bytes (between 0 and {@link Integer#MAX_VALUE},
+     *   after which {@link #parsingItem(FileUpload, UploadRequest, FileItem, long)}
      *   should be called again. May be {@link #NO_PARSING_ITEM_CALLS}, in
      *   which case no more invocations will happen for this file item.
      * @see #startItem(FileUpload, UploadRequest, FileItem)

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/StoredFileItem.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/StoredFileItem.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/StoredFileItem.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/StoredFileItem.java Mon Jun 21 08:29:22 2010
@@ -76,4 +76,11 @@ public interface StoredFileItem extends 
      * @throws IOException An I/O error occurred while deleting the file item.
      */
     void delete() throws FileUploadException, IOException;
+
+    /**
+     * Returns, whether the file item is stored in external media
+     * (like file system, or in a database), or completely held in
+     * memory.
+     */
+    boolean isInMemory();
 }

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItem.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItem.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItem.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItem.java Mon Jun 21 08:29:22 2010
@@ -61,4 +61,8 @@ public class DiskFileItem extends Abstra
         file.delete();
         file = null;
     }
+
+	public boolean isInMemory() {
+		return false;
+	}
 }

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItemStore.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItemStore.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItemStore.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/disk/DiskFileItemStore.java Mon Jun 21 08:29:22 2010
@@ -5,9 +5,9 @@ import java.io.IOException;
 
 import org.apache.commons.fileupload2.FileItem;
 import org.apache.commons.fileupload2.FileItemStore;
-import org.apache.commons.fileupload2.FileUploadException;
 import org.apache.commons.fileupload2.impl.MemoryCapableFileItemStore;
 import org.apache.commons.fileupload2.impl.WritableFileItem;
+import org.apache.commons.io.FileCleaningTracker;
 
 
 /**
@@ -16,6 +16,7 @@ import org.apache.commons.fileupload2.im
  */
 public class DiskFileItemStore extends MemoryCapableFileItemStore {
     private File repository;
+    private FileCleaningTracker tracker;
     private boolean deletingOnExit = true;
 
     /**
@@ -63,14 +64,62 @@ public class DiskFileItemStore extends M
     }
 
     protected File newFile() throws IOException {
-        final File f = File.createTempFile("fileUpload", null, getRepository());
+    	final File f = File.createTempFile("fileUpload", null, getRepository());
         f.deleteOnExit();
         return f;
     }
     
     @Override
     protected WritableFileItem newWritableFileItem(FileItem pFileItem)
-            throws FileUploadException, IOException {
-        return new DiskFileItem(pFileItem, newFile());
+            throws IOException {
+    	final File f = newFile();
+    	final DiskFileItem dfi = new DiskFileItem(pFileItem, f);
+    	track(dfi, f);
+    	return dfi;
     }
+
+	private void track(final FileItem pFileItem, final File pFile) {
+		final FileCleaningTracker tr = getTracker();
+    	if (tr != null) {
+    		tr.track(pFile, pFileItem);
+    	}
+	}
+
+    /**
+     * This method allows to explicitly request storing a file item to disk.
+     * By default, file items aren't necessarily written to disk, depending
+     * on the value of {@link #getThreshold()}.
+     */
+    public File writeToFile(FileItem pFileItem) throws IOException {
+    	if (pFileItem == null) {
+    		throw new IllegalArgumentException("The FileItem must not be null.");
+    	}
+    	final DiskFileItem dfi;
+    	if (pFileItem instanceof DiskFileItem) {
+    		dfi = (DiskFileItem) pFileItem;
+    	} else {
+    		final File f = newFile();
+    		dfi = new DiskFileItem(pFileItem, f);
+    		track(pFileItem, f);
+    	}
+    	return dfi.getFile();
+    }
+
+    /**
+     * Returns the {@link FileCleaningTracker}, which is responsible
+     * for automatic disposal of temporary files, which are no longer
+     * needed.
+     */
+    public FileCleaningTracker getTracker() {
+		return tracker;
+	}
+
+    /**
+     * Sets the {@link FileCleaningTracker}, which is responsible
+     * for automatic disposal of temporary files, which are no longer
+     * needed.
+     */
+	public void setTracker(FileCleaningTracker pTracker) {
+		tracker = pTracker;
+	}
 }

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileItemIteratorImpl.java Mon Jun 21 08:29:22 2010
@@ -13,11 +13,11 @@ import org.apache.commons.fileupload2.In
 import org.apache.commons.fileupload2.UploadRequest;
 import org.apache.commons.fileupload2.util.LimitedInputStream;
 import org.apache.james.mime4j.MimeException;
-import org.apache.james.mime4j.descriptor.BodyDescriptor;
-import org.apache.james.mime4j.descriptor.MaximalBodyDescriptor;
-import org.apache.james.mime4j.parser.EntityStates;
-import org.apache.james.mime4j.parser.MimeEntityConfig;
-import org.apache.james.mime4j.parser.MimeTokenStream;
+import org.apache.james.mime4j.stream.BodyDescriptor;
+import org.apache.james.mime4j.stream.EntityStates;
+import org.apache.james.mime4j.stream.MimeEntityConfig;
+import org.apache.james.mime4j.stream.MimeTokenStream;
+import org.apache.james.mime4j.stream.RecursionMode;
 
 
 /**
@@ -34,6 +34,7 @@ public class FileItemIteratorImpl<FI ext
     private FileItem currentItem, previousFileItem;
     private LimitedInputStream itemStream;
     private int level;
+    private long numBytesToParseForEvent;
 
     /**
      * Creates a new instance.
@@ -58,11 +59,9 @@ public class FileItemIteratorImpl<FI ext
             listener.startRequest(pFileUpload, pRequest);
         }
 		MimeEntityConfig config = new MimeEntityConfig();
-		config.setMaximalBodyDescriptor(true);
 		config.setStrictParsing(true);
-        mts = new MimeTokenStream(config){
-        	// No additional methods, or fields, just to make the constructor accessible.
-        };
+        mts = new MimeTokenStream(config, new FileUploadBodyDescriptorFactory());
+        mts.setRecursionMode(RecursionMode.M_NO_RECURSE);
         final InputStream is;
         final long requestSizeMax = pFileUpload.getRequestSizeMax();
         if (requestSizeMax == FileUpload.NO_REQUEST_SIZE_MAX) {
@@ -97,7 +96,7 @@ public class FileItemIteratorImpl<FI ext
             }
             state = mts.next();
             for (;;) {
-                switch (state) {
+            	switch (state) {
                     case EntityStates.T_END_OF_STREAM:
                         if (listener != null) {
                             listener.endRequest(fileUpload, request);
@@ -105,8 +104,8 @@ public class FileItemIteratorImpl<FI ext
                         }
                         return false;
                     case EntityStates.T_START_MULTIPART:
-                        if (level++ == 1) {
-                            final MaximalBodyDescriptor bodyDescriptor = (MaximalBodyDescriptor) mts.getBodyDescriptor();
+                        if (++level == 1) {
+                            final FileUploadBodyDescriptor bodyDescriptor = (FileUploadBodyDescriptor) mts.getBodyDescriptor();
                             final String fldName = getFieldName(bodyDescriptor);
                             if (fldName != null) {
                                 final String subContentType = getContentType(bodyDescriptor);
@@ -118,12 +117,12 @@ public class FileItemIteratorImpl<FI ext
                         }
                         break;
                     case EntityStates.T_END_MULTIPART:
-                        if (--level == 1) {
+                        if (level-- == 1) {
                             currentFieldName = null;
                         }
                         break;
                     case EntityStates.T_BODY:
-                        final MaximalBodyDescriptor bodyDescriptor = (MaximalBodyDescriptor) mts.getBodyDescriptor();
+                    	final FileUploadBodyDescriptor bodyDescriptor = (FileUploadBodyDescriptor) mts.getBodyDescriptor();
                         if (currentFieldName == null) {
                             final String fldName = getFieldName(bodyDescriptor);
                             if (fldName != null) {
@@ -167,22 +166,66 @@ public class FileItemIteratorImpl<FI ext
     /**
      * Creates a new instance of {@link FileItem}.
      */
-    protected FileItem newFileItem(String pFieldName, String pFileName, MaximalBodyDescriptor pBodyDescriptor)
+    protected FileItem newFileItem(String pFieldName, String pFileName, FileUploadBodyDescriptor pBodyDescriptor)
             throws FileUploadException, IOException {
         final long fileSizeMax = fileUpload.getFileSizeMax();
         final AbstractFileItem fileItem = new AbstractFileItem(){
             public InputStream getInputStream() throws FileUploadException,
                     IOException {
-                if (fileSizeMax == FileUpload.NO_FILE_SIZE_MAX  &&  listener == null) {
-                    return mts.getDecodedInputStream();
+            	final InputStream istream = mts.getDecodedInputStream();
+            	if (fileSizeMax == FileUpload.NO_FILE_SIZE_MAX  &&  listener == null) {
+                    return istream;
                 }
                 final FileItem fi = this;
-                itemStream = new LimitedInputStream(mts.getDecodedInputStream(), fileSizeMax == FileUpload.NO_FILE_SIZE_MAX ? 0 : fileSizeMax) {
+                itemStream = new LimitedInputStream(istream, fileSizeMax == FileUpload.NO_FILE_SIZE_MAX ? 0 : fileSizeMax) {
                     @Override
                     protected void raiseError(long pSizeMax, long pCount)
                             throws IOException {
                     	noteFileSizeMaxExceeded(fi, pCount);
                     }
+
+                    private void fireParsingItem(long pCount) throws IOException {
+						if (listener == null  ||  numBytesToParseForEvent == EventListener.NO_PARSING_ITEM_CALLS) {
+							return;
+						}
+						if (pCount >= 0) {
+							numBytesToParseForEvent -= pCount;
+							if (numBytesToParseForEvent > 0) {
+								return;
+							}
+						}
+						numBytesToParseForEvent = listener.parsingItem(fileUpload, request, fi, super.getCount());
+						if (numBytesToParseForEvent < EventListener.NO_PARSING_ITEM_CALLS  ||  numBytesToParseForEvent > Integer.MAX_VALUE) {
+							throw new IllegalStateException("The value returned by parsingItem must be between 0 and " + Integer.MAX_VALUE);
+						}
+                    }
+                    
+					@Override
+					public int read() throws IOException {
+						final int result = super.read();
+						if (result != -1) {
+							fireParsingItem(1);
+						}
+						return result;
+					}
+
+					@Override
+					public int read(byte[] b, int off, int len) throws IOException {
+						final int result = super.read(b, off, len);
+						if (result != -1  &&  result != 0) {
+							fireParsingItem(result);
+						}
+						return result;
+					}
+
+					@Override
+					public long skip(long pCount) throws IOException {
+						final long result = super.skip(pCount);
+						if (result != -1  &&  result != 0) {
+							fireParsingItem(result);
+						}
+						return result;
+					}
                 };
                 return itemStream;
             }
@@ -202,7 +245,7 @@ public class FileItemIteratorImpl<FI ext
         return fileItem;
     }
 
-    private String getFieldName(MaximalBodyDescriptor pBodyDescriptor) {
+    private String getFieldName(FileUploadBodyDescriptor pBodyDescriptor) {
         return pBodyDescriptor.getContentDispositionParameters().get("name");
     }
 
@@ -210,7 +253,7 @@ public class FileItemIteratorImpl<FI ext
         return pBodyDescriptor.getMimeType();
     }
 
-    private String getFileName(MaximalBodyDescriptor pBodyDescriptor) {
+    private String getFileName(FileUploadBodyDescriptor pBodyDescriptor) {
         return pBodyDescriptor.getContentDispositionFilename();
     }
 
@@ -222,14 +265,18 @@ public class FileItemIteratorImpl<FI ext
         previousFileItem = currentItem;
         currentItem = null;
         if (listener != null) {
-            listener.startItem(fileUpload, request, previousFileItem);
+        	numBytesToParseForEvent = listener.startItem(fileUpload, request, previousFileItem);
+			if (numBytesToParseForEvent < EventListener.NO_PARSING_ITEM_CALLS  ||  numBytesToParseForEvent > Integer.MAX_VALUE) {
+				throw new IllegalStateException("The value returned by startItem must be between 0 and " + Integer.MAX_VALUE);
+			}
         }
         return (FI) previousFileItem;
     }
 
     private void skip(LimitedInputStream pStream) throws IOException {
         while (!pStream.isClosed()) {
-            if (pStream.skip(Integer.MAX_VALUE) == -1) {
+        	pStream.skip(Integer.MAX_VALUE);
+        	if (pStream.read() == -1) {
                 pStream.close();
             }
         }

Added: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptor.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptor.java?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptor.java (added)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptor.java Mon Jun 21 08:29:22 2010
@@ -0,0 +1,66 @@
+package org.apache.commons.fileupload2.impl;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.stream.BodyDescriptor;
+import org.apache.james.mime4j.stream.DefaultBodyDescriptor;
+import org.apache.james.mime4j.stream.MutableBodyDescriptor;
+import org.apache.james.mime4j.stream.RawField;
+import org.apache.james.mime4j.util.MimeUtil;
+
+
+/**
+ * FileUpload specific implementation of {@link MutableBodyDescriptor}.
+ */
+public class FileUploadBodyDescriptor extends DefaultBodyDescriptor {
+	private Map<String,String> contentDispositionParameters;
+
+	/**
+	 * Creates a new instance with the given monitor settings.
+	 */
+	public FileUploadBodyDescriptor(DecodeMonitor pMonitor) {
+		this(null, pMonitor);
+	}
+
+	/**
+	 * Creates a new instance with the given parent and monitor settings.
+	 */
+	public FileUploadBodyDescriptor(BodyDescriptor pParent, DecodeMonitor pMonitor) {
+		super(pParent, pMonitor);
+	}
+
+	@Override
+	public void addField(RawField field) throws MimeException {
+		super.addField(field);
+		final String name = field.getName().trim().toLowerCase();
+        final String value = field.getBody();
+        if ("content-disposition".equals(name)) {
+        	contentDispositionParameters = DefaultBodyDescriptor.getHeaderParams(value, getDecodeMonitor());
+        }
+	}
+
+	/**
+	 * Returns the parameters of the "content-disposition" header.
+	 */
+	public Map<String,String> getContentDispositionParameters() {
+		if (contentDispositionParameters == null) {
+			contentDispositionParameters = Collections.emptyMap();
+		}
+		return contentDispositionParameters;
+	}
+
+	/**
+	 * Returns the file name, which is specified in the "content-disposition" header.
+	 */
+	public String getContentDispositionFilename() {
+		return getContentDispositionParameters().get(MimeUtil.PARAM_FILENAME);
+	}
+
+	@Override
+	public MutableBodyDescriptor newChild() {
+		return new FileUploadBodyDescriptor(this, getDecodeMonitor());
+	}
+}

Added: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptorFactory.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptorFactory.java?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptorFactory.java (added)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/FileUploadBodyDescriptorFactory.java Mon Jun 21 08:29:22 2010
@@ -0,0 +1,16 @@
+package org.apache.commons.fileupload2.impl;
+
+import org.apache.james.mime4j.codec.DecodeMonitor;
+import org.apache.james.mime4j.stream.MutableBodyDescriptor;
+import org.apache.james.mime4j.stream.MutableBodyDescriptorFactory;
+
+
+/**
+ * Implementation of {@link MutableBodyDescriptorFactory} with support
+ * for collecting headers.
+ */
+public class FileUploadBodyDescriptorFactory implements MutableBodyDescriptorFactory {
+	public MutableBodyDescriptor newInstance(DecodeMonitor pMonitor) {
+		return new FileUploadBodyDescriptor(pMonitor);
+	}
+}

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/MemoryFileItem.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/MemoryFileItem.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/MemoryFileItem.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/impl/MemoryFileItem.java Mon Jun 21 08:29:22 2010
@@ -73,4 +73,8 @@ public class MemoryFileItem extends Abst
 	public long getContentLength() {
 		return buffer.length;
 	}
+
+	public boolean isInMemory() {
+		return true;
+	}
 }

Added: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/portlet/PortletFileTracker.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/portlet/PortletFileTracker.java?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/portlet/PortletFileTracker.java (added)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/portlet/PortletFileTracker.java Mon Jun 21 08:29:22 2010
@@ -0,0 +1,20 @@
+package org.apache.commons.fileupload2.portlet;
+
+import javax.portlet.PortletContext;
+
+import org.apache.commons.fileupload2.servlet.ServletFileTracker;
+import org.apache.commons.io.FileCleaningTracker;
+
+
+/**
+ * This class is responsible for tracking temporary files, that
+ * must be removed later on.
+ */
+public class PortletFileTracker {
+	/**
+	 * Returns this portlet contexts file tracker.
+	 */
+	public static FileCleaningTracker getFileTracker(PortletContext pContext) {
+		return (FileCleaningTracker) pContext.getAttribute(ServletFileTracker.KEY_FILE_CLEANER);
+	}
+}

Added: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/servlet/ServletFileTracker.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/servlet/ServletFileTracker.java?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/servlet/ServletFileTracker.java (added)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/servlet/ServletFileTracker.java Mon Jun 21 08:29:22 2010
@@ -0,0 +1,45 @@
+package org.apache.commons.fileupload2.servlet;
+
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+import org.apache.commons.io.FileCleaningTracker;
+
+
+/**
+ * This class is responsible for tracking temporary files, that
+ * must be removed later on.
+ */
+public class ServletFileTracker implements ServletContextListener {
+	/**
+	 * Key, which is used to store the {@link FileCleaningTracker file tracker}
+	 * in the servlet context.
+	 */
+	public static final String KEY_FILE_CLEANER = ServletFileTracker.class.getName() + ".fileCleaner";
+
+	/**
+	 * Returns this servlet contexts file tracker.
+	 */
+	public static FileCleaningTracker getFileTracker(ServletContext pContext) {
+		return (FileCleaningTracker) pContext.getAttribute(KEY_FILE_CLEANER);
+	}
+
+	private static void setFileTracker(ServletContext pContext, FileCleaningTracker pFileCleaner) {
+		pContext.setAttribute(KEY_FILE_CLEANER, pFileCleaner);
+	}
+
+	public void contextDestroyed(ServletContextEvent pEvent) {
+		final FileCleaningTracker cleaner = getFileTracker(pEvent.getServletContext());
+		setFileTracker(pEvent.getServletContext(), null);
+		if (cleaner != null) {
+			cleaner.exitWhenFinished();
+		}
+	}
+
+	public void contextInitialized(ServletContextEvent pEvent) {
+		contextDestroyed(pEvent);
+		final FileCleaningTracker cleaner = new FileCleaningTracker();
+		setFileTracker(pEvent.getServletContext(), cleaner);
+	}
+}

Modified: commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/util/Streams.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/util/Streams.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/util/Streams.java (original)
+++ commons/sandbox/commons-fileupload2/src/java/org/apache/commons/fileupload2/util/Streams.java Mon Jun 21 08:29:22 2010
@@ -134,6 +134,20 @@ public final class Streams {
     }
 
     /**
+     * This convenience method allows to read a {@link FileItem file items}
+     * content into a string. The file items encoding, if known, or the
+     * platforms default encoding is used to convert bytes into characters.
+     * @param pItem The file item to read.
+     */
+    public static String asString(FileItem pItem) throws IOException {
+    	final String encoding = pItem.getEncoding();
+    	if (encoding == null) {
+    		return asString(pItem.getInputStream());
+    	}
+    	return asString(pItem.getInputStream(), encoding);
+    }
+    
+    /**
      * This convenience method allows to read a
      * {@link FileItem file items}
      * content into a string. The platform's default character encoding
@@ -210,4 +224,15 @@ public final class Streams {
         copy(pStream, baos, true);
         return baos.toByteArray();
     }
+
+    /**
+     * This convenience method allows to read a {@link FileItem file items}
+     * content into a byte array.
+     * @param pFileItem The file item to read
+     * @return The streams contents, as a byte array.
+     * @throws IOException An I/O error occurred.
+     */
+    public static byte[] asByteArray(FileItem pFileItem) throws IOException {
+    	return asByteArray(pFileItem.getInputStream());
+    }
 }

Added: commons/sandbox/commons-fileupload2/src/site/apt/customizing.apt
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/site/apt/customizing.apt?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/site/apt/customizing.apt (added)
+++ commons/sandbox/commons-fileupload2/src/site/apt/customizing.apt Mon Jun 21 08:29:22 2010
@@ -0,0 +1,24 @@
+~~   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.
+
+  ----------------------
+  Customizing FileUpload
+  ----------------------
+
+Customizing FileUpload
+
+  TODO: Document usage of factories and subclassing for customization.

Added: commons/sandbox/commons-fileupload2/src/site/apt/index.apt
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/site/apt/index.apt?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/site/apt/index.apt (added)
+++ commons/sandbox/commons-fileupload2/src/site/apt/index.apt Mon Jun 21 08:29:22 2010
@@ -0,0 +1,57 @@
+~~   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.
+
+    --------------------------
+    About Commons Fileupload 2
+    --------------------------
+
+Commons FileUpload 2
+
+  The Commons <<FileUpload>> 2 package makes it easy to add robust,
+  high-performance, file upload capability to your servlets and web
+  applications.
+
+  FileUpload parses HTTP requests which conform to
+  {{{http://www.ietf.org/rfc/rfc1867.txt}RFC 1867}},
+  "Form-based File Upload in HTML". That is, if an HTTP request is
+  submitted using the POST method, and with a content type of
+  "multipart/form-data", then FileUpload can parse that request, and
+  make the results available in a manner easily used by the caller.
+
+Documentation
+
+  The following documentation is available:
+
+  * {{{using.html}User Guide}}
+  * {{{streaming.html}Streaming API}}
+  * {{faq.html}Frequently Asked Questions}}
+  * {{{apidocs/index.html}JavaDoc API}}
+  * {{{project-reports.html}Project Reports}}
+
+  You can also {{source-usage.html}browse}} the Subversion repository.
+
+Support
+
+  The {{{mail-lists.html}Apache Commons mailing lists}} act as
+  the main support forum. The <<user>> list is suitable for most library
+  usage queries. The <<dev>> list is intended for development discussion.
+  Please remember that the lists are shared between all commons components,
+  so prefix your e-mail subject line with <<<[fileupload]>>>.
+
+  Issues may be reported via {{{issue-tracking.html}ASF JIRA}}.
+
+

Added: commons/sandbox/commons-fileupload2/src/site/apt/streaming.apt
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/site/apt/streaming.apt?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/site/apt/streaming.apt (added)
+++ commons/sandbox/commons-fileupload2/src/site/apt/streaming.apt Mon Jun 21 08:29:22 2010
@@ -0,0 +1,81 @@
+~~   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.
+
+    -----------------
+    The Streaming API
+    -----------------
+
+The Streaming API
+
+* Why Streaming?
+
+  The traditional, and more comfortable API, which is described in the
+  {{{using.html}User Guide}}, assumes, that file items must be stored
+  somewhere, before they are actually accessable by the user. This
+  approach is convenient, because it allows easy access to an items
+  contents. On the other hand, it is memory and time consuming.
+
+  The streaming API allows you to trade a little bit of convenience for
+  optimal performance and and a low memory profile. Additionally, the
+  API is more lightweight, thus easier to understand.
+
+* How it works
+
+  Again, the <<<FileUpload>>> class is used for accessing the
+  form fields and fields in the order, in which they have been sent
+  by the client. However, the <<<FileItemStore>>>, or its main
+  implementation, the <<<DiskFileItemStore>>>, is completely
+  ignored.
+
+* Parsing the request
+
+  First of all, do not forget to ensure, that a request actually is a
+  a file upload request. This is typically done using the same static
+  method, which you already know from the traditional API.
+
+---------------------------------------------------------------------------
+  // Check that we have a file upload request
+  boolean isMultipart = HttpServletUploadRequest.isMultipartContent(request);
+---------------------------------------------------------------------------
+
+  Now we are ready to parse the request into its constituent items. Here's
+  how we do it:
+
+---------------------------------------------------------------------------
+  // Create a new file upload handler
+  FileUpload upload = new FileUpload();
+
+  // Parse the request
+  HttpServletRequest req;
+  HttpServletUploadRequest request = new HttpServletUploadRequest(req);
+  FileItemIterator iter = upload.parse(request);
+  while (iter.hasNext()) {
+    FileItem item = iter.next();
+    String name = item.getFieldName();
+    if (item.isFormField()) {
+        System.out.println("Form field " + name + " with value "
+            + Streams.asString(item) + " detected.");
+    } else {
+        System.out.println("File field " + name + " with file name "
+            + item.getName() + " detected.");
+        // Process the input stream
+        InputStream istream = item.getInputStream();
+        ...
+    }
+---------------------------------------------------------------------------
+
+  That's all that's needed. Really!

Added: commons/sandbox/commons-fileupload2/src/site/apt/using.apt
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/site/apt/using.apt?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/site/apt/using.apt (added)
+++ commons/sandbox/commons-fileupload2/src/site/apt/using.apt Mon Jun 21 08:29:22 2010
@@ -0,0 +1,411 @@
+~~   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.
+
+  --------------------------
+  Using Commons Fileupload 2
+  --------------------------
+
+Using Commons FileUpload 2
+
+  FileUpload can be used in a number of different ways, depending upon the
+  requirements of your application. In the simplest case, you will call a
+  single method to parse the servlet request, and then process the list of
+  items as they apply to your application. At the other end of the scale,
+  you might decide to customize FileUpload to take full control of the way
+  in which individual items are stored; for example, you might decide to
+  stream the content into a database.
+
+  Here, we will describe the basic principles of FileUpload, and illustrate
+  some of the simpler - and most common - usage patterns. Customization of
+  FileUpload is described {{{customizing.html}elsewhere}}.
+
+How it works
+
+  A file upload request comprises an ordered list of <<items>> that
+  are encoded according to {{{http://www.ietf.org/rfc/rfc1867.txt}RFC 1867}},
+  "Form-based File Upload in HTML". FileUpload can parse such a request
+  and provide your application with a list of the individual uploaded
+  items. Each such item implements the <<FileItem>> interface,
+  regardless of its underlying implementation.
+
+  This page describes the traditional API of the commons fileupload
+  library. The traditional API is a convenient approach. However, for
+  ultimate performance, you might prefer the faster {{{streaming.html}Streaming
+  API}}.
+
+  Each file item has a number of properties that might be of interest for
+  your application. For example, every item has a field name and a content
+  type, and can provide an <<InputStream>> to access its data. On the
+  other hand, you may need to process items differently, depending upon
+  whether the item is a regular form field - that is, the data came from
+  an ordinary text box or similar HTML field - or an uploaded file. The
+  <<FileItem>> interface provides the methods to make such a determination,
+  and to access the data in the most appropriate manner.
+
+  FileUpload creates new file items using a <<FileItemStore>>. This is what
+  gives FileUpload most of its flexibility. The factory has ultimate control
+  over how each item is created and stored. The factory implementation that
+  currently ships with FileUpload stores the item's data in memory or
+  on disk, depending on the size of the item (i.e. bytes of data). However,
+  this behavior can be customized to suit your application.
+
+Servlets and Portlets
+
+  Starting with version 1.1, FileUpload supports file upload requests in
+  both servlet and portlet environments. The usage is almost identical in
+  the two environments, so the remainder of this document refers only to
+  the servlet environment.
+
+  If you are building a portlet application, the following are the two
+  distinctions you should make as you read this document:
+
+  * Where you see references to the <<HttpServletUploadRequest>> class,
+    substitute the <<PortletUploadRequest>> class.
+  * Where you see references to the <<HttpServletRequest>> class,
+    substitute the <<ActionRequest>> class.
+
+Parsing the request
+
+  Before you can work with the uploaded items, of course, you need to parse
+  the request itself. Ensuring that the request is actually a file upload
+  request is straightforward, but FileUpload makes it simplicity itself, by
+  providing a static method to do just that.
+
+---------------------------------------------------------------------------
+  // Check that we have a file upload request
+  boolean isMultipart = HttpServletUploadRequest.isMultipartContent(request);]]
+---------------------------------------------------------------------------
+
+  Now we are ready to parse the request into its constituent items.
+
+The simplest case
+
+  The simplest usage scenario is the following:
+
+  * Uploaded items should be retained in memory as long as they are reasonably
+    small.
+  * Larger items should be written to a temporary file on disk.
+  * Very large upload requests should not be permitted.
+  * The built-in defaults for the maximum size of an item to be retained in
+    memory, the maximum permitted size of an upload request, and the location
+    of temporary files are acceptable.
+
+  Handling a request in this scenario couldn't be much simpler:
+
+---------------------------------------------------------------------------
+  // Create a factory for disk-based file items
+  DiskFileItemStore store = new DiskFileItemStore();
+  // Create a new file upload handler
+  FileUpload upload = new FileUpload();
+
+  // Parse the request
+  List<StoredFileItem> items = store.parse(upload, request);
+---------------------------------------------------------------------------
+
+  That's all that's needed. Really!
+
+  The result of the parse is a <<List>> of file items, each of which
+  implements the <<StoredFileItem>>> interface. Processing these items
+  is discussed below.
+
+Exercising more control
+
+  If your usage scenario is close to the simplest case, described above,
+  but you need a little more control, you can easily customize the
+  behavior of the upload handler or the file item factory or both. The
+  following example shows several configuration options:
+
+---------------------------------------------------------------------------
+  // Create a factory for disk-based file items
+  DiskFileItemStore factory = new DiskFileItemStore();
+  // Set factory constraints
+  factory.setThreshold(yourMaxMemorySize);
+  factory.setRepository(yourTempDirectory);
+
+  // Create a new file upload handler
+  FileUpload upload = new FileUpload();
+  // Set overall request size constraint
+  upload.setRequestSizeMax(yourMaxRequestSize);
+
+  // Parse the request
+  List<StoredFileItem> items = store.parse(upload, request);
+---------------------------------------------------------------------------
+
+  Of course, each of the configuration methods is independent of the
+  others.
+
+---------------------------------------------------------------------------
+
+  Should you need further control over the parsing of the request, such
+  as storing the items elsewhere - for example, in a database - you will
+  need to look into {{{customizing.html}customizing}} FileUpload.
+
+Processing the uploaded items
+
+  Once the parse has completed, you will have a <<List>> of file items
+  that you need to process. In most cases, you will want to handle
+  file uploads differently from regular form fields, so you might process
+  the list like this:
+
+---------------------------------------------------------------------------
+  // Process the uploaded items
+  Iterator<StoredFileItem> iter = items.iterator();
+  while (iter.hasNext()) {
+    StoredFileItem item = (StoredFileItem) iter.next();
+    if (item.isFormField()) {
+        processFormField(item);
+    } else {
+        processUploadedFile(item);
+    }
+  }
+---------------------------------------------------------------------------
+
+  For a regular form field, you will most likely be interested only in the
+  name of the item, and its <<String>> value. The following example shows
+  how to access these:
+
+---------------------------------------------------------------------------
+  // Process a regular form field
+  if (item.isFormField()) {
+    String name = item.getFieldName();
+    String value = Streams.asString(item);
+    ...
+  }
+---------------------------------------------------------------------------
+
+  For a file upload, there are several different things you might want to
+  know before you process the content. Here is an example of some of the
+  methods you might be interested in.
+
+---------------------------------------------------------------------------
+  // Process a file upload
+  if (!item.isFormField()) {
+    String fieldName = item.getFieldName();
+    String fileName = item.getFileName();
+    String contentType = item.getContentType();
+    boolean isInMemory = item.isInMemory();
+    long sizeInBytes = item.getContentLength();
+    ...
+---------------------------------------------------------------------------
+
+  With uploaded files, you generally will not want to access them via
+  memory, unless they are small, or unless you have no other alternative.
+  Rather, you will want to process the content as a stream, or write the
+  entire file to its ultimate location. FileUpload provides simple means of
+  accomplishing both of these.
+
+---------------------------------------------------------------------------
+  // Process a file upload
+  if (writeToFile) {
+    File uploadedFile = new DiskFileItemStore().writeToFile(item);
+  } else {
+    InputStream uploadedStream = item.getInputStream();
+    ...
+    uploadedStream.close();
+  }
+---------------------------------------------------------------------------
+
+  Note that, in the default implementation of FileUpload, <<<write()>>>
+  will create a new file only, if that hasn't already be done. Actually
+  copying the data is only done if the file item is still held in memory.
+
+  If you do need to access the uploaded data in memory, you need simply
+  call the <<<Streams.asByteArray()>>> method to obtain the data as an
+  array of bytes.
+
+---------------------------------------------------------------------------
+  // Process a file upload in memory
+  byte[] data = Streams.asByteArray(item);
+---------------------------------------------------------------------------
+  
+Resource cleanup
+
+  This section applies only, if you are using the
+  {{{apidocs/org/apache/commons/fileupload2/disk/DiskFileItemStore.html}DiskFileItemStore}}.
+  In other words, it applies, if your uploaded files are written to
+  temporary files before processing them.
+
+  Such temporary files can be deleted automatically, if they are no longer
+  used (more precisely, if the corresponding instance of <<<FileItem>>>
+  is garbage collected. This is done silently by the
+  <<<org.apache.commons.io.FileCleaningTracker>>> class, which starts a
+  reaper thread.
+
+  This reaper thread must be created and stopped, if it is no longer
+  needed. In a servlet environment, this is done by using a special
+  servlet context listener, called
+  {{{apidocs/org/apache/commons/fileupload2/servlet/ServletFileTracker.html}ServletFileTracker}}.
+  To do so, add a section like the following to your <<<web.xml>>>:
+
+---------------------------------------------------------------------------
+  <web-app>
+    ...
+    <listener>
+      <listener-class>
+        org.apache.commons.fileupload2.servlet.ServletFileTracker
+      </listener-class>
+    </listener>
+    ...
+  </web-app>
+---------------------------------------------------------------------------
+
+  Additionally, you must initialize your <<<DiskFileItemStore>>> like
+  this:
+
+---------------------------------------------------------------------------
+  ServletContext ctx = ...; /* Depends on your application, how to obtain
+                             * the ServletContext. In a servlet application,
+                             * there will be a possibility.
+                             */
+  DiskFileItemStore store = new DiskFileItemStore();
+  store.setTracker(ServletFileTracker.getFileTracker(ctx));
+---------------------------------------------------------------------------
+
+  For a portlet environment, the same section in <<<web.xml>>> is required,
+  but your code would look like this:
+
+---------------------------------------------------------------------------
+  PortletContext ctx = ...; /* Depends on your application, how to obtain
+                             * the PortletContext. In a portlet application,
+                             * there will be a possibility.
+                             */
+  DiskFileItemStore store = new DiskFileItemStore();
+  store.setTracker(PortletFileTracker.getFileTracker(ctx));
+---------------------------------------------------------------------------
+
+
+Creating a DiskFileItemFactory
+
+  The <<<ServletFileTracker>>> provides an instance of
+  <<<org.apache.commons.io.FileCleaningTracker>>>. This instance must
+  be used when creating a {{{apidocs/org/apache/commons/fileupload2/disk/DiskFileItemFactory.html}DiskFileItemFactory}}.
+
+  This should be done by calling a method like the following:
+
+---------------------------------------------------------------------------
+  public static DiskFileItemFactory newDiskFileItemFactory(ServletContext pCtx,
+                                                           File pRepository) {
+    FileCleaningTracker tracker = ServletFileTracker.getFileTracker(pCtx);
+    DiskFileItemFactory factory = new DiskFileItemFactory();
+    factory.setRepository(pRepository);
+    factory.setTracker(tracker);
+    return factory;
+  }
+---------------------------------------------------------------------------
+
+
+Disabling cleanup of temporary files
+
+  To disable tracking of temporary files, you may set the
+  <<<FileCleaningTracker>>> to null. Consequently, created files will no
+  longer be tracked. In particular, they will no longer be deleted
+  automatically.
+
+
+Interaction with virus scanners
+
+  Virus scanners running on the same system as the web container can cause
+  some unexpected behaviours for applications using FileUpload. This section
+  describes some of the behaviours that you might encounter, and provides
+  some ideas for how to handle them.
+
+  The default implementation of FileUpload will cause uploaded items above
+  a certain size threshold to be written to disk. As soon as such a file is
+  closed, any virus scanner on the system will wake up and inspect it, and
+  potentially quarantine the file - that is, move it to a special location
+  where it will not cause problems. This, of course, will be a surprise to
+  the application developer, since the uploaded file item will no longer be
+  available for processing. On the other hand, uploaded items below that
+  same threshold will be held in memory, and therefore will not be seen by
+  virus scanners. This allows for the possibility of a virus being retained
+  in some form (although if it is ever written to disk, the virus scanner
+  would locate and inspect it).
+
+  One commonly used solution is to set aside one directory on the system
+  into which all uploaded files will be placed, and to configure the virus
+  scanner to ignore that directory. This ensures that files will not be
+  ripped out from under the application, but then leaves responsibility for
+  virus scanning up to the application developer. Scanning the uploaded
+  files for viruses can then be performed by an external process, which
+  might move clean or cleaned files to an "approved" location, or by
+  integrating a virus scanner within the application itself. The details of
+  configuring an external process or integrating virus scanning into an
+  application are outside the scope of this document.
+
+
+Watching progress
+
+  If you expect really large file uploads, then it would be nice to report
+  to your users, how much is already received. Even HTML pages allow to
+  implement a progress bar by returning a multipart/replace response,
+  or something like that.
+
+  Watching the upload progress may be done by supplying an event listener:
+
+---------------------------------------------------------------------------
+  //Create an event listener
+  EventListener listener = new DefaultEventListener(){
+    private final long APPROXIMATE_EVENT_INTERVAL = 100000;
+    private int num;
+
+    public long startItem(FileUpload pFileUpload, UploadRequest pRequest, FileItem pItem)
+            throws IOException {
+      ++num;
+      System.out.println("Beginning to parse item " + num);
+      return APPROXIMATE_EVENT_INTERVAL;
+    }
+
+    public long parsingItem(FileUpload pFileUpload, UploadRequest pRequest, FileItem pItem,
+            long pCurrentLength) throws IOException {
+      System.out.println("Still reading item " + num + ", " + pCurrentLength
+                         + " bytes read so far.");
+      return APPROXIMATE_EVENT_INTERVAL;
+    }
+
+    public void endItem(FileUpload pFileUpload, UploadRequest pRequest, FileItem pItem,
+                        long pContentLength)
+            throws IOException {
+      System.out.println("Finished parsing item " + num + ", size = "
+                         + pContentLength + " bytes.");
+    }
+  };
+  // Install the event listener
+  FileUpload upload = new FileUpload();
+  upload.setEventListener(listener);
+---------------------------------------------------------------------------
+
+  Do yourself a favour and implement your first event listener just
+  like the above, but by changing the number APPROXIMATE_EVENT_INTERVAL
+  to a small value, like 1. This will show you a pitfall: The event
+  listener can be called quite frequently. Depending on the servlet
+  engine and other environment factors, it may be called for any
+  network packet, or even any single byte! In other words, your
+  progress listener may become a performance problem!
+  A typical solution might be, to reduce the event listeners activity
+  by increasing the value of APPROXIMATE_EVENT_INTERVAL.
+
+What's next
+
+  Hopefully this page has provided you with a good idea of how to use
+  FileUpload in your own applications. For more detail on the methods
+  introduced here, as well as other available methods, you should refer
+  to the {{{apidocs/index.html}JavaDocs}}.
+
+  The usage described here should satisfy a large majority of file upload
+  needs. However, should you have more complex requirements, FileUpload
+  should still be able to help you, with it's flexible
+  {{{customizing.html}customization}} capabilities.

Added: commons/sandbox/commons-fileupload2/src/site/fml/faq.fml
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/site/fml/faq.fml?rev=956490&view=auto
==============================================================================
--- commons/sandbox/commons-fileupload2/src/site/fml/faq.fml (added)
+++ commons/sandbox/commons-fileupload2/src/site/fml/faq.fml Mon Jun 21 08:29:22 2010
@@ -0,0 +1,126 @@
+<?xml version="1.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.
+-->
+
+<faqs title="FileUpload FAQ">
+
+  <part id="general">
+    <title>General</title>
+
+    <faq id="empty-parse">
+      <question>
+        Why is <code>parse(UploadRequest)</code> returning no items?
+      </question>
+      <answer>
+        This most commonly happens when the request has already been parsed, or
+        processed in some other way. Since the input stream has aleady been
+        consumed by that earlier process, it is no longer available for parsing
+        by Commons FileUpload.
+      </answer>
+    </faq>
+
+    <faq id="read-timeout">
+      <question>
+        Why am I getting "Read timed out" exceptions while parsing?
+      </question>
+      <answer>
+        The most common cause of these exceptions is when FileUpload is being
+        used on a site that is using the Tomcat ISAPI redirector. There was a
+        bug in earlier versions of that component that caused problems with
+        multipart requests. The bug was fixed some time ago, so you probably
+        just need to pick up a newer version. See the
+        <a href="http://issues.apache.org/bugzilla/show_bug.cgi?id=15278">Tomcat bug report</a>
+        for full details.
+      </answer>
+    </faq>
+
+    <faq id="class-not-found">
+      <question>
+        Why is NoClassDefFoundError being thrown?
+      </question>
+      <answer>
+        <p>There are two common causes for this error. </p>
+        
+        <p>Firstly, it might simply mean that you do not have the Commons IO 
+        jar in your classpath. DiskFileUpload depends on IO (see 
+        <a href="dependencies.html">dependencies</a>) - you can tell if 
+        this is the case if the missing class is within the 
+        <code>org.apache.commons.io</code> package. </p>
+
+        <p>Secondly this can happen when attempting to rely on a shared copy of
+        the Commons FileUpload jar file provided by your web container. The
+        solution is to include the FileUpload jar file as part of your own
+        web application, instead of relying on the container. The same may 
+        hold for FileUpload's IO dependency. </p>
+      </answer>
+    </faq>
+
+    <faq id="whole-path-from-IE">
+      <question>
+        Why does <code>FileItem.getFileName()</code> return the whole path,
+        and not just the file name?
+      </question>
+      <answer>
+        Internet Explorer provides the entire path to the uploaded file and not
+        just the base file name. Since FileUpload provides exactly what was
+        supplied by the client (browser), you may want to remove this path
+        information in your application. You can do that using the following
+        method from Commons IO (which you may already have, since it is used by
+        DiskFileUpload).
+        <pre>
+    String fileName = item.getName();
+    if (fileName != null) {
+        filename = FilenameUtils.getName(filename);
+    }
+        </pre>
+      </answer>
+    </faq>
+  </part>
+
+  <part id="struts">
+    <title>FileUpload and Struts</title>
+
+    <faq id="parse-in-action-fails">
+      <question>
+        I'm using FileUpload in an Action, but it's not working. Why?
+      </question>
+      <answer>
+        Struts recognises multipart requests, and parses them automatically,
+        presenting the request parameters to your code in the same manner as
+        if they were regular request parameters. Since Struts has already
+        processed the request, and made it available in your form bean, the
+        input stream is no longer available for parsing, so attempting to do
+        so with FileUpload will fail.
+      </answer>
+    </faq>
+
+    <faq id="howto-parse-in-action">
+      <question>
+        But I need to parse the request myself. How can I do that?
+      </question>
+      <answer>
+        Struts parses multipart a request as a part of the process of populating
+        your form bean from that request. If, for some reason, you need to have
+        full control over the multipart parsing, you can do so by configuring
+        your action mapping without an associated form bean. (A better way of
+        doing this, however, is to replace the default multipart handler with
+        your own. See the Struts documentation for details.)
+      </answer>
+    </faq>
+  </part>
+
+</faqs>

Modified: commons/sandbox/commons-fileupload2/src/site/site.xml
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/site/site.xml?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/site/site.xml (original)
+++ commons/sandbox/commons-fileupload2/src/site/site.xml Mon Jun 21 08:29:22 2010
@@ -15,27 +15,26 @@
  See the License for the specific language governing permissions and
  limitations under the License.
 -->
-<project name="FileUpload">
+<project name="FileUpload 2">
 
   <bannerRight>
-    <name>Commons FileUpload</name>
+    <name>Commons FileUpload 2</name>
     <src>/images/logo.png</src>
     <href>/index.html</href>
   </bannerRight>
 
   <body>
 
-    <menu name="Commons FileUpload">
-      <item name="Overview"                 href="/index.html"/>
-      <item name="User guide"               href="/using.html"/>
-      <item name="Streaming API"            href="/streaming.html"/>
-      <item name="FAQ"                      href="/faq.html"/>
+    <menu name="Commons FileUpload 2">
+      <item name="Overview"                 href="index.html"/>
+      <item name="User guide"               href="using.html"/>
+      <item name="Streaming API"            href="streaming.html"/>
+      <item name="FAQ"                      href="faq.html"/>
       <item name="Javadoc"                  href="apidocs/index.html"/>
-      <item name="Mailing lists"            href="/mail-lists.html"/>
-      <item name="Issue Tracking"           href="/issue-tracking.html"/>
-      <item name="Team"                     href="/team-list.html"/>
-      <item name="Tasks"                    href="/tasks.html"/>
-      <item name="SVN repository"           href="/source-repository.html"/>
+      <item name="Mailing lists"            href="mail-lists.html"/>
+      <item name="Issue Tracking"           href="issue-tracking.html"/>
+      <item name="Team"                     href="team-list.html"/>
+      <item name="SVN repository"           href="source-repository.html"/>
     </menu>
 
   </body>

Modified: commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/DefaultFileItemTest.java
URL: http://svn.apache.org/viewvc/commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/DefaultFileItemTest.java?rev=956490&r1=956489&r2=956490&view=diff
==============================================================================
--- commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/DefaultFileItemTest.java (original)
+++ commons/sandbox/commons-fileupload2/src/test/org/apache/commons/fileupload2/DefaultFileItemTest.java Mon Jun 21 08:29:22 2010
@@ -33,7 +33,6 @@ import java.util.Arrays;
 import org.apache.commons.fileupload2.disk.DiskFileItem;
 import org.apache.commons.fileupload2.disk.DiskFileItemStore;
 import org.apache.commons.fileupload2.impl.AbstractFileItem;
-import org.apache.commons.fileupload2.impl.MemoryFileItem;
 import org.apache.commons.fileupload2.util.Streams;
 import org.junit.Test;
 
@@ -116,7 +115,7 @@ public class DefaultFileItemTest {
         final FileItemStore fileItemStore = createFileItemStore(null);
         final StoredFileItem storedFileItem = fileItemStore.store(item);
         assertNotNull(storedFileItem);
-        assertTrue(storedFileItem instanceof MemoryFileItem);
+        assertTrue(storedFileItem.isInMemory());
         assertEquals(testFieldValueBytes.length, storedFileItem.getContentLength());
         assertTrue(Arrays.equals(Streams.asByteArray(storedFileItem.getInputStream()), testFieldValueBytes));
         assertEquals(Streams.asString(storedFileItem.getInputStream()), textFieldValue);
@@ -136,8 +135,15 @@ public class DefaultFileItemTest {
      */
     @Test public void testAboveThresholdSpecifiedRepository() throws IOException {
         String tempPath = System.getProperty("java.io.tmpdir");
-        String tempDirName = "testAboveThresholdSpecifiedRepository";
-        File tempDir = new File(tempPath, tempDirName);
+        String tempDirName;
+        File tempDir;
+        for (int i = 0;  ;  i++) {
+        	tempDirName = "testAboveThresholdSpecifiedRepository" + (i == 0 ? "" : String.valueOf(i));
+        	tempDir = new File(tempPath, tempDirName);
+        	if (!tempDir.exists()) {
+        		break;
+        	}
+        }
         tempDir.mkdir();
         doTestAboveThreshold(tempDir);
         assertTrue(tempDir.delete());
@@ -161,7 +167,7 @@ public class DefaultFileItemTest {
         assertNotNull(item);
         FileItemStore factory = createFileItemStore(repository);
         final StoredFileItem storedFileItem = factory.store(item);
-        assertTrue(storedFileItem instanceof DiskFileItem);
+        assertTrue(!storedFileItem.isInMemory());
         assertEquals(testFieldValueBytes.length, storedFileItem.getContentLength());
         assertTrue(Arrays.equals(Streams.asByteArray(storedFileItem.getInputStream()), testFieldValueBytes));
         assertEquals(Streams.asString(storedFileItem.getInputStream()), textFieldValue);