![JAR search and dependency download from the Maven repository](/logo.png)
net.sf.saxon.lib.DirectResourceResolver Maven / Gradle / Ivy
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2018-2023 Saxonica Limited
// This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0.
// If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
// This Source Code Form is "Incompatible With Secondary Licenses", as defined by the Mozilla Public License, v. 2.0.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
package net.sf.saxon.lib;
import net.sf.saxon.Configuration;
import net.sf.saxon.event.FilterFactory;
import net.sf.saxon.event.IDFilter;
import net.sf.saxon.resource.ResourceLoader;
import net.sf.saxon.trans.XPathException;
import org.xml.sax.InputSource;
import javax.xml.transform.Source;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.stream.StreamSource;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
/**
* A DirectResourceResolver
is a {@link ResourceResolver} that resolves requests
* using the direct, native capabilities of the platform. For example a "file:" URI is resolved
* by finding the file in filestore, and an "http:" URI is resolved by making an HTTP request.
*/
public class DirectResourceResolver implements ResourceResolver {
private final Configuration config;
public DirectResourceResolver(Configuration config) {
this.config = config;
}
/**
* Process a resource request to deliver a resource
*
* @param request the resource request
* @return the returned Source; or null to delegate resolution to another resolver
* @throws XPathException if the request is invalid in some way, or if the identified resource is unsuitable,
* or if resolution is to fail rather than being delegated to another resolver.
*/
@Override
public Source resolve(ResourceRequest request) throws XPathException {
if (request.uriIsNamespace) {
return null; // bug 5266
}
ProtocolRestrictor restrictor = config.getProtocolRestrictor();
if (!"all".equals(restrictor.toString())) {
try {
URI u = new URI(request.uri);
if (!restrictor.test(u)) {
throw new XPathException("URIs using protocol " + u.getScheme() + " are not permitted");
}
} catch (URISyntaxException err) {
throw new XPathException("Unknown URI scheme requested " + request.uri);
}
}
String relativeURI = request.relativeUri;
if (relativeURI == null) {
relativeURI = request.uri;
}
String id = null;
// Extract any fragment identifier. Note, this code is no longer used to
// resolve fragment identifiers in URI references passed to the document()
// function: the code of the document() function handles these itself.
int hash = relativeURI.indexOf('#');
if (hash >= 0) {
request = request.copy();
request.relativeUri = relativeURI.substring(0, hash);
id = relativeURI.substring(hash + 1);
// System.err.println("StandardURIResolver, href=" + href + ", id=" + id);
}
Source ss;
if (ResourceRequest.XSLT_NATURE.equals(request.nature)) {
InputStream stream;
try {
if (request.uri.startsWith("classpath:")) {
String s = request.uri.substring(10);
if (s.startsWith("/")) {
s = s.substring(1);
}
stream = config.getDynamicLoader().getResourceAsStream(s);
} else {
stream = ResourceLoader.urlStream(new URL(request.uri));
}
} catch (IOException e) {
stream = null; // Carry on, the XML parser might know what to do with it.
}
InputSource is = new InputSource(request.uri);
is.setByteStream(stream);
ss = new SAXSource(config.getStyleParser(), is);
if (stream != null) {
// We created the stream, so we must close it after use
ss = AugmentedSource.makeAugmentedSource(ss);
((AugmentedSource) ss).setPleaseCloseAfterUse(true);
}
} else if (ResourceRequest.XML_NATURE.equals(request.nature) || ResourceRequest.XSD_NATURE.equals(request.nature)) {
InputStream stream;
try {
stream = ResourceLoader.urlStream(new URL(request.uri));
} catch (IOException e) {
stream = null; // Carry on, the XML parser might know what to do with it.
}
ss = new StreamSource(stream, request.uri);
if (stream != null) {
// We created the stream, so we must close it after use
ss = AugmentedSource.makeAugmentedSource(ss);
((AugmentedSource) ss).setPleaseCloseAfterUse(true);
}
} else {
ss = new StreamSource(request.uri);
}
if (id != null) {
final String idFinal = id;
FilterFactory factory = next -> new IDFilter(next, idFinal);
ss = AugmentedSource.makeAugmentedSource(ss);
((AugmentedSource) ss).addFilter(factory);
}
return ss;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy