/*
 * 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: ServletContextURIResolver.java 679326 2008-07-24 09:35:34Z vhennebert $ */

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.
/** * 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.
/** The protocol name for the servlet context URIs. */
public static final String SERVLET_CONTEXT_PROTOCOL = "servlet-context:"; private ServletContext servletContext;
Main constructor
Params:
  • servletContext – the servlet context to access the resources through
/** * Main constructor * @param servletContext the servlet context to access the resources through */
public ServletContextURIResolver(ServletContext servletContext) { this.servletContext = servletContext; }
{@inheritDoc}
/** {@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.
Params:
  • path – the path part after the protocol (should start with a "/")
Throws:
Returns:the resolved Source or null if the resource was not found
/** * 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); } } }