You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by "JF (JIRA)" <xa...@xml.apache.org> on 2010/07/06 13:57:49 UTC

[jira] Created: (XALANJ-2517) xmlns:redirect="http://xml.apache.org/xalan/redirect" write does not close File handle

xmlns:redirect="http://xml.apache.org/xalan/redirect" write does not close File handle
--------------------------------------------------------------------------------------

                 Key: XALANJ-2517
                 URL: https://issues.apache.org/jira/browse/XALANJ-2517
             Project: XalanJ2
          Issue Type: Improvement
      Security Level: No security risk; visible to anyone (Ordinary problems in Xalan projects.  Anybody can view the issue.)
          Components: Xalan-extensions
    Affects Versions: 2.7.1
         Environment: Windows Server standard 2008 SP2 32bit
            Reporter: JF
            Priority: Critical


When using the redirect extension with XSLTC;

				System.setProperty("javax.xml.transform.TransformerFactory",
					"org.apache.xalan.xsltc.trax.TransformerFactoryImpl");

the following 

<redirect:write file="{$lopFile}">
				<LopNumber><xsl:value-of select="$lopNumber"/></LopNumber>
				<xsl:fallback><xsl:message terminate="yes">Outputing of lops requires http://xml.apache.org/xalan/redirect:write, if you are using another processor or xslt2.0 there are other choices, not implemented yet</xsl:message></xsl:fallback>
		    </redirect:write>

does not close the File handle it creates.

This causes me problems as I cannot delete the file ( I use it to output temporary data ), and it is running in a server app that then clogs up the temp dir.

If I call System.gc() after the transform call it is cleaned up.  This is a work around ( short of changing the Xalan code, or using my own handler  ). There does not seem to be any opportunity to override TransletOutputHandlerFactory.

You can watch the behaviour in ProcessMonitor from sysinternals to confirm this is what is happening.

Tracing the source I find that;

AbstractTranslet
 public void closeOutputHandler(SerializationHandler handler) {
	try {
	    handler.endDocument();
	    handler.close();
	}
	catch (Exception e) {
	    // what can you do?
	}
    }

calls close on the SerializationHandler. BUT  the handler instance is of type org.apache.xml.serializer.ToXMLStream
which does not override the close method of org.apache.xml.serializer.SerializerBase ( which after all does have the writer var ), this in turn does nothing.




-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-dev-help@xml.apache.org