Class ContainerBase
- java.lang.Object
-
- org.apache.catalina.core.ContainerBase
-
- Direct Known Subclasses:
StandardContext
,StandardEngine
,StandardHost
,StandardWrapper
public abstract class ContainerBase extends Object implements Container, Lifecycle, Pipeline
Abstract implementation of the Container interface, providing common functionality required by nearly every implementation. Classes extending this base class must implementgetInfo()
, and may implement a replacement forinvoke()
.All subclasses of this abstract base class will include support for a Pipeline object that defines the processing to be performed for each request received by the
invoke()
method of this class, utilizing the "Chain of Responsibility" design pattern. A subclass should encapsulate its own processing functionality as aValve
, and configure this Valve into the pipeline by callingsetBasic()
.This implementation fires property change events, per the JavaBeans design pattern, for changes in singleton properties. In addition, it fires the following
ContainerEvent
events to listeners who register themselves withaddContainerListener()
:Type Data Description addChild
Container
Child container added to this Container. addValve
Valve
Valve added to this Container. removeChild
Container
Child container removed from this Container. removeValve
Valve
Valve removed from this Container. start
null
Container was started. stop
null
Container was stopped. - Author:
- Craig R. McClanahan
-
-
Nested Class Summary
Nested Classes Modifier and Type Class Description protected class
ContainerBase.ContainerBackgroundProcessor
Private thread class to invoke the backgroundProcess method of this container and its children after a fixed delay.protected class
ContainerBase.PrivilegedAddChild
Perform addChild with the permissions of this class.
-
Field Summary
Fields Modifier and Type Field Description protected int
backgroundProcessorDelay
The processor delay for this component.protected boolean
checkIfRequestIsSecure
Flag indicating whether a check to see if the request is secure is required before adding Pragma and Cache-Control headers when proxy caching has been disabledprotected Map<String,Container>
children
The child Containers belonging to this Container, keyed by name.protected ObjectName
controller
protected int
debug
The debugging detail level for this component.protected String
domain
protected boolean
hasCustomPipeline
protected boolean
initialized
protected LifecycleSupport
lifecycle
The lifecycle event support for this component.protected ArrayList<ContainerListener>
listeners
The container event listeners for this Container.protected Loader
loader
The Loader implementation with which this Container is associated.protected static Logger
log
protected Logger
logger
The Logger implementation with which this Container is associated.protected Manager
manager
The Manager implementation with which this Container is associated.protected String
name
The human-readable name of this Container.protected boolean
notifyContainerListeners
Indicates whether ContainerListener instances need to be notified of a particular configuration event.protected ObjectName
oname
protected Container
parent
The parent Container to which this Container is a child.protected ClassLoader
parentClassLoader
The parent class loader to be configured when we install a Loader.protected Pipeline
pipeline
The Pipeline object with which this Container is associated.protected static ResourceBundle
rb
protected Lock
readLock
protected Realm
realm
The Realm with which this Container is associated.protected DirContext
resources
The resources DirContext object with which this Container is associated.protected boolean
started
Has this component been started?protected PropertyChangeSupport
support
The property change support for this component.protected Lock
writeLock
-
Fields inherited from interface org.apache.catalina.Container
ADD_CHILD_EVENT, ADD_MAPPER_EVENT, ADD_VALVE_EVENT, REMOVE_CHILD_EVENT, REMOVE_MAPPER_EVENT, REMOVE_VALVE_EVENT
-
Fields inherited from interface org.apache.catalina.Lifecycle
AFTER_START_EVENT, AFTER_STOP_EVENT, BEFORE_START_EVENT, BEFORE_STOP_EVENT, INIT_EVENT, START_EVENT, STOP_EVENT
-
-
Constructor Summary
Constructors Constructor Description ContainerBase()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addChild(Container child)
Add a new child Container to those associated with this Container, if supported.void
addContainerListener(ContainerListener listener)
Add a container event listener to this component.void
addLifecycleListener(LifecycleListener listener)
Add a lifecycle event listener to this component.void
addPropertyChangeListener(PropertyChangeListener listener)
Add a property change listener to this component.void
addValve(Valve valve)
Add Tomcat-style valve.void
addValve(GlassFishValve valve)
Add a new Valve to the end of the pipeline associated with this Container.void
backgroundProcess()
Execute a periodic task, such as reloading, etc.ObjectName
createObjectName(String domain, ObjectName parent)
void
destroy()
Stops the component and any children and removes all listenersContainer
findChild(String name)
Return the child Container, associated with this Container, with the specified name (if any); otherwise, returnnull
Container[]
findChildren()
Return the set of children Containers associated with this Container.ContainerListener[]
findContainerListeners()
Return the set of container listeners associated with this Container.List<LifecycleListener>
findLifecycleListeners()
Gets the (possibly empty) list of lifecycle listeners associated with this Container.void
fireContainerEvent(String type, Object data)
Notify all container event listeners that a particular event has occurred for this Container.int
getBackgroundProcessorDelay()
Get the delay between the invocation of the backgroundProcess method on this container and its children.GlassFishValve
getBasic()
Return the Valve instance that has been distinguished as the basic Valve for this Pipeline (if any).ObjectName[]
getChildren()
String
getContainerSuffix()
int
getDebug()
Return the debugging detail level for this component.String
getDomain()
String
getInfo()
Return descriptive information about this Container implementation and the corresponding version number, in the format<description>/<version>
.ObjectName
getJmxName()
Loader
getLoader()
Return the Loader with which this Container is associated.Logger
getLogger()
Return the Logger with which this Container is associated.Manager
getManager()
Return the Manager with which this Container is associated.Object
getMappingObject()
Return an object which may be utilized for mapping to this component.String
getName()
Return a name string (suitable for use by humans) that describes this Container.String
getObjectName()
Container
getParent()
Return the Container for which this Container is a child, if there is one.ClassLoader
getParentClassLoader()
Return the parent class loader (if any) for this web application.ObjectName
getParentName()
Gets the name of the parent containerPipeline
getPipeline()
Return the Pipeline object that manages the Valves associated with this Container.Realm
getRealm()
Return the Realm with which this Container is associated.DirContext
getResources()
Return the resources DirContext object with which this Container is associated.ObjectName[]
getValveObjectNames()
Gets the name of all Tomcat valvesGlassFishValve[]
getValves()
Return the set of Valves in the pipeline associated with this Container, including the basic Valve (if any).boolean
hasCustomPipeline()
boolean
hasNonBasicValves()
void
init()
Init method, part of the MBean lifecycle.void
invoke(Request request, Response response)
Process the specified Request, to produce the corresponding Response, by invoking the first Valve in our pipeline (if any), or the basic Valve otherwise.boolean
isCheckIfRequestIsSecure()
Indicates whether the request will be checked to see if it is secure before adding Pragma and Cache-control headers when proxy caching has been disabled.protected void
log(String message)
Log the specified message to our current Logger (if any).protected void
log(String message, Throwable throwable)
Log the specified message and exception to our current Logger (if any).protected String
logName()
Return the abbreviated name of this container for logging messagesvoid
removeChild(Container child)
Remove an existing child Container from association with this parent Container.void
removeContainerListener(ContainerListener listener)
Remove a container event listener from this component.void
removeLifecycleListener(LifecycleListener listener)
Removes the given lifecycle event listener from this Container.void
removeLifecycleListeners()
Removes any lifecycle event listeners from this Container.void
removePropertyChangeListener(PropertyChangeListener listener)
Remove a property change listener from this component.void
removeValve(GlassFishValve valve)
Remove the specified Valve from the pipeline associated with this Container, if it is found; otherwise, do nothing.void
setBackgroundProcessorDelay(int delay)
Set the delay between the invocation of the execute method on this container and its children.void
setBasic(GlassFishValve valve)
Set the Valve instance that has been distinguished as the basic Valve for this Pipeline (if any).void
setCheckIfRequestIsSecure(boolean checkIfRequestIsSecure)
Sets the checkIfRequestIsSecure property of this Container.void
setDebug(int debug)
Set the debugging detail level for this component.void
setDomain(String domain)
void
setLoader(Loader loader)
Set the Loader with which this Container is associated.void
setLogger(Logger logger)
Set the Logger with which this Container is associated.void
setManager(Manager manager)
Set the Manager with which this Container is associated.void
setName(String name)
Set a name string (suitable for use by humans) that describes this Container.void
setParent(Container container)
Set the parent Container to which this Container is being added as a child.void
setParentClassLoader(ClassLoader parent)
Set the parent class loader (if any) for this web application.void
setRealm(Realm realm)
Set the Realm with which this Container is associated.void
setResources(DirContext resources)
Set the resources DirContext object with which this Container is associated.void
start()
Prepare for active use of the public methods of this Component.protected void
startChildren()
Starts the children of this container.void
stop()
Gracefully shut down active use of the public methods of this Component.protected void
threadStart()
Start the background thread that will periodically check for session timeouts.protected void
threadStop()
Stop the background thread that is periodically checking for session timeouts.
-
-
-
Field Detail
-
log
protected static final Logger log
-
rb
protected static final ResourceBundle rb
-
children
protected Map<String,Container> children
The child Containers belonging to this Container, keyed by name.
-
debug
protected int debug
The debugging detail level for this component.
-
backgroundProcessorDelay
protected int backgroundProcessorDelay
The processor delay for this component.
-
checkIfRequestIsSecure
protected boolean checkIfRequestIsSecure
Flag indicating whether a check to see if the request is secure is required before adding Pragma and Cache-Control headers when proxy caching has been disabled
-
lifecycle
protected LifecycleSupport lifecycle
The lifecycle event support for this component.
-
listeners
protected ArrayList<ContainerListener> listeners
The container event listeners for this Container.
-
loader
protected Loader loader
The Loader implementation with which this Container is associated.
-
readLock
protected Lock readLock
-
writeLock
protected Lock writeLock
-
logger
protected Logger logger
The Logger implementation with which this Container is associated.
-
manager
protected Manager manager
The Manager implementation with which this Container is associated.
-
name
protected String name
The human-readable name of this Container.
-
parent
protected Container parent
The parent Container to which this Container is a child.
-
parentClassLoader
protected ClassLoader parentClassLoader
The parent class loader to be configured when we install a Loader.
-
pipeline
protected Pipeline pipeline
The Pipeline object with which this Container is associated.
-
hasCustomPipeline
protected boolean hasCustomPipeline
-
realm
protected Realm realm
The Realm with which this Container is associated.
-
resources
protected DirContext resources
The resources DirContext object with which this Container is associated.
-
started
protected volatile boolean started
Has this component been started?
-
initialized
protected boolean initialized
-
support
protected PropertyChangeSupport support
The property change support for this component.
-
notifyContainerListeners
protected boolean notifyContainerListeners
Indicates whether ContainerListener instances need to be notified of a particular configuration event.
-
domain
protected String domain
-
oname
protected ObjectName oname
-
controller
protected ObjectName controller
-
-
Method Detail
-
getDebug
public int getDebug()
Return the debugging detail level for this component.- Returns:
-
setDebug
public void setDebug(int debug)
Set the debugging detail level for this component.- Parameters:
debug
- The new debugging detail level
-
getBackgroundProcessorDelay
public int getBackgroundProcessorDelay()
Get the delay between the invocation of the backgroundProcess method on this container and its children. Child containers will not be invoked if their delay value is not negative (which would mean they are using their own thread). Setting this to a positive value will cause a thread to be spawn. After waiting the specified amount of time, the thread will invoke the executePeriodic method on this container and all its children.- Specified by:
getBackgroundProcessorDelay
in interfaceContainer
- Returns:
-
setBackgroundProcessorDelay
public void setBackgroundProcessorDelay(int delay)
Set the delay between the invocation of the execute method on this container and its children.- Specified by:
setBackgroundProcessorDelay
in interfaceContainer
- Parameters:
delay
- The delay in seconds between the invocation of backgroundProcess methods
-
getInfo
public String getInfo()
Return descriptive information about this Container implementation and the corresponding version number, in the format<description>/<version>
.
-
getLoader
public Loader getLoader()
Return the Loader with which this Container is associated. If there is no associated Loader, return the Loader associated with our parent Container (if any); otherwise, returnnull
.
-
setLoader
public void setLoader(Loader loader)
Set the Loader with which this Container is associated.
-
getLogger
public Logger getLogger()
Return the Logger with which this Container is associated. If there is no associated Logger, return the Logger associated with our parent Container (if any); otherwise returnnull
.
-
setLogger
public void setLogger(Logger logger)
Set the Logger with which this Container is associated.
-
getManager
public Manager getManager()
Return the Manager with which this Container is associated. If there is no associated Manager, return the Manager associated with our parent Container (if any); otherwise returnnull
.- Specified by:
getManager
in interfaceContainer
- Returns:
-
setManager
public void setManager(Manager manager)
Set the Manager with which this Container is associated.- Specified by:
setManager
in interfaceContainer
- Parameters:
manager
- The newly associated Manager
-
getMappingObject
public Object getMappingObject()
Return an object which may be utilized for mapping to this component.- Specified by:
getMappingObject
in interfaceContainer
- Returns:
-
getName
public String getName()
Return a name string (suitable for use by humans) that describes this Container. Within the set of child containers belonging to a particular parent, Container names must be unique.
-
setName
public void setName(String name)
Set a name string (suitable for use by humans) that describes this Container. Within the set of child containers belonging to a particular parent, Container names must be unique.- Specified by:
setName
in interfaceContainer
- Parameters:
name
- New name of this container- Throws:
IllegalStateException
- if this Container has already been added to the children of a parent Container (after which the name may not be changed)
-
getParent
public Container getParent()
Return the Container for which this Container is a child, if there is one. If there is no defined parent, returnnull
.
-
setParent
public void setParent(Container container)
Set the parent Container to which this Container is being added as a child. This Container may refuse to become attached to the specified Container by throwing an exception.- Specified by:
setParent
in interfaceContainer
- Parameters:
container
- Container to which this Container is being added as a child- Throws:
IllegalArgumentException
- if this Container refuses to become attached to the specified Container
-
getParentClassLoader
public ClassLoader getParentClassLoader()
Return the parent class loader (if any) for this web application. This call is meaningful only after a Loader has been configured.- Specified by:
getParentClassLoader
in interfaceContainer
- Returns:
-
setParentClassLoader
public void setParentClassLoader(ClassLoader parent)
Set the parent class loader (if any) for this web application. This call is meaningful only before a Loader has been configured, and the specified value (if non-null) should be passed as an argument to the class loader constructor.- Specified by:
setParentClassLoader
in interfaceContainer
- Parameters:
parent
- The new parent class loader
-
getPipeline
public Pipeline getPipeline()
Return the Pipeline object that manages the Valves associated with this Container.- Specified by:
getPipeline
in interfaceContainer
- Returns:
-
hasCustomPipeline
public boolean hasCustomPipeline()
- Specified by:
hasCustomPipeline
in interfaceContainer
- Returns:
- true if this container was configured with a custom pipeline, false otherwise
-
isCheckIfRequestIsSecure
public boolean isCheckIfRequestIsSecure()
Indicates whether the request will be checked to see if it is secure before adding Pragma and Cache-control headers when proxy caching has been disabled.- Specified by:
isCheckIfRequestIsSecure
in interfaceContainer
- Returns:
- true if the check is required; false otherwise.
-
setCheckIfRequestIsSecure
public void setCheckIfRequestIsSecure(boolean checkIfRequestIsSecure)
Sets the checkIfRequestIsSecure property of this Container. Setting this property to true will check if the request is secure before adding Pragma and Cache-Control headers when proxy caching has been disabled.- Specified by:
setCheckIfRequestIsSecure
in interfaceContainer
- Parameters:
checkIfRequestIsSecure
- true if check is required, false otherwise
-
getRealm
public Realm getRealm()
Return the Realm with which this Container is associated. If there is no associated Realm, return the Realm associated with our parent Container (if any); otherwise returnnull
.
-
setRealm
public void setRealm(Realm realm)
Set the Realm with which this Container is associated.
-
getResources
public DirContext getResources()
Return the resources DirContext object with which this Container is associated. If there is no associated resources object, return the resources associated with our parent Container (if any); otherwise returnnull
.- Specified by:
getResources
in interfaceContainer
- Returns:
-
setResources
public void setResources(DirContext resources) throws Exception
Set the resources DirContext object with which this Container is associated.- Specified by:
setResources
in interfaceContainer
- Parameters:
resources
- The newly associated DirContext- Throws:
Exception
-
addChild
public void addChild(Container child)
Add a new child Container to those associated with this Container, if supported. Prior to adding this Container to the set of children, the child'ssetParent()
method must be called, with this Container as an argument. This method may thrown anIllegalArgumentException
if this Container chooses not to be attached to the specified Container, in which case it is not added- Specified by:
addChild
in interfaceContainer
- Parameters:
child
- New child Container to be added- Throws:
IllegalArgumentException
- if this exception is thrown by thesetParent()
method of the child ContainerIllegalArgumentException
- if the new child does not have a name unique from that of existing children of this ContainerIllegalStateException
- if this Container does not support child Containers
-
addContainerListener
public void addContainerListener(ContainerListener listener)
Add a container event listener to this component.- Specified by:
addContainerListener
in interfaceContainer
- Parameters:
listener
- The listener to add
-
addPropertyChangeListener
public void addPropertyChangeListener(PropertyChangeListener listener)
Add a property change listener to this component.- Specified by:
addPropertyChangeListener
in interfaceContainer
- Parameters:
listener
- The listener to add
-
findChild
public Container findChild(String name)
Return the child Container, associated with this Container, with the specified name (if any); otherwise, returnnull
-
findChildren
public Container[] findChildren()
Return the set of children Containers associated with this Container. If this Container has no children, a zero-length array is returned.- Specified by:
findChildren
in interfaceContainer
- Returns:
-
findContainerListeners
public ContainerListener[] findContainerListeners()
Return the set of container listeners associated with this Container. If this Container has no registered container listeners, a zero-length array is returned.- Specified by:
findContainerListeners
in interfaceContainer
- Returns:
-
invoke
public void invoke(Request request, Response response) throws IOException, jakarta.servlet.ServletException
Process the specified Request, to produce the corresponding Response, by invoking the first Valve in our pipeline (if any), or the basic Valve otherwise.- Specified by:
invoke
in interfaceContainer
- Specified by:
invoke
in interfacePipeline
- Parameters:
request
- Request to be processedresponse
- Response to be produced- Throws:
IllegalStateException
- if neither a pipeline or a basic Valve have been configured for this ContainerIOException
- if an input/output error occurred while processingjakarta.servlet.ServletException
- if a ServletException was thrown while processing this request
-
removeChild
public void removeChild(Container child)
Remove an existing child Container from association with this parent Container.This will also stop the child container.
- Specified by:
removeChild
in interfaceContainer
- Parameters:
child
- Existing child Container to be removed
-
removeContainerListener
public void removeContainerListener(ContainerListener listener)
Remove a container event listener from this component.- Specified by:
removeContainerListener
in interfaceContainer
- Parameters:
listener
- The listener to remove
-
removePropertyChangeListener
public void removePropertyChangeListener(PropertyChangeListener listener)
Remove a property change listener from this component.- Specified by:
removePropertyChangeListener
in interfaceContainer
- Parameters:
listener
- The listener to remove
-
addLifecycleListener
public void addLifecycleListener(LifecycleListener listener)
Add a lifecycle event listener to this component.- Specified by:
addLifecycleListener
in interfaceLifecycle
- Parameters:
listener
- The listener to add
-
findLifecycleListeners
public List<LifecycleListener> findLifecycleListeners()
Gets the (possibly empty) list of lifecycle listeners associated with this Container.- Specified by:
findLifecycleListeners
in interfaceLifecycle
- Returns:
-
removeLifecycleListener
public void removeLifecycleListener(LifecycleListener listener)
Removes the given lifecycle event listener from this Container.- Specified by:
removeLifecycleListener
in interfaceLifecycle
- Parameters:
listener
- The listener to remove
-
removeLifecycleListeners
public void removeLifecycleListeners()
Removes any lifecycle event listeners from this Container.
-
start
public void start() throws LifecycleException
Prepare for active use of the public methods of this Component.- Specified by:
start
in interfaceLifecycle
- Throws:
LifecycleException
- if this component detects a fatal error that prevents it from being started
-
stop
public void stop() throws LifecycleException
Gracefully shut down active use of the public methods of this Component.- Specified by:
stop
in interfaceLifecycle
- Throws:
LifecycleException
- if this component detects a fatal error that needs to be reported
-
init
public void init() throws Exception
Init method, part of the MBean lifecycle. If the container was added via JMX, it'll register itself with the parent, using the ObjectName conventions to locate the parent. If the container was added directly and it doesn't have an ObjectName, it'll create a name and register itself with the JMX console. On destroy(), the object will unregister.- Throws:
Exception
-
getParentName
public ObjectName getParentName() throws MalformedObjectNameException
Gets the name of the parent container- Returns:
- null if no parent
- Throws:
MalformedObjectNameException
-
destroy
public void destroy() throws Exception
Stops the component and any children and removes all listeners- Throws:
Exception
-
addValve
public void addValve(GlassFishValve valve)
Add a new Valve to the end of the pipeline associated with this Container. Prior to adding the Valve, the Valve'ssetContainer
method must be called, with this Container as an argument. The method may throw anIllegalArgumentException
if this Valve chooses not to be associated with this Container, orIllegalStateException
if it is already associated with a different Container.- Specified by:
addValve
in interfacePipeline
- Parameters:
valve
- Valve to be added- Throws:
IllegalArgumentException
- if this Container refused to accept the specified ValveIllegalArgumentException
- if the specified Valve refuses to be associated with this ContainerIllegalStateException
- if the specified Valve is already associated with a different Container
-
addValve
public void addValve(Valve valve)
Add Tomcat-style valve.
-
getValveObjectNames
public ObjectName[] getValveObjectNames()
Gets the name of all Tomcat valves- Returns:
- See Also:
ValveBase
-
getBasic
public GlassFishValve getBasic()
Return the Valve instance that has been distinguished as the basic Valve for this Pipeline (if any).
-
getValves
public GlassFishValve[] getValves()
Return the set of Valves in the pipeline associated with this Container, including the basic Valve (if any). If there are no such Valves, a zero-length array is returned.
-
hasNonBasicValves
public boolean hasNonBasicValves()
- Specified by:
hasNonBasicValves
in interfacePipeline
- Returns:
- true if this pipeline has any non basic valves, false otherwise
-
removeValve
public void removeValve(GlassFishValve valve)
Remove the specified Valve from the pipeline associated with this Container, if it is found; otherwise, do nothing.- Specified by:
removeValve
in interfacePipeline
- Parameters:
valve
- Valve to be removed
-
setBasic
public void setBasic(GlassFishValve valve)
Set the Valve instance that has been distinguished as the basic Valve for this Pipeline (if any). Prior to setting the basic Valve, the Valve's
setContainer()
will be called, if it implementsContained
, with the owning Container as an argument. The method may throw anIllegalArgumentException
if this Valve chooses not to be associated with this Container, orIllegalStateException
if it is already associated with a different Container.
-
backgroundProcess
public void backgroundProcess()
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.- Specified by:
backgroundProcess
in interfaceContainer
-
fireContainerEvent
public void fireContainerEvent(String type, Object data)
Notify all container event listeners that a particular event has occurred for this Container. The default implementation performs this notification synchronously using the calling thread.- Specified by:
fireContainerEvent
in interfaceContainer
- Parameters:
type
- Event typedata
- Event data
-
startChildren
protected void startChildren()
Starts the children of this container.
-
log
protected void log(String message)
Log the specified message to our current Logger (if any).- Parameters:
message
- Message to be logged
-
log
protected void log(String message, Throwable throwable)
Log the specified message and exception to our current Logger (if any).- Parameters:
message
- Message to be loggedthrowable
- Related exception
-
logName
protected String logName()
Return the abbreviated name of this container for logging messages- Returns:
-
getJmxName
public ObjectName getJmxName()
-
getObjectName
public String getObjectName()
-
getDomain
public String getDomain()
-
setDomain
public void setDomain(String domain)
-
getChildren
public ObjectName[] getChildren()
-
createObjectName
public ObjectName createObjectName(String domain, ObjectName parent) throws Exception
- Throws:
Exception
-
getContainerSuffix
public String getContainerSuffix()
-
threadStart
protected void threadStart()
Start the background thread that will periodically check for session timeouts.
-
threadStop
protected void threadStop()
Stop the background thread that is periodically checking for session timeouts.
-
-