[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);