/*
* eXist Open Source Native XML Database
* Copyright (C) 2009 The eXist Project
* http://exist-db.org
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* $Id$
*/
package org.exist.validation.resolver.unstable;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
import org.apache.log4j.Logger;
import org.exist.protocolhandler.embedded.EmbeddedInputStream;
import org.exist.protocolhandler.xmldb.XmldbURL;
import org.exist.storage.BrokerPool;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.ext.EntityResolver2;
/**
*
* @author dizzzz@exist-db.org
*/
public class ExistResolver implements EntityResolver2, URIResolver {
private final static Logger LOG = Logger.getLogger(ExistResolver.class);
private BrokerPool brokerPool = null;
private final static String LOCALURI = "xmldb:exist:///";
private final static String SHORTLOCALURI = "xmldb:///";
public ExistResolver(BrokerPool brokerPool) {
this.brokerPool = brokerPool;
}
/* ========================================== */
/* SAX1: interface org.xml.sax.EntityResolver */
/* ========================================== */
public InputSource resolveEntity(String publicId, String systemId)
throws SAXException, IOException {
LOG.debug("publicId=" + publicId + " systemId=" + systemId);
return resolveInputSource(brokerPool, systemId);
}
/* =============================================== */
/* SAX2: interface org.xml.sax.ext.EntityResolver2 */
/* =============================================== */
public InputSource getExternalSubset(String name, String baseURI)
throws SAXException, IOException {
LOG.debug("name=" + name + " baseURI=" + baseURI);
return resolveInputSource(brokerPool, baseURI);
}
public InputSource resolveEntity(String name, String publicId,
String baseURI, String systemId) throws SAXException, IOException {
LOG.debug("name=" + name + " publicId=" + publicId + " baseURI=" + baseURI + " systemId=" + systemId);
return resolveInputSource(brokerPool, systemId);
}
/* ================================================ */
/* JAXP : interface javax.xml.transform.URIResolver */
/* ================================================ */
public Source resolve(String href, String base) throws TransformerException {
LOG.debug("href=" + href + " base=" + base);
if(base!=null){
int pos = base.lastIndexOf('/');
if(pos!=-1){
base=base.substring(0, pos);
href=base+"/"+href;
}
}
return resolveStreamSource(brokerPool, href);
}
/* ============== */
/* Helper methods */
/* ============== */
private InputSource resolveInputSource(BrokerPool bPool, String path) throws IOException {
LOG.debug("Resolving "+path);
InputSource inputsource = new InputSource();
if (path != null &&
(path.startsWith(LOCALURI) || path.startsWith(SHORTLOCALURI))) {
XmldbURL url = new XmldbURL(path);
EmbeddedInputStream eis = new EmbeddedInputStream(bPool, url);
inputsource.setByteStream(eis);
inputsource.setSystemId(path);
} else {
InputStream is = new URL(path).openStream();
inputsource.setByteStream(is);
inputsource.setSystemId(path);
}
return inputsource;
}
private StreamSource resolveStreamSource(BrokerPool bPool, String path) throws TransformerException {
LOG.debug("Resolving "+path);
StreamSource streamsource = new StreamSource();
try {
if (path != null &&
(path.startsWith(LOCALURI) || path.startsWith(SHORTLOCALURI))) {
XmldbURL url = new XmldbURL(path);
EmbeddedInputStream eis = new EmbeddedInputStream(bPool, url);
streamsource.setInputStream(eis);
streamsource.setSystemId(path);
} else {
InputStream is = new URL(path).openStream();
streamsource.setInputStream(is);
streamsource.setSystemId(path);
}
} catch (IOException ex) {
throw new TransformerException(ex);
}
return streamsource;
}
}