package edu.uw.zookeeper.netty.server;
import java.net.SocketAddress;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.Channel;
import edu.uw.zookeeper.common.Factory;
import edu.uw.zookeeper.common.ParameterizedFactory;
import edu.uw.zookeeper.common.RuntimeModule;
import edu.uw.zookeeper.net.Codec;
import edu.uw.zookeeper.net.CodecConnection;
import edu.uw.zookeeper.net.Connection;
import edu.uw.zookeeper.net.NetServerModule;
import edu.uw.zookeeper.net.ServerConnectionFactory;
import edu.uw.zookeeper.netty.ChannelCodecConnection;
import edu.uw.zookeeper.netty.ChannelServerConnectionFactory;
public class NettyServerModule implements NetServerModule {
public static NettyServerModule newInstance(
RuntimeModule runtime) {
ParameterizedFactory<SocketAddress, ServerBootstrap> bootstrapFactory =
NioServerBootstrapFactory.ParameterizedDecorator.newInstance(
NioServerBootstrapFactory.newInstance(runtime.getThreadFactory(), runtime.getServiceMonitor()));
return newInstance(bootstrapFactory);
}
public static NettyServerModule newInstance(
ParameterizedFactory<SocketAddress, ServerBootstrap> bootstrapFactory) {
return new NettyServerModule(bootstrapFactory);
}
protected final ParameterizedFactory<SocketAddress, ServerBootstrap> bootstrapFactory;
public NettyServerModule(
ParameterizedFactory<SocketAddress, ServerBootstrap> bootstrapFactory) {
this.bootstrapFactory = bootstrapFactory;
}
@Override
public <I, O, T extends Codec<I,O,? extends I,? extends O>, C extends Connection<?,?,?>> ParameterizedFactory<SocketAddress, ? extends ServerConnectionFactory<C>> getServerConnectionFactory(
Factory<? extends T> codecFactory,
ParameterizedFactory<CodecConnection<I,O,T,?>, C> connectionFactory) {
ParameterizedFactory<Channel, C> factory =
ChannelCodecConnection.factory(codecFactory, connectionFactory);
return ChannelServerConnectionFactory.factory(factory, bootstrapFactory);
}
}