On 9/20/06, Matt Benson <[EMAIL PROTECTED]> wrote:
--- Antoine Levy-Lambert <[EMAIL PROTECTED]> wrote:
> Hello Xavier,
>
> the patch is welcome, but I do not see the
> attachment ? maybe it
> comes from my email reader.
Nor did I. :)
This is weird, I see it in gmail... Is it using some fancy thing to attach
files?
Anyway, here is the patch in plain text:
Index: src/main/org/apache/tools/ant/types/resources/URLResource.java
===================================================================
--- src/main/org/apache/tools/ant/types/resources/URLResource.java
(revision 448066)
+++ src/main/org/apache/tools/ant/types/resources/URLResource.java
(working copy)
@@ -22,6 +22,7 @@
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;
@@ -145,6 +146,28 @@
* @return true if this resource exists.
*/
public synchronized boolean isExists() {
+ return isExists(true);
+ }
+
+ /**
+ * 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 (isReference()) {
return ((Resource) getCheckedRef()).isExists();
}
@@ -156,9 +179,14 @@
return true;
} catch (IOException e) {
return false;
+ } finally {
+ if (closeConnection) {
+ close();
+ }
}
}
+
/**
* Tells the modification time in milliseconds since 01.01.1970 .
*
@@ -169,10 +197,12 @@
if (isReference()) {
return ((Resource) getCheckedRef()).getLastModified();
}
- if (!isExists()) {
+ if (!isExists(false)) {
return 0L;
}
try {
+ // note that this call to connect() is not necessary:
+ // isExists returned true and isReference returned false
connect();
return conn.getLastModified();
} catch (IOException e) {
@@ -177,6 +207,8 @@
return conn.getLastModified();
} catch (IOException e) {
return 0L;
+ } finally {
+ close();
}
}
@@ -199,16 +231,18 @@
if (isReference()) {
return ((Resource) getCheckedRef()).getSize();
}
- if (!isExists()) {
+ if (!isExists(false)) {
return 0L;
}
try {
+ // note that this call to connect() is not necessary:
+ // isExists returned true and isReference returned false
connect();
- long contentlength = conn.getContentLength();
- close();
- return contentlength;
+ return conn.getContentLength();
} catch (IOException e) {
return UNKNOWN_SIZE;
+ } finally {
+ close();
}
}
@@ -260,7 +294,7 @@
try {
return conn.getInputStream();
} finally {
- conn = null;
+ close();
}
}
@@ -280,7 +314,7 @@
try {
return conn.getOutputStream();
} finally {
- conn = null;
+ close();
}
}
@@ -304,7 +338,15 @@
}
}
- 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,6 +354,8 @@
JarFile jf = juc.getJarFile();
jf.close();
jf = null;
+ } else if (conn instanceof HttpURLConnection) {
+ ((HttpURLConnection) conn).disconnect();
}
} catch (IOException exc) {
@@ -327,7 +371,7 @@
*/
protected void finalize() throws Throwable {
close();
- conn = null;
+ conn = null; // Note: already done by close();
super.finalize();
}