Class FilterHandler
- java.lang.Object
-
- sunlabs.brazil.filter.FilterHandler
-
- All Implemented Interfaces:
Handler
public class FilterHandler extends java.lang.Object implements Handler
TheFilterHandler
captures the output of anotherHandler
and allows the ouput to be modified. One or moreFilters
may be specified to change that output before it is returned to the client.This handler provides one of the core services now associated with the Brazil Server: the ability to dynamically rewrite web content obtained from an arbitrary source.
For instance, the
FilterHandler
can be used as a proxy for a PDA. The wrappedHandler
would go to the web to obtain the requested pages on behalf of the PDA. Then, aFilter
would examine all "text/html" pages and rewrite the pages so they fit into the PDA's 200 pixel wide screen. AnotherFilter
would examine all requested images and dynamically dither them to reduce the wireless bandwidth consumed by the PDA.The following configuration parameters are used to initialize this
Handler
:- prefix, suffix, glob, match
- Specify the URL that triggers this handler.
(See
MatchString
). -
handler
- The name of the
Handler
whose output will be captured and then filtered. This is called the "wrapped handler". -
filters
- A list of
Filter
names. The filters are applied in the specified order to the output of the wrapped handler. -
exitOnError
- If set, the server's
initFailure
will set any of the filters fail to initialize. No handler prefix is required.
handler=filter port=8081 filter.class=sunlabs.brazil.filter.FilterHandler filter.handler=proxy filter.filters=noimg proxy.class=sunlabs.brazil.proxy.ProxyHandler noimg.class=sunlabs.brazil.filter.TemplateFilter noimg.template=sunlabs.brazil.template.NoImageTemplate
These parameters set up a proxy server running on port 8081. As with a normal proxy, this proxy server forwards all HTTP requests to the target machine, but it then examines all HTML pages before they are returned to the client and strips out all<img>
tags. By applying different filters, the developer could instead build a server- to automatically dither embedded images down to grayscale (instead of simply stripping them all out)
- to apply pattern recognition techniques to strip out only the advertisements
- to examine and change arbitrary URLs on the page
- to extract the content from an HTML page and dynamically combine it with another file to produce a different look-and-feel.
responnd
for a more detailed explaination.- Version:
- 2.3
- Author:
- Stephen Uhler (stephen.uhler@sun.com), Colin Stevens (colin.stevens@sun.com)
-
-
Constructor Summary
Constructors Constructor Description FilterHandler()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
init(Server server, java.lang.String prefix)
Start the handler and filter classes.boolean
respond(Request request)
Responds to an HTTP request by the forwarding the request to the wrappedHandler
and filtering the output of thatHandler
before sending the output to the client.
-
-
-
Method Detail
-
init
public boolean init(Server server, java.lang.String prefix)
Start the handler and filter classes.- Specified by:
init
in interfaceHandler
- Parameters:
server
- The HTTP server that created thisHandler
. TypicalHandler
s will useServer.props
to obtain run-time configuration information.prefix
- The handlers name. The string thisHandler
may prepend to all of the keys that it uses to extract configuration information fromServer.props
. This is set (by theServer
andChainHandler
) to help avoid configuration parameter namespace collisions.- Returns:
true
if thisHandler
initialized successfully,false
otherwise. Iffalse
is returned, thisHandler
should not be used.
-
respond
public boolean respond(Request request) throws java.io.IOException
Responds to an HTTP request by the forwarding the request to the wrappedHandler
and filtering the output of thatHandler
before sending the output to the client.At several stages, the
Filters
are given a chance to short-circuit this process:- Each
Filter
is given a chance to examine the request before it is sent to theHandler
by invoking its respond() method. TheFilter
may decide to change the request's properties. AFilter
may even return some content to the client now, by (callingrequest.sendResponse()
and returning true), in which case, neither theHandler
nor any furtherFilter
s are invoked at all. - Assuming the respond() methods of all the filters
returned false (which is normally the case),
the
handler's respond()
method is called, and is expected to generate content. If no content is generated at this step, this handler returns false. - After the
Handler
has generated the response headers, but before it has generated any content, eachFilter
is asked if it would be interested in filtering the content. If noFilter
is, then the subsequent content from theHandler
will be sent directly to the client. - On the other hand, if any
Filter
is interested in filtering the content, then the output of theHandler
will be sent to each of the interestedFilter
s in order. The output of each interestedFilter
is sent to the next one; the output of the finalFilter
is sent to the client. - At this point, any one of the invoked
Filter
s can decide to reject the content completely, instead of rewriting it.
Filter
for a description of how to cause filters to implement the various behaviors defined above.- Specified by:
respond
in interfaceHandler
- Parameters:
request
- The HTTP request to be forwarded to one of the sub-servers.- Returns:
true
if the request was handled and content was generated,false
otherwise.- Throws:
java.io.IOException
- if there was an I/O error while sending the response to the client.
- Each
-
-