sylvain 2003/11/13 06:56:12
Modified: src/java/org/apache/cocoon/servlet/multipart
MultipartHttpServletRequest.java Part.java
PartInMemory.java PartOnDisk.java
RequestFactory.java
Log:
Allow parts to be detached from the request and thus survive the end of its
processing.
This is needed for the woody upload widget.
Revision Changes Path
1.5 +6 -4
cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/MultipartHttpServletRequest.java
Index: MultipartHttpServletRequest.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/MultipartHttpServletRequest.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MultipartHttpServletRequest.java 30 Jul 2003 02:21:31 -0000 1.4
+++ MultipartHttpServletRequest.java 13 Nov 2003 14:56:12 -0000 1.5
@@ -98,9 +98,11 @@
Enumeration e = getParameterNames();
while (e.hasMoreElements()) {
Object o = get( (String)e.nextElement() );
- if (o instanceof PartOnDisk) {
- File file = ((PartOnDisk) o).getFile();
- file.delete();
+ if (o instanceof Part) {
+ Part part = (Part)o;
+ if (part.disposeWithRequest()) {
+ part.dispose();
+ }
}
}
}
1.3 +26 -3
cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/Part.java
Index: Part.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/Part.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- Part.java 17 Apr 2003 20:11:24 -0000 1.2
+++ Part.java 13 Nov 2003 14:56:12 -0000 1.3
@@ -53,6 +53,8 @@
import java.io.InputStream;
import java.util.Map;
+import org.apache.avalon.framework.activity.Disposable;
+
/**
* This (abstract) class represents a file part parsed from a http post
stream.
@@ -60,7 +62,9 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Jeroen ter Voorde</a>
* @version CVS $Id$
*/
-public abstract class Part {
+public abstract class Part implements Disposable {
+
+ private boolean disposeWithRequest = true;
/** Field headers */
protected Map headers;
@@ -99,7 +103,26 @@
public String getMimeType() {
return (String) headers.get("content-type");
}
-
+
+ /**
+ * Do we want any temporary resource held by this part to be cleaned up
when processing of
+ * the request that created it is finished? Default is <code>true</code>.
+ *
+ * @return <code>true</code> if the part should be disposed with the
request.
+ */
+ public boolean disposeWithRequest() {
+ return this.disposeWithRequest;
+ }
+
+ /**
+ * Set the value of the <code>disposeWithRequest</code> flag (default is
<code>true</code>).
+ *
+ * @param dispose <code>true</code> if the part should be disposed after
request processing
+ */
+ public void setDisposeWithRequest(boolean dispose) {
+ this.disposeWithRequest = dispose;
+ }
+
/**
* Returns an InputStream containing the file data
* @throws Exception
1.4 +13 -2
cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/PartInMemory.java
Index: PartInMemory.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/PartInMemory.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PartInMemory.java 19 Aug 2003 06:01:26 -0000 1.3
+++ PartInMemory.java 13 Nov 2003 14:56:12 -0000 1.4
@@ -98,6 +98,17 @@
* @throws Exception
*/
public InputStream getInputStream() throws Exception {
- return in;
+ if (this.in != null) {
+ return this.in;
+ } else {
+ throw new IllegalStateException("This part has already been
disposed.");
+ }
+ }
+
+ /**
+ * Clean the byte array content buffer holding part data
+ */
+ public void dispose() {
+ this.in = null;
}
}
1.3 +24 -2
cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/PartOnDisk.java
Index: PartOnDisk.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/PartOnDisk.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PartOnDisk.java 18 Aug 2003 21:55:40 -0000 1.2
+++ PartOnDisk.java 13 Nov 2003 14:56:12 -0000 1.3
@@ -76,6 +76,10 @@
protected PartOnDisk(Map headers, File file) {
super(headers);
this.file = file;
+
+ // Ensure the file will be deleted when we exit the JVM
+ this.file.deleteOnExit();
+
this.size = (int) file.length();
}
@@ -106,7 +110,11 @@
* @throws Exception
*/
public InputStream getInputStream() throws Exception {
- return new FileInputStream(file);
+ if (this.file != null) {
+ return new FileInputStream(file);
+ } else {
+ throw new IllegalStateException("This part has already been
disposed.");
+ }
}
/**
@@ -114,5 +122,19 @@
*/
public String toString() {
return file.getPath();
+ }
+
+ public void dispose() {
+ if (this.file != null) {
+ this.file.delete();
+ this.file = null;
+ }
+ }
+
+ public void finalize() throws Throwable {
+ // Ensure the file has been deleted
+ dispose();
+
+ super.finalize();
}
}
1.2 +10 -2
cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/RequestFactory.java
Index: RequestFactory.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/servlet/multipart/RequestFactory.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RequestFactory.java 4 Apr 2003 13:19:05 -0000 1.1
+++ RequestFactory.java 13 Nov 2003 14:56:12 -0000 1.2
@@ -88,7 +88,15 @@
this.allowOverwrite = allowOverwrite;
this.silentlyRename = silentlyRename;
this.maxUploadSize = maxUploadSize;
- this.defaultCharEncoding = defaultCharEncoding;
+ this.defaultCharEncoding = defaultCharEncoding;
+
+ if (saveUploadedFilesToDisk) {
+ // Empty the contents of the upload directory
+ File[] files = uploadDirectory.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ files[i].delete();
+ }
+ }
}
/**