Hi Joe,

thanks for your comments.

Yes the customer does not really want to insert a null value but create an 
empty text node. So they'll fix their code anyway.

However, I thought it would be a good Idea to make the Serializer more robust 
with regards to such null data. Especially given that it's possible via the DOM 
API to construct such null nodes. So I take you support this endeavor?

Thanks
Christoph

From: huizhe wang [mailto:huizhe.w...@oracle.com]
Sent: Dienstag, 8. November 2016 06:01
To: Langer, Christoph <christoph.lan...@sap.com>; Aleks Efimov 
<aleksej.efi...@oracle.com>; Lance Andersen <lance.ander...@oracle.com>
Cc: core-libs-dev@openjdk.java.net
Subject: Re: XALAN: Text node of value 'null' - Is this illegal or does XSLTC 
have an issue here?

Looks like a null check-in is desirable. If the intention is to add a text 
node, which I assume was his intention, he wouldn't want a null node. If the 
intention is to create an empty element, then he didn't need the line that 
added the null text node.

As far as DOM goes, it would have been better if it was clearer on how null be 
handled (a DOMException probably). But for a 10+ yr old API, the case is not 
enough to call for a change of the behavior.

Thanks,
Joe
On 11/7/2016 8:09 AM, Langer, Christoph wrote:
Hi Xalan experts,

I've recently handled a customer issue about Text Nodes of value 'null' inside 
a DOM, causing an exception during XALAN XSLT transformation. The repro case is 
quite simple. Consider the following small Java sample [1] which creates a DOM 
from a very basic XML, inserts a text node with value null into the DOM and 
then runs an identity transformation on it. Without inserting the null Text 
node, it would run without issues. However, the 
com.sun.org.apache.xml.internal.serializer.ToUnknownStream class stumbles over 
the null value and the transformation throws an NPE [2]. I believe this could 
be easily fixed by adding a null check in the serializer and handling null like 
"". However, would you agree that it is a real issue worth fixing or should one 
rather stress the point that Text Nodes of null are illegal? (Is that true, 
anyway? Didn't find any specification about that...) Please let me know your 
opinion - and if you agree I would work on a fix.

Thanks in advance for comments
Christoph


[1] Sample code:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;

public class TestTransformWithNullText {

                public static void main(String[] args) throws 
ParserConfigurationException, SAXException, IOException, TransformerException {
                               // create a small DOM
                               DocumentBuilder db = 
DocumentBuilderFactory.newInstance().newDocumentBuilder();
                               Document doc = db.parse(new 
ByteArrayInputStream("<?xml version=\"1.0\"?><DOCROOT/>".getBytes()));

                               // insert a bad element
                               Element e = doc.createElement("ERROR");
                               e.appendChild(doc.createTextNode(null));
                               doc.getDocumentElement().appendChild(e);

                               // transform
                               ByteArrayOutputStream bos = new 
ByteArrayOutputStream();
                               
TransformerFactory.newInstance().newTransformer().transform(
                                               new 
DOMSource(doc.getDocumentElement()), new StreamResult(bos));
                               System.out.println(bos);
                }

}

[2] Exception encountered:

Exception in thread "main" javax.xml.transform.TransformerException: 
java.lang.NullPointerException
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml@9.0.0.1-internal/TransformerImpl.java:789<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:789>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml@9.0.0.1-internal/TransformerImpl.java:376<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:376>)
        at 
com.sap.cl.xml.test.transform.TestTransformWithNullText.main(TestTransformWithNullText.java:33)
Caused by: java.lang.NullPointerException
        at 
com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(java.xml@9.0.0.1-internal/ToUnknownStream.java:342<mailto:java.xml@9.0.0.1-internal/ToUnknownStream.java:342>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:244<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:244>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:230<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:230>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:230<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:230>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:94<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:94>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(java.xml@9.0.0.1-internal/TransformerImpl.java:718<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:718>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml@9.0.0.1-internal/TransformerImpl.java:780<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:780>)
        ... 2 more
---------
java.lang.NullPointerException
        at 
com.sun.org.apache.xml.internal.serializer.ToUnknownStream.characters(java.xml@9.0.0.1-internal/ToUnknownStream.java:342<mailto:java.xml@9.0.0.1-internal/ToUnknownStream.java:342>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:244<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:244>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:230<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:230>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:230<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:230>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.parse(java.xml@9.0.0.1-internal/DOM2TO.java:94<mailto:java.xml@9.0.0.1-internal/DOM2TO.java:94>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transformIdentity(java.xml@9.0.0.1-internal/TransformerImpl.java:718<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:718>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml@9.0.0.1-internal/TransformerImpl.java:780<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:780>)
        at 
com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(java.xml@9.0.0.1-internal/TransformerImpl.java:376<mailto:java.xml@9.0.0.1-internal/TransformerImpl.java:376>)
        at 
com.sap.cl.xml.test.transform.TestTransformWithNullText.main(TestTransformWithNullText.java:33)

Reply via email to