Author: norman
Date: Sun Apr 11 10:43:20 2010
New Revision: 932865

URL: http://svn.apache.org/viewvc?rev=932865&view=rev
Log:
Make sure all file descriptors are really closed when object is disposed

Modified:
    
james/server/trunk/core-library/src/main/java/org/apache/james/core/MimeMessageInputStreamSource.java
    
james/server/trunk/spoolmanager/src/main/java/org/apache/james/FileSpoolMessageStore.java

Modified: 
james/server/trunk/core-library/src/main/java/org/apache/james/core/MimeMessageInputStreamSource.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/core-library/src/main/java/org/apache/james/core/MimeMessageInputStreamSource.java?rev=932865&r1=932864&r2=932865&view=diff
==============================================================================
--- 
james/server/trunk/core-library/src/main/java/org/apache/james/core/MimeMessageInputStreamSource.java
 (original)
+++ 
james/server/trunk/core-library/src/main/java/org/apache/james/core/MimeMessageInputStreamSource.java
 Sun Apr 11 10:43:20 2010
@@ -33,6 +33,8 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
 
 /**
  * Takes an input stream and creates a repeatable input stream source
@@ -48,6 +50,9 @@ public class MimeMessageInputStreamSourc
     extends MimeMessageSource
     implements Disposable {
 
+    private final List<InputStream> streams = new ArrayList<InputStream>();
+
+    
     /**
      * A temporary file used to hold the message stream
      */
@@ -141,7 +146,9 @@ public class MimeMessageInputStreamSourc
      * @return a <code>BufferedInputStream</code> containing the data
      */
     public synchronized InputStream getInputStream() throws IOException {
-        return new SharedFileInputStream(file);
+        SharedFileInputStream in = new SharedFileInputStream(file);
+        streams.add(in);
+        return in;
     }
 
     /**
@@ -167,6 +174,14 @@ public class MimeMessageInputStreamSourc
      * @see org.apache.avalon.framework.activity.Disposable#dispose()
      */
     public void dispose() {
+        // explicit close all streams
+        for (int i = 0; i < streams.size(); i++) {
+            try {
+                streams.get(i).close();
+            } catch (IOException e) {
+                // ignore on dispose
+            }
+        }
         try {
             if (file != null && file.exists()) {
                 file.delete();

Modified: 
james/server/trunk/spoolmanager/src/main/java/org/apache/james/FileSpoolMessageStore.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/spoolmanager/src/main/java/org/apache/james/FileSpoolMessageStore.java?rev=932865&r1=932864&r2=932865&view=diff
==============================================================================
--- 
james/server/trunk/spoolmanager/src/main/java/org/apache/james/FileSpoolMessageStore.java
 (original)
+++ 
james/server/trunk/spoolmanager/src/main/java/org/apache/james/FileSpoolMessageStore.java
 Sun Apr 11 10:43:20 2010
@@ -19,11 +19,14 @@
 package org.apache.james;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.mail.util.SharedFileInputStream;
 
 import org.apache.james.core.MimeMessageSource;
 import org.apache.james.lifecycle.Disposable;
@@ -107,6 +110,7 @@ public class FileSpoolMessageStore imple
 
         private File file;
         private String id;
+        private List<SharedFileInputStream> streams = new 
ArrayList<SharedFileInputStream>();
         
         private FileMimeMessageSource(File file) throws IOException {
             this.file = file;
@@ -114,8 +118,10 @@ public class FileSpoolMessageStore imple
         }
         
         @Override
-        public InputStream getInputStream() throws IOException {
-            return new FileInputStream(file);
+        public synchronized InputStream getInputStream() throws IOException {
+            SharedFileInputStream input = new SharedFileInputStream(file);
+            streams.add(input);
+            return input;
         }
 
         @Override
@@ -127,8 +133,19 @@ public class FileSpoolMessageStore imple
          * (non-Javadoc)
          * @see org.apache.james.lifecycle.Disposable#dispose()
          */
-        public void dispose() {
-            file.delete();
+        public synchronized void dispose() {
+            for (int i = 0; i < streams.size(); i++) {
+                SharedFileInputStream in = streams.get(i);
+                try {
+                    in.close();
+                } catch (IOException e) {
+                    // ignore on dispose
+                }
+            }
+            if (file != null) {
+                file.delete();
+                file = null;
+            }
         }
         
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to