package com.hubspot.blazar.guice; import com.google.inject.Binder; import com.google.inject.Module; import com.google.inject.multibindings.Multibinder; import com.hubspot.blazar.base.visitor.InterProjectBuildVisitor; import com.hubspot.blazar.base.visitor.ModuleBuildVisitor; import com.hubspot.blazar.base.visitor.RepositoryBuildVisitor; import com.hubspot.blazar.visitor.modulebuild.BuildContainerKiller; import com.hubspot.blazar.visitor.BuildEventDispatcher; import com.hubspot.blazar.visitor.repositorybuild.CancelledRepositoryBuildVisitor; import com.hubspot.blazar.visitor.repositorybuild.CompletedRepositoryBuildVisitor; import com.hubspot.blazar.visitor.modulebuild.DownstreamModuleBuildCanceller; import com.hubspot.blazar.visitor.modulebuild.DownstreamModuleBuildVisitor; import com.hubspot.blazar.visitor.repositorybuild.GitHubStatusVisitor; import com.hubspot.blazar.visitor.InterProjectBuildHandler; import com.hubspot.blazar.visitor.modulebuild.InterProjectModuleBuildVisitor; import com.hubspot.blazar.visitor.repositorybuild.InterProjectRepositoryBuildVisitor; import com.hubspot.blazar.visitor.repositorybuild.LaunchingRepositoryBuildVisitor; import com.hubspot.blazar.visitor.modulebuild.QueuedModuleBuildVisitor; import com.hubspot.blazar.visitor.repositorybuild.QueuedRepositoryBuildVisitor; import com.hubspot.blazar.visitor.modulebuild.RepositoryBuildCompleter; /** * Binds all visitors except Slack Visitors which are bound in the BlazarSlackModule */ public class BuildVisitorModule implements Module { @Override public void configure(Binder binder) { binder.bind(BuildEventDispatcher.class); Multibinder<RepositoryBuildVisitor> repositoryBuildVisitors = Multibinder.newSetBinder(binder, RepositoryBuildVisitor.class); // launch the queued build if nothing in progress repositoryBuildVisitors.addBinding().to(QueuedRepositoryBuildVisitor.class); // queue builds for the affected modules repositoryBuildVisitors.addBinding().to(LaunchingRepositoryBuildVisitor.class); // cancel module builds repositoryBuildVisitors.addBinding().to(CancelledRepositoryBuildVisitor.class); // post event for queued repository build if present repositoryBuildVisitors.addBinding().to(CompletedRepositoryBuildVisitor.class); // update GitHub status repositoryBuildVisitors.addBinding().to(GitHubStatusVisitor.class); // Make note of launched module Builds for IPR builds repositoryBuildVisitors.addBinding().to(InterProjectRepositoryBuildVisitor.class); Multibinder<ModuleBuildVisitor> moduleBuildVisitors = Multibinder.newSetBinder(binder, ModuleBuildVisitor.class); // launch the queued build if nothing upstream moduleBuildVisitors.addBinding().to(QueuedModuleBuildVisitor.class); // launch downstream builds if all upstreams succeeded moduleBuildVisitors.addBinding().to(DownstreamModuleBuildVisitor.class); // kill the singularity task moduleBuildVisitors.addBinding().to(BuildContainerKiller.class); // cancel all downstream builds moduleBuildVisitors.addBinding().to(DownstreamModuleBuildCanceller.class); // complete the repository build once all of the module builds have finished moduleBuildVisitors.addBinding().to(RepositoryBuildCompleter.class); // launch interProjectChildren for completed Modules moduleBuildVisitors.addBinding().to(InterProjectModuleBuildVisitor.class); Multibinder<InterProjectBuildVisitor> interProjectBuildVisitors = Multibinder.newSetBinder(binder, InterProjectBuildVisitor.class); interProjectBuildVisitors.addBinding().to(InterProjectBuildHandler.class); } }