Re: [Classpathx-xml] Unwanted SAXParseException
Ito Kazumitsu <[email protected]>
| Newsgroups | gmane.comp.java.vm.kaffe.general,gmane.comp.java.classpath.extensions.xml |
|---|---|
| Message-ID | <[email protected]> |
>>>>> ":" == David Brownell <[email protected]> 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);