Hi,

 

Here is a serious issue in the
org.apache.commons.vfs.util.MonitorInputStream (and so it is also in
org.apache.commons.vfs.provider.DefaultFileContent$FileContentInputStream)

 

FileContentInputStream extends MonitorInputStream extends
BufferedInputStream

So they support < mark > (stream.markSupported() returns true)

 

But in MonitorInputStream.read(), when reaching the end of the stream, there
is a call to close() regardless if 'mark' is positioned.

 To respect BufferedInputStream specifications we shouldn't close the stream
in order to be able to call reset() on the stream and return in the state i
twas when we called mark().

 

Usually doing the folowing before using mark feature :

        if (!stream.markSupported()) {

            stream = new BufferedInputStream(stream);

        }

Won't work with a VFS stream.

 

So what i did :

        if (!stream.markSupported() || stream instanaceof
MonitorInputStream) { //Hack to solve a VFS issue

            stream = new BufferedInputStream(stream);

        }

 

I inform you also that in the BufferedInputStream.close() doc, it'written :

< Once the stream has been closed, further read(), available(), reset(), or
skip() invocations will throw an IOException. >

And in the MonitorInputStream, if we call read() after close() it returns
'-1'.

 

Thank you in advance for solving this issue (may be somewhat difficult not
to break compatibility with code that uses this specific usage)

 

IMHO,

I think < end-of-stream monitoring > doesn't mean < close when reach the end
> but should mean < propose a way to execute some code when reaching the end
> but anyway if we put a call to close() in this code it breaks the
habillity to call reset().

As this class consequently modify the comportment from the super class it
should be more documented and explain what it does.

I would say that your class is currently doing end-of-stream autoClose and
after-close monitoring.

Maybe it shouldn't extends BufferedInputStream to avoid confusion and don't
try to support 'mark' (respond false in markSupported()) as it doesn't seem
to serve you.

 

Regards,

 

KERDUDOU Ronan

VIRAGE Group (France)

+33 2 53 55 10 22

r...@viragegroup.com

www.viragegroup.com <http://www.viragegroup.com/> 

 

 

Reply via email to