relativeURI = href.substring(0, hash);
id = href.substring(hash+1);
// System.err.println("StandardURIResolver, href=" + href + ", id=" + id);
}
URIQueryParameters params = null;
URI uri;
URI relative;
try {
relativeURI = ResolveURI.escapeSpaces(relativeURI);
relative = new URI(relativeURI);
} catch (URISyntaxException err) {
throw new XPathException("Invalid relative URI " + Err.wrap(relativeURI), err);
}
String query = relative.getQuery();
if (query != null && recognizeQueryParameters) {
params = new URIQueryParameters(query, config);
int q = relativeURI.indexOf('?');
relativeURI = relativeURI.substring(0, q);
}
Source source = null;
if (recognizeQueryParameters && relativeURI.endsWith(".ptree")) {
source = getPTreeSource(relativeURI, base);
}
if (source == null) {
try {
uri = platform.makeAbsolute(relativeURI, base);
} catch (URISyntaxException err) {
// System.err.println("Recovering from " + err);
// last resort: if the base URI is null, or is itself a relative URI, we
// try to expand it relative to the current working directory
String expandedBase = ResolveURI.tryToExpand(base);
if (!expandedBase.equals(base)) { // prevent infinite recursion
return resolve(href, expandedBase);
}
//err.printStackTrace();
throw new XPathException("Invalid URI " + Err.wrap(relativeURI) + " - base " + Err.wrap(base), err);
}
// Check that any "%" sign in the URI is part of a well-formed percent-encoded UTF-8 character.
// Without this check, dereferencing the resulting URL can fail with arbitrary unchecked exceptions
final String uriString = uri.toString();
EscapeURI.checkPercentEncoding(uriString);
source = new SAXSource();
setSAXInputSource((SAXSource)source, uriString);
if (params != null) {
XMLReader parser = params.getXMLReader();
if (parser != null) {
((SAXSource)source).setXMLReader(parser);
}
}
if (((SAXSource)source).getXMLReader() == null) {
if (config==null) {
try {
((SAXSource)source).setXMLReader(SAXParserFactory.newInstance().newSAXParser().getXMLReader());
} catch (Exception err) {
throw new XPathException(err);
}
} else {
//((SAXSource)source).setXMLReader(config.getSourceParser());
// Leave the Sender to allocate an XMLReader, so that it can be returned to the pool after use
}
}
}
if (params != null) {
int stripSpace = params.getStripSpace();
switch (stripSpace) {
case Whitespace.ALL: {
Stripper stripper = AllElementStripper.getInstance();
stripper.setStripAll();
source = AugmentedSource.makeAugmentedSource(source);
((AugmentedSource)source).addFilter(stripper);
break;
}
case Whitespace.IGNORABLE:
case Whitespace.NONE:
source = AugmentedSource.makeAugmentedSource(source);
((AugmentedSource)source).setStripSpace(stripSpace);
}
}
if (id != null) {
IDFilter filter = new IDFilter(id);
source = AugmentedSource.makeAugmentedSource(source);
((AugmentedSource)source).addFilter(filter);
}
if (params != null) {
Integer validation = params.getValidationMode();
if (validation != null) {
source = AugmentedSource.makeAugmentedSource(source);
((AugmentedSource)source).setSchemaValidationMode(validation.intValue());
}
}
if (params != null) {
Boolean xinclude = params.getXInclude();
if (xinclude != null) {
source = AugmentedSource.makeAugmentedSource(source);
((AugmentedSource)source).setXIncludeAware(xinclude.booleanValue());
}
}