package edu.unc.lib.dl.xml;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ClasspathURIResolver implements URIResolver {
private static Logger log = LoggerFactory.getLogger(ClasspathURIResolver.class);
private List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
public ClasspathURIResolver(@SuppressWarnings("rawtypes") Class... loaders) {
for(@SuppressWarnings("rawtypes") Class l : loaders) classLoaders.add(l.getClassLoader());
}
public ClasspathURIResolver() {}
@Override
public Source resolve(String href, String base) throws TransformerException {
log.debug("href=" + href + " : base=" + base);
String fileName = null;
try {
int k = href.lastIndexOf('/') + 1;
if (k > 0) {
fileName = href.substring(k);
} else {
fileName = href;
}
InputStream input = null;
for(ClassLoader l : classLoaders) {
input = l.getResourceAsStream(fileName);
if (input != null) break;
}
if(input == null) input = ClassLoader.getSystemResourceAsStream(fileName);
if (input != null) {
return (new StreamSource(input));
}
} catch (Exception ie) {
log.error("File " + fileName + " not found!", ie);
}
// instruct the caller to use the default lookup
return (null);
}
}