FileDocCategorySizeDatePackage
StandardContext.javaAPI DocGlassfish v2 API196409Tue Jul 24 17:52:04 BST 2007org.apache.catalina.core

StandardContext

public class StandardContext extends ContainerBase implements org.apache.catalina.Context, Serializable
Standard implementation of the Context interface. Each child container must be a Wrapper implementation to process the requests directed to a particular servlet.
author
Craig R. McClanahan
author
Remy Maucherat
version
$Revision: 1.48 $ $Date: 2007/07/25 00:52:04 $

Fields Summary
private static transient com.sun.org.apache.commons.logging.Log
log
private static final ClassLoader
standardContextClassLoader
private String
altDDName
The alternate deployment descriptor name.
private String
hostName
Associated host name.
private String[]
applicationListeners
The set of application listener class names configured for this application, in the order they were encountered in the web.xml file.
private transient Object[]
applicationEventListenersObjects
The set of instantiated application event listener objects.
private transient Object[]
applicationLifecycleListenersObjects
The set of instantiated application lifecycle listener objects.
private org.apache.catalina.deploy.ApplicationParameter[]
applicationParameters
The set of application parameters defined for this application.
private boolean
available
The application available flag for this Context.
private NotificationBroadcasterSupport
broadcaster
The broadcaster that sends j2ee notifications.
private transient org.apache.catalina.util.CharsetMapper
charsetMapper
The Locale to character set mapper for this application.
private String
charsetMapperClass
The Java class name of the CharsetMapper class to be created.
private String
configFile
The path to a file to save this Context information.
private boolean
configured
The "correctly configured" flag for this Context.
private org.apache.catalina.deploy.SecurityConstraint[]
constraints
The security constraints for this web application.
protected transient ApplicationContext
context
The ServletContext implementation associated with this Context.
private String
compilerClasspath
Compiler classpath to use.
private boolean
cookies
Should we attempt to use cookies for session id communication?
private boolean
crossContext
Should we allow the ServletContext.getContext() method to access the context of other web applications in this server?
private boolean
delegate
The "follow standard delegation model" flag that will be used to configure our ClassLoader.
private String
displayName
The display name of this web application.
private String
defaultWebXml
Override the default web xml location. ContextConfig is not configurable so the setter is not used.
private boolean
distributable
The distributable flag for this web application.
private String
docBase
The document root for this web application.
private HashMap
exceptionPages
The exception pages for this web application, keyed by fully qualified class name of the Java exception.
private HashMap
filterConfigs
The set of filter configurations (and associated filter instances) we have initialized, keyed by filter name.
private HashMap
filterDefs
The set of filter definitions for this application, keyed by filter name.
private org.apache.catalina.deploy.FilterMap[]
filterMaps
The set of filter mappings for this application, in the order they were defined in the deployment descriptor.
private static final String
info
The descriptive information string for this implementation.
private String[]
instanceListeners
The set of classnames of InstanceListeners that will be added to each newly created Wrapper by createWrapper().
private org.apache.catalina.deploy.LoginConfig
loginConfig
The login configuration descriptor for this web application.
private transient org.apache.tomcat.util.http.mapper.Mapper
mapper
The mapper associated with this context.
private transient NamingContextListener
namingContextListener
The naming context listener for this web application.
private org.apache.catalina.deploy.NamingResources
namingResources
The naming resources for this web application.
private HashMap
messageDestinations
The message destinations for this web application.
private HashMap
mimeMappings
The MIME mappings for this web application, keyed by extension.
private HashMap
parameters
The context initialization parameters for this web application, keyed by name.
private boolean
paused
The request processing pause flag (while reloading occurs)
private String
publicId
The public identifier of the DTD for the web application deployment descriptor version we are currently parsing. This is used to support relaxed validation rules when processing version 2.2 web.xml files.
private boolean
reloadable
The reloadable flag for this web application.
private boolean
unpackWAR
Unpack WAR property.
private boolean
override
The DefaultContext override flag for this web application.
private boolean
privileged
The privileged flag for this web application.
private boolean
replaceWelcomeFiles
Should the next call to addWelcomeFile() cause replacement of any existing welcome files? This will be set before processing the web application's deployment descriptor, so that application specified choices replace, rather than append to, those defined in the global descriptor.
private boolean
securePagesWithPragma
With proxy caching disabled, setting this flag to true adds Pragma and Cache-Control headers with "No-cache" as value. Setting this flag to false does not add any Pragma header, but sets the Cache-Control header to "private".
private HashMap
roleMappings
The security role mappings for this application, keyed by role name (as used within the application).
private String[]
securityRoles
The security roles for this application, keyed by role name.
private HashMap
servletMappings
The servlet mappings for this web application, keyed by matching pattern.
private int
sessionTimeout
The session timeout (in minutes) for this web application.
private boolean
sessionTimeoutOveridden
Has the session timeout (in minutes) for this web application been over-ridden by web-xml HERCULES:add
private long
sequenceNumber
The notification sequence number.
private HashMap
statusPages
The status code error pages for this web application, keyed by HTTP status code (as an Integer).
private boolean
swallowOutput
Set flag to true to cause the system.out and system.err to be redirected to the logger when executing a servlet.
private HashMap
taglibs
The JSP tag libraries for this web application, keyed by URI
private String[]
welcomeFiles
The welcome files for this application.
private String[]
wrapperLifecycles
The set of classnames of LifecycleListeners that will be added to each newly created Wrapper by createWrapper().
private String[]
wrapperListeners
The set of classnames of ContainerListeners that will be added to each newly created Wrapper by createWrapper().
private String
workDir
The pathname to the work directory for this context (relative to the server's home if not absolute).
private String
wrapperClassName
Java class name of the Wrapper class implementation we use.
private Class
wrapperClass
private boolean
useNaming
JNDI use flag.
private boolean
filesystemBased
Filesystem based flag.
private String
namingContextName
Name of the associated naming context.
private int
managerChecksFrequency
Frequency of the session expiration, and related manager operations. Manager operations will be done once for the specified amount of backgrondProcess calls (ie, the lower the amount, the most often the checks will occur).
private int
count
Iteration count for background processing.
private boolean
cachingAllowed
Caching allowed flag.
protected boolean
caseSensitive
Case sensitivity.
protected boolean
allowLinking
Allow linking.
protected int
cacheMaxSize
Cache max size in KB.
protected int
cacheTTL
Cache TTL in ms.
private boolean
lazy
private transient DirContext
webappResources
Non proxied resources.
private long
startupTime
private long
startTimeMillis
private long
tldScanTime
protected boolean
caseSensitiveMapping
private boolean
reuseSessionID
The flag that specifies whether to reuse the session id (if any) from the request for newly created sessions
private boolean
allowRelativeRedirect
The flag that specifies whether this context allows sendRedirect() to redirect to a relative URL.
private String
engineName
Name of the engine. If null, the domain is used.
private String
j2EEApplication
private String
j2EEServer
private transient org.apache.catalina.Auditor[]
auditors
List of configured Auditors for this context.
private static int
instanceIDCounter
used to create unique id for each app instance.
private boolean
webXmlValidation
Attribute value used to turn on/off XML validation
private boolean
webXmlNamespaceAware
Attribute value used to turn on/off XML namespace validation
private boolean
tldValidation
Attribute value used to turn on/off XML validation
private boolean
tldNamespaceAware
Attribute value used to turn on/off TLD XML namespace validation
protected boolean
isJsfApplication
Is the context contains the JSF servlet.
private boolean
saveConfig
Should we save the configuration.
protected static final org.apache.catalina.util.URLEncoder
urlEncoder
Array containing the safe characters set.
private boolean
isReload
private ArrayList
alternateDocBases
Alternate doc base resources
private boolean
useMyFaces
private String
encodedPath
Encoded path.
private String
server
The J2EE Server ObjectName this module is deployed on.
private String[]
javaVMs
The Java virtual machines on which this module is running.
Constructors Summary
public StandardContext()
Create a new StandardContext component with the default basic Valve.



    // ----------------------------------------------------------- Constructors


                   
      

        super();
        pipeline.setBasic(new StandardContextValve());
        namingResources.setContainer(this);
        broadcaster = new NotificationBroadcasterSupport();

    
Methods Summary
public voidaddAlternateDocBase(java.lang.String urlPattern, java.lang.String docBase)
Configures this context's alternate doc base mappings.

param
alternateDocBasesMap HashMap containing this context's mappings from url patterns to alternate doc base paths


        if (urlPattern == null || docBase == null) {
            throw new IllegalArgumentException(
                sm.getString(
                    "standardContext.alternateDocBase.missingPathOrUrlPattern"));
        }
  
        AlternateDocBase alternateDocBase = new AlternateDocBase();
        alternateDocBase.setUrlPattern(urlPattern);
        alternateDocBase.setDocBase(docBase);
        alternateDocBase.setBasePath(getBasePath(docBase));

        if (alternateDocBases == null) {
            alternateDocBases = new ArrayList<AlternateDocBase>();
        }
        alternateDocBases.add(alternateDocBase);
    
public voidaddApplicationListener(java.lang.String listener)
Add a new Listener class name to the set of Listeners configured for this application.

param
listener Java class name of a listener class


        synchronized (applicationListeners) {
            String results[] = new String[applicationListeners.length + 1];
            if ("com.sun.faces.config.ConfigureListener".equals(listener)) {
                // Always add the JSF listener as the first element, 
                // see GlassFish Issue 2563 for details
                for (int i = 0; i < applicationListeners.length; i++) {
                    if (listener.equals(applicationListeners[i])) {
                        return;
                    }
                    results[i+1] = applicationListeners[i];
                }
                results[0] = listener;
            } else {
                for (int i = 0; i < applicationListeners.length; i++) {
                    if (listener.equals(applicationListeners[i])) {
                        return;
                    }
                    results[i] = applicationListeners[i];
                }
                results[applicationListeners.length] = listener;
            }
            applicationListeners = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addApplicationListener", listener);
        }

        // FIXME - add instance if already started?

    
public voidaddApplicationParameter(org.apache.catalina.deploy.ApplicationParameter parameter)
Add a new application parameter for this application.

param
parameter The new application parameter


        synchronized (applicationParameters) {
            String newName = parameter.getName();
            for (int i = 0; i < applicationParameters.length; i++) {
                if (newName.equals(applicationParameters[i].getName()) &&
                    !applicationParameters[i].getOverride())
                    return;
            }
            ApplicationParameter results[] =
                new ApplicationParameter[applicationParameters.length + 1];
            System.arraycopy(applicationParameters, 0, results, 0,
                             applicationParameters.length);
            results[applicationParameters.length] = parameter;
            applicationParameters = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addApplicationParameter", parameter);
        }
    
public voidaddChild(org.apache.catalina.Container child)
Add a child Container, only if the proposed child is an implementation of Wrapper.

param
child Child container to be added
exception
IllegalArgumentException if the proposed container is not an implementation of Wrapper


        // Global JspServlet
        Wrapper oldJspServlet = null;

        if (!(child instanceof Wrapper)) {
            throw new IllegalArgumentException
                (sm.getString("standardContext.notWrapper"));
        }

        Wrapper wrapper = (Wrapper) child;
        boolean isJspServlet = "jsp".equals(child.getName());

        // Allow webapp to override JspServlet inherited from global web.xml.
        if (isJspServlet) {
            oldJspServlet = (Wrapper) findChild("jsp");
            if (oldJspServlet != null) {
                removeChild(oldJspServlet);
            }
        }

        String jspFile = wrapper.getJspFile();
        if ((jspFile != null) && !jspFile.startsWith("/")) {
            if (isServlet22()) {
                if (log.isDebugEnabled()) {
                    log.debug(sm.getString("standardContext.wrapper.warning", 
                                           jspFile));
                }
                wrapper.setJspFile("/" + jspFile);
            } else {
                throw new IllegalArgumentException
                    (sm.getString("standardContext.wrapper.error", jspFile));
            }
        }

        super.addChild(child);

        // START SJSAS 6342808
        /* SJSWS 6362207
        if (started) {
        */
        // START SJSWS 6362207
        if (getAvailable()) {
        // END SJSWS 6362207
            /*
             * If this StandardContext has already been started, we need to
             * register the newly added child with JMX. Any children that were
             * added before this StandardContext was started have already been
             * registered with JMX (as part of StandardContext.start()).
             */
            if (wrapper instanceof StandardWrapper) {
                ((StandardWrapper) wrapper).registerJMX( this );
            }
        }
        // END SJSAS 6342808

        if (isJspServlet && oldJspServlet != null) {
            /*
             * The webapp-specific JspServlet inherits all the mappings
             * specified in the global web.xml, and may add additional ones.
             */
            String[] jspMappings = oldJspServlet.findMappings();
            for (int i=0; jspMappings!=null && i<jspMappings.length; i++) {
                addServletMapping(jspMappings[i], child.getName());
            }
        }
    
public voidaddConstraint(org.apache.catalina.deploy.SecurityConstraint constraint)
Add a security constraint to the set for this web application.


        // Validate the proposed constraint
        SecurityCollection collections[] = constraint.findCollections();
        for (int i = 0; i < collections.length; i++) {
            String patterns[] = collections[i].findPatterns();
            for (int j = 0; j < patterns.length; j++) {
                patterns[j] = adjustURLPattern(patterns[j]);
                if (!validateURLPattern(patterns[j]))
                    throw new IllegalArgumentException
                        (sm.getString
                         ("standardContext.securityConstraint.pattern",
                          patterns[j]));
            }
        }

        // Add this constraint to the set for our web application
        synchronized (constraints) {
            SecurityConstraint results[] =
                new SecurityConstraint[constraints.length + 1];
            for (int i = 0; i < constraints.length; i++)
                results[i] = constraints[i];
            results[constraints.length] = constraint;
            constraints = results;
        }

    
public voidaddEjb(org.apache.catalina.deploy.ContextEjb ejb)
Add an EJB resource reference for this web application.

param
ejb New EJB resource reference


        namingResources.addEjb(ejb);

        if (notifyContainerListeners) {
           fireContainerEvent("addEjb", ejb.getName());
        }
    
public voidaddEnvironment(org.apache.catalina.deploy.ContextEnvironment environment)
Add an environment entry for this web application.

param
environment New environment entry


        ContextEnvironment env = findEnvironment(environment.getName());
        if ((env != null) && !env.getOverride())
            return;
        namingResources.addEnvironment(environment);

        if (notifyContainerListeners) {
            fireContainerEvent("addEnvironment", environment.getName());
        }
    
public java.lang.StringaddEnvironment(java.lang.String envName, java.lang.String type)
Add an environment entry for this web application.

param
envName New environment entry name


        NamingResources nresources = getNamingResources();
        if (nresources == null) {
            return null;
        }
        ContextEnvironment env = nresources.findEnvironment(envName);
        if (env != null) {
            throw new IllegalArgumentException
                ("Invalid environment name - already exists '" + envName + "'");
        }
        env = new ContextEnvironment();
        env.setName(envName);
        env.setType(type);
        nresources.addEnvironment(env);

        // Return the corresponding MBean name
        ManagedBean managed = Registry.getRegistry(null, null).findManagedBean("ContextEnvironment");
        ObjectName oname =
            MBeanUtils.createObjectName(managed.getDomain(), env);
        return (oname.toString());

    
public voidaddErrorPage(org.apache.catalina.deploy.ErrorPage errorPage)
Add an error page for the specified error or Java exception.

param
errorPage The error page definition to be added

        // Validate the input parameters
        if (errorPage == null)
            throw new IllegalArgumentException
                (sm.getString("standardContext.errorPage.required"));
        String location = errorPage.getLocation();
        if ((location != null) && !location.startsWith("/")) {
            if (isServlet22()) {
                if (log.isDebugEnabled()) {
                    log.debug(sm.getString("standardContext.errorPage.warning",
                                           location));
                }
                errorPage.setLocation("/" + location);
            } else {
                throw new IllegalArgumentException
                    (sm.getString("standardContext.errorPage.error",
                                  location));
            }
        }

        // Add the specified error page to our internal collections
        String exceptionType = errorPage.getExceptionType();
        if (exceptionType != null) {
            synchronized (exceptionPages) {
                exceptionPages.put(exceptionType, errorPage);
            }
        } else {
            synchronized (statusPages) {
                int errorCode = errorPage.getErrorCode();
                if ((errorCode >= 400) && (errorCode < 600)) {
                    statusPages.put(Integer.valueOf(errorCode), errorPage);
                } else {
                    log.error(sm.getString(
                                "standardContext.invalidErrorPageCode",
                                errorCode));
                }
            }
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addErrorPage", errorPage);
        }
    
public voidaddFilterDef(org.apache.catalina.deploy.FilterDef filterDef)
Add a filter definition to this Context.

param
filterDef The filter definition to be added


        synchronized (filterDefs) {
            filterDefs.put(filterDef.getFilterName(), filterDef);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addFilterDef", filterDef);
        }
    
public voidaddFilterMap(org.apache.catalina.deploy.FilterMap filterMap)
Add a filter mapping to this Context.

param
filterMap The filter mapping to be added
exception
IllegalArgumentException if the specified filter name does not match an existing filter definition, or the filter mapping is malformed


        // Validate the proposed filter mapping
        String filterName = filterMap.getFilterName();
        String servletName = filterMap.getServletName();
        String urlPattern = filterMap.getURLPattern();
        if (findFilterDef(filterName) == null)
            throw new IllegalArgumentException
                (sm.getString("standardContext.filterMap.name", filterName));
        if ((servletName == null) && (urlPattern == null))
            throw new IllegalArgumentException
                (sm.getString("standardContext.filterMap.either"));
        if ((servletName != null) && (urlPattern != null))
            throw new IllegalArgumentException
                (sm.getString("standardContext.filterMap.either"));
        // Because filter-pattern is new in 2.3, no need to adjust
        // for 2.2 backwards compatibility
        if ((urlPattern != null) && !validateURLPattern(urlPattern))
            throw new IllegalArgumentException
                (sm.getString("standardContext.filterMap.pattern",
                              urlPattern));

        // Add this filter mapping to our registered set
        synchronized (filterMaps) {
            FilterMap results[] =new FilterMap[filterMaps.length + 1];
            System.arraycopy(filterMaps, 0, results, 0, filterMaps.length);
            results[filterMaps.length] = filterMap;
            filterMaps = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addFilterMap", filterMap);
        }
    
public voidaddFilterMaps(org.apache.catalina.deploy.FilterMaps filterMaps)
Add multiple filter mappings to this Context.

param
filterMaps The filter mappings to be added
exception
IllegalArgumentException if the specified filter name does not match an existing filter definition, or the filter mapping is malformed

        int dispatcherMapping = filterMaps.getDispatcherMapping();
        String filterName = filterMaps.getFilterName();
        String[] servletNames = filterMaps.getServletNames();
        String[] urlPatterns = filterMaps.getURLPatterns();
        for (int i = 0; i < servletNames.length; i++) {
            FilterMap fmap = new FilterMap();
            fmap.setFilterName(filterName);
            fmap.setServletName(servletNames[i]);
            fmap.setDispatcherMapping(dispatcherMapping);
            addFilterMap(fmap);
        }
        for (int i = 0; i < urlPatterns.length; i++) {
            FilterMap fmap = new FilterMap();
            fmap.setFilterName(filterName);
            fmap.setURLPattern(urlPatterns[i]);
            fmap.setDispatcherMapping(dispatcherMapping);
            addFilterMap(fmap);
        }
    
public voidaddInstanceListener(java.lang.String listener)
Add the classname of an InstanceListener to be added to each Wrapper appended to this Context.

param
listener Java class name of an InstanceListener class


        synchronized (instanceListeners) {
            String results[] =new String[instanceListeners.length + 1];
            for (int i = 0; i < instanceListeners.length; i++)
                results[i] = instanceListeners[i];
            results[instanceListeners.length] = listener;
            instanceListeners = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addInstanceListener", listener);
        }
    
public voidaddJspMapping(java.lang.String pattern)
Add the given URL pattern as a jsp-property-group. This maps resources that match the given pattern so they will be passed to the JSP container. Though there are other elements in the property group, we only care about the URL pattern here. The JSP container will parse the rest.

param
pattern URL pattern to be mapped

        String servletName = findServletMapping("*.jsp");
        if (servletName == null) {
            servletName = "jsp";
        }

        if( findChild(servletName) != null) {
            addServletMapping(pattern, servletName, true);
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Skipping " + pattern + " , no servlet "
                          + servletName);
            }
        }
    
public voidaddLocalEjb(org.apache.catalina.deploy.ContextLocalEjb ejb)
Add a local EJB resource reference for this web application.

param
ejb New EJB resource reference


        namingResources.addLocalEjb(ejb);
        
        if (notifyContainerListeners) {
            fireContainerEvent("addLocalEjb", ejb.getName());
        }
    
public voidaddLocaleEncodingMappingParameter(java.lang.String locale, java.lang.String encoding)
Add a Locale Encoding Mapping (see Sec 5.4 of Servlet spec 2.4)

param
locale locale to map an encoding for
param
encoding encoding to be used for a give locale

        getCharsetMapper().addCharsetMappingFromDeploymentDescriptor(locale, encoding);
    
public voidaddMessageDestination(org.apache.catalina.deploy.MessageDestination md)
Add a message destination for this web application.

param
md New message destination


        synchronized (messageDestinations) {
            messageDestinations.put(md.getName(), md);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addMessageDestination", md.getName());
        }
    
public voidaddMessageDestinationRef(org.apache.catalina.deploy.MessageDestinationRef mdr)
Add a message destination reference for this web application.

param
mdr New message destination reference


        namingResources.addMessageDestinationRef(mdr);

        if (notifyContainerListeners) {
            fireContainerEvent("addMessageDestinationRef", mdr.getName());
        }
    
public voidaddMimeMapping(java.lang.String extension, java.lang.String mimeType)
Add a new MIME mapping, replacing any existing mapping for the specified extension.

param
extension Filename extension being mapped
param
mimeType Corresponding MIME type


        synchronized (mimeMappings) {
            mimeMappings.put(extension, mimeType);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addMimeMapping", extension);
        }
    
public voidaddParameter(java.lang.String name, java.lang.String value)
Add a new context initialization parameter.

param
name Name of the new parameter
param
value Value of the new parameter
exception
IllegalArgumentException if the name or value is missing, or if this context initialization parameter has already been registered

        // Validate the proposed context initialization parameter
        if ((name == null) || (value == null))
            throw new IllegalArgumentException
                (sm.getString("standardContext.parameter.required"));
        if (parameters.get(name) != null)
            throw new IllegalArgumentException
                (sm.getString("standardContext.parameter.duplicate", name));

        // Add this parameter to our defined set
        synchronized (parameters) {
            parameters.put(name, value);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addParameter", name);
        }
    
public voidaddResource(org.apache.catalina.deploy.ContextResource resource)
Add a resource reference for this web application.

param
resource New resource reference


        namingResources.addResource(resource);

        if (notifyContainerListeners) {
            fireContainerEvent("addResource", resource.getName());
        }
    
public java.lang.StringaddResource(java.lang.String resourceName, java.lang.String type)
Add a resource reference for this web application.

param
resourceName New resource reference name


        NamingResources nresources = getNamingResources();
        if (nresources == null) {
            return null;
        }
        ContextResource resource = nresources.findResource(resourceName);
        if (resource != null) {
            throw new IllegalArgumentException
                ("Invalid resource name - already exists'" + resourceName + "'");
        }
        resource = new ContextResource();
        resource.setName(resourceName);
        resource.setType(type);
        nresources.addResource(resource);

        // Return the corresponding MBean name
        ManagedBean managed = Registry.getRegistry(null, null).findManagedBean("ContextResource");
        ObjectName oname =
            MBeanUtils.createObjectName(managed.getDomain(), resource);
        return (oname.toString());
    
public voidaddResourceEnvRef(java.lang.String name, java.lang.String type)
Add a resource environment reference for this web application.

param
name The resource environment reference name
param
type The resource environment reference type


        namingResources.addResourceEnvRef(name, type);

        if (notifyContainerListeners) {
            fireContainerEvent("addResourceEnvRef", name);
        }
    
public voidaddResourceLink(org.apache.catalina.deploy.ContextResourceLink resourceLink)
Add a resource link for this web application.

param
resourceLink New resource link


        namingResources.addResourceLink(resourceLink);

        if (notifyContainerListeners) {
            fireContainerEvent("addResourceLink", resourceLink.getName());
        }
    
public java.lang.StringaddResourceLink(java.lang.String resourceLinkName, java.lang.String global, java.lang.String name, java.lang.String type)
Add a resource link for this web application.

param
resourceLinkName New resource link name


        NamingResources nresources = getNamingResources();
        if (nresources == null) {
            return null;
        }
        ContextResourceLink resourceLink =
                                nresources.findResourceLink(resourceLinkName);
        if (resourceLink != null) {
            throw new IllegalArgumentException
                ("Invalid resource link name - already exists'" +
                                                        resourceLinkName + "'");
        }
        resourceLink = new ContextResourceLink();
        resourceLink.setGlobal(global);
        resourceLink.setName(resourceLinkName);
        resourceLink.setType(type);
        nresources.addResourceLink(resourceLink);

        // Return the corresponding MBean name
        ManagedBean managed = Registry.getRegistry(null, null).findManagedBean("ContextResourceLink");
        ObjectName oname =
            MBeanUtils.createObjectName(managed.getDomain(), resourceLink);
        return (oname.toString());
    
public voidaddResourceParams(org.apache.catalina.deploy.ResourceParams resourceParameters)
Add resource parameters for this web application.

param
resourceParameters New resource parameters


        namingResources.addResourceParams(resourceParameters);

        if (notifyContainerListeners) {
            fireContainerEvent("addResourceParams",
                               resourceParameters.getName());
        }
    
public voidaddRoleMapping(java.lang.String role, java.lang.String link)
Add a security role reference for this web application.

param
role Security role used in the application
param
link Actual security role to check for


        synchronized (roleMappings) {
            roleMappings.put(role, link);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addRoleMapping", role);
        }
    
public voidaddSecurityRole(java.lang.String role)
Add a new security role for this web application.

param
role New security role


        synchronized (securityRoles) {
            String results[] =new String[securityRoles.length + 1];
            for (int i = 0; i < securityRoles.length; i++)
                results[i] = securityRoles[i];
            results[securityRoles.length] = role;
            securityRoles = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addSecurityRole", role);
        }
    
public voidaddServletMapping(org.apache.catalina.deploy.ServletMap servletMap)
Add a new servlet mapping, replacing any existing mapping for the multiple patterns.

param
servletMap ServletMap containing the servletname and patterns
exception
IllegalArgumentException if the specified servlet name is not known to this Context

         String[] patterns = servletMap.getUrlPatterns();
         String name = servletMap.getServletName();
         for (int i = 0; i < patterns.length; i++) {
             addServletMapping(patterns[i], name, false);
         }
     
public voidaddServletMapping(java.lang.String pattern, java.lang.String name)
Add a new servlet mapping, replacing any existing mapping for the specified pattern.

param
pattern URL pattern to be mapped
param
name Name of the corresponding servlet to execute
exception
IllegalArgumentException if the specified servlet name is not known to this Context

        addServletMapping(pattern, name, false);
    
public voidaddServletMapping(java.lang.String pattern, java.lang.String name, boolean jspWildCard)
Add a new servlet mapping, replacing any existing mapping for the specified pattern.

param
pattern URL pattern to be mapped
param
name Name of the corresponding servlet to execute
param
jspWildCard true if name identifies the JspServlet and pattern contains a wildcard; false otherwise
exception
IllegalArgumentException if the specified servlet name is not known to this Context

        // Validate the proposed mapping
        if (findChild(name) == null)
            throw new IllegalArgumentException
                (sm.getString("standardContext.servletMap.name", name));
        pattern = adjustURLPattern(RequestUtil.URLDecode(pattern));
        if (!validateURLPattern(pattern))
            throw new IllegalArgumentException
                (sm.getString("standardContext.servletMap.pattern", pattern));

        // Add this mapping to our registered set
        synchronized (servletMappings) {
            String name2 = (String) servletMappings.get(pattern);
            if (name2 != null) {
                // Don't allow more than one servlet on the same pattern
                Wrapper wrapper = (Wrapper) findChild(name2);
                wrapper.removeMapping(pattern);
                mapper.removeWrapper(pattern);
            }
            servletMappings.put(pattern, name);
        }
        Wrapper wrapper = (Wrapper) findChild(name);
        wrapper.addMapping(pattern);

        // Update context mapper
        mapper.addWrapper(pattern, wrapper, jspWildCard);

        if (notifyContainerListeners) {
            fireContainerEvent("addServletMapping", pattern);
        }
    
public voidaddTaglib(java.lang.String uri, java.lang.String location)
Add a JSP tag library for the specified URI.

param
uri URI, relative to the web.xml file, of this tag library
param
location Location of the tag library descriptor


        synchronized (taglibs) {
            taglibs.put(uri, location);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addTaglib", uri);
        }
    
public voidaddWelcomeFile(java.lang.String name)
Add a new welcome file to the set recognized by this Context.

param
name New welcome file name


        synchronized (welcomeFiles) {
            // Welcome files from the application deployment descriptor
            // completely replace those from the default conf/web.xml file
            if (replaceWelcomeFiles) {
                welcomeFiles = new String[0];
                setReplaceWelcomeFiles(false);
            }
            String results[] =new String[welcomeFiles.length + 1];
            for (int i = 0; i < welcomeFiles.length; i++)
                results[i] = welcomeFiles[i];
            results[welcomeFiles.length] = name;
            welcomeFiles = results;
        }
        postWelcomeFiles();

        if (notifyContainerListeners) {
            fireContainerEvent("addWelcomeFile", name);
        }
    
public voidaddWrapperLifecycle(java.lang.String listener)
Add the classname of a LifecycleListener to be added to each Wrapper appended to this Context.

param
listener Java class name of a LifecycleListener class


        synchronized (wrapperLifecycles) {
            String results[] =new String[wrapperLifecycles.length + 1];
            for (int i = 0; i < wrapperLifecycles.length; i++)
                results[i] = wrapperLifecycles[i];
            results[wrapperLifecycles.length] = listener;
            wrapperLifecycles = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addWrapperLifecycle", listener);
        }
    
public voidaddWrapperListener(java.lang.String listener)
Add the classname of a ContainerListener to be added to each Wrapper appended to this Context.

param
listener Java class name of a ContainerListener class


        synchronized (wrapperListeners) {
            String results[] =new String[wrapperListeners.length + 1];
            for (int i = 0; i < wrapperListeners.length; i++)
                results[i] = wrapperListeners[i];
            results[wrapperListeners.length] = listener;
            wrapperListeners = results;
        }

        if (notifyContainerListeners) {
            fireContainerEvent("addWrapperListener", listener);
        }
    
protected java.lang.StringadjustURLPattern(java.lang.String urlPattern)
Adjust the URL pattern to begin with a leading slash, if appropriate (i.e. we are running a servlet 2.2 application). Otherwise, return the specified URL pattern unchanged.

param
urlPattern The URL pattern to be adjusted (if needed) and returned


        if (urlPattern == null)
            return (urlPattern);
        if (urlPattern.startsWith("/") || urlPattern.startsWith("*."))
            return (urlPattern);
        if (!isServlet22())
            return (urlPattern);
        if (log.isDebugEnabled()) {
            log.debug(sm.getString("standardContext.urlPattern.patternWarning",
                                   urlPattern));
        }
        return ("/" + urlPattern);

    
public booleanalternateResourcesStart()
Starts this context's alternate doc base resources.


        boolean ok = true;

        if (alternateDocBases == null || alternateDocBases.size() == 0) {
            return ok;
        }

        Hashtable env = new Hashtable();
        if (getParent() != null)
            env.put(ProxyDirContext.HOST, getParent().getName());
        env.put(ProxyDirContext.CONTEXT, getName());

        for (int i=0; i<alternateDocBases.size(); i++) {

            AlternateDocBase alternateDocBase = alternateDocBases.get(i);
            String basePath = alternateDocBase.getBasePath();
            DirContext alternateWebappResources =
                alternateDocBase.getWebappResources();
            try {
                ProxyDirContext proxyDirContext =
                    new ProxyDirContext(env, alternateWebappResources);
                if (alternateWebappResources instanceof BaseDirContext) {
                    ((BaseDirContext) alternateWebappResources).setDocBase(
                        basePath);
                    ((BaseDirContext) alternateWebappResources).allocate();
                }
                alternateDocBase.setResources(proxyDirContext);
            } catch (Throwable t) {
                if(log.isDebugEnabled()) {
                    log.error(
                        sm.getString("standardContext.resourcesStart",
                                     getName()), 
                        t);
                } else {
                    log.error(sm.getString("standardContext.resourcesStart", 
                                           getName()));
                    log.error(t.getMessage());
                }
                ok = false;
            }
        }

        return ok;
    
public booleanalternateResourcesStop()
Stops this context's alternate doc base resources.


        boolean ok = true;

        if (alternateDocBases == null || alternateDocBases.size() == 0) {
            return ok;
        }

        for (int i=0; i<alternateDocBases.size(); i++) {

            AlternateDocBase alternateDocBase = alternateDocBases.get(i);
            DirContext alternateResources =
                alternateDocBase.getResources();
            if (alternateResources instanceof Lifecycle) {
                try {
                    ((Lifecycle) alternateResources).stop();
                } catch (Throwable t) {
                    log.error(sm.getString("standardContext.resourcesStop"),
                              t);
                    ok = false;
                }
            }

            DirContext alternateWebappResources =
                alternateDocBase.getWebappResources();
            if (alternateWebappResources instanceof BaseDirContext) {
                try {
                    ((BaseDirContext) alternateWebappResources).release();
                } catch (Throwable t) {
                    log.error(sm.getString("standardContext.resourcesStop"),
                              t);
                    ok = false;
                }
            }
        }

        this.alternateDocBases = null;

        return (ok);

    
public voidbackgroundProcess()
Execute a periodic task, such as reloading, etc. This method will be invoked inside the classloading context of this container. Unexpected throwables will be caught and logged.


        if (!started)
            return;

        count = (count + 1) % managerChecksFrequency;

        if ((getManager() != null) && (count == 0)) {
            if (getManager() instanceof StandardManager) {
                ((StandardManager) getManager()).processExpires();
            } else if (getManager() instanceof PersistentManagerBase) {
                PersistentManagerBase pManager = 
                    (PersistentManagerBase) getManager();
                pManager.backgroundProcess();
            }
        }

        // START S1AS8PE 4965017
        if (isReload()) {
            if (getLoader() != null) {
                if (reloadable && (getLoader().modified())) {
                    try {
                        Thread.currentThread().setContextClassLoader
                            (standardContextClassLoader);
                        reload();
                    } finally {
                        if (getLoader() != null) {
                            Thread.currentThread().setContextClassLoader
                                (getLoader().getClassLoader());
                        }
                    }
                }
                if (getLoader() instanceof WebappLoader) {
                    ((WebappLoader) getLoader()).closeJARs(false);
                }
            }
        }
        // END S1AS8PE 4965017
    
private java.lang.ClassLoaderbindThread()
Bind current thread, both for CL purposes and for JNDI ENC support during : startup, shutdown and realoading of the context.

return
the previous context class loader


        ClassLoader oldContextClassLoader =
            Thread.currentThread().getContextClassLoader();

        Thread.currentThread().setContextClassLoader
            (getLoader().getClassLoader());

        if (isUseNaming()) {
            try {
                ContextBindings.bindThread(this, this);
            } catch (NamingException e) {
                // Silent catch, as this is a normal case during the early
                // startup stages
            }
        }

        return oldContextClassLoader;

    
private voidcacheContext()

        try {
            File workDir=new File( getWorkPath() );
            
            File ctxSer=new File( workDir, "_tomcat_context.ser");
            FileOutputStream fos=new FileOutputStream( ctxSer );
            ObjectOutputStream oos=new ObjectOutputStream( fos );
            oos.writeObject(this);
            oos.close();
            fos.close();
        } catch( Throwable t ) {
            log.info("Error saving context.ser ", t);
        }
    
private booleancopy(java.io.File src, java.io.File dest)
Copy a file.

        FileInputStream is = null;
        FileOutputStream os = null;
        try {
            is = new FileInputStream(src);
            os = new FileOutputStream(dest);
            byte[] buf = new byte[4096];
            while (true) {
                int len = is.read(buf);
                if (len < 0)
                    break;
                os.write(buf, 0, len);
            }
            is.close();
            os.close();
        } catch (IOException e) {
            return false;
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (Exception e) {
                // Ignore
            }
            try {
                if (os != null) {
                    os.close();
                }
            } catch (Exception e) {
                // Ignore
            }
        }
        return true;
    
public voidcreate()

        init();
    
public voidcreateLoader()
Creates a classloader for this context.

        ClassLoader parent = null;
        if (getPrivileged()) {
            if (log.isDebugEnabled()) {
                log.debug("Configuring privileged default Loader");
            }
            parent = this.getClass().getClassLoader();
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Configuring non-privileged default Loader");
            }
            parent = getParentClassLoader();
        }
        WebappLoader webappLoader = new WebappLoader(parent);
        webappLoader.setDelegate(getDelegate());
        webappLoader.setUseMyFaces(useMyFaces);
        setLoader(webappLoader);
    
public javax.management.ObjectNamecreateObjectName(java.lang.String hostDomain, javax.management.ObjectName parentName)

        String onameStr;
        StandardHost hst=(StandardHost)getParent();
        
        String hostName=getParent().getName();
        String name= "//" + ((hostName==null)? "DEFAULT" : hostName) +
                (("".equals(encodedPath)) ? "/" : encodedPath);

        String suffix=",J2EEApplication=" +
                getJ2EEApplication() + ",J2EEServer=" +
                getJ2EEServer();

        onameStr="j2eeType=WebModule,name=" + name + suffix;
        if( log.isDebugEnabled())
            log.debug("Registering " + onameStr + " for " + oname);
        
        // default case - no domain explictely set.
        if( getDomain() == null ) domain=hst.getDomain();

        ObjectName oname=new ObjectName(getDomain() + ":" + onameStr);
        return oname;        
    
public org.apache.catalina.WrappercreateWrapper()
Factory method to create and return a new Wrapper instance, of the Java implementation class appropriate for this Context implementation. The constructor of the instantiated Wrapper will have been called, but no properties will have been set.

     
        Wrapper wrapper = null;
        if (wrapperClass != null) {
            try {
                wrapper = (Wrapper) wrapperClass.newInstance();
            } catch (Throwable t) {
                log.error(sm.getString(
                                "standardContext.createWrapperInstance",
                                wrapperClassName),
                          t);
                return (null);
            }
        } else {
            wrapper = new StandardWrapper();
        }

        synchronized (instanceListeners) {
            for (int i = 0; i < instanceListeners.length; i++) {
                try {
                    Class clazz = Class.forName(instanceListeners[i]);
                    InstanceListener listener =
                      (InstanceListener) clazz.newInstance();
                    wrapper.addInstanceListener(listener);
                } catch (Throwable t) {
                    log.error(sm.getString(
                                  "standardContext.instanceListener",
                                  instanceListeners[i]),
                              t);
                    return (null);
                }
            }
        }

        synchronized (wrapperLifecycles) {
            for (int i = 0; i < wrapperLifecycles.length; i++) {
                try {
                    Class clazz = Class.forName(wrapperLifecycles[i]);
                    LifecycleListener listener =
                      (LifecycleListener) clazz.newInstance();
                    if (wrapper instanceof Lifecycle)
                        ((Lifecycle) wrapper).addLifecycleListener(listener);
                } catch (Throwable t) {
                    log.error(sm.getString(
                                "standardContext.lifecycleListener",
                                wrapperLifecycles[i]),
                              t);
                    return (null);
                }
            }
        }

        synchronized (wrapperListeners) {
            for (int i = 0; i < wrapperListeners.length; i++) {
                try {
                    Class clazz = Class.forName(wrapperListeners[i]);
                    ContainerListener listener =
                      (ContainerListener) clazz.newInstance();
                    wrapper.addContainerListener(listener);
                } catch (Throwable t) {
                    log.error(sm.getString(
                                "standardContext.containerListener",
                                wrapperListeners[i]),
                              t);
                    return (null);
                }
            }
        }

        return (wrapper);

    
public voiddestroy()
Destroy needs to clean up the context completely. The problem is that undoing all the config in start() and restoring a 'fresh' state is impossible. After stop()/destroy()/init()/start() we should have the same state as if a fresh start was done - i.e read modified web.xml, etc. This can only be done by completely removing the context object and remapping a new one, or by cleaning up everything. XXX Should this be done in stop() ?

        if( oname != null ) { 
            // Send j2ee.object.deleted notification 
            Notification notification = 
                new Notification("j2ee.object.deleted", this.getObjectName(), 
                                sequenceNumber++);
            broadcaster.sendNotification(notification);
        } 
        super.destroy();
        
        // START SJASAS 6359401
        // super.destroy() will stop session manager and cause it to unload
        // all its active sessions into a file. Delete this file, because this
        // context is being destroyed and must not leave any traces.
        if (getManager() instanceof ManagerBase) {
            ((ManagerBase)getManager()).release();
        }
        // END SJSAS 6359401

        instanceListeners = new String[0];
    
protected java.io.FileengineBase()
Return a File object representing the base directory for the entire servlet container (i.e. the Engine container if present).

        String base=System.getProperty("catalina.base");
        if( base == null ) {
            StandardEngine eng=(StandardEngine)this.getParent().getParent();
            base=eng.getBaseDir();
        }
        return (new File(base));
    
public booleanfilterStart()
Configure and initialize the set of filters for this Context. Return true if all filter initialization completed successfully, or false otherwise.


        if (log.isDebugEnabled())
            log.debug("Starting filters");
        // Instantiate and record a FilterConfig for each defined filter
        boolean ok = true;
        synchronized (filterConfigs) {
            filterConfigs.clear();
            Iterator names = filterDefs.keySet().iterator();
            while (names.hasNext()) {
                String name = (String) names.next();
                if (log.isDebugEnabled())
                    log.debug(" Starting filter '" + name + "'");
                ApplicationFilterConfig filterConfig = null;
                try {
                    filterConfig = new ApplicationFilterConfig
                      (this, (FilterDef) filterDefs.get(name));
                    filterConfigs.put(name, filterConfig);
                } catch (Throwable t) {
                    getServletContext().log
                        (sm.getString("standardContext.filterStart", name), t);
                    ok = false;
                }
            }
        }

        return (ok);

    
public booleanfilterStop()
Finalize and release the set of filters for this Context. Return true if all filter finalization completed successfully, or false otherwise.


        if (log.isDebugEnabled())
            log.debug("Stopping filters");

        // Release all Filter and FilterConfig instances
        synchronized (filterConfigs) {
            Iterator names = filterConfigs.keySet().iterator();
            while (names.hasNext()) {
                String name = (String) names.next();
                if (log.isDebugEnabled())
                    log.debug(" Stopping filter '" + name + "'");
                ApplicationFilterConfig filterConfig =
                  (ApplicationFilterConfig) filterConfigs.get(name);
                filterConfig.release();
            }
            filterConfigs.clear();
        }
        return (true);

    
public java.lang.String[]findApplicationListeners()
Return the set of application listener class names configured for this application.


        return (applicationListeners);

    
public org.apache.catalina.deploy.ApplicationParameter[]findApplicationParameters()
Return the set of application parameters for this application.


        return (applicationParameters);

    
public org.apache.catalina.deploy.SecurityConstraint[]findConstraints()
Return the security constraints for this web application. If there are none, a zero-length array is returned.


        return (constraints);

    
public org.apache.catalina.deploy.ContextEjbfindEjb(java.lang.String name)
Return the EJB resource reference with the specified name, if any; otherwise, return null.

param
name Name of the desired EJB resource reference


        return namingResources.findEjb(name);

    
public org.apache.catalina.deploy.ContextEjb[]findEjbs()
Return the defined EJB resource references for this application. If there are none, a zero-length array is returned.


        return namingResources.findEjbs();

    
public org.apache.catalina.deploy.ContextEnvironmentfindEnvironment(java.lang.String name)
Return the environment entry with the specified name, if any; otherwise, return null.

param
name Name of the desired environment entry


        return namingResources.findEnvironment(name);

    
public org.apache.catalina.deploy.ContextEnvironment[]findEnvironments()
Return the set of defined environment entries for this web application. If none have been defined, a zero-length array is returned.


        return namingResources.findEnvironments();

    
public org.apache.catalina.deploy.ErrorPagefindErrorPage(int errorCode)
Return the error page entry for the specified HTTP error code, if any; otherwise return null.

param
errorCode Error code to look up

        if ((errorCode >= 400) && (errorCode < 600)) {
            return ((ErrorPage) statusPages.get(Integer.valueOf(errorCode)));
        }

        return null;
    
public org.apache.catalina.deploy.ErrorPagefindErrorPage(java.lang.String exceptionType)
Return the error page entry for the specified Java exception type, if any; otherwise return null.

param
exceptionType Exception type to look up


        synchronized (exceptionPages) {
            return ((ErrorPage) exceptionPages.get(exceptionType));
        }

    
public org.apache.catalina.deploy.ErrorPage[]findErrorPages()
Return the set of defined error pages for all specified error codes and exception types.


        synchronized(exceptionPages) {
            synchronized(statusPages) {
                ErrorPage results1[] = new ErrorPage[exceptionPages.size()];
                results1 =
                    (ErrorPage[]) exceptionPages.values().toArray(results1);
                ErrorPage results2[] = new ErrorPage[statusPages.size()];
                results2 =
                    (ErrorPage[]) statusPages.values().toArray(results2);
                ErrorPage results[] =
                    new ErrorPage[results1.length + results2.length];
                for (int i = 0; i < results1.length; i++)
                    results[i] = results1[i];
                for (int i = results1.length; i < results.length; i++)
                    results[i] = results2[i - results1.length];
                return (results);
            }
        }

    
public javax.servlet.FilterConfigfindFilterConfig(java.lang.String name)
Find and return the initialized FilterConfig for the specified filter name, if any; otherwise return null.

param
name Name of the desired filter


        return ((FilterConfig) filterConfigs.get(name));

    
public org.apache.catalina.deploy.FilterDeffindFilterDef(java.lang.String filterName)
Return the filter definition for the specified filter name, if any; otherwise return null.

param
filterName Filter name to look up


        synchronized (filterDefs) {
            return ((FilterDef) filterDefs.get(filterName));
        }

    
public org.apache.catalina.deploy.FilterDef[]findFilterDefs()
Return the set of defined filters for this Context.


        synchronized (filterDefs) {
            FilterDef results[] = new FilterDef[filterDefs.size()];
            return ((FilterDef[]) filterDefs.values().toArray(results));
        }

    
public org.apache.catalina.deploy.FilterMap[]findFilterMaps()
Return the set of filter mappings for this Context.


        return (filterMaps);

    
public java.lang.String[]findInstanceListeners()
Return the set of InstanceListener classes that will be added to newly created Wrappers automatically.


        return (instanceListeners);

    
public org.apache.catalina.deploy.ContextLocalEjbfindLocalEjb(java.lang.String name)
Return the local EJB resource reference with the specified name, if any; otherwise, return null.

param
name Name of the desired EJB resource reference


        return namingResources.findLocalEjb(name);

    
public org.apache.catalina.deploy.ContextLocalEjb[]findLocalEjbs()
Return the defined local EJB resource references for this application. If there are none, a zero-length array is returned.


        return namingResources.findLocalEjbs();

    
public org.apache.catalina.ContextfindMappingObject()
FIXME: Fooling introspection ...

        return (Context) getMappingObject();
    
public org.apache.catalina.deploy.MessageDestinationfindMessageDestination(java.lang.String name)
Return the message destination with the specified name, if any; otherwise, return null.

param
name Name of the desired message destination


        synchronized (messageDestinations) {
            return ((MessageDestination) messageDestinations.get(name));
        }

    
public org.apache.catalina.deploy.MessageDestinationReffindMessageDestinationRef(java.lang.String name)
Return the message destination ref with the specified name, if any; otherwise, return null.

param
name Name of the desired message destination ref


        return namingResources.findMessageDestinationRef(name);

    
public org.apache.catalina.deploy.MessageDestinationRef[]findMessageDestinationRefs()
Return the set of defined message destination refs for this web application. If none have been defined, a zero-length array is returned.


        return namingResources.findMessageDestinationRefs();

    
public org.apache.catalina.deploy.MessageDestination[]findMessageDestinations()
Return the set of defined message destinations for this web application. If none have been defined, a zero-length array is returned.


        synchronized (messageDestinations) {
            MessageDestination results[] =
                new MessageDestination[messageDestinations.size()];
            return ((MessageDestination[])
                    messageDestinations.values().toArray(results));
        }

    
public java.lang.StringfindMimeMapping(java.lang.String extension)
Return the MIME type to which the specified extension is mapped, if any; otherwise return null.

param
extension Extension to map to a MIME type


        String mimeType = mimeMappings.get(extension);
        if (mimeType == null) {
            // No mapping found, try case-insensitive match
            synchronized (mimeMappings) {
                Iterator<String> extensions = mimeMappings.keySet().iterator();
                while (extensions.hasNext()) {
                    String ext = extensions.next();
                    if (ext.equalsIgnoreCase(extension)) {
                        // Case-insensitive extension match found
                        mimeType = mimeMappings.get(ext);
                        // Add given extension to the map, in order to make
                        // subsequent lookups faster
                        mimeMappings.put(extension, mimeType);
                        break;
                    }
                }                
            }        
        }

        return mimeType;
    
public java.lang.String[]findMimeMappings()
Return the extensions for which MIME mappings are defined. If there are none, a zero-length array is returned.


        synchronized (mimeMappings) {
            String results[] = new String[mimeMappings.size()];
            return
                ((String[]) mimeMappings.keySet().toArray(results));
        }

    
public java.lang.StringfindParameter(java.lang.String name)
Return the value for the specified context initialization parameter name, if any; otherwise return null.

param
name Name of the parameter to return


        synchronized (parameters) {
            return ((String) parameters.get(name));
        }

    
public java.lang.String[]findParameters()
Return the names of all defined context initialization parameters for this Context. If no parameters are defined, a zero-length array is returned.


        synchronized (parameters) {
            String results[] = new String[parameters.size()];
            return ((String[]) parameters.keySet().toArray(results));
        }

    
public org.apache.catalina.deploy.ContextResourcefindResource(java.lang.String name)
Return the resource reference with the specified name, if any; otherwise return null.

param
name Name of the desired resource reference


        return namingResources.findResource(name);

    
public java.lang.StringfindResourceEnvRef(java.lang.String name)
Return the resource environment reference type for the specified name, if any; otherwise return null.

param
name Name of the desired resource environment reference


        return namingResources.findResourceEnvRef(name);

    
public java.lang.String[]findResourceEnvRefs()
Return the set of resource environment reference names for this web application. If none have been specified, a zero-length array is returned.


        return namingResources.findResourceEnvRefs();

    
public org.apache.catalina.deploy.ContextResourceLinkfindResourceLink(java.lang.String name)
Return the resource link with the specified name, if any; otherwise return null.

param
name Name of the desired resource link


        return namingResources.findResourceLink(name);

    
public org.apache.catalina.deploy.ContextResourceLink[]findResourceLinks()
Return the defined resource links for this application. If none have been defined, a zero-length array is returned.


        return namingResources.findResourceLinks();

    
public org.apache.catalina.deploy.ContextResource[]findResources()
Return the defined resource references for this application. If none have been defined, a zero-length array is returned.


        return namingResources.findResources();

    
public java.lang.StringfindRoleMapping(java.lang.String role)
For the given security role (as used by an application), return the corresponding role name (as defined by the underlying Realm) if there is one. Otherwise, return the specified role unchanged.

param
role Security role to map


        String realRole = null;
        synchronized (roleMappings) {
            realRole = (String) roleMappings.get(role);
        }
        if (realRole != null)
            return (realRole);
        else
            return (role);

    
public booleanfindSecurityRole(java.lang.String role)
Return true if the specified security role is defined for this application; otherwise return false.

param
role Security role to verify


        synchronized (securityRoles) {
            for (int i = 0; i < securityRoles.length; i++) {
                if (role.equals(securityRoles[i]))
                    return (true);
            }
        }
        return (false);

    
public java.lang.String[]findSecurityRoles()
Return the security roles defined for this application. If none have been defined, a zero-length array is returned.


        return (securityRoles);

    
public java.lang.StringfindServletMapping(java.lang.String pattern)
Return the servlet name mapped by the specified pattern (if any); otherwise return null.

param
pattern Pattern for which a mapping is requested


        synchronized (servletMappings) {
            return ((String) servletMappings.get(pattern));
        }

    
public java.lang.String[]findServletMappings()
Return the patterns of all defined servlet mappings for this Context. If no mappings are defined, a zero-length array is returned.


        synchronized (servletMappings) {
            String results[] = new String[servletMappings.size()];
            return
               ((String[]) servletMappings.keySet().toArray(results));
        }

    
public javax.naming.directory.DirContextfindStaticResources()
Return the naming resources associated with this web application. FIXME: Fooling introspection ...


        return getResources();

    
public java.lang.StringfindStatusPage(int status)
Return the context-relative URI of the error page for the specified HTTP status code, if any; otherwise return null.

param
status HTTP status code to look up


        return ((String) statusPages.get(Integer.valueOf(status)));

    
public int[]findStatusPages()
Return the set of HTTP status codes for which error pages have been specified. If none are specified, a zero-length array is returned.


        synchronized (statusPages) {
            int results[] = new int[statusPages.size()];
            Iterator elements = statusPages.keySet().iterator();
            int i = 0;
            while (elements.hasNext())
                results[i++] = ((Integer) elements.next()).intValue();
            return (results);
        }

    
public java.lang.StringfindTaglib(java.lang.String uri)
Return the tag library descriptor location for the specified taglib URI, if any; otherwise, return null.

param
uri URI, relative to the web.xml file


        synchronized (taglibs) {
            return ((String) taglibs.get(uri));
        }

    
public java.lang.String[]findTaglibs()
Return the URIs of all tag libraries for which a tag library descriptor location has been specified. If none are specified, a zero-length array is returned.


        synchronized (taglibs) {
            String results[] = new String[taglibs.size()];
            return ((String[]) taglibs.keySet().toArray(results));
        }

    
public booleanfindWelcomeFile(java.lang.String name)
Return true if the specified welcome file is defined for this Context; otherwise return false.

param
name Welcome file to verify


        synchronized (welcomeFiles) {
            for (int i = 0; i < welcomeFiles.length; i++) {
                if (name.equals(welcomeFiles[i]))
                    return (true);
            }
        }
        return (false);

    
public java.lang.String[]findWelcomeFiles()
Return the set of welcome files defined for this Context. If none are defined, a zero-length array is returned.


        return (welcomeFiles);

    
public java.lang.String[]findWrapperLifecycles()
Return the set of LifecycleListener classes that will be added to newly created Wrappers automatically.


        return (wrapperLifecycles);

    
public java.lang.String[]findWrapperListeners()
Return the set of ContainerListener classes that will be added to newly created Wrappers automatically.


        return (wrapperListeners);

    
public java.lang.StringgetAdHocServletName(java.lang.String path)
Returns the name of the ad-hoc servlet responsible for servicing the given path.

param
path The path to service
return
The name of the ad-hoc servlet responsible for servicing the given path, or null if the given path is not an ad-hoc path

        return null;
    
public booleangetAllowRelativeRedirect()
Return whether this context allows sendRedirect() to redirect to a relative URL. The default value for this property is 'false'.


        return allowRelativeRedirect;

    
public java.lang.StringgetAltDDName()
Return the alternate Deployment Descriptor name.

        return altDDName;
    
public java.util.ArrayListgetAlternateDocBases()
Gets this context's configured alternate doc bases.

return
This context's configured alternate doc bases

        return alternateDocBases;
    
private java.lang.StringgetAppBase()
Get app base.

        String appBase = null;
        Container container = this;
        while (container != null) {
            if (container instanceof Host)
                break;
            container = container.getParent();
        }
        if (container != null) {
            appBase = ((Host) container).getAppBase();
        }
        return appBase;
    
public java.lang.Object[]getApplicationEventListeners()
Return the set of initialized application event listener objects, in the order they were specified in the web application deployment descriptor, for this application.

exception
IllegalStateException if this method is called before this application has started, or after it has been stopped

        return (applicationEventListenersObjects);
    
public java.lang.Object[]getApplicationLifecycleListeners()
Return the set of initialized application lifecycle listener objects, in the order they were specified in the web application deployment descriptor, for this application.

exception
IllegalStateException if this method is called before this application has started, or after it has been stopped

        return (applicationLifecycleListenersObjects);
    
public org.apache.catalina.Auditor[]getAuditors()
Get Auditors associated with this context, if any.

return
array of Auditor objects, or null

        return auditors;
    
public booleangetAvailable()
Return the application available flag for this Context.


        return (this.available);

    
private java.lang.StringgetBasePath(java.lang.String docBase)
Get base path.

        String basePath = null;
        Container container = this;
        while (container != null) {
            if (container instanceof Host)
                break;
            container = container.getParent();
        }
        File file = new File(docBase);
        if (!file.isAbsolute()) {
            if (container == null) {
                basePath = (new File(engineBase(), docBase)).getPath();
            } else {
                // Use the "appBase" property of this container
                String appBase = ((Host) container).getAppBase();
                file = new File(appBase);
                if (!file.isAbsolute())
                    file = new File(engineBase(), appBase);
                basePath = (new File(file, docBase)).getPath();
            }
        } else {
            basePath = file.getPath();
        }
        return basePath;
    
public intgetCacheMaxSize()
Return the maximum size of the cache in KB.

        return cacheMaxSize;
    
public intgetCacheTTL()
Get cache TTL.

        return cacheTTL;
    
public org.apache.catalina.util.CharsetMappergetCharsetMapper()
Return the Locale to character set mapper for this Context.


        // Create a mapper the first time it is requested
        if (this.charsetMapper == null) {
            try {
                Class clazz = Class.forName(charsetMapperClass);
                this.charsetMapper =
                  (CharsetMapper) clazz.newInstance();
            } catch (Throwable t) {
                this.charsetMapper = new CharsetMapper();
            }
        }

        return (this.charsetMapper);

    
public java.lang.StringgetCharsetMapperClass()
Return the Locale to character set mapper class for this Context.


        return (this.charsetMapperClass);

    
public java.lang.StringgetCompilerClasspath()
Return the compiler classpath.

        return compilerClasspath;
    
private java.io.FilegetConfigBase()
Get config base.

        File configBase = 
            new File(System.getProperty("catalina.base"), "conf");
        if (!configBase.exists()) {
            return null;
        }
        Container container = this;
        Container host = null;
        Container engine = null;
        while (container != null) {
            if (container instanceof Host)
                host = container;
            if (container instanceof Engine)
                engine = container;
            container = container.getParent();
        }
        if (engine != null) {
            configBase = new File(configBase, engine.getName());
        }
        if (host != null) {
            configBase = new File(configBase, host.getName());
        }
        configBase.mkdirs();
        return configBase;
    
public java.lang.StringgetConfigFile()
Return the path to a file to save this Context information.


        return (this.configFile);

    
public booleangetConfigured()
Return the "correctly configured" flag for this Context.


        return (this.configured);

    
public booleangetCookies()
Return the "use cookies for session ids" flag.


        return (this.cookies);

    
public booleangetCrossContext()
Return the "allow crossing servlet contexts" flag.


        return (this.crossContext);

    
protected java.lang.StringgetDefaultConfigFile()
Given a context path, get the config file name.

        String basename = null;
        String path = getPath();
        if (path.equals("")) {
            basename = "ROOT";
        } else {
            basename = path.substring(1).replace('/", '_");
        }
        return (basename + ".xml");
    
public java.lang.StringgetDefaultWebXml()

        return defaultWebXml;
    
public booleangetDelegate()
Return the "follow standard delegation model" flag used to configure our ClassLoader.


        return (this.delegate);

    
public java.lang.StringgetDeploymentDescriptor()
JSR77 deploymentDescriptor attribute

return
string deployment descriptor

    
        InputStream stream = null;
        ServletContext servletContext = getServletContext();
        if (servletContext != null) {
            stream = servletContext.getResourceAsStream(
                org.apache.catalina.startup.Constants.ApplicationWebXml);
        }
        if (stream == null) {
            return "";
        }
        BufferedReader br = new BufferedReader(
                                new InputStreamReader(stream));
        StringBuffer sb = new StringBuffer();
        String strRead = "";
        try {
            while (strRead != null) {
                sb.append(strRead);
                strRead = br.readLine();
            }
        } catch (IOException e) {
            return "";
        }

        return sb.toString(); 
    
    
public java.lang.StringgetDisplayName()
Return the display name of this web application.


        return (this.displayName);

    
public booleangetDistributable()
Return the distributable flag for this web application.


        return (this.distributable);

    
public java.lang.StringgetDocBase()
Return the document root for this Context. This can be an absolute pathname, a relative pathname, or a URL.

        return (this.docBase);
    
public java.lang.StringgetEncodedPath()



    // ----------------------------------------------------- Context Properties

       
        return encodedPath;
    
public java.lang.StringgetEngineName()

        if( engineName != null ) return engineName;
        return domain;
    
public java.lang.String[]getEnvironments()
Return the MBean Names of the set of defined environment entries for this web application

        ContextEnvironment[] envs = getNamingResources().findEnvironments();
        ArrayList results = new ArrayList();
        for (int i = 0; i < envs.length; i++) {
            try {
                ObjectName oname =
                    MBeanUtils.createObjectName(this.getEngineName(), envs[i]);
                results.add(oname.toString());
            } catch (MalformedObjectNameException e) {
                IllegalArgumentException iae = new IllegalArgumentException
                    ("Cannot create object name for environment " + envs[i]);
                iae.initCause(e);
                throw iae;
            }
        }
        return ((String[]) results.toArray(new String[results.size()]));

    
public java.lang.StringgetHostname()

        Container parentHost = getParent();
        if (parentHost != null) {
            hostName = parentHost.getName();
        }
        if ((hostName == null) || (hostName.length() < 1))
            hostName = "_";
        return hostName;
    
public java.lang.StringgetInfo()
Return descriptive information about this Container implementation and the corresponding version number, in the format <description>/<version>.


        return (info);

    
public java.lang.StringgetJ2EEApplication()

        return j2EEApplication;
    
public java.lang.StringgetJ2EEServer()

        return j2EEServer;
    
public java.lang.String[]getJavaVMs()

        return javaVMs;
    
public org.apache.catalina.deploy.LoginConfiggetLoginConfig()
Return the login configuration descriptor for this web application.


        return (this.loginConfig);

    
public intgetManagerChecksFrequency()
Return the frequency of manager checks.


        return (this.managerChecksFrequency);

    
public org.apache.tomcat.util.http.mapper.MappergetMapper()
Get the mapper associated with the context.

        return (mapper);
    
public java.lang.StringgetNamingContextName()
Get naming context full name.

    // END RIMOD 6195820
        if (namingContextName == null) {
            Container parent = getParent();
            if (parent == null) {
                namingContextName = getName();
            } else {
                Stack stk = new Stack();
                StringBuffer buff = new StringBuffer();
                while (parent != null) {
                    stk.push(parent.getName());
                    parent = parent.getParent();
                }
                while (!stk.empty()) {
                    buff.append("/" + stk.pop());
                }
                buff.append(getName());
                namingContextName = buff.toString();
            }
            // START RIMOD 4868393
            // append an id to make the name unique to the instance.
            namingContextName += instanceIDCounter++;
            // END RIMOD 4868393
        }
        return namingContextName;
    
public org.apache.catalina.deploy.NamingResourcesgetNamingResources()
Return the naming resources associated with this web application.


        return (this.namingResources);

    
public booleangetOverride()
Return the DefaultContext override flag for this web application.


        return (this.override);

    
public javax.management.ObjectNamegetParentName()

        // "Life" update
        String path=oname.getKeyProperty("name");
        if( path == null ) {
            log.error(sm.getString(
                            "standardContext.missingNameAttributeInName",
                            getName()));
            return null;
        }
        if( ! path.startsWith( "//")) {
            log.error(sm.getString("standardContext.malformedName",
                                   getName()));
        }
        path=path.substring(2);
        int delim=path.indexOf( "/" );
        hostName="localhost"; // Should be default...
        if( delim > 0 ) {
            hostName=path.substring(0, delim);
            path = path.substring(delim);
            if (path.equals("/")) {
                this.setName("");
            } else {
                this.setName(path);
            }
        } else {
            if (log.isDebugEnabled()) {
                log.debug("Setting path " +  path );
            }
            this.setName( path );
        }
        // XXX  The service and domain should be the same.
        String parentDomain=getEngineName();
        if( parentDomain == null ) parentDomain=domain;
        ObjectName parentName=new ObjectName( parentDomain + ":" +
                "type=Host,host=" + hostName);
        return parentName;
    
public java.lang.StringgetPath()
Return the context path for this Context.


        return (getName());

    
public booleangetPaused()
Return the request processing paused flag for this Context.


        return (this.paused);

    
public booleangetPrivileged()
Return the privileged flag for this web application.


        return (this.privileged);

    
public longgetProcessingTimeMillis()
Gets the cumulative processing times of all servlets in this StandardContext.

return
Cumulative processing times of all servlets in this StandardContext

        
        long result = 0;

        Container[] children = findChildren();
        if (children != null) {
            for( int i=0; i< children.length; i++ ) {
                result += ((StandardWrapper)children[i]).getProcessingTimeMillis();
            }
        }

        return result;
    
public java.lang.StringgetPublicId()
Return the public identifier of the deployment descriptor DTD that is currently being parsed.


        return (this.publicId);

    
public booleangetReloadable()
Return the reloadable flag for this web application.


        return (this.reloadable);

    
public java.lang.String[]getResourceLinks()
Return the MBean Names of all the defined resource links for this application


        ContextResourceLink[] links = getNamingResources().findResourceLinks();
        ArrayList results = new ArrayList();
        for (int i = 0; i < links.length; i++) {
            try {
                ObjectName oname =
                    MBeanUtils.createObjectName(this.getEngineName(), links[i]);
                results.add(oname.toString());
            } catch (MalformedObjectNameException e) {
                IllegalArgumentException iae = new IllegalArgumentException
                    ("Cannot create object name for resource " + links[i]);
                iae.initCause(e);
                throw iae;
            }
        }
        return ((String[]) results.toArray(new String[results.size()]));

    
public java.lang.String[]getResourceNames()
Return the MBean Names of all the defined resource references for this application.


        ContextResource[] resources = getNamingResources().findResources();
        ArrayList results = new ArrayList();
        for (int i = 0; i < resources.length; i++) {
            try {
                ObjectName oname =
                    MBeanUtils.createObjectName(this.getEngineName(), resources[i]);
                results.add(oname.toString());
            } catch (MalformedObjectNameException e) {
                IllegalArgumentException iae = new IllegalArgumentException
                    ("Cannot create object name for resource " + resources[i]);
                iae.initCause(e);
                throw iae;
            }
        }
        return ((String[]) results.toArray(new String[results.size()]));

    
public booleangetReuseSessionID()
Return the "reuse session IDs when creating sessions" flag

        return reuseSessionID;
    
public java.lang.StringgetServer()

    
       
        return server;
    
public javax.servlet.ServletContextgetServletContext()
Return the servlet context for which this Context is a facade.


        if (context == null) {
            context = new ApplicationContext(getBasePath(getDocBase()),
                                             getAlternateDocBases(),
                                             this);
            if (altDDName != null 
                    && context.getAttribute(Globals.ALT_DD_ATTR) == null){
                context.setAttribute(Globals.ALT_DD_ATTR,altDDName);
                context.setAttributeReadOnly(Globals.ALT_DD_ATTR);
            }
        }

        return (context.getFacade());

    
public java.lang.String[]getServlets()
JSR77 servlets attribute

return
list of all servlets ( we know about )


        String[] result = null;

        Container[] children = findChildren();
        if (children != null) {
            result = new String[children.length];
            for( int i=0; i< children.length; i++ ) {
                result[i] = ((StandardWrapper)children[i]).getObjectName();
            }
        }

        return result;
    
public intgetSessionTimeout()
Return the default session timeout (in minutes) for this web application.


        return (this.sessionTimeout);

    
public longgetStartTimeMillis()
Gets the time this context was started.

return
Time (in milliseconds since January 1, 1970, 00:00:00) when this context was started

        return startTimeMillis;
    
public longgetStartupTime()
Gets the time (in milliseconds) it took to start this context.

return
Time (in milliseconds) it took to start this context.

        return startupTime;
    
public intgetState()

        if( started ) {
            return 1; // RUNNING
        }
        if( initialized ) {
            return 0; // starting ? 
        }
        if( ! available ) { 
            return 4; //FAILED
        }
        // 2 - STOPPING
        return 3; // STOPPED
    
public javax.naming.directory.DirContextgetStaticResources()
Return the naming resources associated with this web application.


        return getResources();

    
public booleangetSwallowOutput()
Return the value of the swallowOutput flag.


        return (this.swallowOutput);

    
public booleangetTldNamespaceAware()
Get the server.xml attribute's xmlNamespaceAware.

return
true if namespace awarenes is enabled.

        return tldNamespaceAware;
    
public longgetTldScanTime()

        return tldScanTime;
    
public booleangetTldValidation()
Get the server.xml attribute's webXmlValidation.

return
true if validation is enabled.

        return tldValidation;
    
public booleangetUnpackWAR()
Unpack WAR flag accessor.


        return (unpackWAR);

    
public java.lang.String[]getWelcomeFiles()
Return the naming resources associated with this web application.


        return findWelcomeFiles();

    
public java.lang.StringgetWorkDir()
Return the work directory for this Context.


        return (this.workDir);

    
public java.lang.StringgetWorkPath()
Get the absolute path to the work dir. To avoid duplication.

return

        File workDir = new File(getWorkDir());
        if (!workDir.isAbsolute()) {
            File catalinaHome = engineBase();
            String catalinaHomePath = null;
            try {
                catalinaHomePath = catalinaHome.getCanonicalPath();
                workDir = new File(catalinaHomePath,
                        getWorkDir());
            } catch (IOException e) {
            }
        }
        return workDir.getAbsolutePath();
    
public java.lang.StringgetWrapperClass()
Return the Java class name of the Wrapper implementation used for servlets registered in this Context.


        return (this.wrapperClassName);

    
public booleangetXmlNamespaceAware()
Get the server.xml attribute's xmlNamespaceAware.

return
true if namespace awarenes is enabled.

        return webXmlNamespaceAware;
    
public booleangetXmlValidation()
Get the server.xml attribute's xmlValidation.

return
true if validation is enabled.

        return webXmlValidation;
    
public booleanhasAdHocPaths()
Indicates whether this web module contains any ad-hoc paths. An ad-hoc path is a servlet path that is mapped to a servlet not declared in the web module's deployment descriptor. A web module all of whose mappings are for ad-hoc paths is called an ad-hoc web module.

return
true if this web module contains any ad-hoc paths, false otherwise

        return false;
    
public voidinit()


        if( this.getParent() == null ) {
            ObjectName parentName=getParentName();
            
            if( ! mserver.isRegistered(parentName)) {
                if (log.isDebugEnabled()) {
                    log.debug("No host, creating one " + parentName);
                }
                StandardHost host=new StandardHost();
                host.setName(hostName);
                Registry.getRegistry(null, null).registerComponent(host, parentName, null);
                mserver.invoke(parentName, "init", new Object[] {}, new String[] {} );
            }
            ContextConfig config = new ContextConfig();
            this.addLifecycleListener(config);
      
            if (log.isDebugEnabled()) {
                log.debug( "AddChild " + parentName + " " + this);
            }
            try {
                mserver.invoke(parentName, "addChild", new Object[] { this },
                               new String[] {"org.apache.catalina.Container"});
            } catch (Exception e) {
                destroy();
                throw e;
            }
        }
        
        // It's possible that addChild may have started us
        if( initialized ) {
            return;
        }
        
        super.init();

        // START GlassFish 2439
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(INIT_EVENT, null);
        // END GlassFish 2439
        
        // Send j2ee.state.starting notification 
        if (this.getObjectName() != null) {
            Notification notification = new Notification("j2ee.state.starting", 
                                                        this.getObjectName(), 
                                                        sequenceNumber++);
            broadcaster.sendNotification(notification);
        }
        
    
public booleanisAllowLinking()
Is linking allowed.

        return allowLinking;
    
public booleanisCachingAllowed()
Is caching allowed ?

        return cachingAllowed;
    
public booleanisCaseSensitive()
Is case sensitive ?

        return caseSensitive;
    
public booleanisCaseSensitiveMapping()
Are filters and security constraints mapped in a case sensitive manner?

        return caseSensitiveMapping;
    
public booleanisEventProvider()

        return false;
    
public booleanisFilesystemBased()
Returns true if the resources associated with this context are filesystem based.


        return (filesystemBased);

    
public booleanisJsfApplication()
Scan the parent when searching for TLD listeners.

        return isJsfApplication;
    
private booleanisJsfServletDefined()
Check if we need to scan the classloader parent for Tld listeners. Tlds will be scanned for listeners only if the web app uses Java Server Faces.

        Container[] wrappers = (Container[])findChildren();     
        String servletName;
        for(int i=0; i < wrappers.length; i++){
            servletName = ((Wrapper)wrappers[i]).getServletClass();
            if (servletName == null){
                continue;
            } 
            // REVISIT Should we make the list configurable?
            if ( servletName.equals("javax.faces.webapp.FacesServlet") ){
                return true;
            }
        }
        
        return false;
        
    
public booleanisLazy()

        return lazy;
    
public booleanisReload()

        return isReload;
    
public booleanisReplaceWelcomeFiles()
Return the "replace welcome files" property.


        return (this.replaceWelcomeFiles);

    
public booleanisSaveConfig()
Save config ?

        return saveConfig;
    
public booleanisSecurePagesWithPragma()
Returns the value of the securePagesWithPragma property.


        return (this.securePagesWithPragma);
    
protected booleanisServlet22()
Are we processing a version 2.2 deployment descriptor?


        if (this.publicId == null)
            return (false);
        if (this.publicId.equals
            (org.apache.catalina.startup.Constants.WebDtdPublicId_22))
            return (true);
        else
            return (false);

    
public booleanisSessionTimeoutOveridden()
Is the session timeout (in minutes) for this web application over-ridden from the default HERCULES:add


        return (this.sessionTimeoutOveridden);

    
public booleanisStateManageable()
Support for "stateManageable" JSR77

        return true;
    
public booleanisStatisticsProvider()

        return false;
    
public booleanisUseMyFaces()

        return useMyFaces;
    
public booleanisUseNaming()
Returns true if the internal naming support is used.


        return (useNaming);

    
public booleanlistenerStart()
Configure the set of instantiated application event listeners for this Context. Return true if all listeners wre initialized successfully, or false otherwise.


        if (log.isDebugEnabled())
            log.debug("Configuring application event listeners");

        // Instantiate the required listeners
        ClassLoader loader = getLoader().getClassLoader();
        String listeners[] = findApplicationListeners();
        Object results[] = new Object[listeners.length];
        boolean ok = true;
        for (int i = 0; i < results.length; i++) {
            if (log.isDebugEnabled())
                log.debug(" Configuring event listener class '" +
                    listeners[i] + "'");
            try {
                Class clazz = loader.loadClass(listeners[i]);
                results[i] = clazz.newInstance();
                // START PWC 1.2 6310695
                fireContainerEvent(ContainerEvent.AFTER_LISTENER_INSTANTIATED,
                                   results[i]);
                // END PWC 1.2 6310695
            } catch (Throwable t) {
                getServletContext().log
                    (sm.getString("standardContext.applicationListener",
                                  listeners[i]), t);
                ok = false;
            }
        }
        if (!ok) {
            log.error(sm.getString("standardContext.applicationSkipped"));
            return (false);
        }

        // Sort listeners in two arrays
        ArrayList eventListeners = new ArrayList();
        ArrayList lifecycleListeners = new ArrayList();
        for (int i = 0; i < results.length; i++) {
            if ((results[i] instanceof ServletContextAttributeListener)
                || (results[i] instanceof ServletRequestAttributeListener)
                || (results[i] instanceof ServletRequestListener)
                || (results[i] instanceof HttpSessionAttributeListener)) {
                eventListeners.add(results[i]);
            }
            if ((results[i] instanceof ServletContextListener)
                || (results[i] instanceof HttpSessionListener)) {
                lifecycleListeners.add(results[i]);
            }
        }

        setApplicationEventListeners(eventListeners.toArray());
        setApplicationLifecycleListeners(lifecycleListeners.toArray());

        // Send application start events

        if (log.isDebugEnabled())
            log.debug("Sending application start events");

        Object instances[] = getApplicationLifecycleListeners();
        if (instances == null)
            return (ok);
        ServletContextEvent event =
          new ServletContextEvent(getServletContext());
        for (int i = 0; i < instances.length; i++) {
            if (instances[i] == null)
                continue;
            if (!(instances[i] instanceof ServletContextListener))
                continue;
            ServletContextListener listener =
                (ServletContextListener) instances[i];
            try {
                fireContainerEvent(ContainerEvent.BEFORE_CONTEXT_INITIALIZED,
                                   listener);
                listener.contextInitialized(event);
                fireContainerEvent(ContainerEvent.AFTER_CONTEXT_INITIALIZED,
                                   listener);
            } catch (Throwable t) {
                fireContainerEvent(ContainerEvent.AFTER_CONTEXT_INITIALIZED,
                                   listener);
                getServletContext().log
                    (sm.getString("standardContext.listenerStart",
                                  instances[i].getClass().getName()), t);
                ok = false;
            }
        }
        return (ok);

    
public booleanlistenerStop()
Send an application stop event to all interested listeners. Return true if all events were sent successfully, or false otherwise.


        if (log.isDebugEnabled())
            log.debug("Sending application stop events");

        boolean ok = true;
        Object listeners[] = getApplicationLifecycleListeners();
        if (listeners == null)
            return (ok);
        ServletContextEvent event =
          new ServletContextEvent(getServletContext());
        for (int i = 0; i < listeners.length; i++) {
            int j = (listeners.length - 1) - i;
            if (listeners[j] == null)
                continue;
            if (!(listeners[j] instanceof ServletContextListener))
                continue;
            ServletContextListener listener =
                (ServletContextListener) listeners[j];
            try {
                fireContainerEvent(ContainerEvent.BEFORE_CONTEXT_DESTROYED,
                                   listener);
                listener.contextDestroyed(event);
                fireContainerEvent(ContainerEvent.AFTER_CONTEXT_DESTROYED,
                                   listener);
            } catch (Throwable t) {
                fireContainerEvent(ContainerEvent.AFTER_CONTEXT_DESTROYED,
                                   listener);
                getServletContext().log
                    (sm.getString("standardContext.listenerStop",
                                  listeners[j].getClass().getName()), t);
                ok = false;
            }
        }
        setApplicationEventListeners(null);
        setApplicationLifecycleListeners(null);
        return (ok);

    
public voidloadOnStartup(org.apache.catalina.Container[] children)
Load and initialize all servlets marked "load on startup" in the web application deployment descriptor.

param
children Array of wrappers for all currently defined servlets (including those not declared load on startup)

    // END SJSAS 6377790
        // Collect "load on startup" servlets that need to be initialized
        TreeMap map = new TreeMap();
        for (int i = 0; i < children.length; i++) {
            Wrapper wrapper = (Wrapper) children[i];
            int loadOnStartup = wrapper.getLoadOnStartup();
            if (loadOnStartup < 0)
                continue;
            if (loadOnStartup == 0)     // Arbitrarily put them last
                loadOnStartup = Integer.MAX_VALUE;
            Integer key = Integer.valueOf(loadOnStartup);
            ArrayList list = (ArrayList) map.get(key);
            if (list == null) {
                list = new ArrayList();
                map.put(key, list);
            }
            list.add(wrapper);
        }

        // Load the collected "load on startup" servlets
        Iterator keys = map.keySet().iterator();
        while (keys.hasNext()) {
            Integer key = (Integer) keys.next();
            ArrayList list = (ArrayList) map.get(key);
            Iterator wrappers = list.iterator();
            while (wrappers.hasNext()) {
                Wrapper wrapper = (Wrapper) wrappers.next();
                try {
                    wrapper.load();
                } catch (ServletException e) {
                    getServletContext().log
                        (sm.getString("standardWrapper.loadException",
                                      getName()),
                        StandardWrapper.getRootCause(e));
                    // NOTE: load errors (including a servlet that throws
                    // UnavailableException from tht init() method) are NOT
                    // fatal to application startup
                    // START SJSAS 6377790
                    throw new LifecycleException(
                        StandardWrapper.getRootCause(e));
                    // END SJSAS 6377790
                }
            }
        }

    
private voidpostResources()
Post a copy of our web application resources as a servlet context attribute.


        getServletContext().setAttribute
            (Globals.RESOURCES_ATTR, getResources());
        context.setAttributeReadOnly(Globals.RESOURCES_ATTR);

    
private voidpostWelcomeFiles()
Post a copy of our current list of welcome files as a servlet context attribute, so that the default servlet can find them.


        getServletContext().setAttribute("org.apache.catalina.WELCOME_FILES",
                                         welcomeFiles);
        context.setAttributeReadOnly("org.apache.catalina.WELCOME_FILES");

    
private voidpostWorkDirectory()
Set the appropriate context attribute for our work directory.


        // Acquire (or calculate) the work directory path
        String workDir = getWorkDir();
        if (workDir == null) {

            // Retrieve our parent (normally a host) name
            String hostName = null;
            String engineName = null;
            String hostWorkDir = null;
            Container parentHost = getParent();
            if (parentHost != null) {
                hostName = parentHost.getName();
                if (parentHost instanceof StandardHost) {
                    hostWorkDir = ((StandardHost)parentHost).getWorkDir();
                }
                Container parentEngine = parentHost.getParent();
                if (parentEngine != null) {
                   engineName = parentEngine.getName();
                }
            }
            if ((hostName == null) || (hostName.length() < 1))
                hostName = "_";
            if ((engineName == null) || (engineName.length() < 1))
                engineName = "_";

            String temp = getPath();
            if (temp.startsWith("/"))
                temp = temp.substring(1);
            temp = temp.replace('/", '_");
            temp = temp.replace('\\", '_");
            if (temp.length() < 1)
                temp = "_";
            if (hostWorkDir != null ) {
                workDir = hostWorkDir + File.separator + temp;
            } else {
                workDir = "work" + File.separator + engineName +
                    File.separator + hostName + File.separator + temp;
            }
            setWorkDir(workDir);
        }

        // Create this directory if necessary
        File dir = new File(workDir);
        if (!dir.isAbsolute()) {
            File catalinaHome = engineBase();
            String catalinaHomePath = null;
            try {
                catalinaHomePath = catalinaHome.getCanonicalPath();
                dir = new File(catalinaHomePath, workDir);
            } catch (IOException e) {
            }
        }
        dir.mkdirs();

        // Set the appropriate servlet context attribute
        getServletContext().setAttribute(Globals.WORK_DIR_ATTR, dir);
        context.setAttributeReadOnly(Globals.WORK_DIR_ATTR);

    
public voidpreDeregister()

        if( started ) {
            try {
                stop();
            } catch( Exception ex ) {
                log.error(sm.getString("standardContext.stoppingContext",
                                       this),
                          ex);
            }
        }
    
public javax.management.ObjectNamepreRegister(javax.management.MBeanServer server, javax.management.ObjectName name)
There are 2 cases: 1.The context is created and registered by internal APIS 2. The context is created by JMX, and it'll self-register.

param
server
param
name
return
throws
Exception

        if( oname != null ) {
            //log.info( "Already registered " + oname + " " + name);
            // Temporary - /admin uses the old names
            return name;
        }
        ObjectName result=super.preRegister(server,name);
        return name;
    
private voidpreRegisterJMX()

        try {
            StandardHost host = (StandardHost) getParent();
            if ((oname == null) 
                || (oname.getKeyProperty("j2eeType") == null)) {
                oname = createObjectName(host.getDomain(), host.getJmxName());
                controller = oname;
            }
        } catch(Exception ex) {
            log.info("Error registering ctx with jmx " + this + " " +
                     oname + " " + ex.toString(), ex );
        }
    
private voidregisterJMX()

        try {
            if (log.isDebugEnabled()) {
                log.debug("Checking for " + oname );
            }
            if(! Registry.getRegistry(null, null).getMBeanServer().isRegistered(oname)) {
                controller = oname;
                Registry.getRegistry(null, null).registerComponent(this, oname, null);

                // Send j2ee.object.created notification 
                if (this.getObjectName() != null) {
                    Notification notification = new Notification(
                                                        "j2ee.object.created", 
                                                        this.getObjectName(), 
                                                        sequenceNumber++);
                    broadcaster.sendNotification(notification);
                }
            }
            Container children[] = findChildren();
            for (int i=0; children!=null && i<children.length; i++) {
                ((StandardWrapper)children[i]).registerJMX( this );
            }
        } catch (Exception ex) {
            log.info("Error registering wrapper with jmx " + this + " " +
                    oname + " " + ex.toString(), ex );
        }
    
public synchronized voidreload()
Reload this web application, if reloading is supported.

IMPLEMENTATION NOTE: This method is designed to deal with reloads required by changes to classes in the underlying repositories of our class loader. It does not handle changes to the web application deployment descriptor. If that has occurred, you should stop this Context and create (and start) a new Context instance instead.

exception
IllegalStateException if the reloadable property is set to false.


        // Validate our current component state
        if (!started)
            throw new IllegalStateException
                (sm.getString("containerBase.notStarted", logName()));

        // Make sure reloading is enabled
        //      if (!reloadable)
        //          throw new IllegalStateException
        //              (sm.getString("standardContext.notReloadable"));
        log.info(sm.getString("standardContext.reloadingStarted"));

        // Stop accepting requests temporarily
        setPaused(true);

        try {
            stop();
        } catch (LifecycleException e) {
            log.error(sm.getString("standardContext.stoppingContext", this),
                      e);
        }

        try {
            start();
        } catch (LifecycleException e) {
            log.error(sm.getString("standardContext.startingContext", this),
                      e);
        }

        setPaused(false);

    
public voidremoveApplicationListener(java.lang.String listener)
Remove the specified application listener class from the set of listeners for this application.

param
listener Java class name of the listener to be removed


        synchronized (applicationListeners) {

            // Make sure this welcome file is currently present
            int n = -1;
            for (int i = 0; i < applicationListeners.length; i++) {
                if (applicationListeners[i].equals(listener)) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified constraint
            int j = 0;
            String results[] = new String[applicationListeners.length - 1];
            for (int i = 0; i < applicationListeners.length; i++) {
                if (i != n)
                    results[j++] = applicationListeners[i];
            }
            applicationListeners = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeApplicationListener", listener);
        }

        // FIXME - behavior if already started?

    
public voidremoveApplicationParameter(java.lang.String name)
Remove the application parameter with the specified name from the set for this application.

param
name Name of the application parameter to remove


        synchronized (applicationParameters) {

            // Make sure this parameter is currently present
            int n = -1;
            for (int i = 0; i < applicationParameters.length; i++) {
                if (name.equals(applicationParameters[i].getName())) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified parameter
            int j = 0;
            ApplicationParameter results[] =
                new ApplicationParameter[applicationParameters.length - 1];
            for (int i = 0; i < applicationParameters.length; i++) {
                if (i != n)
                    results[j++] = applicationParameters[i];
            }
            applicationParameters = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeApplicationParameter", name);
        }
    
public voidremoveChild(org.apache.catalina.Container child)
Add a child Container, only if the proposed child is an implementation of Wrapper.

param
child Child container to be added
exception
IllegalArgumentException if the proposed container is not an implementation of Wrapper


        if (!(child instanceof Wrapper))
            throw new IllegalArgumentException
                (sm.getString("standardContext.notWrapper"));

        super.removeChild(child);
    
public voidremoveConstraint(org.apache.catalina.deploy.SecurityConstraint constraint)
Remove the specified security constraint from this web application.

param
constraint Constraint to be removed


        synchronized (constraints) {

            // Make sure this constraint is currently present
            int n = -1;
            for (int i = 0; i < constraints.length; i++) {
                if (constraints[i].equals(constraint)) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified constraint
            int j = 0;
            SecurityConstraint results[] =
                new SecurityConstraint[constraints.length - 1];
            for (int i = 0; i < constraints.length; i++) {
                if (i != n)
                    results[j++] = constraints[i];
            }
            constraints = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeConstraint", constraint);
        }
    
public voidremoveEjb(java.lang.String name)
Remove any EJB resource reference with the specified name.

param
name Name of the EJB resource reference to remove


        namingResources.removeEjb(name);
     
        if (notifyContainerListeners) {
            fireContainerEvent("removeEjb", name);
        }
    
public voidremoveEnvironment(java.lang.String name)
Remove any environment entry with the specified name.

param
name Name of the environment entry to remove

        if (namingResources == null) {
            return;
        }
        ContextEnvironment env = namingResources.findEnvironment(name);
        if (env == null) {
            throw new IllegalArgumentException
                ("Invalid environment name '" + name + "'");
        }

        namingResources.removeEnvironment(name);

        if (notifyContainerListeners) {
            fireContainerEvent("removeEnvironment", name);
        }
    
public voidremoveErrorPage(org.apache.catalina.deploy.ErrorPage errorPage)
Remove the error page for the specified error code or Java language exception, if it exists; otherwise, no action is taken.

param
errorPage The error page definition to be removed


        String exceptionType = errorPage.getExceptionType();
        if (exceptionType != null) {
            synchronized (exceptionPages) {
                exceptionPages.remove(exceptionType);
            }
        } else {
            synchronized (statusPages) {
                statusPages.remove(Integer.valueOf(errorPage.getErrorCode()));
            }
        }

        if (notifyContainerListeners) {
            fireContainerEvent("removeErrorPage", errorPage);
        }
    
public voidremoveFilterDef(org.apache.catalina.deploy.FilterDef filterDef)
Remove the specified filter definition from this Context, if it exists; otherwise, no action is taken.

param
filterDef Filter definition to be removed


        synchronized (filterDefs) {
            filterDefs.remove(filterDef.getFilterName());
        }
 
        if (notifyContainerListeners) {
            fireContainerEvent("removeFilterDef", filterDef);
        }
    
public voidremoveFilterMap(org.apache.catalina.deploy.FilterMap filterMap)
Remove a filter mapping from this Context.

param
filterMap The filter mapping to be removed


        synchronized (filterMaps) {

            // Make sure this filter mapping is currently present
            int n = -1;
            for (int i = 0; i < filterMaps.length; i++) {
                if (filterMaps[i] == filterMap) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified filter mapping
            FilterMap results[] = new FilterMap[filterMaps.length - 1];
            System.arraycopy(filterMaps, 0, results, 0, n);
            System.arraycopy(filterMaps, n + 1, results, n,
                             (filterMaps.length - 1) - n);
            filterMaps = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeFilterMap", filterMap);
        }
    
public voidremoveInstanceListener(java.lang.String listener)
Remove a class name from the set of InstanceListener classes that will be added to newly created Wrappers.

param
listener Class name of an InstanceListener class to be removed


        synchronized (instanceListeners) {

            // Make sure this welcome file is currently present
            int n = -1;
            for (int i = 0; i < instanceListeners.length; i++) {
                if (instanceListeners[i].equals(listener)) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified constraint
            int j = 0;
            String results[] = new String[instanceListeners.length - 1];
            for (int i = 0; i < instanceListeners.length; i++) {
                if (i != n)
                    results[j++] = instanceListeners[i];
            }
            instanceListeners = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeInstanceListener", listener);
        }
    
public voidremoveLocalEjb(java.lang.String name)
Remove any local EJB resource reference with the specified name.

param
name Name of the EJB resource reference to remove


        namingResources.removeLocalEjb(name);
        
        if (notifyContainerListeners) {
            fireContainerEvent("removeLocalEjb", name);
        }
    
public voidremoveMessageDestination(java.lang.String name)
Remove any message destination with the specified name.

param
name Name of the message destination to remove


        synchronized (messageDestinations) {
            messageDestinations.remove(name);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("removeMessageDestination", name);
        }
    
public voidremoveMessageDestinationRef(java.lang.String name)
Remove any message destination ref with the specified name.

param
name Name of the message destination ref to remove


        namingResources.removeMessageDestinationRef(name);

        if (notifyContainerListeners) {
            fireContainerEvent("removeMessageDestinationRef", name);
        }
    
public voidremoveMimeMapping(java.lang.String extension)
Remove the MIME mapping for the specified extension, if it exists; otherwise, no action is taken.

param
extension Extension to remove the mapping for


        synchronized (mimeMappings) {
            mimeMappings.remove(extension);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("removeMimeMapping", extension);
        }
    
public voidremoveParameter(java.lang.String name)
Remove the context initialization parameter with the specified name, if it exists; otherwise, no action is taken.

param
name Name of the parameter to remove


        synchronized (parameters) {
            parameters.remove(name);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("removeParameter", name);
        }
    
public voidremoveResource(java.lang.String name)
Remove any resource reference with the specified name.

param
name Name of the resource reference to remove

        name = URLDecoder.decode(name);
        if (namingResources == null) {
            return;
        }
        ContextResource resource = namingResources.findResource(name);
        if (resource == null) {
            throw new IllegalArgumentException
                ("Invalid resource name '" + name + "'");
        }

        namingResources.removeResource(name);

        if (notifyContainerListeners) {
            fireContainerEvent("removeResource", name);
        }
    
public voidremoveResourceEnvRef(java.lang.String name)
Remove any resource environment reference with the specified name.

param
name Name of the resource environment reference to remove


        namingResources.removeResourceEnvRef(name);

        if (notifyContainerListeners) {
            fireContainerEvent("removeResourceEnvRef", name);
        }
    
public voidremoveResourceLink(java.lang.String name)
Remove any resource link with the specified name.

param
name Name of the resource link to remove

        name = URLDecoder.decode(name);
        if (namingResources == null) {
            return;
        }
        ContextResourceLink resource = namingResources.findResourceLink(name);
        if (resource == null) {
            throw new IllegalArgumentException
                ("Invalid resource name '" + name + "'");
        }

        namingResources.removeResourceLink(name);

        if (notifyContainerListeners) {
            fireContainerEvent("removeResourceLink", name);
        }
    
public voidremoveRoleMapping(java.lang.String role)
Remove any security role reference for the specified name

param
role Security role (as used in the application) to remove


        synchronized (roleMappings) {
            roleMappings.remove(role);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("removeRoleMapping", role);
        }
    
public voidremoveSecurityRole(java.lang.String role)
Remove any security role with the specified name.

param
role Security role to remove


        synchronized (securityRoles) {

            // Make sure this security role is currently present
            int n = -1;
            for (int i = 0; i < securityRoles.length; i++) {
                if (role.equals(securityRoles[i])) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified security role
            int j = 0;
            String results[] = new String[securityRoles.length - 1];
            for (int i = 0; i < securityRoles.length; i++) {
                if (i != n)
                    results[j++] = securityRoles[i];
            }
            securityRoles = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeSecurityRole", role);
        }
    
public voidremoveServletMapping(java.lang.String pattern)
Remove any servlet mapping for the specified pattern, if it exists; otherwise, no action is taken.

param
pattern URL pattern of the mapping to remove


        String name = null;
        synchronized (servletMappings) {
            name = (String) servletMappings.remove(pattern);
        }
        Wrapper wrapper = (Wrapper) findChild(name);
        if( wrapper != null ) {
            wrapper.removeMapping(pattern);
        }
        mapper.removeWrapper(pattern);

        if (notifyContainerListeners) {
            fireContainerEvent("removeServletMapping", pattern);
        }
    
public voidremoveTaglib(java.lang.String uri)
Remove the tag library location forthe specified tag library URI.

param
uri URI, relative to the web.xml file


        synchronized (taglibs) {
            taglibs.remove(uri);
        }

        if (notifyContainerListeners) {
            fireContainerEvent("removeTaglib", uri);
        }
    
public voidremoveWelcomeFile(java.lang.String name)
Remove the specified welcome file name from the list recognized by this Context.

param
name Name of the welcome file to be removed


        synchronized (welcomeFiles) {

            // Make sure this welcome file is currently present
            int n = -1;
            for (int i = 0; i < welcomeFiles.length; i++) {
                if (welcomeFiles[i].equals(name)) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified constraint
            int j = 0;
            String results[] = new String[welcomeFiles.length - 1];
            for (int i = 0; i < welcomeFiles.length; i++) {
                if (i != n)
                    results[j++] = welcomeFiles[i];
            }
            welcomeFiles = results;

        }

        // Inform interested listeners
        postWelcomeFiles();

        if (notifyContainerListeners) {
            fireContainerEvent("removeWelcomeFile", name);
        }
    
public voidremoveWrapperLifecycle(java.lang.String listener)
Remove a class name from the set of LifecycleListener classes that will be added to newly created Wrappers.

param
listener Class name of a LifecycleListener class to be removed



        synchronized (wrapperLifecycles) {

            // Make sure this welcome file is currently present
            int n = -1;
            for (int i = 0; i < wrapperLifecycles.length; i++) {
                if (wrapperLifecycles[i].equals(listener)) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified constraint
            int j = 0;
            String results[] = new String[wrapperLifecycles.length - 1];
            for (int i = 0; i < wrapperLifecycles.length; i++) {
                if (i != n)
                    results[j++] = wrapperLifecycles[i];
            }
            wrapperLifecycles = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeWrapperLifecycle", listener);
        }
    
public voidremoveWrapperListener(java.lang.String listener)
Remove a class name from the set of ContainerListener classes that will be added to newly created Wrappers.

param
listener Class name of a ContainerListener class to be removed



        synchronized (wrapperListeners) {

            // Make sure this welcome file is currently present
            int n = -1;
            for (int i = 0; i < wrapperListeners.length; i++) {
                if (wrapperListeners[i].equals(listener)) {
                    n = i;
                    break;
                }
            }
            if (n < 0)
                return;

            // Remove the specified constraint
            int j = 0;
            String results[] = new String[wrapperListeners.length - 1];
            for (int i = 0; i < wrapperListeners.length; i++) {
                if (i != n)
                    results[j++] = wrapperListeners[i];
            }
            wrapperListeners = results;

        }

        // Inform interested listeners
        if (notifyContainerListeners) {
            fireContainerEvent("removeWrapperListener", listener);
        }
    
private voidresetContext()

        // Restore the original state ( pre reading web.xml in start )
        // If you extend this - override this method and make sure to clean up
        children=new HashMap();
        startupTime = 0;
        startTimeMillis = 0;
        tldScanTime = 0;

        // Bugzilla 32867
        distributable = false;

        applicationListeners = new String[0];
        applicationEventListenersObjects = new Object[0];
        applicationLifecycleListenersObjects = new Object[0];

        if (log.isDebugEnabled()) {
            log.debug("resetContext " + oname + " " + mserver);
        }
    
public booleanresourcesStart()
Allocate resources, including proxy. Return true if initialization was successfull, or false otherwise.


        boolean ok = true;

        Hashtable env = new Hashtable();
        if (getParent() != null)
            env.put(ProxyDirContext.HOST, getParent().getName());
        env.put(ProxyDirContext.CONTEXT, getName());

        try {
            ProxyDirContext proxyDirContext =
                new ProxyDirContext(env, webappResources);
            if (webappResources instanceof BaseDirContext) {
                ((BaseDirContext) webappResources).setDocBase(getBasePath(getDocBase()));
                ((BaseDirContext) webappResources).allocate();
            }
            // Register the cache in JMX
            if (isCachingAllowed()) {
                ObjectName resourcesName = new ObjectName(
                    this.getDomain() + ":type=Cache,host=" 
                    + getHostname() + ",path=" 
                    + (("".equals(encodedPath)) ? "/" : encodedPath));
                Registry.getRegistry(null, null).registerComponent
                    (proxyDirContext.getCache(), resourcesName, null);
            }
            this.resources = proxyDirContext;
        } catch (Throwable t) {
            if(log.isDebugEnabled()) {
                log.error(
                    sm.getString("standardContext.resourcesStart", getName()), 
                    t);
            } else {
                log.error(sm.getString("standardContext.resourcesStart", 
                                       getName()));
                log.error(t.getMessage());
            }
            ok = false;
        }

        return (ok);
    
public booleanresourcesStop()
Deallocate resources and destroy proxy.


        boolean ok = true;

        try {
            if (resources != null) {
                if (resources instanceof Lifecycle) {
                    ((Lifecycle) resources).stop();
                }
                if (webappResources instanceof BaseDirContext) {
                    ((BaseDirContext) webappResources).release();
                }
                // Unregister the cache in JMX
                if (isCachingAllowed()) {
                    ObjectName resourcesName = 
                        new ObjectName(this.getDomain()
                                       + ":type=Cache,host=" 
                                       + getHostname() + ",path=" 
                                       + (("".equals(getPath()))?"/"
                                          :getPath()));
                    Registry.getRegistry(null, null).unregisterComponent(resourcesName);
                }
            }
        } catch (Throwable t) {
            log.error(sm.getString("standardContext.resourcesStop"), t);
            ok = false;
        }

        this.resources = null;

        return (ok);

    
public voidrestrictedSetPipeline(org.apache.catalina.Pipeline pl)
set a new pipeline (restricted to use by EE code) HERCULES:add

        pl.setBasic(new StandardContextValve());
        pipeline = pl;
    
public voidsetAllowLinking(boolean allowLinking)
Set allow linking.

        this.allowLinking = allowLinking;
    
public voidsetAllowRelativeRedirect(boolean allowRelativeURLs)
Set whether this context allows sendRedirect() to redirect to a relative URL.

param
allowRelativeURLs The new value for this property. The default value for this property is 'false'.


        allowRelativeRedirect = allowRelativeURLs;

    
public voidsetAltDDName(java.lang.String altDDName)
Set an alternate Deployment Descriptor name.

        this.altDDName = altDDName;
        if (context != null) {
            context.setAttribute(Globals.ALT_DD_ATTR,altDDName);
            context.setAttributeReadOnly(Globals.ALT_DD_ATTR);
        }
    
private synchronized voidsetAlternateResources(AlternateDocBase alternateDocBase, javax.naming.directory.DirContext resources)


        if (started) {
            throw new IllegalStateException
                (sm.getString("standardContext.resources.started"));
        }

        DirContext oldResources = alternateDocBase.getWebappResources();
        if (oldResources == resources)
            return;

        if (resources instanceof BaseDirContext) {
            ((BaseDirContext) resources).setCached(isCachingAllowed());
            ((BaseDirContext) resources).setCacheTTL(getCacheTTL());
            ((BaseDirContext) resources).setCacheMaxSize(getCacheMaxSize());
        }
        if (resources instanceof FileDirContext) {
            filesystemBased = true;
            ((FileDirContext) resources).setCaseSensitive(isCaseSensitive());
            ((FileDirContext) resources).setAllowLinking(isAllowLinking());
        }
        alternateDocBase.setWebappResources(resources);
        // The proxied resources will be refreshed on start
        alternateDocBase.setResources(null);
    
public voidsetApplicationEventListeners(java.lang.Object[] listeners)
Store the set of initialized application event listener objects, in the order they were specified in the web application deployment descriptor, for this application.

param
listeners The set of instantiated listener objects.

        applicationEventListenersObjects = listeners;
    
public voidsetApplicationLifecycleListeners(java.lang.Object[] listeners)
Store the set of initialized application lifecycle listener objects, in the order they were specified in the web application deployment descriptor, for this application.

param
listeners The set of instantiated listener objects.

        applicationLifecycleListenersObjects = listeners;
    
public voidsetAuditors(org.apache.catalina.Auditor[] auditor)
Set the Auditors associated with this context.

param
auditor array of Auditor objects

        this.auditors=auditor;
    
public voidsetAvailable(boolean available)
Set the application available flag for this Context.

param
available The new application available flag


        boolean oldAvailable = this.available;
        this.available = available;
        support.firePropertyChange("available",
                                   Boolean.valueOf(oldAvailable),
                                   Boolean.valueOf(this.available));

    
public voidsetCacheMaxSize(int cacheMaxSize)
Set the maximum size of the cache in KB.

        this.cacheMaxSize = cacheMaxSize;
    
public voidsetCacheTTL(int cacheTTL)
Set cache TTL.

        this.cacheTTL = cacheTTL;
    
public voidsetCachingAllowed(boolean cachingAllowed)
Set caching allowed flag.

        this.cachingAllowed = cachingAllowed;
    
public voidsetCaseSensitive(boolean caseSensitive)
Set case sensitivity.

        this.caseSensitive = caseSensitive;
    
public voidsetCaseSensitiveMapping(boolean caseSensitiveMap)
Set case sensitivity for filter and security constraint mappings.

        caseSensitiveMapping = caseSensitiveMap;
    
public voidsetCharsetMapper(org.apache.catalina.util.CharsetMapper mapper)
Set the Locale to character set mapper for this Context.

param
mapper The new mapper


        CharsetMapper oldCharsetMapper = this.charsetMapper;
        this.charsetMapper = mapper;
        if( mapper != null )
            this.charsetMapperClass= mapper.getClass().getName();
        support.firePropertyChange("charsetMapper", oldCharsetMapper,
                                   this.charsetMapper);

    
public voidsetCharsetMapperClass(java.lang.String mapper)
Set the Locale to character set mapper class for this Context.

param
mapper The new mapper class


        String oldCharsetMapperClass = this.charsetMapperClass;
        this.charsetMapperClass = mapper;
        support.firePropertyChange("charsetMapperClass",
                                   oldCharsetMapperClass,
                                   this.charsetMapperClass);

    
public voidsetCompilerClasspath(java.lang.String compilerClasspath)
Set the compiler classpath.

        this.compilerClasspath = compilerClasspath;
    
public voidsetConfigFile(java.lang.String configFile)
Set the path to a file to save this Context information.

param
configFile The path to a file to save this Context information.


        this.configFile = configFile;
    
public voidsetConfigured(boolean configured)
Set the "correctly configured" flag for this Context. This can be set to false by startup listeners that detect a fatal configuration error to avoid the application from being made available.

param
configured The new correctly configured flag


        boolean oldConfigured = this.configured;
        this.configured = configured;
        support.firePropertyChange("configured",
                                   Boolean.valueOf(oldConfigured),
                                   Boolean.valueOf(this.configured));

    
public voidsetCookies(boolean cookies)
Set the "use cookies for session ids" flag.

param
cookies The new flag


        boolean oldCookies = this.cookies;
        this.cookies = cookies;
        support.firePropertyChange("cookies",
                                   Boolean.valueOf(oldCookies),
                                   Boolean.valueOf(this.cookies));

    
public voidsetCrossContext(boolean crossContext)
Set the "allow crossing servlet contexts" flag.

param
crossContext The new cross contexts flag


        boolean oldCrossContext = this.crossContext;
        this.crossContext = crossContext;
        support.firePropertyChange("crossContext",
                                   Boolean.valueOf(oldCrossContext),
                                   Boolean.valueOf(this.crossContext));

    
public voidsetDefaultWebXml(java.lang.String defaultWebXml)
Set the location of the default web xml that will be used. If not absolute, it'll be made relative to the engine's base dir ( which defaults to catalina.base system property ). XXX If a file is not found - we can attempt a getResource()

param
defaultWebXml

        this.defaultWebXml = defaultWebXml;
    
public voidsetDelegate(boolean delegate)
Set the "follow standard delegation model" flag used to configure our ClassLoader.

param
delegate The new flag


        boolean oldDelegate = this.delegate;
        this.delegate = delegate;
        support.firePropertyChange("delegate", Boolean.valueOf(oldDelegate),
                                   Boolean.valueOf(this.delegate));

    
public voidsetDisplayName(java.lang.String displayName)
Set the display name of this web application.

param
displayName The new display name


        String oldDisplayName = this.displayName;
        this.displayName = displayName;
        support.firePropertyChange("displayName", oldDisplayName,
                                   this.displayName);
    
public voidsetDistributable(boolean distributable)
Set the distributable flag for this web application.

param
distributable The new distributable flag

        boolean oldDistributable = this.distributable;
        this.distributable = distributable;
        support.firePropertyChange("distributable",
                                   Boolean.valueOf(oldDistributable),
                                   Boolean.valueOf(this.distributable));
        
        // Bugzilla 32866
        if(getManager() != null) {
            if(log.isDebugEnabled()) {
                log.debug("Propagating distributable=" + distributable
                          + " to manager");
            }
            getManager().setDistributable(distributable);
        }
    
public voidsetDocBase(java.lang.String docBase)
Set the document root for this Context. This can be an absolute pathname, a relative pathname, or a URL.

param
docBase The new document root


        this.docBase = docBase;

    
public voidsetEngineName(java.lang.String engineName)

        this.engineName = engineName;
    
public voidsetJ2EEApplication(java.lang.String j2EEApplication)

        this.j2EEApplication = j2EEApplication;
    
public voidsetJ2EEServer(java.lang.String j2EEServer)

        this.j2EEServer = j2EEServer;
    
public java.lang.String[]setJavaVMs(java.lang.String[] javaVMs)

        return this.javaVMs = javaVMs;
    
public voidsetLazy(boolean lazy)

        this.lazy = lazy;
    
public voidsetLoginConfig(org.apache.catalina.deploy.LoginConfig config)
Set the login configuration descriptor for this web application.

param
config The new login configuration


        // Validate the incoming property value
        if (config == null)
            throw new IllegalArgumentException
                (sm.getString("standardContext.loginConfig.required"));
        String loginPage = config.getLoginPage();
        if ((loginPage != null) && !loginPage.startsWith("/")) {
            if (isServlet22()) {
                if (log.isDebugEnabled()) {
                    log.debug(sm.getString(
                                "standardContext.loginConfig.loginWarning",
                                loginPage));
                }
                config.setLoginPage("/" + loginPage);
            } else {
                throw new IllegalArgumentException
                    (sm.getString("standardContext.loginConfig.loginPage",
                                  loginPage));
            }
        }
        String errorPage = config.getErrorPage();
        if ((errorPage != null) && !errorPage.startsWith("/")) {
            if (isServlet22()) {
                if (log.isDebugEnabled()) {
                    log.debug(sm.getString(
                                "standardContext.loginConfig.errorWarning",
                                errorPage));
                }
                config.setErrorPage("/" + errorPage);
            } else {
                throw new IllegalArgumentException
                    (sm.getString("standardContext.loginConfig.errorPage",
                                  errorPage));
            }
        }

        // Process the property setting change
        LoginConfig oldLoginConfig = this.loginConfig;
        this.loginConfig = config;
        support.firePropertyChange("loginConfig",
                                   oldLoginConfig, this.loginConfig);

    
public voidsetManagerChecksFrequency(int managerChecksFrequency)
Set the manager checks frequency.

param
managerChecksFrequency the new manager checks frequency


        if (managerChecksFrequency <= 0) {
            return;
        }

        int oldManagerChecksFrequency = this.managerChecksFrequency;
        this.managerChecksFrequency = managerChecksFrequency;
        support.firePropertyChange("managerChecksFrequency",
                                   Integer.valueOf(oldManagerChecksFrequency),
                                   Integer.valueOf(this.managerChecksFrequency));

    
public voidsetName(java.lang.String name)

        super.setName( name );
        encodedPath = urlEncoder.encode(name);
    
public voidsetNamingResources(org.apache.catalina.deploy.NamingResources namingResources)
Set the naming resources for this web application.

param
namingResources The new naming resources


        // Process the property setting change
        NamingResources oldNamingResources = this.namingResources;
        this.namingResources = namingResources;
        support.firePropertyChange("namingResources",
                                   oldNamingResources, this.namingResources);

    
public voidsetOverride(boolean override)
Set the DefaultContext override flag for this web application.

param
override The new override flag


        boolean oldOverride = this.override;
        this.override = override;
        support.firePropertyChange("override",
                                   Boolean.valueOf(oldOverride),
                                   Boolean.valueOf(this.override));

    
public voidsetPath(java.lang.String path)
Set the context path for this Context.

IMPLEMENTATION NOTE: The context path is used as the "name" of a Context, because it must be unique.

param
path The new context path

        // XXX  Use host in name
        /* GlassFish Issue 2339
        setName(RequestUtil.URLDecode(path));
         */
        // START GlassFish Issue 2339
        setName(RequestUtil.URLDecode(path, "UTF-8"));
        // END GlassFish Issue 2339
    
private voidsetPaused(boolean paused)
Set the request processing paused flag for this Context.

param
paused The new request processing paused flag


        this.paused = paused;

    
public voidsetPrivileged(boolean privileged)
Set the privileged flag for this web application.

param
privileged The new privileged flag


        boolean oldPrivileged = this.privileged;
        this.privileged = privileged;
        support.firePropertyChange("privileged",
                                   Boolean.valueOf(oldPrivileged),
                                   Boolean.valueOf(this.privileged));

    
public voidsetPublicId(java.lang.String publicId)
Set the public identifier of the deployment descriptor DTD that is currently being parsed.

param
publicId The public identifier


        if (log.isTraceEnabled())
            log.trace("Setting deployment descriptor public ID to '" +
                publicId + "'");

        String oldPublicId = this.publicId;
        this.publicId = publicId;
        support.firePropertyChange("publicId", oldPublicId, publicId);

    
public voidsetReload(boolean isReload)

        this.isReload = isReload;
    
public voidsetReloadable(boolean reloadable)
Set the reloadable flag for this web application.

param
reloadable The new reloadable flag


        boolean oldReloadable = this.reloadable;
        this.reloadable = reloadable;
        support.firePropertyChange("reloadable",
                                   Boolean.valueOf(oldReloadable),
                                   Boolean.valueOf(this.reloadable));

    
public voidsetReplaceWelcomeFiles(boolean replaceWelcomeFiles)
Set the "replace welcome files" property.

param
replaceWelcomeFiles The new property value


        boolean oldReplaceWelcomeFiles = this.replaceWelcomeFiles;
        this.replaceWelcomeFiles = replaceWelcomeFiles;
        support.firePropertyChange("replaceWelcomeFiles",
                                   Boolean.valueOf(oldReplaceWelcomeFiles),
                                   Boolean.valueOf(this.replaceWelcomeFiles));

    
public synchronized voidsetResources(javax.naming.directory.DirContext resources)
Set the resources DirContext object with which this Container is associated.

param
resources The newly associated DirContext


        if (started) {
            throw new IllegalStateException
                (sm.getString("standardContext.resources.started"));
        }

        DirContext oldResources = this.webappResources;
        if (oldResources == resources)
            return;

        if (resources instanceof BaseDirContext) {
            ((BaseDirContext) resources).setCached(isCachingAllowed());
            ((BaseDirContext) resources).setCacheTTL(getCacheTTL());
            ((BaseDirContext) resources).setCacheMaxSize(getCacheMaxSize());
        }
        if (resources instanceof FileDirContext) {
            filesystemBased = true;
            ((FileDirContext) resources).setCaseSensitive(isCaseSensitive());
            ((FileDirContext) resources).setAllowLinking(isAllowLinking());
        }
        this.webappResources = resources;

        // The proxied resources will be refreshed on start
        this.resources = null;

        support.firePropertyChange("resources", oldResources,
                                   this.webappResources);

    
public voidsetReuseSessionID(boolean reuse)
Set the "reuse session IDs when creating sessions" flag

param
reuse The new value for the flag

        reuseSessionID = reuse;
    
public voidsetSaveConfig(boolean saveConfig)
Set save config flag.

        this.saveConfig = saveConfig;
    
public voidsetSecurePagesWithPragma(boolean securePagesWithPragma)
Sets the securePagesWithPragma property of this Context. Setting this property to true will result in Pragma and Cache-Control headers with a value of "No-cache" if proxy caching has been disabled. Setting this property to false will not add any Pragma header, but will set the Cache-Control header to "private".

param
securePagesWithPragma true if Pragma and Cache-Control headers are to be set to "No-cache" if proxy caching has been disabled, false otherwise


        boolean oldSecurePagesWithPragma = this.securePagesWithPragma;
        this.securePagesWithPragma = securePagesWithPragma;
        support.firePropertyChange("securePagesWithPragma",
                                   Boolean.valueOf(oldSecurePagesWithPragma),
                                   Boolean.valueOf(this.securePagesWithPragma));
    
public java.lang.StringsetServer(java.lang.String server)

        return this.server=server;
    
public voidsetSessionTimeout(int timeout)
Set the default session timeout (in minutes) for this web application.

param
timeout The new default session timeout


        int oldSessionTimeout = this.sessionTimeout;
    /*
     * SRV.13.4 ("Deployment Descriptor"):
     * If the timeout is 0 or less, the container ensures the default
     * behaviour of sessions is never to time out.
     */
        this.sessionTimeout = (timeout == 0) ? -1 : timeout;
        support.firePropertyChange("sessionTimeout",
                                   Integer.valueOf(oldSessionTimeout),
                                   Integer.valueOf(this.sessionTimeout));
        //HERCULES:add
        sessionTimeoutOveridden = true;
        //end HERCULES:add        

    
public voidsetStartupTime(long startupTime)

        this.startupTime = startupTime;
    
public voidsetSwallowOutput(boolean swallowOutput)
Set the value of the swallowOutput flag. If set to true, the system.out and system.err will be redirected to the logger during a servlet execution.

param
swallowOuptut The new value


        boolean oldSwallowOutput = this.swallowOutput;
        this.swallowOutput = swallowOutput;
        support.firePropertyChange("swallowOutput",
                                   Boolean.valueOf(oldSwallowOutput),
                                   Boolean.valueOf(this.swallowOutput));

    
public voidsetTldNamespaceAware(boolean tldNamespaceAware)
Set the namespace aware feature of the XML parser used when parsing xml instances.

param
xmlNamespaceAware true to enable namespace awareness

        this.tldNamespaceAware= tldNamespaceAware;
    
public voidsetTldScanTime(long tldScanTime)

        this.tldScanTime = tldScanTime;
    
public voidsetTldValidation(boolean tldValidation)
Set the validation feature of the XML parser used when parsing tlds files.

param
tldXmlValidation true to enable xml instance validation

        
        this.tldValidation = tldValidation;

    
public voidsetUnpackWAR(boolean unpackWAR)
Unpack WAR flag mutator.


        this.unpackWAR = unpackWAR;

    
public voidsetUseMyFaces(boolean useMyFaces)

        this.useMyFaces = useMyFaces;
    
public voidsetUseNaming(boolean useNaming)
Enables or disables naming.

        this.useNaming = useNaming;
    
public voidsetWorkDir(java.lang.String workDir)
Set the work directory for this Context.

param
workDir The new work directory


        this.workDir = workDir;

        if (started)
            postWorkDirectory();

    
public voidsetWrapperClass(java.lang.String wrapperClassName)
Set the Java class name of the Wrapper implementation used for servlets registered in this Context.

param
wrapperClassName The new wrapper class name
throws
IllegalArgumentException if the specified wrapper class cannot be found or is not a subclass of StandardWrapper


        this.wrapperClassName = wrapperClassName;

        try {
            wrapperClass = Class.forName(wrapperClassName);         
            if (!StandardWrapper.class.isAssignableFrom(wrapperClass)) {
                throw new IllegalArgumentException(
                    sm.getString("standardContext.invalidWrapperClass",
                                 wrapperClassName));
            }
        } catch (ClassNotFoundException cnfe) {
            throw new IllegalArgumentException(cnfe);
        }
    
public voidsetXmlNamespaceAware(boolean webXmlNamespaceAware)
Set the namespace aware feature of the XML parser used when parsing xml instances.

param
xmlNamespaceAware true to enable namespace awareness

        this.webXmlNamespaceAware= webXmlNamespaceAware;
    
public voidsetXmlValidation(boolean webXmlValidation)
Set the validation feature of the XML parser used when parsing xml instances.

param
xmlValidation true to enable xml instance validation

        
        this.webXmlValidation = webXmlValidation;

    
public synchronized voidstart()
Start this Context component.

exception
LifecycleException if a startup error occurs


        //if (lazy ) return;
        if (started) {
            if (log.isInfoEnabled()) {
                log.info(sm.getString("containerBase.alreadyStarted",
                                      logName()));
            }
            return;
        }

        long startupTimeStart = System.currentTimeMillis();

        if( !initialized ) { 
            try {
                init();
            } catch( Exception ex ) {
                throw new LifecycleException("Error initializaing ", ex);
            }
        }
        if (log.isDebugEnabled()) {
            log.debug("Starting " + ("".equals(getName()) ? "ROOT" : getName()));
        }

        // Set JMX object name for proper pipeline registration
        preRegisterJMX();

        if ((oname != null) && 
            (Registry.getRegistry().getMBeanServer().isRegistered(oname))) {
            // As things depend on the JMX registration, the context
            // must be reregistered again once properly initialized
            Registry.getRegistry(null, null).unregisterComponent(oname);
        }

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);

        setAvailable(false);
        setConfigured(false);
        boolean ok = true;

        // Set config file name
        File configBase = getConfigBase();
        if (configBase != null && saveConfig) {
            if (getConfigFile() == null) {
                File file = new File(configBase, getDefaultConfigFile());
                setConfigFile(file.getPath());
                // If the docbase is outside the appBase, we should save our
                // config
                try {
                    File appBaseFile = new File(getAppBase());
                    if (!appBaseFile.isAbsolute()) {
                        appBaseFile = new File(engineBase(), getAppBase());
                    }
                    String appBase = appBaseFile.getCanonicalPath();
                    String basePath = 
                        (new File(getBasePath(getDocBase()))).getCanonicalPath();
                    if (!basePath.startsWith(appBase)) {
                        Server server = ServerFactory.getServer();
                        ((StandardServer) server).storeContext(this);
                    }
                } catch (Exception e) {
                    log.warn("Error storing config file", e);
                }
            } else {
                try {
                    String canConfigFile = 
                        (new File(getConfigFile())).getCanonicalPath();
                    if (!canConfigFile.startsWith
                        (configBase.getCanonicalPath())) {
                        File file = 
                            new File(configBase, getDefaultConfigFile());
                        if (copy(new File(canConfigFile), file)) {
                            setConfigFile(file.getPath());
                        }
                    }
                } catch (Exception e) {
                    log.warn("Error setting config file", e);
                }
            }
        }

        // Install DefaultContext configuration
        if (!getOverride()) {
            Container host = getParent();
            if (host instanceof StandardHost) {
                ((StandardHost)host).installDefaultContext(this);
                Container engine = host.getParent();
                if( engine instanceof StandardEngine ) {
                    ((StandardEngine)engine).installDefaultContext(this);
                }
            }
        }

        // Add missing components as necessary
        if (webappResources == null) {   // (1) Required by Loader
            if (log.isDebugEnabled())
                log.debug("Configuring default Resources");
            try {
                if ((docBase != null) && (docBase.endsWith(".war")) && 
                    (!(new File(docBase).isDirectory()))) 
                    setResources(new WARDirContext());
                else
                    setResources(new FileDirContext());
            } catch (IllegalArgumentException e) {
                log.error(sm.getString("standardContext.resourcesInit"), e);
                ok = false;
            }
        }
        if (ok) {
            if (!resourcesStart()) {
                ok = false;
            }
        }

        // Add alternate resources
        if (alternateDocBases != null && alternateDocBases.size() > 0) {

            for (int i=0; i<alternateDocBases.size(); i++) {

                AlternateDocBase alternateDocBase = alternateDocBases.get(i);
                String docBase = alternateDocBase.getDocBase();

                if (log.isDebugEnabled()) {
                    log.debug("Configuring alternate resources");
                }
                try {
                    if (docBase != null
                            && docBase.endsWith(".war")) {
                        setAlternateResources(alternateDocBase,
                                              new WARDirContext());
                    } else {
                        setAlternateResources(alternateDocBase,
                                              new FileDirContext());
                    }
                } catch (IllegalArgumentException e) {
                    log.error(sm.getString("standardContext.resourcesInit"),
                              e);
                    ok = false;
                }
            }
            if (ok) {
                if (!alternateResourcesStart()) {
                    ok = false;
                }
            }
        }

        // Look for a realm - that may have been configured earlier. 
        // If the realm is added after context - it'll set itself.
        if( realm == null ) {
            ObjectName realmName=null;
            try {
                realmName=new ObjectName( getEngineName() + ":type=Realm,host=" 
                                        + getHostname() + ",path=" + getPath());
                if( mserver.isRegistered(realmName ) ) {
                    mserver.invoke(realmName, "init", 
                            new Object[] {},
                            new String[] {}
                    );            
                }
            } catch( Throwable t ) {
                if (log.isDebugEnabled()) {
                    log.debug("No realm for this host " + realmName);
                }
            }
        }
        
        if (getLoader() == null) {
            createLoader();
        }

        // Initialize character set mapper
        getCharsetMapper();

        // Post work directory
        postWorkDirectory();

        // Validate required extensions
        boolean dependencyCheck = true;
        try {
            dependencyCheck = ExtensionValidator.validateApplication
                (getResources(), this);
        } catch (IOException ioe) {
            log.error(sm.getString("standardContext.dependencyCheck", this),
                      ioe);
            dependencyCheck = false;
        }

        if (!dependencyCheck) {
            // do not make application available if depency check fails
            ok = false;
        }

        // Reading the "catalina.useNaming" environment variable
        String useNamingProperty = System.getProperty("catalina.useNaming");
        if ((useNamingProperty != null)
            && (useNamingProperty.equals("false"))) {
            useNaming = false;
        }

        if (ok && isUseNaming()) {
            if (namingContextListener == null) {
                namingContextListener = new NamingContextListener();
                namingContextListener.setDebug(getDebug());
                namingContextListener.setName(getNamingContextName());
                addLifecycleListener(namingContextListener);
            }
        }

        // Binding thread
        // START OF SJSAS 8.1 6174179
        //ClassLoader oldCCL = bindThread();
        ClassLoader oldCCL = null;
        // END OF SJSAS 8.1 6174179

        // Standard container startup
        if (log.isTraceEnabled())
            log.trace("Processing standard container startup");

        boolean mainOk = false;
        try {
            if (ok) {

                started = true;

                // Start our subordinate components, if any
                if ((loader != null) && (loader instanceof Lifecycle))
                    ((Lifecycle) loader).start();
                if ((logger != null) && (logger instanceof Lifecycle))
                    ((Lifecycle) logger).start();

                // Unbinding thread
                // START OF SJSAS 8.1 6174179
                //unbindThread(oldCCL);
                // END OF SJSAS 8.1 6174179
                
                // Binding thread
                oldCCL = bindThread();

                if ((cluster != null) && (cluster instanceof Lifecycle))
                    ((Lifecycle) cluster).start();
                if ((realm != null) && (realm instanceof Lifecycle))
                    ((Lifecycle) realm).start();
                if ((resources != null) && (resources instanceof Lifecycle))
                    ((Lifecycle) resources).start();

                // Start our child containers, if any
                Container children[] = findChildren();
                for (int i = 0; i < children.length; i++) {
                    if (children[i] instanceof Lifecycle)
                        ((Lifecycle) children[i]).start();
                }

                // Start the Valves in our pipeline (including the basic),
                // if any
                if (pipeline instanceof Lifecycle)
                    ((Lifecycle) pipeline).start();
                
                // START SJSAS 8.1 5049111 
                // Notify our interested LifecycleListeners
                lifecycle.fireLifecycleEvent(START_EVENT, null);  
                
                if (TldConfig.getScanParentTldListener() == false)
                    isJsfApplication = isJsfServletDefined();
                // END SJSAS 8.1 5049111 
               
                // Read tldListeners. XXX  Option to disable                
                TldConfig tldConfig = new TldConfig();
                tldConfig.setContext(this);

                // (1)  check if the attribute has been defined
                //      on the context element.
                tldConfig.setTldValidation(tldValidation);
                tldConfig.setTldNamespaceAware(tldNamespaceAware);

                // (2) if the attribute wasn't defined on the context
                //     try the host.
                if (!tldValidation){
                    tldConfig.setTldValidation
                        (((StandardHost) getParent()).getXmlValidation());
                }

                try {
                    tldConfig.execute();
                } catch (Exception ex) {
                    log.error(sm.getString("standardContext.tldConfig"), ex);
                    //ok=false;
                }
                
                 // START SJSAS 8.1 5049111 
                // Notify our interested LifecycleListeners
                // lifecycle.fireLifecycleEvent(START_EVENT, null);  
                // END SJSAS 8.1 504911
                
                // Start manager
                if ((manager != null) && (manager instanceof Lifecycle)) {
                    ((Lifecycle) getManager()).start();
                }

                // Start ContainerBackgroundProcessor thread
                super.threadStart();

                mainOk = true;
            }
        } finally {
            // Unbinding thread
            unbindThread(oldCCL);
            if (!mainOk) {
                // An exception occurred
                // Register with JMX anyway, to allow management
                registerJMX();
            }
        }

        if (!getConfigured()) {
            ok = false;
        }

        // We put the resources into the servlet context
        if (ok) {
            getServletContext().setAttribute
                (Globals.RESOURCES_ATTR, getResources());
            context.setAttributeReadOnly(Globals.RESOURCES_ATTR);
            getServletContext().setAttribute
                (Globals.ALTERNATE_RESOURCES_ATTR, getAlternateDocBases());
            context.setAttributeReadOnly(Globals.ALTERNATE_RESOURCES_ATTR);
        }
        
        // Initialize associated mapper
        mapper.setContext(getPath(), welcomeFiles, resources);

        // Binding thread
        oldCCL = bindThread();

        try{
            // Create context attributes that will be required
            if (ok) {
                if (log.isDebugEnabled())
                    log.debug("Posting standard context attributes");
                postWelcomeFiles();
            }

            if (ok) {
                // Notify our interested LifecycleListeners
                lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
            }


            // Configure and call application event listeners and filters
            if (ok) {
                if (!listenerStart()) {
                    ok = false;
                }
            }
            if (ok) {
                if (!filterStart()) {
                    ok = false;
                }
            }

            // Load and initialize all "load on startup" servlets
            if (ok) {
                loadOnStartup(findChildren());
            }
        } finally {
            // Unbinding thread
            unbindThread(oldCCL);
        }

        // Set available status depending upon startup success
        if (ok) {
            if (log.isTraceEnabled())
                log.trace("Starting completed");
            setAvailable(true);
        } else {
            log.error(sm.getString("standardContext.startFailed", getName()));
            try {
                stop();
            } catch (Throwable t) {
                log.error(sm.getString("standardContext.startCleanup"), t);
            }
            setAvailable(false);
        }

        // JMX registration
        registerJMX();

        startTimeMillis = System.currentTimeMillis();
        startupTime = startTimeMillis - startupTimeStart;

        // Send j2ee.state.running notification 
        if (ok && (this.getObjectName() != null)) {
            Notification notification = 
                new Notification("j2ee.state.running", this.getObjectName(), 
                                sequenceNumber++);
            broadcaster.sendNotification(notification);
        }

        // Close all JARs right away to avoid always opening a peak number 
        // of files on startup
        if (getLoader() instanceof WebappLoader) {
            ((WebappLoader) getLoader()).closeJARs(true);
        }

        // Reinitializing if something went wrong
        if (!ok && started) {
            stop();
        }

        //cacheContext();
    
public voidstartRecursive()

        // nothing to start recursive, the servlets will be started by load-on-startup
        start();
    
public synchronized voidstop()
Stop this Context component.

exception
LifecycleException if a shutdown error occurs


        // Validate and update our current component state
        if (!started) {
            if(log.isInfoEnabled())
                log.info(sm.getString("containerBase.notStarted", logName()));
            return;
        }

        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(BEFORE_STOP_EVENT, null);
        
        // Send j2ee.state.stopping notification 
        if (this.getObjectName() != null) {
            Notification notification = 
                new Notification("j2ee.state.stopping", this.getObjectName(), 
                                sequenceNumber++);
            broadcaster.sendNotification(notification);
        }
        
        // Mark this application as unavailable while we shut down
        setAvailable(false);

        // Binding thread
        ClassLoader oldCCL = bindThread();

        try{
            // Stop our filters
            filterStop();
            
            // Stop ContainerBackgroundProcessor thread
            super.threadStop();

            if ((manager != null) && (manager instanceof Lifecycle)) {
                ((Lifecycle) manager).stop();
            }
            
            // Finalize our character set mapper
            setCharsetMapper(null);

            // Normal container shutdown processing
            if (log.isDebugEnabled())
                log.debug("Processing standard container shutdown");
            // Notify our interested LifecycleListeners
            lifecycle.fireLifecycleEvent(STOP_EVENT, null);
            started = false;

            // Stop the Valves in our pipeline (including the basic), if any
            if (pipeline instanceof Lifecycle) {
                ((Lifecycle) pipeline).stop();
            }

            // Stop our child containers, if any
            Container[] children = findChildren();
            for (int i = 0; i < children.length; i++) {
                if (children[i] instanceof Lifecycle)
                    ((Lifecycle) children[i]).stop();
            }
        
            // Clear all application-originated servlet context attributes
            if (context != null)
                context.clearAttributes();
            
            // Stop our application listeners
            listenerStop();

            // Stop resources
            resourcesStop();
            alternateResourcesStop();

            if ((realm != null) && (realm instanceof Lifecycle)) {
                ((Lifecycle) realm).stop();
            }
            if ((cluster != null) && (cluster instanceof Lifecycle)) {
                ((Lifecycle) cluster).stop();
            }
            if ((logger != null) && (logger instanceof Lifecycle)) {
                ((Lifecycle) logger).stop();
            }
            /* SJSAS 6347606 
            if ((loader != null) && (loader instanceof Lifecycle)) {
                ((Lifecycle) loader).stop();
            }
            */
        } finally {

            // Unbinding thread
            unbindThread(oldCCL);

            // START SJSAS 6347606 
            /*
             * Delay the stopping of the webapp classloader until this point,
             * because unbindThread() calls the security-checked
             * Thread.setContextClassLoader(), which may ask the current thread
             * context classloader (i.e., the webapp classloader) to load
             * Principal classes specified in the security policy file
             */
            if ((loader != null) && (loader instanceof Lifecycle)) {
                ((Lifecycle) loader).stop();
            }
            // END SJSAS 6347606 
        }

        // Send j2ee.state.stopped notification 
        if (this.getObjectName() != null) {
            Notification notification = 
                new Notification("j2ee.state.stopped", this.getObjectName(), 
                                sequenceNumber++);
            broadcaster.sendNotification(notification);
        }
        
        // Reset application context
        context = null;

        // This object will no longer be visible or used. 
        try {
            resetContext();
        } catch( Exception ex ) {
            log.error(sm.getString("standardContext.reset", this), ex);
        }
        
        // Notify our interested LifecycleListeners
        lifecycle.fireLifecycleEvent(AFTER_STOP_EVENT, null);

        if (log.isDebugEnabled())
            log.debug("Stopping complete");

    
public java.lang.StringtoString()
Return a String representation of this component.


        StringBuffer sb = new StringBuffer();
        if (getParent() != null) {
            sb.append(getParent().toString());
            sb.append(".");
        }
        sb.append("StandardContext[");
        sb.append(getName());
        sb.append("]");
        return (sb.toString());

    
private voidunbindThread(java.lang.ClassLoader oldContextClassLoader)
Unbind thread.


        Thread.currentThread().setContextClassLoader(oldContextClassLoader);

        if (isUseNaming()) {
            ContextBindings.unbindThread(this, this);
        }
    
private booleanvalidateURLPattern(java.lang.String urlPattern)
Validate the syntax of a proposed <url-pattern> for conformance with specification requirements.

param
urlPattern URL pattern to be validated


        if (urlPattern == null)
            return (false);
        if (urlPattern.indexOf('\n") >= 0 || urlPattern.indexOf('\r") >= 0) {
            log.warn(sm.getString("standardContext.crlfinurl", urlPattern));
        }
        if (urlPattern.startsWith("*.")) {
            if (urlPattern.indexOf('/") < 0)
                return (true);
            else
                return (false);
        }
        if ( (urlPattern.startsWith("/")) &&
                (urlPattern.indexOf("*.") < 0))
            return (true);
        else
            return (false);