sunlabs.brazil.server

Class ChainHandler

public class ChainHandler extends Object implements Handler

Allows multiple handlers to be invoked sequentially for a single HTTP request. A list of handlers is supplied when this ChainHandler is initialized. When an HTTP request is received by this ChainHandler, each of the handlers from the list is called in turn until one of them responds and returns true.

A useful trick is that some handlers can be run by a ChainHandler for their side effects. The handler can modify the Request object and then return false; the next handler in the list will get a crack at the modified request.

The following configuration parameters eare used to initialize this Handler:

handlers
A list of Handler names that will be invoked in the given order to handle the request. These are considered the "wrapped" handlers. These handlers will all be initialized at startup by {@link #init}. For each name in the list, the property name.class is examined to determine which class to use for this handler. Then name is used as the prefix in the handler's init() method.
report
If set, this property will be set to the name of the handler that handled the request (e.g. returned true).
exitOnError
If set, the server's initFailure will set any of the handlers fail to initialize. No handler prefix is required.
prefix, suffix, glob, match
Specify the URL that triggers this handler.

Version: 2.5

Author: Stephen Uhler (stephen.uhler@sun.com) Colin Stevens (colin.stevens@sun.com)

See Also:

Field Summary
booleanexitOnError
A flag to require the successfull initialization of all handlers.
Handler[]handlers
The array of handlers that will be invoked to handle the request.
MatchStringisMine
The URL that must match for this handler to run
String[]names
The names of the above handlers as specified by the configuration parameters.
Stringprefix
The prefix used to initialize this ChainHandler, used for logging.
Stringreport
The name (if any) of the property to receive the name of the handler that handled the request.
Method Summary
booleaninit(Server server, String prefix)
Initializes this ChainHandler by initializing all the "wrapped" handlers in the list of handlers.
static HandlerinitHandler(Server server, String prefix, String name)
Helper function that allocates and initializes a new Handler, given its name.
booleanrespond(Request request)
Calls each of the Handlers in turn until one of them returns true.

Field Detail

exitOnError

public boolean exitOnError
A flag to require the successfull initialization of all handlers.

handlers

public Handler[] handlers
The array of handlers that will be invoked to handle the request.

isMine

public MatchString isMine
The URL that must match for this handler to run

names

public String[] names
The names of the above handlers as specified by the configuration parameters. Used for logging the names of each Handler as it is invoked.

prefix

public String prefix
The prefix used to initialize this ChainHandler, used for logging.

report

public String report
The name (if any) of the property to receive the name of the handler that handled the request.

Method Detail

init

public boolean init(Server server, String prefix)
Initializes this ChainHandler by initializing all the "wrapped" handlers in the list of handlers. If a wrapped handler cannot be initialized, this method logs a message and skips it. If no handlers were specified, or no handlers were successfully initialized, then the initialization of this ChainHandler is considered to have failed.

Parameters: server The HTTP server that created this ChainHandler. prefix The prefix for this ChainHandler's properties.

Returns: true if at least one of the wrapped handlers was successfully initialized.

initHandler

public static Handler initHandler(Server server, String prefix, String name)
Helper function that allocates and initializes a new Handler, given its name. In addition to the ChainHandler, several other handlers contain embedded Handlers -- this method can be used to initialize those embedded Handlers.

If there is an error initializing the specified Handler, this method will log a dignostic message to the server and return null. This happens if the specified class cannot be found or instantiated, if the specified class is not actually a Handler, if the Handler.init method returns false, or if there is any other exception.

Parameters: server The server that will own the new Handler. Mainly used for the server's properties, which contain the configuration parameters for the new handler. prefix The prefix in the server's properties for the new Handler's configuration parameters. The prefix is prepended to the configuation parameters used by the Handler. name The name of the new Handler. The name can be one of two forms:

  1. The name of the Java class for the Handler. This Handler will be initialized using the prefix specified above.
  2. A symbolic name. The configuration parameter name.class is the name of the Java class for the Handler. The above prefix will be ignored and this Handler will be initialized with the prefix "name." (the symbolic name followed by a ".").

Returns: The newly allocated Handler, or null if the Handler could not be allocated.

respond

public boolean respond(Request request)
Calls each of the Handlers in turn until one of them returns true.

Parameters: request The HTTP request.

Returns: true if one of the Handlers returns true, false otherwise.

Throws: IOException if one of the Handlers throws an IOException while responding.