package im.tox.upsourcebot; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.glassfish.jersey.linking.DeclarativeLinkingFeature; import org.kohsuke.github.GitHub; import org.skife.jdbi.v2.DBI; import java.util.List; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; import im.tox.upsourcebot.client.GitHubConnector; import im.tox.upsourcebot.filters.GitHubHMACFilter; import im.tox.upsourcebot.resources.GitHubWebhookResource; import io.dropwizard.Application; import io.dropwizard.assets.AssetsBundle; import io.dropwizard.db.DataSourceFactory; import io.dropwizard.java8.Java8Bundle; import io.dropwizard.java8.jdbi.DBIFactory; import io.dropwizard.jdbi.bundles.DBIExceptionsBundle; import io.dropwizard.migrations.MigrationsBundle; import io.dropwizard.setup.Bootstrap; import io.dropwizard.setup.Environment; import io.dropwizard.views.ViewBundle; public class UpsourceApplication extends Application<UpsourceConfiguration> { public static void main(String[] args) throws Exception { new UpsourceApplication().run(args); } @Override public void run(UpsourceConfiguration configuration, Environment environment) throws Exception { DBIFactory factory = new DBIFactory(); DBI jdbi = factory.build(environment, configuration.getDataSourceFactory(), "data-source"); GitHub gitHub = GitHub.connectUsingOAuth(configuration.getGitHubOAuthToken()); ImmutableMap.Builder<String, Repository> repositoryBuilder = ImmutableMap.builder(); ImmutableMap.Builder<String, ExecutorService> executorBuilder = ImmutableMap.builder(); configuration.getRepositories().forEach( repository -> { repositoryBuilder.put(repository.getFullName(), repository); executorBuilder.put(repository.getFullName(), Executors.newSingleThreadExecutor()); }); List<String> repoNames = configuration.getRepositories().stream().map(Repository::getFullName). collect(Collectors.toList()); GitHubConnector gitHubConnector = new GitHubConnector(gitHub, repositoryBuilder.build(), executorBuilder.build()); gitHubConnector.handleStartup(); GitHubWebhookResource gitHubWebhookResource = new GitHubWebhookResource(gitHubConnector, ImmutableList.copyOf(repoNames)); environment.jersey().register( gitHubWebhookResource); environment.jersey().register(new GitHubHMACFilter(configuration.getGitHubWebhookSecret())); //environment.jersey().register(new UserResource(jdbi.onDemand(UserDao.class))); environment.jersey().register(DeclarativeLinkingFeature.class); } @Override public String getName() { return "upsource-bot"; } @Override public void initialize(Bootstrap<UpsourceConfiguration> bootstrap) { bootstrap.addBundle(new MigrationsBundle<UpsourceConfiguration>() { @Override public DataSourceFactory getDataSourceFactory(UpsourceConfiguration configuration) { return configuration.getDataSourceFactory(); } }); bootstrap.addBundle(new Java8Bundle()); bootstrap.addBundle(new DBIExceptionsBundle()); bootstrap.addBundle(new ViewBundle<UpsourceConfiguration>() { @Override public ImmutableMap<String, ImmutableMap<String, String>> getViewConfiguration( UpsourceConfiguration configuration) { return ImmutableMap.of(); } }); bootstrap.addBundle(new AssetsBundle()); } }