package nl.ipo.cds.metadata;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import org.apache.log4j.Logger;
import org.w3c.dom.ls.LSInput;
import org.w3c.dom.ls.LSResourceResolver;
class JarResourceResolver implements LSResourceResolver {
private final ClassLoader classLoader;
private final String basePath;
private final Map<String, String> localPaths = new HashMap<String, String>();
private final Logger logger = Logger.getLogger(JarResourceResolver.class);
JarResourceResolver(final String basePath) {
this(basePath, null);
}
JarResourceResolver(final String basePath, final ClassLoader classLoader) {
this.basePath = basePath;
if(classLoader == null) {
this.classLoader = Thread.currentThread().getContextClassLoader();
} else {
this.classLoader = classLoader;
}
logger.debug("basePath: " + this.basePath);
logger.debug("classLoader: " + this.classLoader);
}
void addPath(final String remotePath, final String localPath) {
localPaths.put(remotePath, basePath + "/" + localPath);
}
@Override
public LSInput resolveResource(final String type, final String namespaceURI, final String publicId, final String systemId, final String baseURI) {
InputStream inputStream = null;
for(final Map.Entry<String, String> pathMapping : localPaths.entrySet()) {
final String remotePath = pathMapping.getKey();
if(baseURI.startsWith(remotePath)) {
final String localPath = pathMapping.getValue();
final String filePart = baseURI.substring(remotePath.length());
final String resourcePath = localPath + filePart;
logger.debug("loading resource: " + resourcePath);
inputStream = classLoader.getResourceAsStream(resourcePath);
}
}
if(inputStream == null) {
throw new IllegalStateException("XML Schema resource missing: " + baseURI);
}
final Input input = new Input();
input.setPublicId(publicId);
input.setSystemId(systemId);
input.setBaseURI(baseURI);
return input;
}
}