-
Bug
-
Resolution: Fixed
-
P3
-
5.0u8
-
1.4
-
x86
-
linux
Issue | Fix Version | Assignee | Priority | Status | Resolution | Resolved In Build |
---|---|---|---|---|---|---|
JDK-2153438 | 7 | Joe Wang | P3 | Closed | Fixed | b14 |
JDK-2144798 | 6u2 | Santiago Pericasgeertsen | P3 | Closed | Won't Fix |
Compile and run the following program:
---%<---
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
public class Test {
public static void main(String[] args) throws Exception {
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().
getDOMImplementation().createDocument(null, "r", null);
d.getDocumentElement().setAttributeNS("http://nowhere.net/", "id", "1");
Transformer t = TransformerFactory.newInstance().newTransformer(
new StreamSource(new StringReader(IDENTITY_XSLT)));
t.transform(new DOMSource(d), new StreamResult(System.out));
}
private static final String IDENTITY_XSLT =
"<xsl:stylesheet version='1.0' " +
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" +
"<xsl:template match='@*|node()'>" +
"<xsl:copy>" +
"<xsl:apply-templates select='@*|node()'/>" +
"</xsl:copy>" +
"</xsl:template>" +
"</xsl:stylesheet>";
}
---%<---
Note that we are setting an attribute in a namespace, but not specifying a prefix-qualified name.
Expected output is to generate a prefix, e.g.:
---%<---
<?xml version="1.0" encoding="UTF-8"?>
<r xmlns:ns0="http://nowhere.net/" ns0:id="1"/>
---%<---
Output on JDK 1.4 is incorrect (the element should not be in a namespace) but finishes:
---%<---
java version "1.4.2_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_09-b05)
Java HotSpot(TM) Client VM (build 1.4.2_09-b05, mixed mode)
<?xml version="1.0" encoding="UTF-8"?>
<r xmlns="http://nowhere.net/" id="1"/>
---%<---
But on JDK 5, using XSLTC, an exception is thrown from the serializer:
---%<---
java version "1.5.0_08"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03)
Java HotSpot(TM) Client VM (build 1.5.0_08-b03, mixed mode, sharing)
ERROR: 'java.lang.NullPointerException'
Exception in thread "main" javax.xml.transform.TransformerException: com.sun.org.apache.xalan.internal.xsltc.TransletException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:648)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:281)
at Test.main(Test.java:16)
Caused by: com.sun.org.apache.xalan.internal.xsltc.TransletException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl.shallowCopy(SAXImpl.java:1735)
at com.sun.org.apache.xalan.internal.xsltc.dom.DOMAdapter.shallowCopy(DOMAdapter.java:304)
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.applyTemplates()
at GregorSamsa.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:594)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:644)
... 2 more
---------
com.sun.org.apache.xalan.internal.xsltc.TransletException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl.shallowCopy(SAXImpl.java:1735)
at com.sun.org.apache.xalan.internal.xsltc.dom.DOMAdapter.shallowCopy(DOMAdapter.java:304)
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.applyTemplates()
at GregorSamsa.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:594)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:644)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:281)
at Test.main(Test.java:16)
---%<---
The same error can be seen in JDK 6 b97 as well.
Besides the obvious bug that an exception is thrown, it is a bug that SAXImpl.shallowCopy catches the NullPointerException and yet throws a com.sun.org.apache.xalan.internal.xsltc.TransletException which discards the stack trace. The code
public TransletException(Exception e) {
super(e.toString());
}
ought to read
public TransletException(Exception e) {
super(e.toString());
initCause(e);
}
Using a debugger with exception breakpoints, it can be seen that the NullPointerException is thrown from line 196:
if (prefix.startsWith(XML_PREFIX))
in com.sun.org.apache.xml.internal.serializer.NamespaceMappings.pushNamespace. The truncated part of the call stack is:
NamespaceMappings.pushNamespace:196
ToStream.startPrefixMapping:2107
ToUnknownStream.emitFirstTag:1060
ToUnknownStream.flush:1203
ToUnknownStream.addAttribute:284
SAX2DTM2.copyAttribute:3316
SAXImpl.shallowCopy:1723
---%<---
import java.io.StringReader;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.w3c.dom.Document;
public class Test {
public static void main(String[] args) throws Exception {
Document d = DocumentBuilderFactory.newInstance().newDocumentBuilder().
getDOMImplementation().createDocument(null, "r", null);
d.getDocumentElement().setAttributeNS("http://nowhere.net/", "id", "1");
Transformer t = TransformerFactory.newInstance().newTransformer(
new StreamSource(new StringReader(IDENTITY_XSLT)));
t.transform(new DOMSource(d), new StreamResult(System.out));
}
private static final String IDENTITY_XSLT =
"<xsl:stylesheet version='1.0' " +
"xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>" +
"<xsl:template match='@*|node()'>" +
"<xsl:copy>" +
"<xsl:apply-templates select='@*|node()'/>" +
"</xsl:copy>" +
"</xsl:template>" +
"</xsl:stylesheet>";
}
---%<---
Note that we are setting an attribute in a namespace, but not specifying a prefix-qualified name.
Expected output is to generate a prefix, e.g.:
---%<---
<?xml version="1.0" encoding="UTF-8"?>
<r xmlns:ns0="http://nowhere.net/" ns0:id="1"/>
---%<---
Output on JDK 1.4 is incorrect (the element should not be in a namespace) but finishes:
---%<---
java version "1.4.2_09"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_09-b05)
Java HotSpot(TM) Client VM (build 1.4.2_09-b05, mixed mode)
<?xml version="1.0" encoding="UTF-8"?>
<r xmlns="http://nowhere.net/" id="1"/>
---%<---
But on JDK 5, using XSLTC, an exception is thrown from the serializer:
---%<---
java version "1.5.0_08"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_08-b03)
Java HotSpot(TM) Client VM (build 1.5.0_08-b03, mixed mode, sharing)
ERROR: 'java.lang.NullPointerException'
Exception in thread "main" javax.xml.transform.TransformerException: com.sun.org.apache.xalan.internal.xsltc.TransletException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:648)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:281)
at Test.main(Test.java:16)
Caused by: com.sun.org.apache.xalan.internal.xsltc.TransletException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl.shallowCopy(SAXImpl.java:1735)
at com.sun.org.apache.xalan.internal.xsltc.dom.DOMAdapter.shallowCopy(DOMAdapter.java:304)
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.applyTemplates()
at GregorSamsa.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:594)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:644)
... 2 more
---------
com.sun.org.apache.xalan.internal.xsltc.TransletException: java.lang.NullPointerException
at com.sun.org.apache.xalan.internal.xsltc.dom.SAXImpl.shallowCopy(SAXImpl.java:1735)
at com.sun.org.apache.xalan.internal.xsltc.dom.DOMAdapter.shallowCopy(DOMAdapter.java:304)
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.template$dot$0()
at GregorSamsa.applyTemplates()
at GregorSamsa.applyTemplates()
at GregorSamsa.transform()
at com.sun.org.apache.xalan.internal.xsltc.runtime.AbstractTranslet.transform(AbstractTranslet.java:594)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:644)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:281)
at Test.main(Test.java:16)
---%<---
The same error can be seen in JDK 6 b97 as well.
Besides the obvious bug that an exception is thrown, it is a bug that SAXImpl.shallowCopy catches the NullPointerException and yet throws a com.sun.org.apache.xalan.internal.xsltc.TransletException which discards the stack trace. The code
public TransletException(Exception e) {
super(e.toString());
}
ought to read
public TransletException(Exception e) {
super(e.toString());
initCause(e);
}
Using a debugger with exception breakpoints, it can be seen that the NullPointerException is thrown from line 196:
if (prefix.startsWith(XML_PREFIX))
in com.sun.org.apache.xml.internal.serializer.NamespaceMappings.pushNamespace. The truncated part of the call stack is:
NamespaceMappings.pushNamespace:196
ToStream.startPrefixMapping:2107
ToUnknownStream.emitFirstTag:1060
ToUnknownStream.flush:1203
ToUnknownStream.addAttribute:284
SAX2DTM2.copyAttribute:3316
SAXImpl.shallowCopy:1723
- backported by
-
JDK-2144798 Transformer NPE from NamespaceMappings.pushNamespace setting NS attr w/o prefix
-
- Closed
-
-
JDK-2153438 Transformer NPE from NamespaceMappings.pushNamespace setting NS attr w/o prefix
-
- Closed
-