package com.hubspot.blazar.data; import javax.inject.Singleton; import org.skife.jdbi.v2.DBI; import com.codahale.metrics.MetricRegistry; import com.google.inject.AbstractModule; import com.google.inject.Binder; import com.google.inject.Provides; import com.google.inject.Scopes; import com.hubspot.blazar.data.dao.BranchDao; import com.hubspot.blazar.data.dao.BranchSettingsDao; import com.hubspot.blazar.data.dao.DependenciesDao; import com.hubspot.blazar.data.dao.InstantMessageConfigurationDao; import com.hubspot.blazar.data.dao.InterProjectBuildDao; import com.hubspot.blazar.data.dao.InterProjectBuildMappingDao; import com.hubspot.blazar.data.dao.MalformedFileDao; import com.hubspot.blazar.data.dao.MetricsDao; import com.hubspot.blazar.data.dao.ModuleBuildDao; import com.hubspot.blazar.data.dao.ModuleDao; import com.hubspot.blazar.data.dao.QueueItemDao; import com.hubspot.blazar.data.dao.RepositoryBuildDao; import com.hubspot.blazar.data.dao.StateDao; import com.hubspot.guice.transactional.DataSourceLocator; import com.hubspot.guice.transactional.TransactionalDataSource; import com.hubspot.guice.transactional.TransactionalModule; import com.hubspot.guice.transactional.impl.DefaultDataSourceLocator; import io.dropwizard.db.DataSourceFactory; import io.dropwizard.db.ManagedDataSource; public class BlazarDaoModule extends AbstractModule { @Override protected void configure() { install(new TransactionalModule()); bind(DataSourceLocator.class).to(DefaultDataSourceLocator.class).in(Scopes.SINGLETON); bind(DBI.class).toProvider(DBIProvider.class).in(Scopes.SINGLETON); bindDao(binder(), BranchDao.class); bindDao(binder(), ModuleDao.class); bindDao(binder(), StateDao.class); bindDao(binder(), RepositoryBuildDao.class); bindDao(binder(), ModuleBuildDao.class); bindDao(binder(), DependenciesDao.class); bindDao(binder(), MalformedFileDao.class); bindDao(binder(), InstantMessageConfigurationDao.class); bindDao(binder(), InterProjectBuildDao.class); bindDao(binder(), InterProjectBuildMappingDao.class); bindDao(binder(), BranchSettingsDao.class); bindDao(binder(), MetricsDao.class); bindDao(binder(), QueueItemDao.class); } private static <T> void bindDao(Binder binder, Class<T> type) { binder.bind(type).toProvider(new DaoProvider<>(type)).in(Scopes.SINGLETON); } @Provides @Singleton public ManagedDataSource providesManagedDataSource(DataSourceFactory dataSourceFactory, MetricRegistry metricRegistry) throws ClassNotFoundException { return dataSourceFactory.build(metricRegistry, "db"); } @Provides @Singleton public TransactionalDataSource providesTransactionalDataSource(ManagedDataSource managedDataSource) { return new TransactionalDataSource(managedDataSource); } @Override public boolean equals(Object o) { return o != null && getClass().equals(o.getClass()); } @Override public int hashCode() { return getClass().hashCode(); } }