You are viewing a plain text version of this content. The canonical link for it is here.
Posted to j-dev@xerces.apache.org by bu...@apache.org on 2002/02/06 20:15:38 UTC

DO NOT REPLY [Bug 6283] New: - NPE: System id for external dtd is not passed to DefaultHandler.resolveEntity.

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6283>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=6283

NPE: System id for external dtd is not passed to DefaultHandler.resolveEntity.

           Summary: NPE: System id for external dtd is not passed to
                    DefaultHandler.resolveEntity.
           Product: Xerces2-J
           Version: 2.0.0
          Platform: All
        OS/Version: Windows NT/2K
            Status: NEW
          Severity: Normal
          Priority: Other
         Component: SAX
        AssignedTo: xerces-j-dev@xml.apache.org
        ReportedBy: gleichtman@bioimaging.com
                CC: gleichtman@bioimaging.com


Jetty 4D4 reads an XML configuration file in order to set up container 
properties. The beginning of this file is as follows:

<?xml version="1.0"  encoding="ISO-8859-1"?>
<!DOCTYPE Configure SYSTEM "dtd/configure.dtd">
...

When Xerces 2J jars are substituted for Jetty's Jaxp and Crimson jars, a null 
pointer exception is caused that does not occur with Jaxp/Crimson. The 
traceback for the NPE masks where the actual problem occurs. Below is a 
traceback for where the NPE is actually generated:

- resolveEntity(): 277, org.mortbay.xml.XmlParser$Handler, XmlParser.java
- resolveEntity(): 138, org.apache.xerces.util.EntityResolverWrapper, 
EntityResolverWrapper.java
- esolveEntity(): 528,org.apache.xerces.impl.XMLEntityManager, 
XMLEntityManager.java
- dispatch(): 809, org.apache.xerces.impl.XMLDocumentScannerImpl$DTDDispatcher, 
XMLDocumentScannerImpl.java
- scanDocument(): 333, org.apache.xerces.impl.XMLDocumentFragmentScannerImpl, 
XMLDocumentFragmentScannerImpl.java
- parse(): 525, org.apache.xerces.parsers.StandardParserConfiguration, 
StandardParserConfiguration.java
- parse(): 581, org.apache.xerces.parsers.StandardParserConfiguration, 
StandardParserConfiguration.java
- parse(): 147, org.apache.xerces.parsers.XMLParser, XMLParser.java
- parse(): 1157, org.apache.xerces.parsers.AbstractSAXParser, 
AbstractSAXParser.java
- parse(): 345, javax.xml.parsers.SAXParser, SAXParser.java
- parse(): 223, javax.xml.parsers.SAXParser, SAXParser.java
- parse(): 109, org.mortbay.xml.XmlParser, XmlParser.java
- <init>: 97, org.mortbay.xml.XmlConfiguration, XmlConfiguration.java
- <init> 82, org.mortbay.jetty.Server, Server.java
- <init> 57, org.mortbay.jetty.Server, Server.java
...

The NPE occurs in Jetty at:

- resolveEntity(): 277, org.mortbay.xml.XmlParser$Handler, XmlParser.java

where Jetty attempts to use the system id---the external DTD path. 
Unfortunately, Jetty has been passed a null for the system id and this leads to 
the NPE.

An analysis of the Xerces 2J code that causes this problem follows:

Here is the code in the dispatch method shown in the trace above:

...
case SCANNER_STATE_DTD_EXTERNAL: {
  resourceIdentifier.setValues(fDoctypePublicId, fDoctypeSystemId, null, null);
  XMLInputSource xmlInputSource = fEntityManager.resolveEntity
(resourceIdentifier);
...

Notice the invocation: resourceIdentifier.setValues(fDoctypePublicId, 
fDoctypeSystemId, null, null);

The signature for setValues is:

    public void setValues(String publicId, String literalSystemId,
                          String baseSystemId, String expandedSystemId) 

The method setValues is defined in 
org.apache.xerces.util.XMLResourceIdentifierImpl.java.

Notice that null is being passed for the expandedSystemId.

Now, notice the following code from 
org.apache.xerces.util.EntityResolverWrapper.resolveEntity:

                InputSource inputSource = 
                    fEntityResolver.resolveEntity(resourceIdentifier.getPublicId
(), resourceIdentifier.getExpandedSystemId());


Notice that resourceIdentifier.getExpandedSystemId() is being passed for the 
system id. Since the expanded system id is hard coded at null with setValues, 
the system id will NEVER be passed on to the resolve entity method of the 
implementing class, namely the Jetty code in this case.

Note that DefaultHandler.resolveEntity IS meant to be overridden based upon the 
JavaDoc provided:

    /**
     * Resolve an external entity.
     *
     * <p>Always return null, so that the parser will use the system
     * identifier provided in the XML document.  This method implements
     * the SAX default behaviour: application writers can override it
     * in a subclass to do special translations such as catalog lookups
     * or URI redirection.</p>
     *
     * @param publicId The public identifer, or null if none is
     *                 available.
     * @param systemId The system identifier provided in the XML 
     *                 document.
     * @return The new input source, or null to require the
     *         default behaviour.
     * @exception org.xml.sax.SAXException Any SAX exception, possibly
     *            wrapping another exception.
     * @see org.xml.sax.EntityResolver#resolveEntity
     */
    public InputSource resolveEntity (String publicId, String systemId)
	throws SAXException
    {
	return null;
    }


Jetty is overriding this method, yet it is not being passed the system id, so 
it crashes.

Therefore, I believe that this is a bug in Xerces 2J, since the system id will 
never be passed on to a class that overrides resolveEntity for the 
org.xml.sax.helpers.DefaultHandler. This problem currently makes it impossible 
to use Jetty with Xerces 2J, something that we would like to do, since the rest 
of our code base uses Xerces.

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-j-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-j-dev-help@xml.apache.org