[kaffe] Re: [Classpathx-xml] Unwanted SAXParseException

Ito Kazumitsu kaz@maczuka.gcd.org
Sat Oct 18 18:19:01 2003


>>>>> ":" == David Brownell <david-b@pacbell.net> writes:

:> Ito Kazumitsu wrote:
>> private static class MyResolver implements EntityResolver {
>> public InputSource resolveEntity (String publicId, String systemId) {
>> try {
>> return new InputSource((new URL(systemId)).openStream());

:> This is the bug right here ... you're creating an InputSource
:> without a System ID, which is why you get a later complaint
:> about an InputSource that's missing such an ID!

Yes, I knew about it and deliberately made such an incomplete
program.

The problem is that Sun's JAXP or Xerces does not throw
an exception about this.

:> It's unhealthy to have infrastructure guessing about such
:> things, since it doesn't really have the facts to guess right.
:> For example, the resolver is allowed to change the system ID
:> based on the public ID, in which case the (local) system ID
:> would clearly be wrong.

I think so, too.

As for the patch to gnu/xml/aelfred2/SAXDriver.java,  I think
it should be removed.

Then occurs another question.  Is it correct that 
gnu/xml/aelfred2/XmlParser.java does this in pushURL()?

            systemId = source.getSystemId ();
            if (systemId == null) {
                handler.warn ("missing system ID, using " + ids [1]);
                systemId = ids [1];
            }

Giving the warning of "missing system ID" should be postponed
until the system ID is really needed.

And here is my patch:

bash-2.05b$ diff -u gnu/xml/aelfred2/XmlParser.java.orig gnu/xml/aelfred2/XmlParser.java
--- gnu/xml/aelfred2/XmlParser.java.orig	Sun Sep 14 07:32:02 2003
+++ gnu/xml/aelfred2/XmlParser.java	Sun Oct 19 10:07:50 2003
@@ -3424,6 +3424,7 @@
     ) throws SAXException, IOException
     {
 	boolean		ignoreEncoding;
+	boolean		systemIdGuessed = false;
 	String		systemId;
 	InputSource	source;
 
@@ -3450,8 +3451,8 @@
 	    // we might be using alternate IDs/encoding
 	    systemId = source.getSystemId ();
 	    if (systemId == null) {
-		handler.warn ("missing system ID, using " + ids [1]);
 		systemId = ids [1];
+		systemIdGuessed = true;
 	    }
 	} else {
 	    // "[document]", or "[dtd]" via getExternalSubset()
@@ -3480,8 +3481,11 @@
 	    } catch (IOException e) {
 		stream = source.getByteStream ();
 	    }
-	} else if (systemId == null)
+	} else if (systemId == null) {
 	    error ("InputSource has no URI!");
+	} else if (systemIdGuessed) {
+	    handler.warn ("missing system ID, using " + systemId);
+	}
 	scratch.setCharacterStream (null);
 	scratch.setByteStream (null);
 	scratch.setEncoding (null);