Author: jochen
Date: Sun Aug 6 16:34:18 2006
New Revision: 429209
URL: http://svn.apache.org/viewvc?rev=429209&view=rev
Log:
Reworked the new streaming API in order to throw IOExceptions rather
than mask them as FileUploadExceptions. See FILEUPLOAD-71 for the
reasons.
Modified:
jakarta/commons/proper/fileupload/trunk/.settings/org.eclipse.jdt.core.prefs
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileItemIterator.java
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadException.java
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java
Modified:
jakarta/commons/proper/fileupload/trunk/.settings/org.eclipse.jdt.core.prefs
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/.settings/org.eclipse.jdt.core.prefs?rev=429209&r1=429208&r2=429209&view=diff
==============================================================================
---
jakarta/commons/proper/fileupload/trunk/.settings/org.eclipse.jdt.core.prefs
(original)
+++
jakarta/commons/proper/fileupload/trunk/.settings/org.eclipse.jdt.core.prefs
Sun Aug 6 16:34:18 2006
@@ -1,4 +1,4 @@
-#Mon Jun 19 03:18:34 CEST 2006
+#Mon Aug 07 02:40:54 CEST 2006
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.1
@@ -8,17 +8,67 @@
org.eclipse.jdt.core.compiler.debug.localVariable=generate
org.eclipse.jdt.core.compiler.debug.sourceFile=generate
org.eclipse.jdt.core.compiler.doc.comment.support=enabled
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
org.eclipse.jdt.core.compiler.problem.assertIdentifier=ignore
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
org.eclipse.jdt.core.compiler.problem.enumIdentifier=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=warning
org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=private
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public
org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=public
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
org.eclipse.jdt.core.compiler.source=1.3
Modified:
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileItemIterator.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileItemIterator.java?rev=429209&r1=429208&r2=429209&view=diff
==============================================================================
---
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileItemIterator.java
(original)
+++
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileItemIterator.java
Sun Aug 6 16:34:18 2006
@@ -15,6 +15,7 @@
*/
package org.apache.commons.fileupload;
+import java.io.IOException;
import java.util.NoSuchElementException;
@@ -27,12 +28,12 @@
* Returns, whether another instance of [EMAIL PROTECTED] FileItemStream}
* is available.
*/
- boolean hasNext() throws FileUploadException;
+ boolean hasNext() throws FileUploadException, IOException;
/**
* Returns the next available [EMAIL PROTECTED] FileItemStream}.
* @throws NoSuchElementException No more items are available. Use
* [EMAIL PROTECTED] #hasNext()} to prevent this exception.
*/
- FileItemStream next() throws FileUploadException;
+ FileItemStream next() throws FileUploadException, IOException;
}
Modified:
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java?rev=429209&r1=429208&r2=429209&view=diff
==============================================================================
---
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
(original)
+++
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadBase.java
Sun Aug 6 16:34:18 2006
@@ -271,9 +271,12 @@
*
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
+ * @throws IOException An I/O error occurred. This may be a network
+ * error while communicating with the client or a problem while
+ * storing the uploaded content.
*/
public FileItemIterator getItemIterator(RequestContext ctx)
- throws FileUploadException {
+ throws FileUploadException, IOException {
return new FileItemIteratorImpl(ctx);
}
@@ -291,28 +294,34 @@
*/
public List /* FileItem */ parseRequest(RequestContext ctx)
throws FileUploadException {
- FileItemIterator iter = getItemIterator(ctx);
- List items = new ArrayList();
- FileItemFactory fac = getFileItemFactory();
- final byte[] buffer = new byte[8192];
- while (iter.hasNext()) {
- FileItemStream item = iter.next();
- FileItem fileItem = fac.createItem(item.getFieldName(),
- item.getContentType(), item.isFormField(),
- item.getName());
- try {
- StreamUtil.copy(item.openStream(), fileItem.getOutputStream(),
- true, buffer);
- } catch (FileUploadIOException e) {
- throw (FileUploadException) e.getCause();
- } catch (IOException e) {
- throw new IOFileUploadException(
- "Processing of " + MULTIPART_FORM_DATA
- + " request failed. " + e.getMessage(), e);
- }
- items.add(fileItem);
+ try {
+ FileItemIterator iter = getItemIterator(ctx);
+ List items = new ArrayList();
+ FileItemFactory fac = getFileItemFactory();
+ final byte[] buffer = new byte[8192];
+ while (iter.hasNext()) {
+ FileItemStream item = iter.next();
+ FileItem fileItem = fac.createItem(item.getFieldName(),
+ item.getContentType(), item.isFormField(),
+ item.getName());
+ try {
+ StreamUtil.copy(item.openStream(),
fileItem.getOutputStream(),
+ true, buffer);
+ } catch (FileUploadIOException e) {
+ throw (FileUploadException) e.getCause();
+ } catch (IOException e) {
+ throw new IOFileUploadException(
+ "Processing of " + MULTIPART_FORM_DATA
+ + " request failed. " + e.getMessage(), e);
+ }
+ items.add(fileItem);
+ }
+ return items;
+ } catch (FileUploadIOException e) {
+ throw (FileUploadException) e.getCause();
+ } catch (IOException e) {
+ throw new FileUploadException(e.getMessage(), e);
}
- return items;
}
@@ -534,7 +543,7 @@
private boolean itemValid;
private boolean eof;
- FileItemIteratorImpl(RequestContext ctx) throws FileUploadException {
+ FileItemIteratorImpl(RequestContext ctx) throws FileUploadException,
IOException {
if (ctx == null) {
throw new NullPointerException("ctx parameter");
}
@@ -551,48 +560,40 @@
+ contentType);
}
- try {
- InputStream input = ctx.getInputStream();
-
- if (sizeMax >= 0) {
- int requestSize = ctx.getContentLength();
- if (requestSize == -1) {
- input = new LimitedInputStream(input, sizeMax);
- } else {
- if (sizeMax >= 0 && requestSize > sizeMax) {
- throw new SizeLimitExceededException(
- "the request was rejected because its size
(" + requestSize
- + ") exceeds the configured maximum (" +
sizeMax + ")",
- requestSize, sizeMax);
- }
- }
- }
-
- String charEncoding = headerEncoding;
- if (charEncoding == null) {
- charEncoding = ctx.getCharacterEncoding();
- }
+ InputStream input = ctx.getInputStream();
- boundary = getBoundary(contentType);
- if (boundary == null) {
- throw new FileUploadException(
- "the request was rejected because "
- + "no multipart boundary was found");
- }
+ if (sizeMax >= 0) {
+ int requestSize = ctx.getContentLength();
+ if (requestSize == -1) {
+ input = new LimitedInputStream(input, sizeMax);
+ } else {
+ if (sizeMax >= 0 && requestSize > sizeMax) {
+ throw new SizeLimitExceededException(
+ "the request was rejected
because its size (" + requestSize
+ + ") exceeds the configured
maximum (" + sizeMax + ")",
+ requestSize, sizeMax);
+ }
+ }
+ }
+
+ String charEncoding = headerEncoding;
+ if (charEncoding == null) {
+ charEncoding = ctx.getCharacterEncoding();
+ }
+
+ boundary = getBoundary(contentType);
+ if (boundary == null) {
+ throw new FileUploadException(
+ "the request was rejected because "
+ + "no multipart boundary was found");
+ }
+
+ notifier = new MultipartStream.ProgressNotifier(listener,
ctx.getContentLength());
+ multi = new MultipartStream(input, boundary, notifier);
+ multi.setHeaderEncoding(charEncoding);
- notifier = new MultipartStream.ProgressNotifier(listener,
ctx.getContentLength());
- multi = new MultipartStream(input, boundary, notifier);
- multi.setHeaderEncoding(charEncoding);
-
- skipPreamble = true;
- findNextItem();
- } catch (FileUploadIOException e) {
- throw (FileUploadException) e.getCause();
- } catch (IOException e) {
- throw new FileUploadException(
- "Processing of " + MULTIPART_FORM_DATA
- + " request failed. " + e.getMessage());
- }
+ skipPreamble = true;
+ findNextItem();
}
private boolean findNextItem() throws IOException {
@@ -635,15 +636,14 @@
multi.setBoundary(subBoundary);
skipPreamble = true;
continue;
- } else {
- String fileName = getFileName(headers);
- currentItem = new FileItemStreamImpl(fileName,
- fieldName, getHeader(headers,
CONTENT_TYPE),
- fileName == null);
- notifier.noteItem();
- itemValid = true;
- return true;
}
+ String fileName = getFileName(headers);
+ currentItem = new FileItemStreamImpl(fileName,
+ fieldName, getHeader(headers,
CONTENT_TYPE),
+ fileName == null);
+ notifier.noteItem();
+ itemValid = true;
+ return true;
}
} else {
String fileName = getFileName(headers);
@@ -660,25 +660,17 @@
}
}
- public boolean hasNext() throws FileUploadException {
+ public boolean hasNext() throws FileUploadException, IOException {
if (eof) {
return false;
}
if (itemValid) {
return true;
}
- try {
- return findNextItem();
- } catch (FileUploadIOException e) {
- throw (FileUploadException) e.getCause();
- } catch (IOException e) {
- throw new FileUploadException(
- "Processing of " + MULTIPART_FORM_DATA
- + " request failed. " + e.getMessage());
- }
+ return findNextItem();
}
- public FileItemStream next() throws FileUploadException {
+ public FileItemStream next() throws FileUploadException, IOException {
if (eof || (!itemValid && !hasNext())) {
throw new NoSuchElementException();
}
@@ -879,5 +871,4 @@
public void setProgressListener(ProgressListener pListener) {
listener = pListener;
}
-
}
Modified:
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadException.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadException.java?rev=429209&r1=429208&r2=429209&view=diff
==============================================================================
---
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadException.java
(original)
+++
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/FileUploadException.java
Sun Aug 6 16:34:18 2006
@@ -15,19 +15,24 @@
*/
package org.apache.commons.fileupload;
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
/**
* Exception for errors encountered while processing the request.
*
* @author <a href="mailto:[EMAIL PROTECTED]">John McNally</a>
* @version $Id$
*/
-public class FileUploadException
- extends Exception {
-
+public class FileUploadException extends Exception {
+ private static final long serialVersionUID = 8881893724388807504L;
+ private final Throwable cause;
+
/**
* Constructs a new <code>FileUploadException</code> without message.
*/
public FileUploadException() {
+ this(null, null);
}
/**
@@ -37,8 +42,31 @@
* @param msg the error message.
*/
public FileUploadException(final String msg) {
- super(msg);
+ this(msg, null);
+ }
+
+ /**
+ * Creates a new <code>FileUploadException</code> with the given
+ * detail message and cause.
+ */
+ public FileUploadException(String msg, Throwable cause) {
+ super(msg);
+ this.cause = cause;
}
+ public void printStackTrace(PrintStream stream) {
+ super.printStackTrace(stream);
+ if (cause != null) {
+ stream.println("Caused by:");
+ cause.printStackTrace(stream);
+ }
+ }
+ public void printStackTrace(PrintWriter writer) {
+ super.printStackTrace(writer);
+ if (cause != null) {
+ writer.println("Caused by:");
+ cause.printStackTrace(writer);
+ }
+ }
}
Modified:
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java?rev=429209&r1=429208&r2=429209&view=diff
==============================================================================
---
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java
(original)
+++
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/portlet/PortletFileUpload.java
Sun Aug 6 16:34:18 2006
@@ -15,6 +15,7 @@
*/
package org.apache.commons.fileupload.portlet;
+import java.io.IOException;
import java.util.List;
import javax.portlet.ActionRequest;
@@ -129,8 +130,11 @@
*
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
+ * @throws IOException An I/O error occurred. This may be a network
+ * error while communicating with the client or a problem while
+ * storing the uploaded content.
*/
- public FileItemIterator getItemIterator(ActionRequest request) throws
FileUploadException {
+ public FileItemIterator getItemIterator(ActionRequest request) throws
FileUploadException, IOException {
return super.getItemIterator(new PortletRequestContext(request));
}
}
Modified:
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java
URL:
http://svn.apache.org/viewvc/jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java?rev=429209&r1=429208&r2=429209&view=diff
==============================================================================
---
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java
(original)
+++
jakarta/commons/proper/fileupload/trunk/src/java/org/apache/commons/fileupload/servlet/ServletFileUpload.java
Sun Aug 6 16:34:18 2006
@@ -15,6 +15,7 @@
*/
package org.apache.commons.fileupload.servlet;
+import java.io.IOException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
@@ -136,8 +137,12 @@
*
* @throws FileUploadException if there are problems reading/parsing
* the request or storing files.
+ * @throws IOException An I/O error occurred. This may be a network
+ * error while communicating with the client or a problem while
+ * storing the uploaded content.
*/
- public FileItemIterator getItemIterator(HttpServletRequest request) throws
FileUploadException {
+ public FileItemIterator getItemIterator(HttpServletRequest request)
+ throws FileUploadException, IOException {
return super.getItemIterator(new ServletRequestContext(request));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]