package com.bagri.xquery.saxon;
import java.io.Reader;
import java.io.StringReader;
import java.net.URI;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.xml.transform.stream.StreamSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.bagri.core.server.api.SchemaRepository;
import com.bagri.core.system.Module;
import net.sf.saxon.lib.ModuleURIResolver;
import net.sf.saxon.trans.XPathException;
public class ModuleURIResolverImpl implements ModuleURIResolver {
private static final Logger logger = LoggerFactory.getLogger(ModuleURIResolverImpl.class);
private SchemaRepository repo;
public ModuleURIResolverImpl(SchemaRepository repo) {
this.repo = repo;
logger.trace("<init>; initialized with Repo: {}", repo);
}
@Override
public StreamSource[] resolve(String moduleURI, String baseURI, String[] locations) throws XPathException {
logger.trace("resolve.enter; got module: {}, base: {}, locations: {}", moduleURI, baseURI, locations);
String moduleName;
if (locations.length > 0) {
// locations contains something to use..
Path path = Paths.get(URI.create(locations[0]));
moduleName = path.getFileName().toString();
} else {
// moduleURI is the module namespace!
moduleName = moduleURI;
}
Module module = getModule(moduleName);
if (module != null) {
Reader mReader = new StringReader(module.getBody());
return new StreamSource[] {new StreamSource(mReader)};
} else {
// throw ex?
logger.warn("resolve.exit; no module found for name: {}", moduleName);
}
return new StreamSource[0];
}
private Module getModule(String moduleName) {
for (Module module: repo.getModules()) {
if (moduleName.equals(module.getName())) {
return module;
}
Path path = Paths.get(module.getFileName());
if (moduleName.equals(path.getFileName().toString())) {
return module;
}
}
return null;
}
}