[ 
https://issues.apache.org/jira/browse/KARAF-4802?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Frederic ARNOUD updated KARAF-4802:
-----------------------------------
    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()}}
                => call 
{{sun.net.www.protocol.file.FileURLConnection#getLastModified()}}
                => call 
{{sun.net.www.protocol.file.FileURLConnection#initializeHeaders()}}
                => call 
{{sun.net.www.protocol.file.FileURLConnection#connect()}}
                        line 57: {{this.connected}} is {{false}}
                        line 61: {{this.isDirectory}} is {{false}}
                        *Here they open the input stream:*
                        line 69: open input stream and keep it in this.is

_Note:_
Bad code 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:*
{code:java}
    protected static long getLastModified(URL url) throws IOException {
        URLConnection urlConnection = url.openConnection();
        try(InputStream is = urlConnection.getInputStream()) {
            return urlConnection.getLastModified();
        }
    }
{code}

To avoid risk to open remote stream twice, I did this in my code (in function 
similar to {{transform(URL, OutputStream)}}):
{code:java}
        final URLConnection urlConnection = url.openConnection();
        // keep original last modification date
        final long lastModified = urlConnection.getLastModified();
        try (InputStream in = urlConnection.getInputStream()) {
            source = readAllBytes(in);
        }
{code}

*Note:*
Since no object reference the InputStream, InputStream class will automatically 
close the stream while processing the finalization.
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 deployer (not checked).

  was:
In org.apache.karaf.deployer.blueprint-4.0.7-sources.jar:

org/apache/karaf/deployer/blueprint/BlueprintTransformer.java:94:
        {{url.openConnection().getLastModified()}}
                => call 
{{sun.net.www.protocol.file.FileURLConnection#getLastModified()}}
                => call 
{{sun.net.www.protocol.file.FileURLConnection#initializeHeaders()}}
                => call 
{{sun.net.www.protocol.file.FileURLConnection#connect()}}
                        line 57: {{this.connected}} is {{false}}
                        line 61: {{this.isDirectory}} is {{false}}
                        *Here they open the input stream:*
                        line 69: open input stream and keep it in this.is

_Note:_
Bad code 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:*
{code:java}
    protected static long getLastModified(URL url) throws IOException {
        URLConnection urlConnection = url.openConnection();
        try(InputStream is = urlConnection.getInputStream()) {
            return urlConnection.getLastModified();
        }
    }
{code}

To avoid risk to open remote stream twice, I did this in my code (in function 
similar to {{transform(URL, OutputStream)}}):
{code:java}
        final URLConnection urlConnection = url.openConnection();
        // keep original last modification date
        final long lastModified = urlConnection.getLastModified();
        try (InputStream in = urlConnection.getInputStream()) {
            source = readAllBytes(in);
        }
{code}

*Note:*
Since no object reference the InputStream, InputStream class will automatically 
close the stream while processing the finalization.
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 deployer (not checked).


> Auto Deploy does not release resource
> -------------------------------------
>
>                 Key: KARAF-4802
>                 URL: https://issues.apache.org/jira/browse/KARAF-4802
>             Project: Karaf
>          Issue Type: Bug
>          Components: karaf-core
>    Affects Versions: 4.0.5, 4.0.7
>         Environment: JDK 1.8.0_102 / Win10 (x64)
>            Reporter: Frederic ARNOUD
>              Labels: leak
>   Original Estimate: 2h
>  Remaining Estimate: 2h
>
> *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()}}
>               => call 
> {{sun.net.www.protocol.file.FileURLConnection#getLastModified()}}
>               => call 
> {{sun.net.www.protocol.file.FileURLConnection#initializeHeaders()}}
>               => call 
> {{sun.net.www.protocol.file.FileURLConnection#connect()}}
>                       line 57: {{this.connected}} is {{false}}
>                       line 61: {{this.isDirectory}} is {{false}}
>                       *Here they open the input stream:*
>                       line 69: open input stream and keep it in this.is
> _Note:_
> Bad code 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:*
> {code:java}
>     protected static long getLastModified(URL url) throws IOException {
>         URLConnection urlConnection = url.openConnection();
>         try(InputStream is = urlConnection.getInputStream()) {
>             return urlConnection.getLastModified();
>         }
>     }
> {code}
> To avoid risk to open remote stream twice, I did this in my code (in function 
> similar to {{transform(URL, OutputStream)}}):
> {code:java}
>         final URLConnection urlConnection = url.openConnection();
>         // keep original last modification date
>         final long lastModified = urlConnection.getLastModified();
>         try (InputStream in = urlConnection.getInputStream()) {
>             source = readAllBytes(in);
>         }
> {code}
> *Note:*
> Since no object reference the InputStream, InputStream class will 
> automatically close the stream while processing the finalization.
> 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 deployer (not checked).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to