package edu.harvard.econcs.turkserver.config; import java.util.List; import java.util.Map; import javax.servlet.GenericServlet; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.util.resource.Resource; import com.google.common.collect.ImmutableMap; import com.google.inject.AbstractModule; import com.google.inject.TypeLiteral; import com.google.inject.name.Names; import edu.harvard.econcs.turkserver.api.Configurator; import edu.harvard.econcs.turkserver.api.ExperimentController; import edu.harvard.econcs.turkserver.api.HITWorker; import edu.harvard.econcs.turkserver.api.HITWorkerGroup; import edu.harvard.econcs.turkserver.server.EventAnnotationManager; import edu.harvard.econcs.turkserver.server.ExperimentControllerImpl; import edu.harvard.econcs.turkserver.server.ExperimentScoped; import edu.harvard.econcs.turkserver.server.Experiments; import edu.harvard.econcs.turkserver.server.JettyCometD; import edu.harvard.econcs.turkserver.server.Lobby; import edu.harvard.econcs.turkserver.server.ReadyStateLobby; import edu.harvard.econcs.turkserver.server.ThreadLocalScope; import edu.harvard.econcs.turkserver.server.WorkerAuthenticator; public abstract class ServerModule extends AbstractModule { @Override protected void configure() { // Prevent unwanted initializations // binder().requireExplicitBindings(); // create thread-local scope for initializing experiments ThreadLocalScope scope = new ThreadLocalScope(); bindScope(ExperimentScoped.class, scope); bind(ThreadLocalScope.class).toInstance(scope); // Things will be JIT bound anyway, but required for explicit bindings bind(EventAnnotationManager.class); bind(Experiments.class); bind(JettyCometD.class); bind(WorkerAuthenticator.class); bind(Lobby.class).to(ReadyStateLobby.class); // bind(ExperimentLog.class).to(LogController.class); bind(ExperimentController.class).to(ExperimentControllerImpl.class); bind(HITWorker.class).toProvider(ThreadLocalScope.<HITWorker>seededKeyProvider()).in(ExperimentScoped.class); bind(HITWorkerGroup.class).toProvider(ThreadLocalScope.<HITWorkerGroup>seededKeyProvider()).in(ExperimentScoped.class); } protected void bindBoolean(String setting, boolean value) { bind(boolean.class).annotatedWith(Names.named(setting)).toInstance(value); } protected void bindInt(String setting, int value) { bind(int.class).annotatedWith(Names.named(setting)).toInstance(value); } protected void bindLong(String setting, long value) { bind(long.class).annotatedWith(Names.named(setting)).toInstance(value); } protected void bindDouble(String setting, double value) { bind(double.class).annotatedWith(Names.named(setting)).toInstance(value); } protected void bindString(String setting, String value) { bind(String.class).annotatedWith(Names.named(setting)).toInstance(value); } protected void bindExperimentClass(Class<?> beanClass) { // Explicit binding for experiment class // bind(beanClass); bind(new TypeLiteral<Class<?>>() {}). annotatedWith(Names.named(TSConfig.EXP_CLASS)).toInstance(beanClass); } protected void bindConfigurator(Configurator conf) { bind(Configurator.class).annotatedWith(Names.named(TSConfig.EXP_CONFIGURATOR)).toInstance(conf); } protected void bindResources(Resource[] rscs) { bind(Resource[].class).annotatedWith(Names.named(TSConfig.SERVER_RESOURCES)).toInstance(rscs); } protected void bindSpecialWorkers(List<String> specialWorkers) { bind(new TypeLiteral<List<String>>() {}) .annotatedWith(Names.named(TSConfig.EXP_SPECIAL_WORKERS)) .toInstance(specialWorkers); } protected void bindCustomHandlers(ImmutableMap<Handler, String> handlerMap) { bind(new TypeLiteral<Map<Handler, String>>() {}). annotatedWith(Names.named(TSConfig.SERVER_CUSTOM_HANDLERS)). toInstance(handlerMap); } protected void bindExtraServlets(ImmutableMap<Class<? extends GenericServlet>, String> servletMap) { bind(new TypeLiteral<Map<Class<? extends GenericServlet>, String>>() {}). annotatedWith(Names.named(TSConfig.SERVER_EXTRA_SERVLETS)). toInstance(servletMap); } }