From 359ac4f9675dc4c2bb7add039015fc00f403e9d8 Mon Sep 17 00:00:00 2001 From: Antoine Levy-Lambert Date: Thu, 21 Sep 2006 04:04:32 +0000 Subject: [PATCH] patch submitted by Xavier Hanin, mainly closing HttpURLConnection git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@448452 13f79535-47bb-0310-9956-ffa450edef68 --- CONTRIBUTORS | 1 + WHATSNEW | 2 +- contributors.xml | 4 ++ src/etc/testcases/types/resources/build.xml | 5 +- .../ant/types/resources/URLResource.java | 55 +++++++++++++++---- 5 files changed, 55 insertions(+), 12 deletions(-) diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 883d354ce..b732bb212 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -255,6 +255,7 @@ Wolf Siberski Wolfgang Baer Wolfgang Frech Wolfgang Werner +Xavier Hanin Xavier Witdouck Yohann Roussel Yuji Yamano diff --git a/WHATSNEW b/WHATSNEW index f3b661678..3308d1b82 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -20,7 +20,7 @@ Fixed bugs: * the ant wrapper script should now correctly locate the java executable in more recent IBM JDKs for AIX as well. -* URLResource did not close jar files. +* URLResource did not close jar files, and also did not disconnect HTTPConnection (s). * created junitvmwatcher*.properties files but did not close and delete them. diff --git a/contributors.xml b/contributors.xml index b88f78399..2b8bafaa7 100644 --- a/contributors.xml +++ b/contributors.xml @@ -1014,6 +1014,10 @@ Wolfgang Werner + + Xavier + Hanin + Xavier Witdouck diff --git a/src/etc/testcases/types/resources/build.xml b/src/etc/testcases/types/resources/build.xml index 96c84b9df..52fa64718 100755 --- a/src/etc/testcases/types/resources/build.xml +++ b/src/etc/testcases/types/resources/build.xml @@ -320,7 +320,10 @@ depends="testfileset,testdirset,testfilelist,testpath,testzipfileset,testpropert - + + + + diff --git a/src/main/org/apache/tools/ant/types/resources/URLResource.java b/src/main/org/apache/tools/ant/types/resources/URLResource.java index 74466f1b8..c7a2e0161 100644 --- a/src/main/org/apache/tools/ant/types/resources/URLResource.java +++ b/src/main/org/apache/tools/ant/types/resources/URLResource.java @@ -22,6 +22,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.net.MalformedURLException; @@ -148,6 +149,28 @@ public class URLResource extends Resource { if (isReference()) { return ((Resource) getCheckedRef()).isExists(); } + return isExists(false); + } + + /** + * Find out whether the URL exists, and close the connection + * opened to the URL if closeConnection is true. + * + * Note that this method does ensure that if: + * - the resource exists (if it returns true) + * - and if the current object is not a reference + * (isReference() returns false) + * - and if it was called with closeConnection to false, + * + * then the connection to the URL (stored in the conn + * private field) will be opened, and require to be closed + * by the caller. + * + * @param closeConnection true if the connection should be closed + * after the call, false if it should stay open. + * @return true if this resource exists. + */ + private synchronized boolean isExists(boolean closeConnection) { if (getURL() == null) { return false; } @@ -156,9 +179,14 @@ public class URLResource extends Resource { return true; } catch (IOException e) { return false; + } finally { + if (closeConnection) { + close(); + } } } + /** * Tells the modification time in milliseconds since 01.01.1970 . * @@ -169,15 +197,10 @@ public class URLResource extends Resource { if (isReference()) { return ((Resource) getCheckedRef()).getLastModified(); } - if (!isExists()) { - return 0L; - } - try { - connect(); - return conn.getLastModified(); - } catch (IOException e) { + if (!isExists(false)) { return 0L; } + return conn.getLastModified(); } /** @@ -199,7 +222,7 @@ public class URLResource extends Resource { if (isReference()) { return ((Resource) getCheckedRef()).getSize(); } - if (!isExists()) { + if (!isExists(false)) { return 0L; } try { @@ -271,6 +294,7 @@ public class URLResource extends Resource { * Resource as a stream. * @throws UnsupportedOperationException if OutputStreams are not * supported for this Resource type. + * @throws IOException if the URL cannot be opened. */ public synchronized OutputStream getOutputStream() throws IOException { if (isReference()) { @@ -286,6 +310,7 @@ public class URLResource extends Resource { /** * Ensure that we have a connection. + * @throws IOException if the connection cannot be established. */ protected synchronized void connect() throws IOException { URL u = getURL(); @@ -304,7 +329,15 @@ public class URLResource extends Resource { } } - private void close() { + /** + * Closes the URL connection if: + * - it is opened (i.e. the field conn is not null) + * - this type of URLConnection supports some sort of close mechanism + * + * This method ensures the field conn will be null after the call. + * + */ + private synchronized void close() { if (conn != null) { try { if (conn instanceof JarURLConnection) { @@ -312,9 +345,11 @@ public class URLResource extends Resource { JarFile jf = juc.getJarFile(); jf.close(); jf = null; + } else if (conn instanceof HttpURLConnection) { + ((HttpURLConnection) conn).disconnect(); } } catch (IOException exc) { - + //ignore } finally { conn = null; }