|
|
@@ -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; |
|
|
|
} |
|
|
|