package org.webpieces.webserver.impl;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import javax.inject.Named;
import javax.inject.Singleton;
import org.webpieces.data.api.BufferCreationPool;
import org.webpieces.data.api.BufferPool;
import org.webpieces.frontend.api.HttpFrontendFactory;
import org.webpieces.frontend.api.HttpFrontendManager;
import org.webpieces.nio.api.SSLEngineFactory;
import org.webpieces.templating.api.RouterLookup;
import org.webpieces.templating.api.ConverterLookup;
import org.webpieces.util.threading.NamedThreadFactory;
import org.webpieces.webserver.api.WebServer;
import org.webpieces.webserver.api.WebServerConfig;
import com.google.inject.Binder;
import com.google.inject.Module;
import com.google.inject.Provides;
import com.google.inject.util.Providers;
public class WebServerModule implements Module {
public static final String FILE_READ_EXECUTOR = "fileReadExecutor";
private WebServerConfig config;
public WebServerModule(WebServerConfig config) {
this.config = config;
}
@Override
public void configure(Binder binder) {
if(config.getSslEngineFactory() == null)
binder.bind(SSLEngineFactory.class).toProvider(Providers.of(null));
else
binder.bind(SSLEngineFactory.class).toInstance(config.getSslEngineFactory());
binder.bind(WebServer.class).to(WebServerImpl.class);
binder.bind(WebServerConfig.class).toInstance(config);
binder.bind(RouterLookup.class).to(RouterLookupProxy.class).asEagerSingleton();
binder.bind(ConverterLookup.class).to(ConverterLookupProxy.class).asEagerSingleton();
}
@Provides
@Singleton
@Named(FILE_READ_EXECUTOR)
public ExecutorService provideExecutor() {
return Executors.newFixedThreadPool(10, new NamedThreadFactory("fileReadCallbacks"));
}
@Provides
@Singleton
public ScheduledExecutorService provideTimer() {
return new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("webpieces-timer"));
}
@Provides
@Singleton
public BufferPool createBufferPool() {
BufferCreationPool pool = new BufferCreationPool();
return pool;
}
@Provides
@Singleton
public HttpFrontendManager providesAsyncServerMgr(WebServerConfig config, BufferPool pool, ScheduledExecutorService timer) {
return HttpFrontendFactory.createFrontEnd("httpFrontEnd", config.getNumFrontendServerThreads(), timer, pool);
}
}