Abstract implementation of the
Container interface, providing common
functionality required by nearly every implementation. Classes extending
this base class must implement
getInfo()
, and may implement
a replacement for
invoke()
.
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 a
Valve
, and configure this
Valve into the pipeline by calling
setBasic()
.
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 with
addContainerListener()
:
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. |
Subclasses that fire additional events should document them in the
class comments of the implementation class.
backgroundProcessorDelay
protected int backgroundProcessorDelay
The processor delay for this component.
children
protected HashMap children
The child Containers belonging to this Container, keyed by name.
cluster
protected Cluster cluster
The cluster with which this Container is associated.
controller
protected ObjectName controller
debug
protected int debug
The debugging detail level for this component.
domain
protected String domain
initialized
protected boolean initialized
lifecycle
protected LifecycleSupport lifecycle
The lifecycle event support for this component.
listeners
protected ArrayList listeners
The container event listeners for this Container.
loader
protected Loader loader
The Loader implementation with which this Container is associated.
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.
mserver
protected MBeanServer mserver
name
protected String name
The human-readable name of this Container.
oname
protected ObjectName oname
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.
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.
sm
protected static StringManager sm
The string manager for this package.
started
protected boolean started
Has this component been started?
suffix
protected String suffix
support
protected PropertyChangeSupport support
The property change support for this component.
type
protected String type
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's setParent()
method must be called, with this
Container as an argument. This method may thrown an
IllegalArgumentException
if this Container chooses not
to be attached to the specified Container, in which case it is not added
- addChild in interface Container
child
- New child Container to be added
addPropertyChangeListener
public void addPropertyChangeListener(PropertyChangeListener listener)
Add a property change listener to this component.
- addPropertyChangeListener in interface Container
listener
- The listener to add
addValve
public void addValve(Valve valve)
Add a new Valve to the end of the pipeline associated with this
Container. Prior to adding the Valve, the Valve's
setContainer
method must be called, with this Container
as an argument. The method may throw an
IllegalArgumentException
if this Valve chooses not to
be associated with this Container, or IllegalStateException
if it is already associated with a different Container.
- addValve in interface Pipeline
valve
- Valve to be added
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.
- backgroundProcess in interface Container
createObjectName
public ObjectName createObjectName(String domain,
ObjectName parent)
throws Exception
destroy
public void destroy()
throws Exception
findChild
public Container findChild(String name)
Return the child Container, associated with this Container, with
the specified name (if any); otherwise, return null
- findChild in interface Container
name
- Name of the child Container to be retrieved
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.
- findChildren in interface Container
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.
- findContainerListeners in interface Container
findLifecycleListeners
public LifecycleListener[] findLifecycleListeners()
Get the lifecycle listeners associated with this lifecycle. If this
Lifecycle has no listeners registered, a zero-length array is returned.
- findLifecycleListeners in interface Lifecycle
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.
type
- Event typedata
- Event data
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.
- getBackgroundProcessorDelay in interface Container
getBasic
public Valve getBasic()
Return the Valve instance that has been distinguished as the basic
Valve for this Pipeline (if any).
- getBasic in interface Pipeline
getChildren
public ObjectName[] getChildren()
getCluster
public Cluster getCluster()
Return the Cluster with which this Container is associated. If there is
no associated Cluster, return the Cluster associated with our parent
Container (if any); otherwise return null
.
- getCluster in interface Container
getContainerSuffix
public String getContainerSuffix()
getDebug
public int getDebug()
Return the debugging detail level for this component.
getDomain
public String getDomain()
getInfo
public String getInfo()
Return descriptive information about this Container implementation and
the corresponding version number, in the format
<description>/<version>
.
- getInfo in interface Container
getJSR77Suffix
protected String getJSR77Suffix()
getJmxName
public ObjectName getJmxName()
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, return null
.
- getLoader in interface Container
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 return null
.
- getLogger in interface Container
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 return null
.
- getManager in interface Container
getMappingObject
public Object getMappingObject()
Return an object which may be utilized for mapping to this component.
- getMappingObject in interface Container
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.
- getName in interface Container
getObjectName
public String getObjectName()
getParent
public Container getParent()
Return the Container for which this Container is a child, if there is
one. If there is no defined parent, return null
.
- getParent in interface 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.
- getParentClassLoader in interface Container
getParentName
public ObjectName getParentName()
throws MalformedObjectNameException
getPipeline
public Pipeline getPipeline()
Return the Pipeline object that manages the Valves associated with
this Container.
- getPipeline in interface Container
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 return null
.
- getRealm in interface Container
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
return null
.
- getResources in interface Container
getType
public String getType()
getValveObjectNames
public ObjectName[] getValveObjectNames()
getValves
public Valve[] 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.
- getValves in interface Pipeline
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.
invoke
public final void invoke(Request request,
Response response)
throws IOException,
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.
- invoke in interface Container
- invoke in interface Pipeline
request
- Request to be processedresponse
- Response to be produced
log
protected void log(String message)
Log the specified message to our current Logger (if any).
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).
message
- Message to be loggedthrowable
- Related exception
logName
protected String logName()
Return the abbreviated name of this container for logging messsages
postDeregister
public void postDeregister()
postRegister
public void postRegister(Boolean registrationDone)
preDeregister
public void preDeregister()
throws Exception
preRegister
public ObjectName preRegister(MBeanServer server,
ObjectName name)
throws Exception
removeChild
public void removeChild(Container child)
Remove an existing child Container from association with this parent
Container.
- removeChild in interface Container
child
- Existing child Container to be removed
removePropertyChangeListener
public void removePropertyChangeListener(PropertyChangeListener listener)
Remove a property change listener from this component.
- removePropertyChangeListener in interface Container
listener
- The listener to remove
removeValve
public void removeValve(Valve valve)
Remove the specified Valve from the pipeline associated with this
Container, if it is found; otherwise, do nothing.
- removeValve in interface Pipeline
valve
- Valve to be removed
setBackgroundProcessorDelay
public void setBackgroundProcessorDelay(int delay)
Set the delay between the invocation of the execute method on this
container and its children.
- setBackgroundProcessorDelay in interface Container
delay
- The delay in seconds between the invocation of
backgroundProcess methods
setBasic
public void setBasic(Valve valve)
Set the Valve instance that has been distinguished as the basic
Valve for this Pipeline (if any). Prioer to setting the basic Valve,
the Valve's setContainer()
will be called, if it
implements Contained
, with the owning Container as an
argument. The method may throw an IllegalArgumentException
if this Valve chooses not to be associated with this Container, or
IllegalStateException
if it is already associated with
a different Container.
- setBasic in interface Pipeline
valve
- Valve to be distinguished as the basic Valve
setCluster
public void setCluster(Cluster cluster)
Set the Cluster with which this Container is associated.
- setCluster in interface Container
cluster
- The newly associated Cluster
setDebug
public void setDebug(int debug)
Set the debugging detail level for this component.
debug
- The new debugging detail level
setDomain
public void setDomain(String domain)
setLoader
public void setLoader(Loader loader)
Set the Loader with which this Container is associated.
- setLoader in interface Container
loader
- The newly associated loader
setLogger
public void setLogger(Logger logger)
Set the Logger with which this Container is associated.
- setLogger in interface Container
logger
- The newly associated Logger
setManager
public void setManager(Manager manager)
Set the Manager with which this Container is associated.
- setManager in interface Container
manager
- The newly associated Manager
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.
- setName in interface Container
name
- New name of this container
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.
- setParent in interface Container
container
- Container to which this Container is being added
as a child
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.
- setParentClassLoader in interface Container
parent
- The new parent class loader
setRealm
public void setRealm(Realm realm)
Set the Realm with which this Container is associated.
- setRealm in interface Container
realm
- The newly associated Realm
setResources
public void setResources(DirContext resources)
Set the resources DirContext object with which this Container is
associated.
- setResources in interface Container
resources
- The newly associated DirContext
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.