blob: 413dac76d4213ca73234f1a831918a958245d6da [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* $Id$ */
package org.apache.fop.servlet;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import javax.servlet.ServletContext;
import javax.xml.transform.Source;
import javax.xml.transform.TransformerException;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;
/**
* This class is a URIResolver implementation that provides access to resources in the WEB-INF
* directory of a web application using "servlet-content:" URIs.
*/
public class ServletContextURIResolver implements URIResolver {
/** The protocol name for the servlet context URIs. */
public static final String SERVLET_CONTEXT_PROTOCOL = "servlet-context:";
private ServletContext servletContext;
/**
* Main constructor
* @param servletContext the servlet context to access the resources through
*/
public ServletContextURIResolver(ServletContext servletContext) {
this.servletContext = servletContext;
}
/** {@inheritDoc} */
public Source resolve(String href, String base) throws TransformerException {
if (href.startsWith(SERVLET_CONTEXT_PROTOCOL)) {
return resolveServletContextURI(href.substring(SERVLET_CONTEXT_PROTOCOL.length()));
} else {
if (base != null
&& base.startsWith(SERVLET_CONTEXT_PROTOCOL)
&& (href.indexOf(':') < 0)) {
String abs = base + href;
return resolveServletContextURI(
abs.substring(SERVLET_CONTEXT_PROTOCOL.length()));
} else {
return null;
}
}
}
/**
* Resolves the "servlet-context:" URI.
* @param path the path part after the protocol (should start with a "/")
* @return the resolved Source or null if the resource was not found
* @throws TransformerException if no URL can be constructed from the path
*/
protected Source resolveServletContextURI(String path) throws TransformerException {
while (path.startsWith("//")) {
path = path.substring(1);
}
try {
URL url = this.servletContext.getResource(path);
InputStream in = this.servletContext.getResourceAsStream(path);
if (in != null) {
if (url != null) {
return new StreamSource(in, url.toExternalForm());
} else {
return new StreamSource(in);
}
} else {
throw new TransformerException("Resource does not exist. \"" + path
+ "\" is not accessible through the servlet context.");
}
} catch (MalformedURLException mfue) {
throw new TransformerException(
"Error accessing resource using servlet context: " + path, mfue);
}
}
}