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]