Berin Loritsch wrote:

>Darren Gibbons wrote:
>
>>Hi all,
>>
>>I'm using Tomcat4+Cocoon2rc1a on Windows NT4 Workstation.  I've run into a
>>strange problem when editing XSL files.  After starting up Tomcat, I can
>>edit and save my XSL files without any problems.  However, if I access a
>>page that uses one of these XSL files, Tomcat sometimes "locks" the file,
>>and makes further saving of the file impossible.
>>
<snip/>

>>The odd thing is, it's not always reproducible.  Sometimes I'll be able to
>>perform several rounds of editing and saving before the error shows up.
>>Shutting down and restarting Tomcat clears the error every time.
>>
>>Any ideas?  Any suggestions of IDE's that don't display this behaviour?
>>This makes editing somewhat frustrating after a while.
>>
>An exception is probably being thrown and and caught before the stream is
>closed.  Can someone verify that all streams are closed in a "finally" block?
>
I have experienced the same problem and now hope to have found the 
culprit. In org.apache.cocoon.components.xslt.XSLTProcessorImpl (CVS 
Version 1.0), check out the function transform() and locate the 
following lines:

>       InputSource is = source.getInputSource();
>       getLogger().debug("XSLTProcessorImpl: starting transform");
>       transformer.transform(new StreamSource(is.getByteStream(),
>                                              is.getSystemId()),
>                             result);

You see the is.getByteStream() call ? It returns an opened InputStream, 
which is not being explicitly closed anywhere near. According to the 
Java Bug Database, a lock is being maintained as long as the InputStream 
remains open - in this case until it is being garbage-collected.

I guess that the sporadic locking of XSLT files arises due to the opened 
InputStream returned by is.getByteStream() is only then being closed 
when the StreamSource object is being garbage-collected. StreamSource 
does not offer any direct method of closing the stream, and the 
semantics of transform() do not imply that the Source is explictly being 
closed by that operation. As I currently cannot test my assumption, it 
would be cool if anyone could test it by turning it into something like this

>       InputSource is = source.getInputSource();
>       InputStream bs = is.getByteStream();
>       getLogger().debug("XSLTProcessorImpl: starting transform");
>       transformer.transform(new StreamSource(bs,
>                                              is.getSystemId()),
>                             result);
>       bs.close();

and give it a try.

Best regards,

Michael Hartle,
Hartle & Klug GbR


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to