The AddOn abstraction provides a simple and generic way how to extend existing HttpServer functionality. The interface looks very simple:
/**
* The {@link HttpServer} addon interface, responsible for adding
* features like WebSockets, Comet to HttpServer.
*/
public interface AddOn {
/**
* The method, which will be invoked by {@link HttpServer} in order to
* initialize the AddOn on the passed {@link NetworkListener}.
* Most of the time the AddOn implementation will update the passed
* {@link NetworkListener}'s {@link FilterChainBuilder} by adding custom
* {@link Filter}(s), which implement AddOn's logic.
*
* @param networkListener the {@link NetworkListener} the addon is being
* initialized on.
* @param builder the {@link FilterChainBuilder},
* representing the {@link NetworkListener} logic.
*/
public void setup(NetworkListener networkListener,
FilterChainBuilder builder);
}So basically custom AddOn should implement only one method, and most of the time AddOn just inserts a custom logic Filter into the given FilterChainBuilder. Here is example of WebSocketAddOn:
/**
* WebSockets {@link AddOn} for the {@link org.glassfish.grizzly.http.server.HttpServer}.
*/
public class WebSocketAddOn implements AddOn {
@Override
public void setup(final NetworkListener networkListener,
final FilterChainBuilder builder) {
// Get the index of HttpCodecFilter in the HttpServer filter chain
final int httpCodecFilterIdx = builder.indexOfType(HttpCodecFilter.class);
if (httpCodecFilterIdx >= 0) {
// Insert the WebSocketFilter right after HttpCodecFilter
builder.add(httpCodecFilterIdx + 1, new WebSocketFilter());
}
}
}