libreccm-legacy/ccm-core/src/com/arsdigita/templating/SimpleURIResolver.java

136 lines
4.3 KiB
Java
Executable File

/*
* Copyright (C) 2003-2004 Red Hat Inc. All Rights Reserved.
*
* This library 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.1 of
* the License, or (at your option) any later version.
*
* This library 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package com.arsdigita.templating;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
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;
/**
* An implementation of the URIResolver interface that keeps track of
* all the URLs that have been loaded. If you set this as the URI
* resolver for a Transformer then this will track all the
* <code>xsl:import</code> and <code>xsl:include</code> statements.
*/
final class SimpleURIResolver implements URIResolver {
public static final String versionId =
"$Id: SimpleURIResolver.java 287 2005-02-22 00:29:02Z sskracic $" +
"$Author: sskracic $" +
"$DateTime: 2004/08/16 18:10:38 $";
private static final Logger s_log = Logger.getLogger
(SimpleURIResolver.class);
private final Set m_uniqueStylesheetURIs;
private final List m_stylesheetURIs;
public SimpleURIResolver() {
m_uniqueStylesheetURIs = new HashSet();
m_stylesheetURIs = new ArrayList();
}
/**
* Returns all the stylesheet URIs encountered so far.
*
* @return a Set whose elements are isntances of java.net.URL
*/
public List getStylesheetURIs() {
return m_stylesheetURIs;
}
/**
* Resolves a URL and returns a stream source.
*
* @param href the url to resolve
* @param base the base url to resolve relative to
*/
public Source resolve(final String href, final String base)
throws TransformerException {
if (s_log.isDebugEnabled()) {
s_log.debug("Resolve " + href + " (" + base + ")");
}
URL baseURL = null;
if (base != null) {
try {
baseURL = new URL(base);
} catch (MalformedURLException ex) {
throw new TransformerException("cannot parse href " + base, ex);
}
}
URL thisURL = null;
try {
if (baseURL == null) {
thisURL = new URL(href);
} else {
thisURL = new URL(baseURL, href);
}
if (!m_uniqueStylesheetURIs.contains(thisURL)) {
m_uniqueStylesheetURIs.add(thisURL);
m_stylesheetURIs.add(thisURL);
}
} catch (MalformedURLException ex) {
throw new TransformerException("cannot parse href " + href, ex);
}
try {
if (s_log.isDebugEnabled()) {
s_log.debug("Got url " + thisURL);
}
// Optimize calls to resource servlet into file:///
// where possible
URL xfrmedURL = Templating.transformURL(thisURL);
if ( xfrmedURL == null ) {
throw new TransformerException
("URL does not exist: " + thisURL);
}
if (s_log.isInfoEnabled()) {
s_log.info("Loading URL " + xfrmedURL);
}
InputStream is = xfrmedURL.openStream();
// NB, don't pass through 'xfrmedURL' since imports
// are relative to 'thisURL'
return new StreamSource(is, thisURL.toString());
} catch (IOException ex) {
throw new TransformerException("cannot read stream", ex);
}
}
}