package edu.uw.zookeeper.netty.server;
import java.net.SocketAddress;
import java.util.concurrent.ThreadFactory;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import edu.uw.zookeeper.common.DefaultsFactory;
import edu.uw.zookeeper.common.Factory;
import edu.uw.zookeeper.common.ParameterizedFactory;
import edu.uw.zookeeper.common.Reference;
import edu.uw.zookeeper.common.ServiceMonitor;
import edu.uw.zookeeper.netty.DaemonThreadFactory;
import edu.uw.zookeeper.netty.EventLoopGroupService;
import edu.uw.zookeeper.netty.NioEventLoopGroupFactory;
public class NioServerBootstrapFactory implements Factory<ServerBootstrap> {
public static class ParameterizedDecorator implements DefaultsFactory<SocketAddress, ServerBootstrap> {
public static ParameterizedDecorator newInstance(Factory<ServerBootstrap> delegate) {
return new ParameterizedDecorator(delegate);
}
private final Factory<ServerBootstrap> delegate;
private ParameterizedDecorator(Factory<ServerBootstrap> delegate) {
this.delegate = delegate;
}
@Override
public ServerBootstrap get() {
return delegate.get();
}
@Override
public ServerBootstrap get(SocketAddress value) {
return get().localAddress(value);
}
}
public static NioServerBootstrapFactory newInstance(
Factory<ThreadFactory> threadFactory,
ServiceMonitor serviceMonitor) {
ThreadFactory threads = DaemonThreadFactory.getInstance().get(threadFactory.get());
Reference<? extends EventLoopGroup> groupFactory = EventLoopGroupService.factory(
NioEventLoopGroupFactory.DEFAULT,
serviceMonitor).get(threads);
return newInstance(groupFactory);
}
public static NioServerBootstrapFactory newInstance(
Factory<? extends EventLoopGroup> groupFactory) {
return new NioServerBootstrapFactory(groupFactory);
}
protected final Factory<? extends EventLoopGroup> groupFactory;
protected final ParameterizedFactory<Factory<? extends EventLoopGroup>, ServerBootstrap> bootstrapFactory;
protected NioServerBootstrapFactory(
Factory<? extends EventLoopGroup> groupFactory) {
this.groupFactory = groupFactory;
this.bootstrapFactory = SimpleServerBootstrapFactory.newInstance(
NioServerSocketChannel.class,
ServerTcpChannelOptionsFactory.getClient(),
ServerTcpChannelOptionsFactory.getServer());
}
@Override
public ServerBootstrap get() {
return bootstrapFactory.get(groupFactory);
}
}