package org.jboss.pitbull.server;
import org.jboss.pitbull.internal.crypto.KeyTools;
import org.jboss.pitbull.internal.nio.http.HttpConnector;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import java.security.KeyStore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @author <a href="mailto:bill@burkecentral.com">Bill Burke</a>
* @version $Revision: 1 $
*/
public class HttpServerBuilder<T extends HttpServerBuilder, Z extends HttpServer>
{
private int workers = 1;
private int maxRequestThreads = 1;
private HttpServer server = create();
public class ConnectorBuilder
{
private int port = -1;
private boolean enableHttps;
private KeyStore keyStore;
private String keyStorePassword;
public ConnectorBuilder port(int port)
{
this.port = port;
return this;
}
public ConnectorBuilder https()
{
enableHttps = true;
return this;
}
public ConnectorBuilder https(KeyStore keyStore, String password)
{
enableHttps = true;
this.keyStore = keyStore;
return this;
}
public T add() throws Exception
{
HttpConnector connector = new HttpConnector();
connector.setPort(port);
if (enableHttps)
{
KeyManagerFactory kmf = null;
if (keyStore == null)
{
try
{
keyStore = KeyTools.generateKeyStore();
kmf = KeyManagerFactory.getInstance("SunX509");
keyStore = KeyTools.generateKeyStore();
kmf.init(keyStore, new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'});
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
else
{
kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(keyStore, keyStorePassword.toCharArray());
}
// Initialize the SSLContext to work with our key managers.
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);
// Initialize the SSLContext to work with our key managers.
SSLContext serverContext = SSLContext.getInstance("TLS");
serverContext.init(kmf.getKeyManagers(), null, null);
connector.setSslContext(serverContext);
}
server.getConnectors().add(connector);
return (T) HttpServerBuilder.this;
}
}
public ConnectorBuilder connector()
{
return new ConnectorBuilder();
}
public T workers(int workers)
{
this.workers = workers;
return (T) this;
}
public T maxRequestThreads(int max)
{
this.maxRequestThreads = max;
return (T) this;
}
protected HttpServer create()
{
return new HttpServer();
}
public Z build()
{
server.setNumWorkers(workers);
ExecutorService acceptorExecutor = Executors.newCachedThreadPool();
ExecutorService requestExecutor = Executors.newFixedThreadPool(maxRequestThreads);
ExecutorService workerExecutor = Executors.newFixedThreadPool(workers);
server.setAcceptorExecutor(acceptorExecutor);
server.setRequestExecutor(requestExecutor);
server.setWorkerExecutor(workerExecutor);
return (Z) server;
}
}