[ 
https://issues.apache.org/jira/browse/CXF-9037?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Gordon Freeman updated CXF-9037:
--------------------------------
    Description: 
I am using custom out interceptor, which make xsl transformation to serialize 
some elements as CDATA, my code was inspired by 
org.apache.cxf.feature.transform.XSLTOutInterceptor.

But if I set property com.ctc.wstx.returnNullForDefaultNamespace=true, the I've 
got an NPE. This property is required to fix some other issues with xml 
generation (without it I've got empty namespaces xmlns="" in some cases).

The code bellow is the minimum example of NPE, using 
org.apache.cxf.staxutils.StaxSource.

 
{code:java}
Exception in thread "main" java.lang.NullPointerException: Cannot invoke 
"String.equals(Object)" because "prefix" is null 
       at 
net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:300)
 
       at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145) 
       at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259) 
       at 
net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:192) 
       at net.sf.saxon.event.Sender.send(Sender.java:104) 
       at 
net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)


{code}
{code:java}
package test;

import com.ctc.wstx.stax.WstxInputFactory;
import org.apache.cxf.staxutils.StaxSource;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;

public class NpeTest
{
    public static void main(String[] args) throws Exception
    {
        String bodyXml = "<?xml version=\"1.0\"?>\n" +
                "<soap:Envelope 
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\";>\n" +
                "  <soap:Body>\n" +
                "    <testReq xmlns=\"http://test.com/test\";>\n" +
                "        <reqBody>&lt;&lt;&lt;&lt;&lt;</reqBody>\n" +
                "    </testReq>\n" +
                "  </soap:Body>\n" +
                "</soap:Envelope>\n";

        System.setProperty("com.ctc.wstx.returnNullForDefaultNamespace", 
"true");

        WstxInputFactory factory = new WstxInputFactory();
        Source beforeSource = new StaxSource(factory.createXMLStreamReader(new 
ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
//        Source beforeSource = new 
StAXSource(factory.createXMLStreamReader(new 
ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
        System.out.println(save(beforeSource));
    }

    public static String save(Source beforeSource) throws Exception
    {
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);

        TransformerFactory tf = TransformerFactory.newInstance();

        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
        transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, 
"Q{http://test.com/test}reqBody";);
        
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount";, "4");

        transformer.transform(beforeSource, result);

        return writer.toString();
    }
}

{code}
The stacktrace from my project is:
{code:java}
java.lang.NullPointerException
        at 
net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:301)
        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145)
        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259)
        at 
net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:190)
        at net.sf.saxon.event.Sender.send(Sender.java:105)
        at 
net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)
        at 
org.apache.cxf.feature.transform.XSLTUtils.transform(XSLTUtils.java:57)
        at 
org.apache.cxf.feature.transform.XSLTOutInterceptor$XSLTCachedOutputStreamCallback.onClose(XSLTOutInterceptor.java:165)
        at 
org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:219)
        at 
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:688)
        at 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at 
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)

{code}

  was:
I am using custom out interceptor, which make xsl transformation to serialize 
some elements as CDATA, my code was inspired by 
org.apache.cxf.feature.transform.XSLTOutInterceptor.

But if I set property com.ctc.wstx.returnNullForDefaultNamespace=true, the I've 
got an NPE. This property is required to fix some other issues with xml 
generation (without it I've got empty namespaces xmlns="" in some cases).

The code bellow is the minimum example of NPE, using 
org.apache.cxf.staxutils.StaxSource.

 
{code:java}
Exception in thread "main" java.lang.NullPointerException: Cannot invoke 
"String.equals(Object)" because "prefix" is null 
       at 
net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:300)
 
       at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145) 
       at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259) 
       at 
net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:192) 
       at net.sf.saxon.event.Sender.send(Sender.java:104) 
       at 
net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)


{code}
{code:java}
package test;

import com.ctc.wstx.stax.WstxInputFactory;
import org.apache.cxf.staxutils.StaxSource;

import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stax.StAXSource;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;

public class NpeTest
{
    public static void main(String[] args) throws Exception
    {
        String bodyXml = "<?xml version=\"1.0\"?>\n" +
                "<soap:Envelope 
xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\";>\n" +
                "  <soap:Body>\n" +
                "    <testReq xmlns=\"http://test.com/test\";>\n" +
                "        <reqBody>&lt;&lt;&lt;&lt;&lt;</reqBody>\n" +
                "    </testReq>\n" +
                "  </soap:Body>\n" +
                "</soap:Envelope>\n";

        System.setProperty("com.ctc.wstx.returnNullForDefaultNamespace", 
"true");

        WstxInputFactory factory = new WstxInputFactory();
        Source beforeSource = new StaxSource(factory.createXMLStreamReader(new 
ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
//        Source beforeSource = new 
StAXSource(factory.createXMLStreamReader(new 
ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
        System.out.println(save(beforeSource));
    }

    public static String save(Source beforeSource) throws Exception
    {
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);

        TransformerFactory tf = TransformerFactory.newInstance();

        Transformer transformer = tf.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
        transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, 
"Q\{http://test.com/test}reqBody";);
        
transformer.setOutputProperty("\{http://xml.apache.org/xslt}indent-amount";, 
"4");

        transformer.transform(beforeSource, result);

        return writer.toString();
    }
}

{code}
The stacktrace from my project is:
{code:java}
java.lang.NullPointerException
        at 
net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:301)
        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145)
        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259)
        at 
net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:190)
        at net.sf.saxon.event.Sender.send(Sender.java:105)
        at 
net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)
        at 
org.apache.cxf.feature.transform.XSLTUtils.transform(XSLTUtils.java:57)
        at 
org.apache.cxf.feature.transform.XSLTOutInterceptor$XSLTCachedOutputStreamCallback.onClose(XSLTOutInterceptor.java:165)
        at 
org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:219)
        at 
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
        at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:688)
        at 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
        at 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
        at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356)
        at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314)
        at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
        at 
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)

{code}


> NPE when using com.ctc.wstx.returnNullForDefaultNamespace=true
> --------------------------------------------------------------
>
>                 Key: CXF-9037
>                 URL: https://issues.apache.org/jira/browse/CXF-9037
>             Project: CXF
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 3.5.8, 3.6.3, 4.0.4
>            Reporter: Gordon Freeman
>            Priority: Major
>             Fix For: 3.5.8, 3.6.3, 4.0.4
>
>         Attachments: xmlTest.zip
>
>
> I am using custom out interceptor, which make xsl transformation to serialize 
> some elements as CDATA, my code was inspired by 
> org.apache.cxf.feature.transform.XSLTOutInterceptor.
> But if I set property com.ctc.wstx.returnNullForDefaultNamespace=true, the 
> I've got an NPE. This property is required to fix some other issues with xml 
> generation (without it I've got empty namespaces xmlns="" in some cases).
> The code bellow is the minimum example of NPE, using 
> org.apache.cxf.staxutils.StaxSource.
>  
> {code:java}
> Exception in thread "main" java.lang.NullPointerException: Cannot invoke 
> "String.equals(Object)" because "prefix" is null 
>        at 
> net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:300)
>  
>        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145) 
>        at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259) 
>        at 
> net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:192) 
>        at net.sf.saxon.event.Sender.send(Sender.java:104) 
>        at 
> net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)
> {code}
> {code:java}
> package test;
> import com.ctc.wstx.stax.WstxInputFactory;
> import org.apache.cxf.staxutils.StaxSource;
> import javax.xml.transform.OutputKeys;
> import javax.xml.transform.Source;
> import javax.xml.transform.Transformer;
> import javax.xml.transform.TransformerFactory;
> import javax.xml.transform.stax.StAXSource;
> import javax.xml.transform.stream.StreamResult;
> import java.io.ByteArrayInputStream;
> import java.io.StringWriter;
> import java.nio.charset.StandardCharsets;
> public class NpeTest
> {
>     public static void main(String[] args) throws Exception
>     {
>         String bodyXml = "<?xml version=\"1.0\"?>\n" +
>                 "<soap:Envelope 
> xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\";>\n" +
>                 "  <soap:Body>\n" +
>                 "    <testReq xmlns=\"http://test.com/test\";>\n" +
>                 "        <reqBody>&lt;&lt;&lt;&lt;&lt;</reqBody>\n" +
>                 "    </testReq>\n" +
>                 "  </soap:Body>\n" +
>                 "</soap:Envelope>\n";
>         System.setProperty("com.ctc.wstx.returnNullForDefaultNamespace", 
> "true");
>         WstxInputFactory factory = new WstxInputFactory();
>         Source beforeSource = new 
> StaxSource(factory.createXMLStreamReader(new 
> ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
> //        Source beforeSource = new 
> StAXSource(factory.createXMLStreamReader(new 
> ByteArrayInputStream(bodyXml.getBytes(StandardCharsets.UTF_8))));
>         System.out.println(save(beforeSource));
>     }
>     public static String save(Source beforeSource) throws Exception
>     {
>         StringWriter writer = new StringWriter();
>         StreamResult result = new StreamResult(writer);
>         TransformerFactory tf = TransformerFactory.newInstance();
>         Transformer transformer = tf.newTransformer();
>         transformer.setOutputProperty(OutputKeys.INDENT, "yes");
>         transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");
>         transformer.setOutputProperty(OutputKeys.CDATA_SECTION_ELEMENTS, 
> "Q{http://test.com/test}reqBody";);
>         
> transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount";, 
> "4");
>         transformer.transform(beforeSource, result);
>         return writer.toString();
>     }
> }
> {code}
> The stacktrace from my project is:
> {code:java}
> java.lang.NullPointerException
>         at 
> net.sf.saxon.event.ReceivingContentHandler.startPrefixMapping(ReceivingContentHandler.java:301)
>         at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:145)
>         at org.apache.cxf.staxutils.StaxSource.parse(StaxSource.java:259)
>         at 
> net.sf.saxon.resource.ActiveSAXSource.deliver(ActiveSAXSource.java:190)
>         at net.sf.saxon.event.Sender.send(Sender.java:105)
>         at 
> net.sf.saxon.jaxp.IdentityTransformer.transform(IdentityTransformer.java:364)
>         at 
> org.apache.cxf.feature.transform.XSLTUtils.transform(XSLTUtils.java:57)
>         at 
> org.apache.cxf.feature.transform.XSLTOutInterceptor$XSLTCachedOutputStreamCallback.onClose(XSLTOutInterceptor.java:165)
>         at 
> org.apache.cxf.io.CachedOutputStream.close(CachedOutputStream.java:219)
>         at 
> org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
>         at 
> org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:688)
>         at 
> org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:63)
>         at 
> org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
>         at org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:530)
>         at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:441)
>         at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:356)
>         at org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:314)
>         at org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:96)
>         at 
> org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:140)
> {code}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to