NPE in XMLEntityManager
-----------------------

                 Key: XERCESJ-1272
                 URL: https://issues.apache.org/jira/browse/XERCESJ-1272
             Project: Xerces2-J
          Issue Type: Bug
    Affects Versions: 2.6.2, 2.9.1
         Environment: Weblogic 8.1 SP 5 running on Solaris 2.10, Axis 1.4
            Reporter: Shinta


Our application runs on Weblogic 8.1 SP 5. It makes a webservice call to an 
Axis webservice. When we ran our load tests, we would occasionally get the 
following exception:

my.exceptions.ProviderException: java.lang.NullPointerException
    at my.ReferenceWebservicesPlugin.sendOutBoundResult(Unknown Source)
    at 
my.ejb.NBINotificationServiceMDB.onMessage(NBINotificationServiceMDB.java:60)
    at weblogic.ejb20.internal.MDListener.execute(MDListener.java:400)
    at 
weblogic.ejb20.internal.MDListener.transactionalOnMessage(MDListener.java:333)
    at weblogic.ejb20.internal.MDListener.onMessage(MDListener.java:298)
    at weblogic.jms.client.JMSSession.onMessage(JMSSession.java:2686)
    at weblogic.jms.client.JMSSession.execute(JMSSession.java:2598)
    at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:224)
    at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:183)
Caused by: java.lang.NullPointerException
    at org.apache.axis.AxisFault.makeFault(AxisFault.java:101)
    at org.apache.axis.client.Call.invoke(Call.java:2446)
    at org.apache.axis.client.Call.invoke(Call.java:2366)
    at org.apache.axis.client.Call.invoke(Call.java:1812)
    at 
my.service.NotificationEventServiceSoapBindingStub.processDeviceActivationResult(Unknown
 Source)  
    ... 9 more
Caused by: java.lang.NullPointerException                                       
                                                        at 
java.io.FilterInputStream.read(FilterInputStream.java:66)
    at 
org.apache.xerces.impl.XMLEntityManager$RewindableInputStream.read(Unknown 
Source)
    at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown 
Source)
    at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown 
Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.SAXParserImpl.parse(Unknown Source)
    at 
org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
    at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
    at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
    at org.apache.axis.client.Call.invokeEngine(Call.java:2804)
    at org.apache.axis.client.Call.invoke(Call.java:2767)
    at org.apache.axis.client.Call.invoke(Call.java:2443)
    ... 12 more

We originally ran the application with Xerces 2.6.2 and have tried 2.9.1. Same 
issue happened on 2.9.1 as well.

While looking at the source code for Xerces 2.9.1, I noticed this:

       // create reader
        InputStream stream = null;
        Reader reader = xmlInputSource.getCharacterStream();
        // First chance checking strict URI
        String expandedSystemId = expandSystemId(literalSystemId, baseSystemId, 
fStrictURI);
        if (baseSystemId == null) {
            baseSystemId = expandedSystemId;
        }
        if (reader == null) {
            stream = xmlInputSource.getByteStream();
            if (stream == null) {
                URL location = new URL(expandedSystemId);
                URLConnection connect = location.openConnection();
                if (!(connect instanceof HttpURLConnection)) {
                    stream = connect.getInputStream();
                }
                else {
                    boolean followRedirects = true;
                    
                    // setup URLConnection if we have an HTTPInputSource
                    if (xmlInputSource instanceof HTTPInputSource) {
                        final HttpURLConnection urlConnection = 
(HttpURLConnection) connect;
                        final HTTPInputSource httpInputSource = 
(HTTPInputSource) xmlInputSource;
                        
                        // set request properties
                        Iterator propIter = 
httpInputSource.getHTTPRequestProperties();
                        while (propIter.hasNext()) {
                            Map.Entry entry = (Map.Entry) propIter.next();
                            urlConnection.setRequestProperty((String) 
entry.getKey(), (String) entry.getValue());
                        }
                        
                        // set preference for redirection
                        followRedirects = 
httpInputSource.getFollowHTTPRedirects();
                        if (!followRedirects) {
                            setInstanceFollowRedirects(urlConnection, 
followRedirects);
                        }
                    }
                    
                    stream = connect.getInputStream();
                    
                    // REVISIT: If the URLConnection has external encoding
                    // information, we should be reading it here. It's located
                    // in the charset parameter of Content-Type. -- mrglavas
                    
                    if (followRedirects) {
                        String redirect = connect.getURL().toString();
                        // E43: Check if the URL was redirected, and then
                        // update literal and expanded system IDs if needed.
                        if (!redirect.equals(expandedSystemId)) {
                            literalSystemId = redirect;
                            expandedSystemId = redirect;
                        }
                    }
                }
            }
            // wrap this stream in RewindableInputStream
            stream = new RewindableInputStream(stream);

Could it be that the call to "stream = connect.getInputStream()" returns null? 
In this case the RewindableInputStream() will contain a null stream and when we 
try to read it, we will get NPE?

This code probably could be made more robust by checking for the null stream....


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to