You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by ma...@apache.org on 2004/03/26 00:17:40 UTC
cvs commit: jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core ApplicationContext.java
markt 2004/03/25 15:17:40
Modified: catalina/src/share/org/apache/catalina/core
ApplicationContext.java
Log:
- Fix line termination. Should be no change to code.
Revision Changes Path
1.42 +1165 -1159jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationContext.java
Index: ApplicationContext.java
===================================================================
RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/core/ApplicationContext.java,v
retrieving revision 1.41
retrieving revision 1.42
diff -u -r1.41 -r1.42
--- ApplicationContext.java 12 Feb 2003 10:24:09 -0000 1.41
+++ ApplicationContext.java 25 Mar 2004 23:17:40 -0000 1.42
@@ -1,1159 +1,1165 @@
-/*
- * $Header$
- * $Revision$
- * $Date$
- *
- * ====================================================================
- *
- * The Apache Software License, Version 1.1
- *
- * Copyright (c) 1999 The Apache Software Foundation. All rights
- * reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * 3. The end-user documentation included with the redistribution, if
- * any, must include the following acknowlegement:
- * "This product includes software developed by the
- * Apache Software Foundation (http://www.apache.org/)."
- * Alternately, this acknowlegement may appear in the software itself,
- * if and wherever such third-party acknowlegements normally appear.
- *
- * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
- * Foundation" must not be used to endorse or promote products derived
- * from this software without prior written permission. For written
- * permission, please contact apache@apache.org.
- *
- * 5. Products derived from this software may not be called "Apache"
- * nor may "Apache" appear in their names without prior written
- * permission of the Apache Group.
- *
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
- * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
- * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- * ====================================================================
- *
- * This software consists of voluntary contributions made by many
- * individuals on behalf of the Apache Software Foundation. For more
- * information on the Apache Software Foundation, please see
- * <http://www.apache.org/>.
- *
- * [Additional notices, if required by prior licensing conditions]
- *
- */
-
-
-package org.apache.catalina.core;
-
-
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.File;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.Socket;
-import java.net.URL;
-import java.security.AccessController;
-import java.security.Principal;
-import java.security.PrivilegedAction;
-import java.security.PrivilegedExceptionAction;
-import java.security.PrivilegedActionException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import javax.naming.NamingException;
-import javax.naming.Binding;
-import javax.naming.directory.DirContext;
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextAttributeEvent;
-import javax.servlet.ServletContextAttributeListener;
-import javax.servlet.ServletInputStream;
-import javax.servlet.ServletRequest;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import org.apache.naming.resources.Resource;
-import org.apache.naming.resources.DirContextURLStreamHandler;
-import org.apache.naming.resources.DirContextURLConnection;
-import org.apache.catalina.Connector;
-import org.apache.catalina.Container;
-import org.apache.catalina.Context;
-import org.apache.catalina.Globals;
-import org.apache.catalina.Host;
-import org.apache.catalina.HttpRequest;
-import org.apache.catalina.Logger;
-import org.apache.catalina.Response;
-import org.apache.catalina.Wrapper;
-import org.apache.catalina.connector.HttpRequestBase;
-import org.apache.catalina.deploy.ApplicationParameter;
-import org.apache.catalina.util.Enumerator;
-import org.apache.catalina.util.ResourceSet;
-import org.apache.catalina.util.ServerInfo;
-import org.apache.catalina.util.StringManager;
-
-
-/**
- * Standard implementation of <code>ServletContext</code> that represents
- * a web application's execution environment. An instance of this class is
- * associated with each instance of <code>StandardContext</code>.
- *
- * @author Craig R. McClanahan
- * @author Remy Maucherat
- * @version $Revision$ $Date$
- */
-
-public class ApplicationContext
- implements ServletContext {
-
-
- protected class PrivilegedGetRequestDispatcher
- implements PrivilegedAction {
-
- private String contextPath;
- private String relativeURI;
- private String queryString;
-
- PrivilegedGetRequestDispatcher(String contextPath, String relativeURI,
- String queryString) {
- this.contextPath = contextPath;
- this.relativeURI = relativeURI;
- this.queryString = queryString;
- }
-
- public Object run() {
- HttpRequest request = new MappingRequest
- (context.getPath(), contextPath + relativeURI, queryString);
- /*
- HttpRequestBase request = new HttpRequestBase();
- request.setContext(context);
- request.setContextPath(context.getPath());
- request.setRequestURI(contextPath + relativeURI);
- request.setQueryString(queryString);
- */
- Wrapper wrapper = (Wrapper) context.map(request, true);
- if (wrapper == null)
- return (null);
-
- // Construct a RequestDispatcher to process this request
- HttpServletRequest hrequest =
- (HttpServletRequest) request.getRequest();
- return (RequestDispatcher) new ApplicationDispatcher
- (wrapper,
- hrequest.getServletPath(),
- hrequest.getPathInfo(),
- hrequest.getQueryString(),
- null);
- }
-
- }
-
-
- protected class PrivilegedGetResource
- implements PrivilegedExceptionAction {
-
- private String path;
- private String host;
- private DirContext resources;
-
- PrivilegedGetResource(String host, String path, DirContext resources) {
- this.host = host;
- this.path = path;
- this.resources = resources;
- }
-
- public Object run() throws Exception {
- return new URL("jndi", null, 0, getJNDIUri(host, path),
- new DirContextURLStreamHandler(resources));
- }
- }
-
-
- protected class PrivilegedGetResourcePaths
- implements PrivilegedAction {
-
- private String path;
- private DirContext resources;
-
- PrivilegedGetResourcePaths(DirContext resources, String path) {
- this.resources = resources;
- this.path = path;
- }
-
- public Object run() {
- return (getResourcePathsInternal(resources, path));
- }
-
- }
-
-
- protected class PrivilegedLogMessage
- implements PrivilegedAction {
-
- private String message;
-
- PrivilegedLogMessage(String message) {
- this.message = message;
- }
-
- public Object run() {
- internalLog(message);
- return null;
- }
-
- }
-
- protected class PrivilegedLogException
- implements PrivilegedAction {
-
- private String message;
- private Exception exception;
-
- PrivilegedLogException(Exception exception,String message) {
- this.message = message;
- this.exception = exception;
- }
-
- public Object run() {
- internalLog(exception,message);
- return null;
- }
-
- }
-
- protected class PrivilegedLogThrowable
- implements PrivilegedAction {
-
- private String message;
- private Throwable throwable;
-
- PrivilegedLogThrowable(String message,Throwable throwable) {
- this.message = message;
- this.throwable = throwable;
- }
-
- public Object run() {
- internalLog(message,throwable);
- return null;
- }
-
- }
-
-
- // ----------------------------------------------------------- Constructors
-
-
- /**
- * Construct a new instance of this class, associated with the specified
- * Context instance.
- *
- * @param context The associated Context instance
- */
- public ApplicationContext(String basePath, StandardContext context) {
- super();
- this.context = context;
- this.basePath = basePath;
- }
-
-
- // ----------------------------------------------------- Instance Variables
-
-
- /**
- * The context attributes for this context.
- */
- private HashMap attributes = new HashMap();
-
-
- /**
- * List of read only attributes for this context.
- */
- private HashMap readOnlyAttributes = new HashMap();
-
-
- /**
- * The Context instance with which we are associated.
- */
- private StandardContext context = null;
-
-
- /**
- * Empty collection to serve as the basis for empty enumerations.
- * <strong>DO NOT ADD ANY ELEMENTS TO THIS COLLECTION!</strong>
- */
- private static final ArrayList empty = new ArrayList();
-
-
- /**
- * The facade around this object.
- */
- private ServletContext facade = new ApplicationContextFacade(this);
-
-
- /**
- * The merged context initialization parameters for this Context.
- */
- private HashMap parameters = null;
-
-
- /**
- * The string manager for this package.
- */
- private static final StringManager sm =
- StringManager.getManager(Constants.Package);
-
-
- /**
- * Base path.
- */
- private String basePath = null;
-
-
- // --------------------------------------------------------- Public Methods
-
-
- /**
- * Clear all application-created attributes.
- */
- public void clearAttributes() {
-
- // Create list of attributes to be removed
- ArrayList list = new ArrayList();
- synchronized (attributes) {
- Iterator iter = attributes.keySet().iterator();
- while (iter.hasNext()) {
- list.add(iter.next());
- }
- }
-
- // Remove application originated attributes
- // (read only attributes will be left in place)
- Iterator keys = list.iterator();
- while (keys.hasNext()) {
- String key = (String) keys.next();
- removeAttribute(key);
- }
-
-
- }
-
-
- /**
- * Return the resources object that is mapped to a specified path.
- * The path must begin with a "/" and is interpreted as relative to the
- * current context root.
- */
- public DirContext getResources() {
-
- return context.getResources();
-
- }
-
-
- /**
- * Set an attribute as read only.
- */
- public void setAttributeReadOnly(String name) {
-
- synchronized (attributes) {
- if (attributes.containsKey(name))
- readOnlyAttributes.put(name, name);
- }
-
- }
-
-
- // ------------------------------------------------- ServletContext Methods
-
-
- /**
- * Return the value of the specified context attribute, if any;
- * otherwise return <code>null</code>.
- *
- * @param name Name of the context attribute to return
- */
- public Object getAttribute(String name) {
-
- synchronized (attributes) {
- return (attributes.get(name));
- }
-
- }
-
-
- /**
- * Return an enumeration of the names of the context attributes
- * associated with this context.
- */
- public Enumeration getAttributeNames() {
-
- synchronized (attributes) {
- return (new Enumerator(attributes.keySet()));
- }
-
- }
-
-
- /**
- * Return a <code>ServletContext</code> object that corresponds to a
- * specified URI on the server. This method allows servlets to gain
- * access to the context for various parts of the server, and as needed
- * obtain <code>RequestDispatcher</code> objects or resources from the
- * context. The given path must be absolute (beginning with a "/"),
- * and is interpreted based on our virtual host's document root.
- *
- * @param uri Absolute URI of a resource on the server
- */
- public ServletContext getContext(String uri) {
-
- // Validate the format of the specified argument
- if ((uri == null) || (!uri.startsWith("/")))
- return (null);
-
- // Return the current context if requested
- String contextPath = context.getPath();
- if (!contextPath.endsWith("/"))
- contextPath = contextPath + "/";
- if ((contextPath.length() > 1) && (uri.startsWith(contextPath))) {
- return (this);
- }
-
- // Return other contexts only if allowed
- if (!context.getCrossContext())
- return (null);
- try {
- Host host = (Host) context.getParent();
- Context child = host.map(uri);
- if (child != null)
- return (child.getServletContext());
- else
- return (null);
- } catch (Throwable t) {
- return (null);
- }
-
- }
-
-
- /**
- * Return the value of the specified initialization parameter, or
- * <code>null</code> if this parameter does not exist.
- *
- * @param name Name of the initialization parameter to retrieve
- */
- public String getInitParameter(String name) {
-
- mergeParameters();
- synchronized (parameters) {
- return ((String) parameters.get(name));
- }
-
- }
-
-
- /**
- * Return the names of the context's initialization parameters, or an
- * empty enumeration if the context has no initialization parameters.
- */
- public Enumeration getInitParameterNames() {
-
- mergeParameters();
- synchronized (parameters) {
- return (new Enumerator(parameters.keySet()));
- }
-
- }
-
-
- /**
- * Return the major version of the Java Servlet API that we implement.
- */
- public int getMajorVersion() {
-
- return (Constants.MAJOR_VERSION);
-
- }
-
-
- /**
- * Return the minor version of the Java Servlet API that we implement.
- */
- public int getMinorVersion() {
-
- return (Constants.MINOR_VERSION);
-
- }
-
-
- /**
- * Return the MIME type of the specified file, or <code>null</code> if
- * the MIME type cannot be determined.
- *
- * @param file Filename for which to identify a MIME type
- */
- public String getMimeType(String file) {
-
- if (file == null)
- return (null);
- int period = file.lastIndexOf(".");
- if (period < 0)
- return (null);
- String extension = file.substring(period + 1);
- if (extension.length() < 1)
- return (null);
- return (context.findMimeMapping(extension));
-
- }
-
-
- /**
- * Return a <code>RequestDispatcher</code> object that acts as a
- * wrapper for the named servlet.
- *
- * @param name Name of the servlet for which a dispatcher is requested
- */
- public RequestDispatcher getNamedDispatcher(String name) {
-
- // Validate the name argument
- if (name == null)
- return (null);
-
- // Create and return a corresponding request dispatcher
- Wrapper wrapper = (Wrapper) context.findChild(name);
- if (wrapper == null)
- return (null);
- ApplicationDispatcher dispatcher =
- new ApplicationDispatcher(wrapper, null, null, null, name);
- return ((RequestDispatcher) dispatcher);
-
- }
-
-
- /**
- * Return the real path for a given virtual path, if possible; otherwise
- * return <code>null</code>.
- *
- * @param path The path to the desired resource
- */
- public String getRealPath(String path) {
-
- if (!context.isFilesystemBased())
- return null;
-
- File file = new File(basePath, path);
- return (file.getAbsolutePath());
-
- }
-
-
- /**
- * Return a <code>RequestDispatcher</code> instance that acts as a
- * wrapper for the resource at the given path. The path must begin
- * with a "/" and is interpreted as relative to the current context root.
- *
- * @param path The path to the desired resource.
- */
- public RequestDispatcher getRequestDispatcher(String path) {
-
- // Validate the path argument
- if (path == null)
- return (null);
- if (!path.startsWith("/"))
- throw new IllegalArgumentException
- (sm.getString("applicationContext.requestDispatcher.iae", path));
- path = normalize(path);
- if (path == null)
- return (null);
-
- // Construct a "fake" request to be mapped by our Context
- String contextPath = context.getPath();
- if (contextPath == null)
- contextPath = "";
- String relativeURI = path;
- String queryString = null;
- int question = path.indexOf('?');
- if (question >= 0) {
- relativeURI = path.substring(0, question);
- queryString = path.substring(question + 1);
- }
- if( System.getSecurityManager() != null ) {
- PrivilegedGetRequestDispatcher dp =
- new PrivilegedGetRequestDispatcher(contextPath,
- relativeURI,queryString);
- return (RequestDispatcher)AccessController.doPrivileged(dp);
- }
-
- // The remaining code is duplicated in PrivilegedGetRequestDispatcher,
- // we need to make sure they stay in sync
- HttpRequest request = new MappingRequest
- (context.getPath(), contextPath + relativeURI, queryString);
- /*
- request.setContext(context);
- request.setContextPath(context.getPath());
- request.setRequestURI(contextPath + relativeURI);
- request.setQueryString(queryString);
- */
- Wrapper wrapper = (Wrapper) context.map(request, true);
- if (wrapper == null)
- return (null);
-
- // Construct a RequestDispatcher to process this request
- HttpServletRequest hrequest =
- (HttpServletRequest) request.getRequest();
- return (RequestDispatcher) new ApplicationDispatcher(wrapper,
- hrequest.getServletPath(),
- hrequest.getPathInfo(),
- hrequest.getQueryString(),
- null);
-
- }
-
-
-
- /**
- * Return the URL to the resource that is mapped to a specified path.
- * The path must begin with a "/" and is interpreted as relative to the
- * current context root.
- *
- * @param path The path to the desired resource
- *
- * @exception MalformedURLException if the path is not given
- * in the correct form
- */
- public URL getResource(String path)
- throws MalformedURLException {
-
- path = normalize(path);
- if (path == null)
- return (null);
-
- DirContext resources = context.getResources();
- if (resources != null) {
- String fullPath = context.getName() + path;
- String hostName = context.getParent().getName();
- try {
- resources.lookup(path);
- if( System.getSecurityManager() != null ) {
- try {
- PrivilegedGetResource dp =
- new PrivilegedGetResource
- (hostName, fullPath, resources);
- return (URL)AccessController.doPrivileged(dp);
- } catch( PrivilegedActionException pe) {
- throw pe.getException();
- }
- } else {
- return new URL
- ("jndi", null, 0, getJNDIUri(hostName, fullPath),
- new DirContextURLStreamHandler(resources));
- }
- } catch (Exception e) {
- //e.printStackTrace();
- }
- }
- return (null);
-
- }
-
-
- /**
- * Return the requested resource as an <code>InputStream</code>. The
- * path must be specified according to the rules described under
- * <code>getResource</code>. If no such resource can be identified,
- * return <code>null</code>.
- *
- * @param path The path to the desired resource.
- */
- public InputStream getResourceAsStream(String path) {
-
- path = normalize(path);
- if (path == null)
- return (null);
-
- DirContext resources = context.getResources();
- if (resources != null) {
- try {
- Object resource = resources.lookup(path);
- if (resource instanceof Resource)
- return (((Resource) resource).streamContent());
- } catch (Exception e) {
- }
- }
- return (null);
-
- }
-
-
- /**
- * Return a Set containing the resource paths of resources member of the
- * specified collection. Each path will be a String starting with
- * a "/" character. The returned set is immutable.
- *
- * @param path Collection path
- */
- public Set getResourcePaths(String path) {
-
- DirContext resources = context.getResources();
- if (resources != null) {
- if (System.getSecurityManager() != null) {
- PrivilegedAction dp =
- new PrivilegedGetResourcePaths(resources, path);
- return ((Set) AccessController.doPrivileged(dp));
- } else {
- return (getResourcePathsInternal(resources, path));
- }
- }
- return (null);
-
- }
-
-
- /**
- * Internal implementation of getResourcesPath() logic.
- *
- * @param resources Directory context to search
- * @param path Collection path
- */
- private Set getResourcePathsInternal(DirContext resources, String path) {
-
- ResourceSet set = new ResourceSet();
- try {
- listCollectionPaths(set, resources, path);
- } catch (NamingException e) {
- return (null);
- }
- set.setLocked(true);
- return (set);
-
- }
-
-
- /**
- * Return the name and version of the servlet container.
- */
- public String getServerInfo() {
-
- return (ServerInfo.getServerInfo());
-
- }
-
-
- /**
- * @deprecated As of Java Servlet API 2.1, with no direct replacement.
- */
- public Servlet getServlet(String name) {
-
- return (null);
-
- }
-
-
- /**
- * Return the display name of this web application.
- */
- public String getServletContextName() {
-
- return (context.getDisplayName());
-
- }
-
-
- /**
- * @deprecated As of Java Servlet API 2.1, with no direct replacement.
- */
- public Enumeration getServletNames() {
-
- return (new Enumerator(empty));
-
- }
-
-
- /**
- * @deprecated As of Java Servlet API 2.1, with no direct replacement.
- */
- public Enumeration getServlets() {
-
- return (new Enumerator(empty));
-
- }
-
-
- /**
- * Writes the specified message to a servlet log file.
- *
- * @param message Message to be written
- */
- public void log(String message) {
- if( System.getSecurityManager() != null ) {
- PrivilegedLogMessage dp =
- new PrivilegedLogMessage(message);
- AccessController.doPrivileged(dp);
- } else {
- internalLog(message);
- }
- }
-
- private void internalLog(String message) {
-
- Logger logger = context.getLogger();
- if (logger != null)
- logger.log(message);
-
- }
-
-
- /**
- * Writes the specified exception and message to a servlet log file.
- *
- * @param exception Exception to be reported
- * @param message Message to be written
- *
- * @deprecated As of Java Servlet API 2.1, use
- * <code>log(String, Throwable)</code> instead
- */
- public void log(Exception exception, String message) {
- if( System.getSecurityManager() != null ) {
- PrivilegedLogException dp =
- new PrivilegedLogException(exception,message);
- AccessController.doPrivileged(dp);
- } else {
- internalLog(exception,message);
- }
- }
-
- private void internalLog(Exception exception, String message) {
- Logger logger = context.getLogger();
- if (logger != null)
- logger.log(exception, message);
-
- }
-
-
- /**
- * Writes the specified message and exception to a servlet log file.
- *
- * @param message Message to be written
- * @param throwable Exception to be reported
- */
- public void log(String message, Throwable throwable) {
- if( System.getSecurityManager() != null ) {
- PrivilegedLogThrowable dp =
- new PrivilegedLogThrowable(message,throwable);
- AccessController.doPrivileged(dp);
- } else {
- internalLog(message,throwable);
- }
- }
-
- private void internalLog(String message, Throwable throwable) {
-
- Logger logger = context.getLogger();
- if (logger != null)
- logger.log(message, throwable);
-
- }
-
-
- /**
- * Remove the context attribute with the specified name, if any.
- *
- * @param name Name of the context attribute to be removed
- */
- public void removeAttribute(String name) {
-
- Object value = null;
- boolean found = false;
-
- // Remove the specified attribute
- synchronized (attributes) {
- // Check for read only attribute
- if (readOnlyAttributes.containsKey(name))
- return;
- found = attributes.containsKey(name);
- if (found) {
- value = attributes.get(name);
- attributes.remove(name);
- } else {
- return;
- }
- }
-
- // Notify interested application event listeners
- Object listeners[] = context.getApplicationListeners();
- if ((listeners == null) || (listeners.length == 0))
- return;
- ServletContextAttributeEvent event =
- new ServletContextAttributeEvent(context.getServletContext(),
- name, value);
- for (int i = 0; i < listeners.length; i++) {
- if (!(listeners[i] instanceof ServletContextAttributeListener))
- continue;
- ServletContextAttributeListener listener =
- (ServletContextAttributeListener) listeners[i];
- try {
- context.fireContainerEvent("beforeContextAttributeRemoved",
- listener);
- listener.attributeRemoved(event);
- context.fireContainerEvent("afterContextAttributeRemoved",
- listener);
- } catch (Throwable t) {
- context.fireContainerEvent("afterContextAttributeRemoved",
- listener);
- // FIXME - should we do anything besides log these?
- log(sm.getString("applicationContext.attributeEvent"), t);
- }
- }
-
- }
-
-
- /**
- * Bind the specified value with the specified context attribute name,
- * replacing any existing value for that name.
- *
- * @param name Attribute name to be bound
- * @param value New attribute value to be bound
- */
- public void setAttribute(String name, Object value) {
-
- // Name cannot be null
- if (name == null)
- throw new IllegalArgumentException
- (sm.getString("applicationContext.setAttribute.namenull"));
-
- // Null value is the same as removeAttribute()
- if (value == null) {
- removeAttribute(name);
- return;
- }
-
- Object oldValue = null;
- boolean replaced = false;
-
- // Add or replace the specified attribute
- synchronized (attributes) {
- // Check for read only attribute
- if (readOnlyAttributes.containsKey(name))
- return;
- oldValue = attributes.get(name);
- if (oldValue != null)
- replaced = true;
- attributes.put(name, value);
- }
-
- // Notify interested application event listeners
- Object listeners[] = context.getApplicationListeners();
- if ((listeners == null) || (listeners.length == 0))
- return;
- ServletContextAttributeEvent event = null;
- if (replaced)
- event =
- new ServletContextAttributeEvent(context.getServletContext(),
- name, oldValue);
- else
- event =
- new ServletContextAttributeEvent(context.getServletContext(),
- name, value);
-
- for (int i = 0; i < listeners.length; i++) {
- if (!(listeners[i] instanceof ServletContextAttributeListener))
- continue;
- ServletContextAttributeListener listener =
- (ServletContextAttributeListener) listeners[i];
- try {
- if (replaced) {
- context.fireContainerEvent
- ("beforeContextAttributeReplaced", listener);
- listener.attributeReplaced(event);
- context.fireContainerEvent("afterContextAttributeReplaced",
- listener);
- } else {
- context.fireContainerEvent("beforeContextAttributeAdded",
- listener);
- listener.attributeAdded(event);
- context.fireContainerEvent("afterContextAttributeAdded",
- listener);
- }
- } catch (Throwable t) {
- if (replaced)
- context.fireContainerEvent("afterContextAttributeReplaced",
- listener);
- else
- context.fireContainerEvent("afterContextAttributeAdded",
- listener);
- // FIXME - should we do anything besides log these?
- log(sm.getString("applicationContext.attributeEvent"), t);
- }
- }
-
- }
-
-
- // -------------------------------------------------------- Package Methods
-
-
- /**
- * Return the facade associated with this ApplicationContext.
- */
- ServletContext getFacade() {
-
- return (this.facade);
-
- }
-
-
- // -------------------------------------------------------- Private Methods
-
-
- /**
- * Return a context-relative path, beginning with a "/", that represents
- * the canonical version of the specified path after ".." and "." elements
- * are resolved out. If the specified path attempts to go outside the
- * boundaries of the current context (i.e. too many ".." path elements
- * are present), return <code>null</code> instead.
- *
- * @param path Path to be normalized
- */
- private String normalize(String path) {
-
- String normalized = path;
-
- // Normalize the slashes and add leading slash if necessary
- if (normalized.indexOf('\\') >= 0)
- normalized = normalized.replace('\\', '/');
-
- // Resolve occurrences of "/../" in the normalized path
- while (true) {
- int index = normalized.indexOf("/../");
- if (index < 0)
- break;
- if (index == 0)
- return (null); // Trying to go outside our context
- int index2 = normalized.lastIndexOf('/', index - 1);
- normalized = normalized.substring(0, index2) +
- normalized.substring(index + 3);
- }
-
- // Return the normalized path that we have completed
- return (normalized);
-
- }
-
-
- /**
- * Merge the context initialization parameters specified in the application
- * deployment descriptor with the application parameters described in the
- * server configuration, respecting the <code>override</code> property of
- * the application parameters appropriately.
- */
- private void mergeParameters() {
-
- if (parameters != null)
- return;
- HashMap results = new HashMap();
- String names[] = context.findParameters();
- for (int i = 0; i < names.length; i++)
- results.put(names[i], context.findParameter(names[i]));
- ApplicationParameter params[] =
- context.findApplicationParameters();
- for (int i = 0; i < params.length; i++) {
- if (params[i].getOverride()) {
- if (results.get(params[i].getName()) == null)
- results.put(params[i].getName(), params[i].getValue());
- } else {
- results.put(params[i].getName(), params[i].getValue());
- }
- }
- parameters = results;
-
- }
-
-
- /**
- * List resource paths (recursively), and store all of them in the given
- * Set.
- */
- private static void listPaths(Set set, DirContext resources, String path)
- throws NamingException {
-
- Enumeration childPaths = resources.listBindings(path);
- while (childPaths.hasMoreElements()) {
- Binding binding = (Binding) childPaths.nextElement();
- String name = binding.getName();
- String childPath = path + "/" + name;
- set.add(childPath);
- Object object = binding.getObject();
- if (object instanceof DirContext) {
- listPaths(set, resources, childPath);
- }
- }
-
- }
-
-
- /**
- * List resource paths (recursively), and store all of them in the given
- * Set.
- */
- private static void listCollectionPaths
- (Set set, DirContext resources, String path)
- throws NamingException {
-
- Enumeration childPaths = resources.listBindings(path);
- while (childPaths.hasMoreElements()) {
- Binding binding = (Binding) childPaths.nextElement();
- String name = binding.getName();
- StringBuffer childPath = new StringBuffer(path);
- if (!"/".equals(path) && !path.endsWith("/"))
- childPath.append("/");
- childPath.append(name);
- Object object = binding.getObject();
- if (object instanceof DirContext) {
- childPath.append("/");
- }
- set.add(childPath.toString());
- }
-
- }
-
-
- /**
- * Get full path, based on the host name and the context path.
- */
- public static String getJNDIUri(String hostName, String path) {
- if (!path.startsWith("/"))
- return "/" + hostName + "/" + path;
- else
- return "/" + hostName + path;
- }
-
-
-}
+/*
+ * $Header$
+ * $Revision$
+ * $Date$
+ *
+ * ====================================================================
+ *
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 1999 The Apache Software Foundation. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ * any, must include the following acknowlegement:
+ * "This product includes software developed by the
+ * Apache Software Foundation (http://www.apache.org/)."
+ * Alternately, this acknowlegement may appear in the software itself,
+ * if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software
+ * Foundation" must not be used to endorse or promote products derived
+ * from this software without prior written permission. For written
+ * permission, please contact apache@apache.org.
+ *
+ * 5. Products derived from this software may not be called "Apache"
+ * nor may "Apache" appear in their names without prior written
+ * permission of the Apache Group.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
+ * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ *
+ * This software consists of voluntary contributions made by many
+ * individuals on behalf of the Apache Software Foundation. For more
+ * information on the Apache Software Foundation, please see
+ * <http://www.apache.org/>.
+ *
+ * [Additional notices, if required by prior licensing conditions]
+ *
+ */
+
+
+package org.apache.catalina.core;
+
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.Socket;
+import java.net.URL;
+import java.security.AccessController;
+import java.security.Principal;
+import java.security.PrivilegedAction;
+import java.security.PrivilegedExceptionAction;
+import java.security.PrivilegedActionException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.Map;
+import java.util.Set;
+import javax.naming.NamingException;
+import javax.naming.Binding;
+import javax.naming.directory.DirContext;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import org.apache.naming.resources.Resource;
+import org.apache.naming.resources.DirContextURLStreamHandler;
+import org.apache.naming.resources.DirContextURLConnection;
+import org.apache.catalina.Connector;
+import org.apache.catalina.Container;
+import org.apache.catalina.Context;
+import org.apache.catalina.Globals;
+import org.apache.catalina.Host;
+
+import org.apache.catalina.HttpRequest;
+import org.apache.catalina.Logger;
+import org.apache.catalina.Response;
+import org.apache.catalina.Wrapper;
+import org.apache.catalina.connector.HttpRequestBase;
+import org.apache.catalina.deploy.ApplicationParameter;
+import org.apache.catalina.util.Enumerator;
+import org.apache.catalina.util.ResourceSet;
+import org.apache.catalina.util.ServerInfo;
+import org.apache.catalina.util.StringManager;
+
+
+/**
+ * Standard implementation of <code>ServletContext</code> that represents
+ * a web application's execution environment. An instance of this class is
+ * associated with each instance of <code>StandardContext</code>.
+ *
+ * @author Craig R. McClanahan
+ * @author Remy Maucherat
+ * @version $Revision$ $Date$
+ */
+
+public class ApplicationContext
+ implements ServletContext {
+
+
+ protected class PrivilegedGetRequestDispatcher
+ implements PrivilegedAction {
+
+ private String contextPath;
+ private String relativeURI;
+ private String queryString;
+
+ PrivilegedGetRequestDispatcher(String contextPath, String relativeURI,
+ String queryString) {
+ this.contextPath = contextPath;
+ this.relativeURI = relativeURI;
+ this.queryString = queryString;
+ }
+
+ public Object run() {
+ HttpRequest request = new MappingRequest
+ (context.getPath(), contextPath + relativeURI, queryString);
+ /*
+ HttpRequestBase request = new HttpRequestBase();
+ request.setContext(context);
+ request.setContextPath(context.getPath());
+ request.setRequestURI(contextPath + relativeURI);
+ request.setQueryString(queryString);
+ */
+ Wrapper wrapper = (Wrapper) context.map(request, true);
+ if (wrapper == null)
+ return (null);
+
+ // Construct a RequestDispatcher to process this request
+ HttpServletRequest hrequest =
+ (HttpServletRequest) request.getRequest();
+ return (RequestDispatcher) new ApplicationDispatcher
+ (wrapper,
+ hrequest.getServletPath(),
+ hrequest.getPathInfo(),
+ hrequest.getQueryString(),
+ null);
+ }
+
+ }
+
+
+
+ protected class PrivilegedGetResource
+ implements PrivilegedExceptionAction {
+
+ private String path;
+ private String host;
+ private DirContext resources;
+
+ PrivilegedGetResource(String host, String path, DirContext resources) {
+ this.host = host;
+ this.path = path;
+ this.resources = resources;
+ }
+
+ public Object run() throws Exception {
+ return new URL("jndi", null, 0, getJNDIUri(host, path),
+ new DirContextURLStreamHandler(resources));
+ }
+ }
+
+
+ protected class PrivilegedGetResourcePaths
+ implements PrivilegedAction {
+
+ private String path;
+ private DirContext resources;
+
+ PrivilegedGetResourcePaths(DirContext resources, String path) {
+ this.resources = resources;
+ this.path = path;
+ }
+
+ public Object run() {
+ return (getResourcePathsInternal(resources, path));
+ }
+
+ }
+
+
+ protected class PrivilegedLogMessage
+ implements PrivilegedAction {
+
+ private String message;
+
+ PrivilegedLogMessage(String message) {
+ this.message = message;
+ }
+
+ public Object run() {
+ internalLog(message);
+ return null;
+ }
+
+ }
+
+ protected class PrivilegedLogException
+ implements PrivilegedAction {
+
+ private String message;
+ private Exception exception;
+
+ PrivilegedLogException(Exception exception,String message) {
+ this.message = message;
+ this.exception = exception;
+ }
+
+ public Object run() {
+ internalLog(exception,message);
+ return null;
+ }
+
+ }
+
+ protected class PrivilegedLogThrowable
+ implements PrivilegedAction {
+
+
+ private String message;
+ private Throwable throwable;
+
+ PrivilegedLogThrowable(String message,Throwable throwable) {
+ this.message = message;
+ this.throwable = throwable;
+ }
+
+ public Object run() {
+ internalLog(message,throwable);
+ return null;
+ }
+
+ }
+
+
+ // ----------------------------------------------------------- Constructors
+
+
+ /**
+ * Construct a new instance of this class, associated with the specified
+ * Context instance.
+ *
+ * @param context The associated Context instance
+ */
+ public ApplicationContext(String basePath, StandardContext context) {
+ super();
+ this.context = context;
+ this.basePath = basePath;
+ }
+
+
+ // ----------------------------------------------------- Instance Variables
+
+
+ /**
+ * The context attributes for this context.
+ */
+ private HashMap attributes = new HashMap();
+
+
+ /**
+ * List of read only attributes for this context.
+ */
+ private HashMap readOnlyAttributes = new HashMap();
+
+
+ /**
+ * The Context instance with which we are associated.
+ */
+ private StandardContext context = null;
+
+
+ /**
+ * Empty collection to serve as the basis for empty enumerations.
+ * <strong>DO NOT ADD ANY ELEMENTS TO THIS COLLECTION!</strong>
+ */
+ private static final ArrayList empty = new ArrayList();
+
+
+ /**
+ * The facade around this object.
+ */
+ private ServletContext facade = new ApplicationContextFacade(this);
+
+
+ /**
+ * The merged context initialization parameters for this Context.
+ */
+ private HashMap parameters = null;
+
+
+ /**
+ * The string manager for this package.
+ */
+ private static final StringManager sm =
+ StringManager.getManager(Constants.Package);
+
+
+ /**
+ * Base path.
+ */
+ private String basePath = null;
+
+
+ // --------------------------------------------------------- Public Methods
+
+
+ /**
+ * Clear all application-created attributes.
+ */
+ public void clearAttributes() {
+
+ // Create list of attributes to be removed
+ ArrayList list = new ArrayList();
+ synchronized (attributes) {
+ Iterator iter = attributes.keySet().iterator();
+ while (iter.hasNext()) {
+ list.add(iter.next());
+ }
+ }
+
+ // Remove application originated attributes
+ // (read only attributes will be left in place)
+ Iterator keys = list.iterator();
+ while (keys.hasNext()) {
+ String key = (String) keys.next();
+ removeAttribute(key);
+ }
+
+
+ }
+
+
+ /**
+ * Return the resources object that is mapped to a specified path.
+ * The path must begin with a "/" and is interpreted as relative to the
+ * current context root.
+ */
+ public DirContext getResources() {
+
+ return context.getResources();
+
+ }
+
+
+ /**
+ * Set an attribute as read only.
+ */
+ public void setAttributeReadOnly(String name) {
+
+ synchronized (attributes) {
+ if (attributes.containsKey(name))
+ readOnlyAttributes.put(name, name);
+ }
+
+ }
+
+
+ // ------------------------------------------------- ServletContext Methods
+
+
+ /**
+ * Return the value of the specified context attribute, if any;
+ * otherwise return <code>null</code>.
+ *
+ * @param name Name of the context attribute to return
+ */
+ public Object getAttribute(String name) {
+
+ synchronized (attributes) {
+ return (attributes.get(name));
+ }
+
+ }
+
+
+ /**
+ * Return an enumeration of the names of the context attributes
+ * associated with this context.
+ */
+ public Enumeration getAttributeNames() {
+
+ synchronized (attributes) {
+ return (new Enumerator(attributes.keySet()));
+ }
+
+ }
+
+
+ /**
+ * Return a <code>ServletContext</code> object that corresponds to a
+ * specified URI on the server. This method allows servlets to gain
+ * access to the context for various parts of the server, and as needed
+ * obtain <code>RequestDispatcher</code> objects or resources from the
+ * context. The given path must be absolute (beginning with a "/"),
+ * and is interpreted based on our virtual host's document root.
+ *
+ * @param uri Absolute URI of a resource on the server
+ */
+ public ServletContext getContext(String uri) {
+
+ // Validate the format of the specified argument
+ if ((uri == null) || (!uri.startsWith("/")))
+ return (null);
+
+ // Return the current context if requested
+ String contextPath = context.getPath();
+ if (!contextPath.endsWith("/"))
+ contextPath = contextPath + "/";
+
+ if ((contextPath.length() > 1) && (uri.startsWith(contextPath))) {
+ return (this);
+ }
+
+ // Return other contexts only if allowed
+ if (!context.getCrossContext())
+ return (null);
+ try {
+ Host host = (Host) context.getParent();
+ Context child = host.map(uri);
+ if (child != null)
+ return (child.getServletContext());
+ else
+ return (null);
+ } catch (Throwable t) {
+ return (null);
+ }
+
+ }
+
+
+ /**
+ * Return the value of the specified initialization parameter, or
+ * <code>null</code> if this parameter does not exist.
+ *
+ * @param name Name of the initialization parameter to retrieve
+ */
+ public String getInitParameter(String name) {
+
+ mergeParameters();
+ synchronized (parameters) {
+ return ((String) parameters.get(name));
+ }
+
+ }
+
+
+ /**
+ * Return the names of the context's initialization parameters, or an
+ * empty enumeration if the context has no initialization parameters.
+ */
+ public Enumeration getInitParameterNames() {
+
+ mergeParameters();
+ synchronized (parameters) {
+ return (new Enumerator(parameters.keySet()));
+ }
+
+ }
+
+
+ /**
+ * Return the major version of the Java Servlet API that we implement.
+ */
+ public int getMajorVersion() {
+
+ return (Constants.MAJOR_VERSION);
+
+ }
+
+
+ /**
+ * Return the minor version of the Java Servlet API that we implement.
+ */
+ public int getMinorVersion() {
+
+ return (Constants.MINOR_VERSION);
+
+ }
+
+
+ /**
+ * Return the MIME type of the specified file, or <code>null</code> if
+ * the MIME type cannot be determined.
+ *
+ * @param file Filename for which to identify a MIME type
+ */
+ public String getMimeType(String file) {
+
+ if (file == null)
+ return (null);
+ int period = file.lastIndexOf(".");
+ if (period < 0)
+ return (null);
+ String extension = file.substring(period + 1);
+ if (extension.length() < 1)
+ return (null);
+ return (context.findMimeMapping(extension));
+
+ }
+
+
+ /**
+ * Return a <code>RequestDispatcher</code> object that acts as a
+ * wrapper for the named servlet.
+ *
+ * @param name Name of the servlet for which a dispatcher is requested
+ */
+ public RequestDispatcher getNamedDispatcher(String name) {
+
+ // Validate the name argument
+ if (name == null)
+ return (null);
+
+ // Create and return a corresponding request dispatcher
+ Wrapper wrapper = (Wrapper) context.findChild(name);
+ if (wrapper == null)
+ return (null);
+ ApplicationDispatcher dispatcher =
+ new ApplicationDispatcher(wrapper, null, null, null, name);
+ return ((RequestDispatcher) dispatcher);
+
+ }
+
+
+ /**
+ * Return the real path for a given virtual path, if possible; otherwise
+ * return <code>null</code>.
+ *
+ * @param path The path to the desired resource
+ */
+ public String getRealPath(String path) {
+
+ if (!context.isFilesystemBased())
+ return null;
+
+ File file = new File(basePath, path);
+ return (file.getAbsolutePath());
+
+ }
+
+
+ /**
+ * Return a <code>RequestDispatcher</code> instance that acts as a
+ * wrapper for the resource at the given path. The path must begin
+ * with a "/" and is interpreted as relative to the current context root.
+ *
+ * @param path The path to the desired resource.
+ */
+ public RequestDispatcher getRequestDispatcher(String path) {
+
+ // Validate the path argument
+ if (path == null)
+ return (null);
+ if (!path.startsWith("/"))
+ throw new IllegalArgumentException
+ (sm.getString("applicationContext.requestDispatcher.iae", path));
+ path = normalize(path);
+ if (path == null)
+ return (null);
+
+ // Construct a "fake" request to be mapped by our Context
+ String contextPath = context.getPath();
+ if (contextPath == null)
+ contextPath = "";
+ String relativeURI = path;
+ String queryString = null;
+ int question = path.indexOf('?');
+ if (question >= 0) {
+ relativeURI = path.substring(0, question);
+ queryString = path.substring(question + 1);
+ }
+ if( System.getSecurityManager() != null ) {
+ PrivilegedGetRequestDispatcher dp =
+ new PrivilegedGetRequestDispatcher(contextPath,
+ relativeURI,queryString);
+ return (RequestDispatcher)AccessController.doPrivileged(dp);
+ }
+
+ // The remaining code is duplicated in PrivilegedGetRequestDispatcher,
+ // we need to make sure they stay in sync
+ HttpRequest request = new MappingRequest
+ (context.getPath(), contextPath + relativeURI, queryString);
+ /*
+ request.setContext(context);
+ request.setContextPath(context.getPath());
+ request.setRequestURI(contextPath + relativeURI);
+ request.setQueryString(queryString);
+ */
+ Wrapper wrapper = (Wrapper) context.map(request, true);
+ if (wrapper == null)
+ return (null);
+
+ // Construct a RequestDispatcher to process this request
+ HttpServletRequest hrequest =
+ (HttpServletRequest) request.getRequest();
+ return (RequestDispatcher) new ApplicationDispatcher(wrapper,
+ hrequest.getServletPath(),
+ hrequest.getPathInfo(),
+ hrequest.getQueryString(),
+ null);
+
+ }
+
+
+
+ /**
+ * Return the URL to the resource that is mapped to a specified path.
+ * The path must begin with a "/" and is interpreted as relative to the
+ * current context root.
+ *
+ * @param path The path to the desired resource
+ *
+ * @exception MalformedURLException if the path is not given
+ * in the correct form
+ */
+ public URL getResource(String path)
+ throws MalformedURLException {
+
+ path = normalize(path);
+ if (path == null)
+ return (null);
+
+ DirContext resources = context.getResources();
+ if (resources != null) {
+ String fullPath = context.getName() + path;
+ String hostName = context.getParent().getName();
+ try {
+ resources.lookup(path);
+ if( System.getSecurityManager() != null ) {
+ try {
+ PrivilegedGetResource dp =
+ new PrivilegedGetResource
+ (hostName, fullPath, resources);
+ return (URL)AccessController.doPrivileged(dp);
+ } catch( PrivilegedActionException pe) {
+ throw pe.getException();
+ }
+ } else {
+ return new URL
+ ("jndi", null, 0, getJNDIUri(hostName, fullPath),
+ new DirContextURLStreamHandler(resources));
+ }
+ } catch (Exception e) {
+ //e.printStackTrace();
+ }
+ }
+ return (null);
+
+ }
+
+
+ /**
+ * Return the requested resource as an <code>InputStream</code>. The
+ * path must be specified according to the rules described under
+ * <code>getResource</code>. If no such resource can be identified,
+ * return <code>null</code>.
+ *
+ * @param path The path to the desired resource.
+
+ */
+ public InputStream getResourceAsStream(String path) {
+
+ path = normalize(path);
+ if (path == null)
+ return (null);
+
+ DirContext resources = context.getResources();
+ if (resources != null) {
+ try {
+ Object resource = resources.lookup(path);
+ if (resource instanceof Resource)
+ return (((Resource) resource).streamContent());
+ } catch (Exception e) {
+ }
+ }
+ return (null);
+
+ }
+
+
+ /**
+ * Return a Set containing the resource paths of resources member of the
+ * specified collection. Each path will be a String starting with
+ * a "/" character. The returned set is immutable.
+ *
+ * @param path Collection path
+ */
+ public Set getResourcePaths(String path) {
+
+ DirContext resources = context.getResources();
+ if (resources != null) {
+ if (System.getSecurityManager() != null) {
+ PrivilegedAction dp =
+ new PrivilegedGetResourcePaths(resources, path);
+ return ((Set) AccessController.doPrivileged(dp));
+ } else {
+ return (getResourcePathsInternal(resources, path));
+ }
+ }
+ return (null);
+
+ }
+
+
+ /**
+ * Internal implementation of getResourcesPath() logic.
+ *
+ * @param resources Directory context to search
+ * @param path Collection path
+ */
+ private Set getResourcePathsInternal(DirContext resources, String path) {
+
+ ResourceSet set = new ResourceSet();
+ try {
+ listCollectionPaths(set, resources, path);
+ } catch (NamingException e) {
+ return (null);
+ }
+ set.setLocked(true);
+ return (set);
+
+ }
+
+
+ /**
+ * Return the name and version of the servlet container.
+ */
+ public String getServerInfo() {
+
+ return (ServerInfo.getServerInfo());
+
+ }
+
+
+ /**
+ * @deprecated As of Java Servlet API 2.1, with no direct replacement.
+ */
+ public Servlet getServlet(String name) {
+
+ return (null);
+
+ }
+
+
+ /**
+ * Return the display name of this web application.
+ */
+ public String getServletContextName() {
+
+ return (context.getDisplayName());
+
+ }
+
+
+ /**
+ * @deprecated As of Java Servlet API 2.1, with no direct replacement.
+ */
+ public Enumeration getServletNames() {
+
+ return (new Enumerator(empty));
+
+ }
+
+
+ /**
+ * @deprecated As of Java Servlet API 2.1, with no direct replacement.
+ */
+ public Enumeration getServlets() {
+
+ return (new Enumerator(empty));
+
+ }
+
+
+ /**
+ * Writes the specified message to a servlet log file.
+ *
+ * @param message Message to be written
+ */
+ public void log(String message) {
+ if( System.getSecurityManager() != null ) {
+ PrivilegedLogMessage dp =
+ new PrivilegedLogMessage(message);
+ AccessController.doPrivileged(dp);
+ } else {
+ internalLog(message);
+ }
+ }
+
+ private void internalLog(String message) {
+
+ Logger logger = context.getLogger();
+ if (logger != null)
+ logger.log(message);
+
+ }
+
+
+ /**
+ * Writes the specified exception and message to a servlet log file.
+ *
+ * @param exception Exception to be reported
+ * @param message Message to be written
+ *
+ * @deprecated As of Java Servlet API 2.1, use
+ * <code>log(String, Throwable)</code> instead
+ */
+ public void log(Exception exception, String message) {
+ if( System.getSecurityManager() != null ) {
+ PrivilegedLogException dp =
+ new PrivilegedLogException(exception,message);
+ AccessController.doPrivileged(dp);
+ } else {
+ internalLog(exception,message);
+ }
+ }
+
+ private void internalLog(Exception exception, String message) {
+ Logger logger = context.getLogger();
+ if (logger != null)
+ logger.log(exception, message);
+
+ }
+
+
+ /**
+ * Writes the specified message and exception to a servlet log file.
+ *
+ * @param message Message to be written
+ * @param throwable Exception to be reported
+ */
+ public void log(String message, Throwable throwable) {
+ if( System.getSecurityManager() != null ) {
+ PrivilegedLogThrowable dp =
+ new PrivilegedLogThrowable(message,throwable);
+ AccessController.doPrivileged(dp);
+ } else {
+ internalLog(message,throwable);
+ }
+ }
+
+ private void internalLog(String message, Throwable throwable) {
+
+ Logger logger = context.getLogger();
+ if (logger != null)
+ logger.log(message, throwable);
+
+ }
+
+
+ /**
+ * Remove the context attribute with the specified name, if any.
+ *
+ * @param name Name of the context attribute to be removed
+ */
+ public void removeAttribute(String name) {
+
+ Object value = null;
+ boolean found = false;
+
+ // Remove the specified attribute
+ synchronized (attributes) {
+ // Check for read only attribute
+ if (readOnlyAttributes.containsKey(name))
+ return;
+ found = attributes.containsKey(name);
+ if (found) {
+ value = attributes.get(name);
+ attributes.remove(name);
+ } else {
+ return;
+ }
+ }
+
+ // Notify interested application event listeners
+ Object listeners[] = context.getApplicationListeners();
+ if ((listeners == null) || (listeners.length == 0))
+ return;
+ ServletContextAttributeEvent event =
+ new ServletContextAttributeEvent(context.getServletContext(),
+ name, value);
+ for (int i = 0; i < listeners.length; i++) {
+ if (!(listeners[i] instanceof ServletContextAttributeListener))
+ continue;
+ ServletContextAttributeListener listener =
+ (ServletContextAttributeListener) listeners[i];
+ try {
+ context.fireContainerEvent("beforeContextAttributeRemoved",
+ listener);
+ listener.attributeRemoved(event);
+ context.fireContainerEvent("afterContextAttributeRemoved",
+ listener);
+ } catch (Throwable t) {
+ context.fireContainerEvent("afterContextAttributeRemoved",
+ listener);
+ // FIXME - should we do anything besides log these?
+ log(sm.getString("applicationContext.attributeEvent"), t);
+ }
+ }
+
+ }
+
+
+ /**
+ * Bind the specified value with the specified context attribute name,
+ * replacing any existing value for that name.
+ *
+ * @param name Attribute name to be bound
+ * @param value New attribute value to be bound
+ */
+ public void setAttribute(String name, Object value) {
+
+ // Name cannot be null
+ if (name == null)
+ throw new IllegalArgumentException
+ (sm.getString("applicationContext.setAttribute.namenull"));
+
+ // Null value is the same as removeAttribute()
+ if (value == null) {
+ removeAttribute(name);
+ return;
+ }
+
+ Object oldValue = null;
+ boolean replaced = false;
+
+ // Add or replace the specified attribute
+ synchronized (attributes) {
+ // Check for read only attribute
+ if (readOnlyAttributes.containsKey(name))
+ return;
+ oldValue = attributes.get(name);
+ if (oldValue != null)
+ replaced = true;
+ attributes.put(name, value);
+ }
+
+ // Notify interested application event listeners
+ Object listeners[] = context.getApplicationListeners();
+ if ((listeners == null) || (listeners.length == 0))
+ return;
+ ServletContextAttributeEvent event = null;
+ if (replaced)
+ event =
+ new ServletContextAttributeEvent(context.getServletContext(),
+ name, oldValue);
+ else
+ event =
+ new ServletContextAttributeEvent(context.getServletContext(),
+ name, value);
+
+ for (int i = 0; i < listeners.length; i++) {
+ if (!(listeners[i] instanceof ServletContextAttributeListener))
+ continue;
+ ServletContextAttributeListener listener =
+ (ServletContextAttributeListener) listeners[i];
+ try {
+ if (replaced) {
+ context.fireContainerEvent
+ ("beforeContextAttributeReplaced", listener);
+ listener.attributeReplaced(event);
+ context.fireContainerEvent("afterContextAttributeReplaced",
+ listener);
+ } else {
+ context.fireContainerEvent("beforeContextAttributeAdded",
+ listener);
+ listener.attributeAdded(event);
+ context.fireContainerEvent("afterContextAttributeAdded",
+ listener);
+ }
+ } catch (Throwable t) {
+ if (replaced)
+ context.fireContainerEvent("afterContextAttributeReplaced",
+ listener);
+ else
+ context.fireContainerEvent("afterContextAttributeAdded",
+ listener);
+ // FIXME - should we do anything besides log these?
+ log(sm.getString("applicationContext.attributeEvent"), t);
+ }
+ }
+
+ }
+
+
+ // -------------------------------------------------------- Package Methods
+
+
+ /**
+ * Return the facade associated with this ApplicationContext.
+ */
+ ServletContext getFacade() {
+
+ return (this.facade);
+
+ }
+
+
+ // -------------------------------------------------------- Private Methods
+
+
+ /**
+ * Return a context-relative path, beginning with a "/", that represents
+ * the canonical version of the specified path after ".." and "." elements
+ * are resolved out. If the specified path attempts to go outside the
+ * boundaries of the current context (i.e. too many ".." path elements
+ * are present), return <code>null</code> instead.
+ *
+ * @param path Path to be normalized
+ */
+ private String normalize(String path) {
+
+ String normalized = path;
+
+ // Normalize the slashes and add leading slash if necessary
+ if (normalized.indexOf('\\') >= 0)
+ normalized = normalized.replace('\\', '/');
+
+ // Resolve occurrences of "/../" in the normalized path
+ while (true) {
+ int index = normalized.indexOf("/../");
+ if (index < 0)
+ break;
+ if (index == 0)
+ return (null); // Trying to go outside our context
+ int index2 = normalized.lastIndexOf('/', index - 1);
+ normalized = normalized.substring(0, index2) +
+ normalized.substring(index + 3);
+ }
+
+ // Return the normalized path that we have completed
+ return (normalized);
+
+ }
+
+
+ /**
+ * Merge the context initialization parameters specified in the application
+ * deployment descriptor with the application parameters described in the
+ * server configuration, respecting the <code>override</code> property of
+ * the application parameters appropriately.
+ */
+ private void mergeParameters() {
+
+ if (parameters != null)
+ return;
+ HashMap results = new HashMap();
+ String names[] = context.findParameters();
+ for (int i = 0; i < names.length; i++)
+ results.put(names[i], context.findParameter(names[i]));
+ ApplicationParameter params[] =
+ context.findApplicationParameters();
+ for (int i = 0; i < params.length; i++) {
+ if (params[i].getOverride()) {
+ if (results.get(params[i].getName()) == null)
+ results.put(params[i].getName(), params[i].getValue());
+ } else {
+ results.put(params[i].getName(), params[i].getValue());
+ }
+ }
+ parameters = results;
+
+ }
+
+
+ /**
+ * List resource paths (recursively), and store all of them in the given
+ * Set.
+ */
+ private static void listPaths(Set set, DirContext resources, String path)
+ throws NamingException {
+
+ Enumeration childPaths = resources.listBindings(path);
+ while (childPaths.hasMoreElements()) {
+ Binding binding = (Binding) childPaths.nextElement();
+ String name = binding.getName();
+ String childPath = path + "/" + name;
+ set.add(childPath);
+ Object object = binding.getObject();
+ if (object instanceof DirContext) {
+ listPaths(set, resources, childPath);
+ }
+ }
+
+ }
+
+
+ /**
+ * List resource paths (recursively), and store all of them in the given
+ * Set.
+ */
+ private static void listCollectionPaths
+ (Set set, DirContext resources, String path)
+ throws NamingException {
+
+ Enumeration childPaths = resources.listBindings(path);
+ while (childPaths.hasMoreElements()) {
+ Binding binding = (Binding) childPaths.nextElement();
+ String name = binding.getName();
+ StringBuffer childPath = new StringBuffer(path);
+ if (!"/".equals(path) && !path.endsWith("/"))
+ childPath.append("/");
+ childPath.append(name);
+ Object object = binding.getObject();
+ if (object instanceof DirContext) {
+ childPath.append("/");
+ }
+ set.add(childPath.toString());
+ }
+
+ }
+
+
+ /**
+ * Get full path, based on the host name and the context path.
+ */
+ public static String getJNDIUri(String hostName, String path) {
+ if (!path.startsWith("/"))
+ return "/" + hostName + "/" + path;
+ else
+ return "/" + hostName + path;
+ }
+
+
+}
+
---------------------------------------------------------------------
To unsubscribe, e-mail: tomcat-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: tomcat-dev-help@jakarta.apache.org