package com.voxeo.rayo.client.internal;
import java.net.InetSocketAddress;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.Channel;
import org.jboss.netty.channel.ChannelFactory;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.group.ChannelGroup;
import org.jboss.netty.channel.group.DefaultChannelGroup;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
import org.jboss.netty.handler.codec.string.StringDecoder;
import org.jboss.netty.handler.codec.string.StringEncoder;
public class NettyServer {
private NettyServerHandler nettyServerHandler;
private ChannelGroup group;
private ChannelFactory factory;
private static Map<Integer, NettyServer> servers = new ConcurrentHashMap<Integer, NettyServer>();
public void assertReceived(String message) {
nettyServerHandler.assertReceived(message);
}
public void sendRayoOffer() {
nettyServerHandler.sendRayoOffer();
}
public static NettyServer newInstance(int port) throws Exception {
NettyServer server = servers.get(port);
if (server == null) {
server = new NettyServer(port);
servers.put(port, server);
}
server.resetState();
return server;
}
private NettyServer(int port) throws Exception {
nettyServerHandler = new NettyServerHandler();
group = new DefaultChannelGroup("myServer");
factory =
new NioServerSocketChannelFactory(
Executors.newCachedThreadPool(),
Executors.newCachedThreadPool());
ServerBootstrap bootstrap = new ServerBootstrap(factory);
bootstrap.setOption("child.tcpNoDelay", true);
bootstrap.setOption("child.keepAlive", true);
bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
@Override
public ChannelPipeline getPipeline() throws Exception {
ChannelPipeline pipeline = Channels.pipeline();
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
pipeline.addLast("handler", nettyServerHandler);
return pipeline;
}
});
Channel channel = bootstrap.bind(new InetSocketAddress(port));
group.add(channel);
}
public void shutdown() {
if (group != null) {
group.close().awaitUninterruptibly();
}
if (factory != null) {
factory.releaseExternalResources();
}
}
public static void shutdownAllInstances() {
for (NettyServer server: servers.values()) {
server.shutdown();
}
}
public void resetState() {
nettyServerHandler.resetState();
}
}