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