package com.tacitknowledge.slowlight.proxyserver.server; import com.tacitknowledge.slowlight.proxyserver.config.ServerConfig; import io.netty.bootstrap.ServerBootstrap; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class defines an abstract server representation providing the implementation for server method like start, stop, etc. * * @author Alexandr Donciu (adonciu@tacitknowledge.com) */ public abstract class AbstractServer implements Server { private static final Logger LOG = LoggerFactory.getLogger(AbstractServer.class); protected static final String PARAM_CONNECTION_THREADS = "connectionThreads"; protected static final String PARAM_WORKER_THREADS = "workerThreads"; protected final ServerConfig serverConfig; public AbstractServer(final ServerConfig serverConfig) { this.serverConfig = serverConfig; } @Override public void start() { ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(createEventLoopGroup(PARAM_CONNECTION_THREADS), createEventLoopGroup(PARAM_WORKER_THREADS)); serverBootstrap.channel(NioServerSocketChannel.class); serverBootstrap.childHandler(createChannelInitializer()); serverBootstrap.childOption(ChannelOption.AUTO_READ, false); serverBootstrap.bind(serverConfig.getLocalPort()); LOG.info("Started {} server [{}] listening on port [{}]. Server parameters [{}]", serverConfig.getType(), serverConfig.getId(), serverConfig.getLocalPort(), serverConfig.getParams()); } @Override public void shutdown() { // TODO: to be implemented } protected EventLoopGroup createEventLoopGroup(final String numberOfThreadsParam) { final String numberOfThreads = serverConfig.getParam(numberOfThreadsParam, false); Integer numberOfThreadsValue = (numberOfThreads != null ? Integer.valueOf(numberOfThreads) : null); if (numberOfThreadsValue == null || numberOfThreadsValue <= 0) { numberOfThreadsValue = 0; } return new NioEventLoopGroup(numberOfThreadsValue); } protected abstract ChannelInitializer createChannelInitializer(); }