You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by bo...@apache.org on 2009/09/01 16:10:12 UTC

svn commit: r810063 - /ant/core/trunk/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java

Author: bodewig
Date: Tue Sep  1 14:10:12 2009
New Revision: 810063

URL: http://svn.apache.org/viewvc?rev=810063&view=rev
Log:
ensure classloaders get cleaned up when no longer needed

Modified:
    ant/core/trunk/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java

Modified: ant/core/trunk/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java?rev=810063&r1=810062&r2=810063&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/types/resources/AbstractClasspathResource.java Tue Sep  1 14:10:12 2009
@@ -24,6 +24,7 @@
 import org.apache.tools.ant.types.Reference;
 import org.apache.tools.ant.util.FileUtils;
 
+import java.io.FilterInputStream;
 import java.io.InputStream;
 import java.io.IOException;
 import java.util.Stack;
@@ -172,6 +173,7 @@
         }
         dieOnCircularReference();
         ClassLoader cl = null;
+        boolean clNeedsCleanup = false;
         if (loader != null) {
             cl = (ClassLoader) loader.getReferencedObject();
         }
@@ -186,6 +188,7 @@
                                                           getProject(),
                                                           p, false);
                 }
+                clNeedsCleanup = loader != null;
             } else {
                 cl = JavaResource.class.getClassLoader();
             }
@@ -194,7 +197,22 @@
             }
         }
 
-        return openInputStream(cl);
+        final ClassLoader classLoader = cl;
+        return !clNeedsCleanup
+            ? openInputStream(cl)
+            : new FilterInputStream(openInputStream(cl)) {
+                    public void close() throws IOException {
+                        FileUtils.close(in);
+                        ((AntClassLoader) classLoader).cleanup();
+                    }
+                    protected void finalize() throws Throwable {
+                        try {
+                            close();
+                        } finally {
+                            super.finalize();
+                        }
+                    }
+                };
     }
 
     /**