/****************************************************************************/
/* File: PkgModuleResolver.java */
/* Author: F. Georges */
/* Company: H2O Consulting */
/* Date: 2009-10-29 */
/* Tags: */
/* Copyright (c) 2009-2015 Florent Georges (see end of file.) */
/* ------------------------------------------------------------------------ */
package org.expath.pkg.saxon;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Map;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.lib.ModuleURIResolver;
import net.sf.saxon.trans.XPathException;
import org.expath.pkg.repo.PackageException;
import org.expath.pkg.repo.Repository;
import org.expath.pkg.repo.URISpace;
import org.expath.pkg.repo.tools.Logger;
/**
* Implementation for EXPath Pkg of Saxon's {@link ModuleURIResolver} for XQuery.
*
* @author Florent Georges
*/
public class PkgModuleResolver
implements ModuleURIResolver
{
public PkgModuleResolver(Map<String, String> overrides, SaxonRepository repo, Repository parent)
throws PackageException
{
myOverrides = overrides;
myRepo = repo;
myParent = parent;
}
@Override
public StreamSource[] resolve(String module_uri, String base_uri, String[] locations)
throws XPathException
{
LOG.fine("resolve: {0} with base: {1}", module_uri, base_uri);
for ( String l : locations ) {
LOG.fine(" location: {0}", l);
}
try {
// try the override URIs
String href = myOverrides.get(module_uri);
if ( href != null ) {
File f = new File(href);
InputStream in;
try {
in = new FileInputStream(f);
}
catch ( FileNotFoundException ex ) {
throw new PackageException("Error opening file", ex);
}
StreamSource[] source = new StreamSource[1];
source[0] = new StreamSource(in);
source[0].setSystemId(f.toURI().toString());
return source;
}
// try a Saxon-specific stuff
Source s = myRepo.resolve(module_uri, URISpace.XQUERY);
if ( s != null ) {
// TODO: Why requiring a StreamSource here...?
if ( ! (s instanceof StreamSource) ) {
throw new XPathException("The Source is not a StreamSource");
}
return new StreamSource[]{ (StreamSource) s };
}
// delegate to pkg-repo's repository
s = myParent.resolve(module_uri, URISpace.XQUERY);
if ( s != null ) {
// TODO: Needs a better abstraction. Even if it is not a StreamSource
// it could succeed... But a Source is not suitable for an XQuery
// module source.
if ( ! (s instanceof StreamSource) ) {
throw new XPathException("The Source is not a StreamSource");
}
return new StreamSource[]{ (StreamSource) s };
}
}
catch ( PackageException ex ) {
throw new XPathException("Error resolving the URI", ex);
}
return null;
}
/** The overrides (take precedence over the catalog resolver). */
private final Map<String, String> myOverrides;
/** The Saxon repo used to resolve Saxon-specific stuff. */
private final SaxonRepository myRepo;
/** The pkg-repo's repository, to delegate everything else to. */
private final Repository myParent;
/** The logger. */
private static final Logger LOG = Logger.getLogger(PkgModuleResolver.class);
}
/* ------------------------------------------------------------------------ */
/* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS COMMENT. */
/* */
/* The contents of this file are subject to the Mozilla Public License */
/* Version 1.0 (the "License"); you may not use this file except in */
/* compliance with the License. You may obtain a copy of the License at */
/* http://www.mozilla.org/MPL/. */
/* */
/* Software distributed under the License is distributed on an "AS IS" */
/* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See */
/* the License for the specific language governing rights and limitations */
/* under the License. */
/* */
/* The Original Code is: all this file. */
/* */
/* The Initial Developer of the Original Code is Florent Georges. */
/* */
/* Contributor(s): none. */
/* ------------------------------------------------------------------------ */