re PR classpath/30718 (TransformerException in XSLURIResolver)

2007-02-07  Chris Burdess  <dog@gnu.org>

	Fixes PR 30718.
	* gnu/xml/dom/ls/SAXEventSink.java: Add public accessor/mutators.
	* gnu/xml/transform/XSLURIResolver.java: Add support for custom
	  SAXSources without a backing URL or stream.

	Fixes PR 27710.
	* gnu/xml/dom/DomDocumentBuilderFactory.java: Fall back to synchronous
	  LSParser if implementation does not support asynchronous.
	* gnu/xml/stream/XMLParser.java,
	  gnu/xml/stream/XIncludeFilter.java: Use custom code instead of
	  java.net.URL to resolve to an an absolute URI, to avoid nonexistent
	  protocol handler problems.

From-SVN: r121694
This commit is contained in:
Chris Burdess 2007-02-07 18:22:26 +00:00 committed by Tom Tromey
parent 74372bdfc6
commit 08452f4553
24 changed files with 155 additions and 29 deletions

View file

@ -1592,7 +1592,6 @@ public class XMLParser
* @param href the (absolute or relative) URL to resolve
*/
public static String absolutize(String base, String href)
throws MalformedURLException
{
if (href == null)
return null;
@ -1622,7 +1621,60 @@ public class XMLParser
if (!base.endsWith("/"))
base += "/";
}
return new URL(new URL(base), href).toString();
// We can't use java.net.URL here to do the parsing, as it searches for
// a protocol handler. A protocol handler may not be registered for the
// URL scheme here. Do it manually.
//
// Set aside scheme and host portion of base URL
String basePrefix = null;
ci = base.indexOf(':');
if (ci > 1 && isURLScheme(base.substring(0, ci)))
{
if (base.length() > (ci + 3) &&
base.charAt(ci + 1) == '/' &&
base.charAt(ci + 2) == '/')
{
int si = base.indexOf('/', ci + 3);
if (si == -1)
base = null;
else
{
basePrefix = base.substring(0, si);
base = base.substring(si);
}
}
else
base = null;
}
if (base == null) // unknown or malformed base URL, use href
return href;
if (href.startsWith("/")) // absolute href pathname
return (basePrefix == null) ? href : basePrefix + href;
// relative href pathname
if (!base.endsWith("/"))
{
int lsi = base.lastIndexOf('/');
if (lsi == -1)
base = "/";
else
base = base.substring(0, lsi + 1);
}
while (href.startsWith("../") || href.startsWith("./"))
{
if (href.startsWith("../"))
{
// strip last path component from base
int lsi = base.lastIndexOf('/', base.length() - 2);
if (lsi > -1)
base = base.substring(0, lsi + 1);
href = href.substring(3); // strip ../ prefix
}
else
{
href = href.substring(2); // strip ./ prefix
}
}
return (basePrefix == null) ? base + href : basePrefix + base + href;
}
/**