Package org.apache.catalina.startup
Class ContextConfig
- java.lang.Object
-
- org.apache.catalina.startup.ContextConfig
-
- All Implemented Interfaces:
LifecycleListener
public class ContextConfig extends java.lang.Object implements LifecycleListener
Startup event listener for a Context that configures the properties of that Context, and the associated defined servlets.
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description static interfaceContextConfig.ContextXmlInterface for loading context XML configuration into a Context.protected static classContextConfig.DefaultWebXmlCacheEntryCache entry for the default web.xml fragment associated with a Host.protected static classContextConfig.JavaClassCacheEntryCache entry for a Java class used during annotation scanning.
-
Field Summary
Fields Modifier and Type Field Description protected static java.util.PropertiesauthenticatorsThe set of Authenticators that we know how to configure.protected ContextcontextThe Context we are associated with.protected java.util.Map<java.lang.String,Authenticator>customAuthenticatorsCustom mappings of login methods to authenticatorsprotected java.lang.StringdefaultWebXmlThe default web application's deployment descriptor location.protected static longdeploymentCountDeployment count.protected static LoginConfigDUMMY_LOGIN_CONFIGDummy login configuration used when no login config is defined but an authenticator is needed to support programmatic login.protected booleanhandlesTypesAnnotationsFlag that indicates if at least oneHandlesTypesentry is present that represents an annotation.protected booleanhandlesTypesNonAnnotationsFlag that indicates if at least oneHandlesTypesentry is present that represents a non-annotation.protected static java.util.Map<Host,ContextConfig.DefaultWebXmlCacheEntry>hostWebXmlCacheCache of default web.xml fragments per Hostprotected java.util.Map<ServletContainerInitializer,java.util.Set<java.lang.Class<?>>>initializerClassMapMap of ServletContainerInitializer to classes they expressed interest in.protected booleanokTrack any fatal errors during startup configuration processing.protected java.lang.StringoriginalDocBaseOriginal docBase.protected static StringManagersmThe string resources for this package.protected java.util.Map<java.lang.Class<?>,java.util.Set<ServletContainerInitializer>>typeInitializerMapMap of Types to ServletContainerInitializer that are interested in those types.
-
Constructor Summary
Constructors Constructor Description ContextConfig()Constructs a new ContextConfig instance.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidantiLocking()Handles anti-locking by copying the docBase to a temporary location to prevent file locking issues on Windows.protected voidapplicationAnnotationsConfig()Process the application classes annotations, if it exists.protected voidauthenticatorConfig()Set up an Authenticator automatically if required, and one has not already been configured.protected voidbeforeStart()Process a "before start" event for this Context.protected voidcheckHandlesTypes(JavaClass javaClass, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)For classes packaged with the web application, the class and each super class needs to be checked for a match withHandlesTypesor for an annotation that matchesHandlesTypes.protected voidconfigureStart()Process a "contextConfig" event for this Context.protected voidconfigureStop()Process a "stop" event for this Context.protected voidcontextConfig(Digester digester)Process the default configuration file, if it exists.protected DigestercreateContextDigester()Create (if necessary) and return a Digester configured to process the context configuration descriptor for an application.protected WebXmlcreateWebXml()Creates a new WebXml instance.protected voiddestroy()Process a "destroy" event for this Context.protected voidfixDocBase()Adjust docBase.protected voidgenerateClassFooter(Digester digester)Generates the footer of the Java class for context XML code generation.protected voidgenerateClassHeader(Digester digester, java.lang.String packageName, java.lang.String resourceName)Generates the header of the Java class for context XML code generation.java.lang.StringgetConfigBasePath()Returns the configuration base path for the Host that contains this Context.protected org.xml.sax.InputSourcegetContextWebXmlSource()Identify the application web.xml to be used and obtain an input source for it.protected java.io.FilegetContextXmlJavaSource(java.lang.String contextXmlPackageName, java.lang.String contextXmlSimpleClassName)Returns the Java source file path for the given context XML class.protected static java.lang.StringgetContextXmlPackageName(java.lang.String generatedCodePackage, Container container)Builds the package name for context XML generated code based on the container hierarchy.java.lang.StringgetDefaultWebXml()Obtain the location of the default deployment descriptor.protected booleangetGenerateCode()Returns whether code generation is enabled for this context.protected java.io.FilegetGeneratedCodeLocation()Returns the location where generated code is stored.protected java.lang.StringgetGeneratedCodePackage()Returns the package name for generated code.protected org.xml.sax.InputSourcegetGlobalWebXmlSource()Identify the default web.xml to be used and obtain an input source for it.protected java.io.FilegetHostConfigBase()Returns the configuration base directory for the Host that contains this Context.protected org.xml.sax.InputSourcegetHostWebXmlSource()Identify the host web.xml to be used and obtain an input source for it.protected booleangetUseGeneratedCode()Returns whether the use of generated code is enabled for this context.protected org.xml.sax.InputSourcegetWebXmlSource(java.lang.String filename, boolean global)Utility method to create an input source from the specified XML file.protected voidinit()Process an "init" event for this Context.voidlifecycleEvent(LifecycleEvent event)Process events for an associated Context.protected voidprocessAnnotations(java.util.Set<WebXml> fragments, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations for the given set of web fragments.protected voidprocessAnnotationsFile(java.io.File file, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations for a file or directory, recursing into subdirectories.protected voidprocessAnnotationsInParallel(java.util.Set<WebXml> fragments, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Parallelized version of processAnnotationsInParallel().protected voidprocessAnnotationsJar(java.net.URL url, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations for all .class files within a JAR.protected voidprocessAnnotationsStream(java.io.InputStream is, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations from a class file input stream.protected java.lang.String[]processAnnotationsStringArray(ElementValue ev)Processes an element value that represents a string array from an annotation.protected voidprocessAnnotationsUrl(java.net.URL url, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Dispatches annotation processing based on the URL protocol.protected voidprocessAnnotationsWebResource(WebResource webResource, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations for a web resource, recursing into directories.protected voidprocessAnnotationWebFilter(java.lang.String className, AnnotationEntry ae, WebXml fragment)Process filter annotation and merge with existing oneprotected java.util.Map<java.lang.String,java.lang.String>processAnnotationWebInitParams(ElementValue ev)Processes init parameters from an annotation element value.protected voidprocessAnnotationWebServlet(java.lang.String className, AnnotationEntry ae, WebXml fragment)Processes a @WebServlet annotation and merges it into the web fragment.protected voidprocessClass(WebXml fragment, JavaClass clazz)Processes servlet annotations from a parsed Java class.protected voidprocessClasses(WebXml webXml, java.util.Set<WebXml> orderedFragments)Processes /WEB-INF/classes and JARs for annotations and @HandlesTypes matches.protected voidprocessContextConfig(Digester digester, java.net.URL contextXml, java.io.InputStream stream)Process a context.xml.protected java.util.Map<java.lang.String,WebXml>processJarsForWebFragments(WebXml application, WebXmlParser webXmlParser)Scan /WEB-INF/lib for JARs and for each one found add it and any /META-INF/web-fragment.xml to the resulting Map.protected voidprocessResourceJARs(java.util.Set<WebXml> fragments)Scan JARs that contain web-fragment.xml files that will be used to configure this application to see if they also contain static resources.protected voidprocessServletContainerInitializers()Scan JARs for ServletContainerInitializer implementations.voidsetCustomAuthenticators(java.util.Map<java.lang.String,Authenticator> customAuthenticators)Sets custom mappings of login methods to authenticators.voidsetDefaultWebXml(java.lang.String path)Set the location of the default deployment descriptor.protected voidvalidateSecurityRoles()Validate the usage of security role names in the web application deployment descriptor.protected voidwebConfig()Scan the web.xml files that apply to the web application and merge them using the rules defined in the spec.
-
-
-
Field Detail
-
sm
protected static final StringManager sm
The string resources for this package.
-
DUMMY_LOGIN_CONFIG
protected static final LoginConfig DUMMY_LOGIN_CONFIG
Dummy login configuration used when no login config is defined but an authenticator is needed to support programmatic login.
-
authenticators
protected static final java.util.Properties authenticators
The set of Authenticators that we know how to configure. The key is the name of the implemented authentication method, and the value is the fully qualified Java class name of the corresponding Valve.
-
deploymentCount
protected static long deploymentCount
Deployment count.
-
hostWebXmlCache
protected static final java.util.Map<Host,ContextConfig.DefaultWebXmlCacheEntry> hostWebXmlCache
Cache of default web.xml fragments per Host
-
customAuthenticators
protected java.util.Map<java.lang.String,Authenticator> customAuthenticators
Custom mappings of login methods to authenticators
-
context
protected volatile Context context
The Context we are associated with.
-
defaultWebXml
protected java.lang.String defaultWebXml
The default web application's deployment descriptor location.
-
ok
protected boolean ok
Track any fatal errors during startup configuration processing.
-
originalDocBase
protected java.lang.String originalDocBase
Original docBase.
-
initializerClassMap
protected final java.util.Map<ServletContainerInitializer,java.util.Set<java.lang.Class<?>>> initializerClassMap
Map of ServletContainerInitializer to classes they expressed interest in.
-
typeInitializerMap
protected final java.util.Map<java.lang.Class<?>,java.util.Set<ServletContainerInitializer>> typeInitializerMap
Map of Types to ServletContainerInitializer that are interested in those types.
-
handlesTypesAnnotations
protected boolean handlesTypesAnnotations
Flag that indicates if at least oneHandlesTypesentry is present that represents an annotation.
-
handlesTypesNonAnnotations
protected boolean handlesTypesNonAnnotations
Flag that indicates if at least oneHandlesTypesentry is present that represents a non-annotation.
-
-
Method Detail
-
getDefaultWebXml
public java.lang.String getDefaultWebXml()
Obtain the location of the default deployment descriptor.- Returns:
- The path to the default web.xml. If not absolute, it is relative to CATALINA_BASE.
-
setDefaultWebXml
public void setDefaultWebXml(java.lang.String path)
Set the location of the default deployment descriptor.- Parameters:
path- The path to the default web.xml. If not absolute, it is relative to CATALINA_BASE.
-
setCustomAuthenticators
public void setCustomAuthenticators(java.util.Map<java.lang.String,Authenticator> customAuthenticators)
Sets custom mappings of login methods to authenticators.- Parameters:
customAuthenticators- Custom mappings of login methods to authenticators
-
lifecycleEvent
public void lifecycleEvent(LifecycleEvent event)
Process events for an associated Context.- Specified by:
lifecycleEventin interfaceLifecycleListener- Parameters:
event- The lifecycle event that has occurred
-
applicationAnnotationsConfig
protected void applicationAnnotationsConfig()
Process the application classes annotations, if it exists.
-
authenticatorConfig
protected void authenticatorConfig()
Set up an Authenticator automatically if required, and one has not already been configured.
-
createContextDigester
protected Digester createContextDigester()
Create (if necessary) and return a Digester configured to process the context configuration descriptor for an application.- Returns:
- the digester for context.xml files
-
getGenerateCode
protected boolean getGenerateCode()
Returns whether code generation is enabled for this context.- Returns:
trueif code generation is enabled
-
getUseGeneratedCode
protected boolean getUseGeneratedCode()
Returns whether the use of generated code is enabled for this context.- Returns:
trueif the use of generated code is enabled
-
getGeneratedCodeLocation
protected java.io.File getGeneratedCodeLocation()
Returns the location where generated code is stored.- Returns:
- the location where generated code is stored
-
getGeneratedCodePackage
protected java.lang.String getGeneratedCodePackage()
Returns the package name for generated code.- Returns:
- the package name for generated code
-
getContextXmlPackageName
protected static java.lang.String getContextXmlPackageName(java.lang.String generatedCodePackage, Container container)Builds the package name for context XML generated code based on the container hierarchy.- Parameters:
generatedCodePackage- the base package name for generated codecontainer- the container from which to derive the package name- Returns:
- the fully qualified package name for the context XML generated code
-
getContextXmlJavaSource
protected java.io.File getContextXmlJavaSource(java.lang.String contextXmlPackageName, java.lang.String contextXmlSimpleClassName)Returns the Java source file path for the given context XML class.- Parameters:
contextXmlPackageName- the package name for the context XML classcontextXmlSimpleClassName- the simple class name- Returns:
- the source file path, or
nullif the directory cannot be created
-
generateClassHeader
protected void generateClassHeader(Digester digester, java.lang.String packageName, java.lang.String resourceName)
Generates the header of the Java class for context XML code generation.- Parameters:
digester- the digester instancepackageName- the package name for the generated classresourceName- the simple class name
-
generateClassFooter
protected void generateClassFooter(Digester digester)
Generates the footer of the Java class for context XML code generation.- Parameters:
digester- the digester instance
-
contextConfig
protected void contextConfig(Digester digester)
Process the default configuration file, if it exists.- Parameters:
digester- The digester that will be used for XML parsing
-
processContextConfig
protected void processContextConfig(Digester digester, java.net.URL contextXml, java.io.InputStream stream)
Process a context.xml.- Parameters:
digester- The digester that will be used for XML parsingcontextXml- The URL to the context.xml configurationstream- The XML resource stream
-
fixDocBase
protected void fixDocBase() throws java.io.IOExceptionAdjust docBase.- Throws:
java.io.IOException- cannot access the context base path
-
antiLocking
protected void antiLocking()
Handles anti-locking by copying the docBase to a temporary location to prevent file locking issues on Windows.
-
init
protected void init()
Process an "init" event for this Context.
-
beforeStart
protected void beforeStart()
Process a "before start" event for this Context.
-
configureStart
protected void configureStart()
Process a "contextConfig" event for this Context.
-
configureStop
protected void configureStop()
Process a "stop" event for this Context.
-
destroy
protected void destroy()
Process a "destroy" event for this Context.
-
validateSecurityRoles
protected void validateSecurityRoles()
Validate the usage of security role names in the web application deployment descriptor. If any problems are found, issue warning messages (for backwards compatibility) and add the missing roles. (To make these problems fatal instead, simply set theokinstance variable tofalseas well).
-
getHostConfigBase
protected java.io.File getHostConfigBase()
Returns the configuration base directory for the Host that contains this Context.- Returns:
- the configuration base directory, or
nullif the parent is not a Host
-
webConfig
protected void webConfig()
Scan the web.xml files that apply to the web application and merge them using the rules defined in the spec. For the global web.xml files, where there is duplicate configuration, the most specific level wins. ie an application's web.xml takes precedence over the host level or global web.xml file.
-
processClasses
protected void processClasses(WebXml webXml, java.util.Set<WebXml> orderedFragments)
Processes /WEB-INF/classes and JARs for annotations and @HandlesTypes matches.- Parameters:
webXml- the main web.xml metadataorderedFragments- the ordered set of web fragments
-
createWebXml
protected WebXml createWebXml()
Creates a new WebXml instance.- Returns:
- a new WebXml instance
-
processServletContainerInitializers
protected void processServletContainerInitializers()
Scan JARs for ServletContainerInitializer implementations.
-
processResourceJARs
protected void processResourceJARs(java.util.Set<WebXml> fragments)
Scan JARs that contain web-fragment.xml files that will be used to configure this application to see if they also contain static resources. If static resources are found, add them to the context. Resources are added in web-fragment.xml priority order.- Parameters:
fragments- The set of fragments that will be scanned for static resources
-
getGlobalWebXmlSource
protected org.xml.sax.InputSource getGlobalWebXmlSource()
Identify the default web.xml to be used and obtain an input source for it.- Returns:
- an input source to the default web.xml
-
getHostWebXmlSource
protected org.xml.sax.InputSource getHostWebXmlSource()
Identify the host web.xml to be used and obtain an input source for it.- Returns:
- an input source to the default per host web.xml
-
getContextWebXmlSource
protected org.xml.sax.InputSource getContextWebXmlSource()
Identify the application web.xml to be used and obtain an input source for it.- Returns:
- an input source to the context web.xml
-
getConfigBasePath
public java.lang.String getConfigBasePath()
Returns the configuration base path for the Host that contains this Context.- Returns:
- the configuration base path, or
nullif the parent is not a Host
-
getWebXmlSource
protected org.xml.sax.InputSource getWebXmlSource(java.lang.String filename, boolean global)Utility method to create an input source from the specified XML file.- Parameters:
filename- Name of the file (possibly with one or more leading path segments) to readglobal- true if processing a shared resource, false if processing a host based resource- Returns:
- the input source
-
processJarsForWebFragments
protected java.util.Map<java.lang.String,WebXml> processJarsForWebFragments(WebXml application, WebXmlParser webXmlParser)
Scan /WEB-INF/lib for JARs and for each one found add it and any /META-INF/web-fragment.xml to the resulting Map. web-fragment.xml files will be parsed before being added to the map. Every JAR will be added andnullwill be used if no web-fragment.xml was found. Any JARs known not contain fragments will be skipped.- Parameters:
application- The main web.xml metadatawebXmlParser- The parser to use to process the web.xml file- Returns:
- A map of JAR name to processed web fragment (if any)
-
processAnnotations
protected void processAnnotations(java.util.Set<WebXml> fragments, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)
Processes annotations for the given set of web fragments.- Parameters:
fragments- the web fragments to scanhandlesTypesOnly- whether to only process @HandlesTypes matchesjavaClassCache- the class cache for tracking processed classes
-
processAnnotationsInParallel
protected void processAnnotationsInParallel(java.util.Set<WebXml> fragments, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)
Parallelized version of processAnnotationsInParallel(). Constructs tasks, submits them as they're created, then waits for completion.- Parameters:
fragments- Set of parallelizable scanshandlesTypesOnly- Important parameter for the underlying scanjavaClassCache- The class cache
-
processAnnotationsWebResource
protected void processAnnotationsWebResource(WebResource webResource, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)
Processes annotations for a web resource, recursing into directories.- Parameters:
webResource- the web resource to processfragment- the web fragment to merge annotations intohandlesTypesOnly- whether to only process @HandlesTypes matchesjavaClassCache- the class cache for tracking processed classes
-
processAnnotationsUrl
protected void processAnnotationsUrl(java.net.URL url, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Dispatches annotation processing based on the URL protocol.- Parameters:
url- the URL to processfragment- the web fragment to merge annotations intohandlesTypesOnly- whether to only process @HandlesTypes matchesjavaClassCache- the class cache for tracking processed classes
-
processAnnotationsJar
protected void processAnnotationsJar(java.net.URL url, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations for all .class files within a JAR.- Parameters:
url- the URL of the JARfragment- the web fragment to merge annotations intohandlesTypesOnly- whether to only process @HandlesTypes matchesjavaClassCache- the class cache for tracking processed classes
-
processAnnotationsFile
protected void processAnnotationsFile(java.io.File file, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)Processes annotations for a file or directory, recursing into subdirectories.- Parameters:
file- the file or directory to processfragment- the web fragment to merge annotations intohandlesTypesOnly- whether to only process @HandlesTypes matchesjavaClassCache- the class cache for tracking processed classes
-
processAnnotationsStream
protected void processAnnotationsStream(java.io.InputStream is, WebXml fragment, boolean handlesTypesOnly, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache) throws ClassFormatException, java.io.IOExceptionProcesses annotations from a class file input stream.- Parameters:
is- the input stream for the class filefragment- the web fragment to merge annotations intohandlesTypesOnly- whether to only process @HandlesTypes matchesjavaClassCache- the class cache for tracking processed classes- Throws:
ClassFormatException- if the class file is malformedjava.io.IOException- if an I/O error occurs
-
processClass
protected void processClass(WebXml fragment, JavaClass clazz)
Processes servlet annotations from a parsed Java class.- Parameters:
fragment- the web fragment to merge annotations intoclazz- the parsed Java class
-
checkHandlesTypes
protected void checkHandlesTypes(JavaClass javaClass, java.util.Map<java.lang.String,ContextConfig.JavaClassCacheEntry> javaClassCache)
For classes packaged with the web application, the class and each super class needs to be checked for a match withHandlesTypesor for an annotation that matchesHandlesTypes.- Parameters:
javaClass- the class to checkjavaClassCache- a class cache
-
processAnnotationWebServlet
protected void processAnnotationWebServlet(java.lang.String className, AnnotationEntry ae, WebXml fragment)Processes a @WebServlet annotation and merges it into the web fragment.- Parameters:
className- the class name containing the annotationae- the annotation entryfragment- the web fragment to merge the servlet definition into
-
processAnnotationWebFilter
protected void processAnnotationWebFilter(java.lang.String className, AnnotationEntry ae, WebXml fragment)Process filter annotation and merge with existing one- Parameters:
className- The filter class nameae- The filter annotationfragment- The corresponding fragment
-
processAnnotationsStringArray
protected java.lang.String[] processAnnotationsStringArray(ElementValue ev)
Processes an element value that represents a string array from an annotation.- Parameters:
ev- the element value to process- Returns:
- the resulting string array
-
processAnnotationWebInitParams
protected java.util.Map<java.lang.String,java.lang.String> processAnnotationWebInitParams(ElementValue ev)
Processes init parameters from an annotation element value.- Parameters:
ev- the element value containing init parameters- Returns:
- a map of init parameter names to values
-
-