package org.webpieces.asyncserver.impl;
import org.webpieces.asyncserver.api.AsyncConfig;
import org.webpieces.asyncserver.api.AsyncServer;
import org.webpieces.asyncserver.api.AsyncServerManager;
import org.webpieces.nio.api.ChannelManager;
import org.webpieces.nio.api.SSLEngineFactory;
import org.webpieces.nio.api.channels.TCPServerChannel;
import org.webpieces.nio.api.handlers.AsyncDataListener;
public class AsyncServerManagerImpl implements AsyncServerManager {
private ChannelManager channelManager;
public AsyncServerManagerImpl(ChannelManager channelManager) {
this.channelManager = channelManager;
}
@Override
public AsyncServer createTcpServer(
AsyncConfig config, AsyncDataListener listener, SSLEngineFactory sslFactory) {
if(sslFactory == null)
throw new IllegalArgumentException("SSLEngineFactory is null but must be supplied");
return createTcpServerImpl(config, listener, sslFactory);
}
private AsyncServer createTcpServerImpl(AsyncConfig config,
AsyncDataListener listener, SSLEngineFactory sslFactory) {
String id = config.id;
ConnectedChannels connectedChannels = new ConnectedChannels();
ProxyDataListener proxyListener = new ProxyDataListener(connectedChannels, listener);
DefaultConnectionListener connectionListener = new DefaultConnectionListener(connectedChannels, proxyListener);
TCPServerChannel serverChannel;
if(sslFactory != null)
serverChannel = channelManager.createTCPServerChannel(id, connectionListener, sslFactory);
else
serverChannel = channelManager.createTCPServerChannel(id, connectionListener);
//MUST be called before bind...
serverChannel.setReuseAddress(true);
serverChannel.configure(config.functionToConfigureBeforeBind);
return new AsyncServerImpl(serverChannel, connectionListener, proxyListener);
}
@Override
public AsyncServer createTcpServer(AsyncConfig config, AsyncDataListener listener) {
return createTcpServerImpl(config, listener, null);
}
}