/* * 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); } } }