package org.jboss.resteasy.plugins.server.netty;
import org.jboss.netty.channel.ChannelHandler;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.handler.codec.http.HttpChunkAggregator;
import org.jboss.netty.handler.codec.http.HttpRequestDecoder;
import org.jboss.netty.handler.codec.http.HttpResponseEncoder;
import org.jboss.netty.handler.execution.ExecutionHandler;
import org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor;
import org.jboss.resteasy.plugins.server.netty.RestEasyHttpRequestDecoder.Protocol;
import java.util.List;
import static org.jboss.netty.channel.Channels.pipeline;
/**
* The {@link ChannelPipelineFactory} which is used to serve HTTP Traffic.
*
*
* @author <a href="http://www.jboss.org/netty/">The Netty Project</a>
* @author Andy Taylor (andy.taylor@jboss.org)
* @author <a href="http://gleamynode.net/">Trustin Lee</a>
* @author Norman Maurer
* @version $Rev: 2080 $, $Date: 2010-01-26 18:04:19 +0900 (Tue, 26 Jan 2010) $
*/
public class HttpServerPipelineFactory implements ChannelPipelineFactory
{
private final ChannelHandler resteasyEncoder;
private final ChannelHandler resteasyDecoder;
private final ChannelHandler resteasyRequestHandler;
private final ChannelHandler executionHandler;
private final List<ChannelHandler> additionalChannelHandlers;
private final int maxRequestSize;
public HttpServerPipelineFactory(RequestDispatcher dispatcher, String root, int executorThreadCount, int maxRequestSize, boolean isKeepAlive, List<ChannelHandler> additionalChannelHandlers)
{
this.resteasyDecoder = new RestEasyHttpRequestDecoder(dispatcher.getDispatcher(), root, getProtocol(), isKeepAlive);
this.resteasyEncoder = new RestEasyHttpResponseEncoder(dispatcher);
this.resteasyRequestHandler = new RequestHandler(dispatcher);
if (executorThreadCount > 0)
{
this.executionHandler = new ExecutionHandler(new OrderedMemoryAwareThreadPoolExecutor(executorThreadCount, 0L, 0L));
}
else
{
this.executionHandler = null;
}
this.maxRequestSize = maxRequestSize;
this.additionalChannelHandlers = additionalChannelHandlers;
}
@Override
public ChannelPipeline getPipeline() throws Exception
{
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
// Add custom channel handlers
for (ChannelHandler channelHandler : additionalChannelHandlers) {
pipeline.addLast(channelHandler.getClass().getSimpleName(), channelHandler);
}
pipeline.addLast("decoder", new HttpRequestDecoder());
pipeline.addLast("aggregator", new HttpChunkAggregator(maxRequestSize));
pipeline.addLast("resteasyDecoder", resteasyDecoder);
pipeline.addLast("encoder", new HttpResponseEncoder());
pipeline.addLast("resteasyEncoder", resteasyEncoder);
if (executionHandler != null) {
pipeline.addLast("executionHandler", executionHandler);
}
pipeline.addLast("handler", resteasyRequestHandler);
return pipeline;
}
protected Protocol getProtocol() {
return Protocol.HTTP;
}
}