Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6465722

Transformer NPE from NamespaceMappings.pushNamespace setting NS attr w/o prefix

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 1.4.0
    • 5.0u8
    • xml

        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&#39;>" +
                    "<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

              spericas Santiago Pericasgeertsen
              jglick Jesse Glick (Inactive)
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

                Created:
                Updated:
                Resolved:
                Imported:
                Indexed: