You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@xalan.apache.org by bu...@apache.org on 2002/02/27 23:59:03 UTC
DO NOT REPLY [Bug 6750] New: -
Reusing a Transformer causes a NullPointerException
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6750>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6750
Reusing a Transformer causes a NullPointerException
Summary: Reusing a Transformer causes a NullPointerException
Product: XalanJ2
Version: CurrentCVS
Platform: PC
OS/Version: Linux
Status: NEW
Severity: Critical
Priority: Other
Component: org.apache.xalan.transformer
AssignedTo: xalan-dev@xml.apache.org
ReportedBy: dminard@objectiveEdge.com
ENVIRONMENT:
* Linux 2.4.7
* JDK: IBMJava2-13 or Sun JDK 1.3.1 or 1.4
* Xalan 2.3.1 (downloaded as "xalan-j_20020227-bin.tar.gz"
from "http://xml.apache.org/dist/xalan-j/nightly/2002-02-27")
DETAILS:
I have a Java app that re-uses a transformer (significant optimization!). The
xslt script declares a variable containing a result tree fragment. After
enough iterations, I get the following stack dump:
javax.xml.transform.TransformerException: java.lang.NullPointerException
at java.lang.Throwable.<init>(Throwable.java:96)
at java.lang.Exception.<init>(Exception.java:44)
at javax.xml.transform.TransformerException.<init>(Unknown Source)
at org.apache.xalan.transformer.TransformerImpl.transformNode
(TransformerImpl.java:1226)
at org.apache.xalan.transformer.TransformerImpl.transform
(TransformerImpl.java:634)
at org.apache.xalan.transformer.TransformerImpl.transform
(TransformerImpl.java:1088)
at org.apache.xalan.transformer.TransformerImpl.transform
(TransformerImpl.java:1066)
at testCase.main(bug.java(Compiled Code))
---------
java.lang.NullPointerException
at org.apache.xpath.objects.XRTreeFrag.xstr(XRTreeFrag.java:256)
at org.apache.xpath.objects.XObject.dispatchCharactersEvents
(XObject.java:187)
at org.apache.xpath.Expression.executeCharsToContentHandler
(Expression.java:303)
at org.apache.xalan.templates.ElemValueOf.execute(ElemValueOf.java:319)
at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes
(ElemApplyTemplates.java(Compiled Code))
at org.apache.xalan.templates.ElemApplyTemplates.execute
(ElemApplyTemplates.java:226)
at org.apache.xalan.templates.ElemApplyTemplates.transformSelectedNodes
(ElemApplyTemplates.java(Compiled Code))
at org.apache.xalan.templates.ElemApplyTemplates.execute
(ElemApplyTemplates.java:226)
at org.apache.xalan.transformer.TransformerImpl.executeChildTemplates
(TransformerImpl.java:2243)
at org.apache.xalan.transformer.TransformerImpl.applyTemplateToNode
(TransformerImpl.java:2069)
at org.apache.xalan.transformer.TransformerImpl.transformNode
(TransformerImpl.java:1171)
at org.apache.xalan.transformer.TransformerImpl.transform
(TransformerImpl.java:634)
at org.apache.xalan.transformer.TransformerImpl.transform
(TransformerImpl.java:1088)
at org.apache.xalan.transformer.TransformerImpl.transform
(TransformerImpl.java:1066)
at testCase.main(testCase.java(Compiled Code))
==============================================================================
The problem may be related to Bug 6156 (a problem where-by the variable stack
and the cached result tree fragments weren't properly reset)...but since 6156
has been closed, this may be an unrelated issue.
Also, it appears that the problem consistently occurs following a garbage
collection. I've reproduced the problem using all of the recent sun and ibm
jdks. Using the sample testCase I'm attaching, I usually see the problem
before the 1000th iteration, but it isn't predictable (which again makes me
believe that is it somehow related to garbage collection)
Steps to Reproduce
===================
testCase.java:
import java.io.FileReader;
import java.io.StringWriter;
import javax.xml.transform.ErrorListener;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.Transformer;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
public class testCase
{
public static void main(String args[])
{
if (args.length != 2)
{
System.err.println("Usage: testCase <xsltScriptFileName>
<xsltInputFileName>");
System.exit(-1);
}
String xsltScriptFileName = args[0];
String xsltInputFileName = args[1];
try
{
Source xsltSource=new StreamSource(new FileReader
(xsltScriptFileName));
TransformerFactory tFactory = TransformerFactory.newInstance();
Templates templates = tFactory.newTemplates(xsltSource);
Transformer transformer = templates.newTransformer();
for (int i=0; i<999999; i++)
{
Source xsltInputSource
= new StreamSource(new FileReader(xsltInputFileName));
StringWriter outputBuffer = new StringWriter();
StreamResult xsltResult = new StreamResult(outputBuffer);
// if you uncomment the following line the problem goes away
// but it's significantly more optimal to reuse the transformer
//transformer = templates.newTransformer();
transformer.transform(xsltInputSource, xsltResult);
System.err.println("Finished translation #" + i);
}
}
catch (Exception e)
{
System.err.println("Caught exception + " + e.getMessage());
e.printStackTrace();
System.exit(-1);
}
}
}
Sample XSLT Script and XSLT Input
==================================
testCaseInput.xslt:
<xsl:stylesheet
version='1.0'
extension-element-prefixes='oeif oeib oeil oeiv oeisql'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method='text'/>
<xsl:variable name="fieldSep">
<xsl:text>'</xsl:text>
</xsl:variable>
<xsl:variable name="recSep">
<xsl:text>
</xsl:text>
</xsl:variable>
<!-- Detail record -->
<xsl:template match="//detail">
<xsl:text>D</xsl:text>
<xsl:value-of select="//fdr_no_rep"/>
<xsl:value-of select="$fieldSep"/>
<xsl:value-of select="$recSep"/>
</xsl:template>
</xsl:stylesheet>
testCaseInput.xml:
<document>
<detail>
<fdr_no_rep>5
</fdr_no_rep>
</detail>
</document>
Running the test case
======================
java testCase input.xsl input.xml
Results
========
Finished translation #0
...
Finished translation #xxxx (usually < 1000, but depends on the jvm and the
memory allocated to the heap)
Caught exception + java.lang.NullPointerException