summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--gnu/xml/stream/SAXParser.java11
-rw-r--r--gnu/xml/stream/UnicodeReader.java2
-rw-r--r--gnu/xml/stream/XIncludeFilter.java13
-rw-r--r--gnu/xml/stream/XMLParser.java54
-rw-r--r--java/lang/ClassNotFoundException.java5
-rw-r--r--java/util/logging/SimpleFormatter.java10
7 files changed, 71 insertions, 37 deletions
diff --git a/ChangeLog b/ChangeLog
index 7ed5ef440..681422001 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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();
}
}