Details
Description
Calling getLastModified() opens the input stream.
In org.apache.karaf.deployer.blueprint-4.0.7-sources.jar:
org/apache/karaf/deployer/blueprint/BlueprintTransformer.java:94:
url.openConnection().getLastModified()
=> calls sun.net.www.protocol.file.FileURLConnection#getLastModified()
=> calls sun.net.www.protocol.file.FileURLConnection#initializeHeaders()
=> calls sun.net.www.protocol.file.FileURLConnection#connect()
in this function at line 57: this.connected is false
and line 61: this.isDirectory is false
Here they open the input stream:
error source is at line 69: open input stream and keep it in this.is
Note:
There's a mistake at line (since they try to open the stream):
sun/net/www/protocol/file/FileURLConnection.java:90 with a nice empty try/catch!
AFAIK, there's no way to know if stream was open or not.
I checked HttpURLConnection, it does the same (and HttpsURLConnection also).
IMHO you should add a function like this one (in BlueprintTransformer.java):
protected static long getLastModified(URL url) throws IOException { URLConnection urlConnection = url.openConnection(); try(InputStream is = urlConnection.getInputStream()) { return urlConnection.getLastModified(); } }
To limit number of stream access, I did this in my code (in function similar to transform(URL, OutputStream)):
final URLConnection urlConnection = url.openConnection(); // keep original last modification date final long lastModified = urlConnection.getLastModified(); try (InputStream in = urlConnection.getInputStream()) { source = readAllBytes(in); }
Note:
When no object reference the InputStream, InputStream class will automatically close the stream while processing finalizations.
Before this process, we cannot delete file in deploy directory.
(sorry I did not find component for this class)
Same issue should appear in other deployers (not checked).