diff options
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | gnu/xml/stream/SAXParser.java | 11 | ||||
-rw-r--r-- | gnu/xml/stream/UnicodeReader.java | 2 | ||||
-rw-r--r-- | gnu/xml/stream/XIncludeFilter.java | 13 | ||||
-rw-r--r-- | gnu/xml/stream/XMLParser.java | 54 | ||||
-rw-r--r-- | java/lang/ClassNotFoundException.java | 5 | ||||
-rw-r--r-- | java/util/logging/SimpleFormatter.java | 10 |
7 files changed, 71 insertions, 37 deletions
@@ -1,3 +1,16 @@ +2006-01-31 Chris Burdess <dog@gnu.org> + + * gnu/xml/stream/SAXParser.java, + gnu/xml/stream/UnicodeReader.java, + gnu/xml/stream/XIncludeFilter.java, + gnu/xml/stream/XMLParser.java: Fix case where resolved InputSource + only resolved the system ID not the stream. Make some utility methods + public and static for use by other private XML APIs. + * java/lang/ClassNotFoundException.java: Ensure that initCause can be + called without throwing IllegalStateException. + * java/util/logging/SimpleFormatter.java: Write thrown exception if + provided. + 2006-01-31 Ito Kazumitsu <kaz@maczuka.gcd.org> Fixes bug #22873 diff --git a/gnu/xml/stream/SAXParser.java b/gnu/xml/stream/SAXParser.java index 4c0edb975..46fe4abe2 100644 --- a/gnu/xml/stream/SAXParser.java +++ b/gnu/xml/stream/SAXParser.java @@ -904,7 +904,16 @@ public class SAXParser InputSource input = entityResolver.resolveEntity(publicId, systemId); if (input != null) - return input.getByteStream(); + { + InputStream in = input.getByteStream(); + if (in == null) + { + String newSystemId = input.getSystemId(); + if (newSystemId != null && !newSystemId.equals(systemId)) + in = XMLParser.resolve(newSystemId); + } + return in; + } } catch (SAXException e) { diff --git a/gnu/xml/stream/UnicodeReader.java b/gnu/xml/stream/UnicodeReader.java index c38516c30..8a1f1b83e 100644 --- a/gnu/xml/stream/UnicodeReader.java +++ b/gnu/xml/stream/UnicodeReader.java @@ -45,7 +45,7 @@ import java.io.Reader; * * @author <a href='mailto:dog@gnu.org'>Chris Burdess</a> */ -class UnicodeReader +public class UnicodeReader { final Reader in; diff --git a/gnu/xml/stream/XIncludeFilter.java b/gnu/xml/stream/XIncludeFilter.java index e151ac69d..6d12bb3b2 100644 --- a/gnu/xml/stream/XIncludeFilter.java +++ b/gnu/xml/stream/XIncludeFilter.java @@ -42,6 +42,7 @@ import java.io.InputStreamReader; import java.io.IOException; import java.io.Reader; import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.HashSet; @@ -121,7 +122,17 @@ class XIncludeFilter boolean expandERefs) { super(reader); - this.systemId = XMLParser.absolutize(null, systemId); + try + { + this.systemId = XMLParser.absolutize(null, systemId); + } + catch (MalformedURLException e) + { + RuntimeException e2 = new RuntimeException("unsupported URL: " + + systemId); + e2.initCause(e); + throw e2; + } this.namespaceAware = namespaceAware; this.validating = validating; this.expandERefs = expandERefs; diff --git a/gnu/xml/stream/XMLParser.java b/gnu/xml/stream/XMLParser.java index 3545ff32d..727dcc437 100644 --- a/gnu/xml/stream/XMLParser.java +++ b/gnu/xml/stream/XMLParser.java @@ -1484,7 +1484,6 @@ public class XMLParser { if (!externalEntities) return; - InputStream in = null; String url = absolutize(input.systemId, ids.systemId); // Check for recursion for (Iterator i = inputStack.iterator(); i.hasNext(); ) @@ -1497,7 +1496,8 @@ public class XMLParser } if (name == null || "".equals(name)) report = false; - if (in == null && url != null && resolver != null) + InputStream in = null; + if (resolver != null) { if (resolver instanceof XMLResolver2) in = ((XMLResolver2) resolver).resolve(ids.publicId, url); @@ -1535,12 +1535,13 @@ public class XMLParser * @param base the current base URL * @param href the (absolute or relative) URL to resolve */ - static String absolutize(String base, String href) + public static String absolutize(String base, String href) + throws MalformedURLException { if (href == null) return null; int ci = href.indexOf(':'); - if (ci > 1 && isLowercaseAscii(href.substring(0, ci))) + if (ci > 1 && isURLScheme(href.substring(0, ci))) { // href is absolute already return href; @@ -1565,40 +1566,23 @@ public class XMLParser if (!base.endsWith("/")) base += "/"; } - if (href.startsWith("/")) - { - if (base.startsWith("file:")) - return "file://" + href; - int i = base.indexOf("://"); - if (i != -1) - { - i = base.indexOf('/', i + 3); - if (i != -1) - base = base.substring(0, i); - } - } - else - { - while (href.startsWith("..")) - { - int i = base.lastIndexOf('/', base.length() - 2); - if (i != -1) - base = base.substring(0, i + 1); - href = href.substring(2); - if (href.startsWith("/")) - href = href.substring(1); - } - } - return base + href; + return new URL(new URL(base), href).toString(); } - private static boolean isLowercaseAscii(String text) + /** + * Indicates whether the specified characters match the scheme portion of + * a URL. + * @see RFC 1738 section 2.1 + */ + private static boolean isURLScheme(String text) { int len = text.length(); for (int i = 0; i < len; i++) { char c = text.charAt(i); - if (c < 97 || c > 122) + if (c == '+' || c == '.' || c == '-') + continue; + if (c < 65 || (c > 90 && c < 97) || c > 122) return false; } return true; @@ -1607,7 +1591,7 @@ public class XMLParser /** * Returns an input stream for the given URL. */ - private InputStream resolve(String url) + static InputStream resolve(String url) throws IOException { try @@ -1618,6 +1602,12 @@ public class XMLParser { return null; } + catch (IOException e) + { + IOException e2 = new IOException("error resolving " + url); + e2.initCause(e); + throw e2; + } } /** diff --git a/java/lang/ClassNotFoundException.java b/java/lang/ClassNotFoundException.java index 6b6ae949d..142bc5d03 100644 --- a/java/lang/ClassNotFoundException.java +++ b/java/lang/ClassNotFoundException.java @@ -70,7 +70,7 @@ public class ClassNotFoundException extends Exception */ public ClassNotFoundException() { - this(null, null); + this(null); } /** @@ -81,7 +81,8 @@ public class ClassNotFoundException extends Exception */ public ClassNotFoundException(String s) { - this(s, null); + super(s); + ex = null; } /** diff --git a/java/util/logging/SimpleFormatter.java b/java/util/logging/SimpleFormatter.java index ff53db8c0..2ebb1a148 100644 --- a/java/util/logging/SimpleFormatter.java +++ b/java/util/logging/SimpleFormatter.java @@ -39,6 +39,8 @@ exception statement from your version. */ package java.util.logging; +import java.io.PrintWriter; +import java.io.StringWriter; import java.text.DateFormat; import java.util.Date; @@ -114,6 +116,14 @@ public class SimpleFormatter buf.append(lineSep); + Throwable throwable = record.getThrown(); + if (throwable != null) + { + StringWriter sink = new StringWriter(); + throwable.printStackTrace(new PrintWriter(sink, true)); + buf.append(sink.toString()); + } + return buf.toString(); } } |