Standard implementation of a processing Pipeline that will invoke
a series of Valves that have been configured to be called in order. This
implementation can be used for any type of Container.
IMPLEMENTATION WARNING - This implementation assumes that no
calls to addValve() or removeValve are allowed
while a request is currently being processed. Otherwise, the mechanism
by which per-thread state is maintained will need to be modified.

setBasic

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.

addValve

Add a new Valve to the end of the pipeline associated with this
Container. Prior to adding the Valve, the Valve's
setContainer() method 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.

getValveObjectNames

removeValve

Remove the specified Valve from the pipeline associated with this
Container, if it is found; otherwise, do nothing. If the Valve is
found and removed, the Valve's setContainer(null) method
will be called if it implements Contained.