Only collect stats for enabled repositories

Currently stats are collected for all the repositories.
Allow collection only for the enabled repositories.

Bug: Issue 15972
Change-Id: Ifd638f97cdac401cea4a6dbdc554992810f88e76
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java
index fa00623..dfabe10 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCache.java
@@ -82,4 +82,8 @@
   public static String getMetricName(String metricName, String projectName) {
     return String.format("%s_%s", metricName, projectName).toLowerCase(Locale.ROOT);
   }
+
+  public boolean shouldCollectStats(String projectName) {
+    return projects.stream().anyMatch(p -> p.equals(projectName));
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoUpdateListener.java
index ad970b5..1411c61 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoUpdateListener.java
@@ -23,19 +23,27 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
   private final ExecutorService executor;
   private final UpdateGitMetricsTask.Factory updateGitMetricsTaskFactory;
+  private GitRepoMetricsCache gitRepoMetricsCache;
 
   @Inject
   GitRepoUpdateListener(
       @UpdateGitMetricsExecutor ExecutorService executor,
-      UpdateGitMetricsTask.Factory updateGitMetricsTaskFactory) {
+      UpdateGitMetricsTask.Factory updateGitMetricsTaskFactory,
+      GitRepoMetricsCache gitRepoMetricsCache) {
     this.executor = executor;
     this.updateGitMetricsTaskFactory = updateGitMetricsTaskFactory;
+    this.gitRepoMetricsCache = gitRepoMetricsCache;
   }
 
   @Override
   public void onGitReferenceUpdated(Event event) {
     String projectName = event.getProjectName();
     logger.atFine().log("Got an update for project %s", projectName);
+
+    if (!gitRepoMetricsCache.shouldCollectStats(projectName)) {
+      return;
+    }
+
     UpdateGitMetricsTask updateGitMetricsTask = updateGitMetricsTaskFactory.create(projectName);
     executor.execute(updateGitMetricsTask);
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java
index c2e4a4e..7a3cf5a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheTest.java
@@ -22,16 +22,23 @@
 import com.googlesource.gerrit.plugins.gitrepometrics.collectors.GitStats;
 import java.io.IOException;
 import java.util.Collections;
+import org.junit.Before;
 import org.junit.Test;
 
 public class GitRepoMetricsCacheTest {
   GitRepoMetricsCache gitRepoMetricsCacheModule;
   GitRepoMetricsConfig gitRepoMetricsConfig;
   FakeMetricMaker fakeMetricMaker;
+  private ConfigSetupUtils configSetupUtils;
+  private final String enabledRepo = "enabledRepo";
+
+  @Before
+  public void setupRepo() throws IOException {
+    configSetupUtils = new ConfigSetupUtils(Collections.singletonList(enabledRepo));
+  }
 
   @Test
   public void shouldRegisterMetrics() throws IOException {
-    ConfigSetupUtils configSetupUtils = new ConfigSetupUtils(Collections.singletonList("repo1"));
     gitRepoMetricsConfig = configSetupUtils.getGitRepoMetricsConfig();
     fakeMetricMaker = new FakeMetricMaker();
     gitRepoMetricsCacheModule = new GitRepoMetricsCache(fakeMetricMaker, gitRepoMetricsConfig);
@@ -39,6 +46,25 @@
     assertThat(fakeMetricMaker.callsCounter).isEqualTo(GitStats.availableMetrics().size());
   }
 
+  @Test
+  public void shouldCollectStatsForEnabledRepo() throws IOException {
+    gitRepoMetricsConfig = configSetupUtils.getGitRepoMetricsConfig();
+    gitRepoMetricsCacheModule =
+        new GitRepoMetricsCache(new FakeMetricMaker(), gitRepoMetricsConfig);
+
+    assertThat(gitRepoMetricsCacheModule.shouldCollectStats(enabledRepo)).isTrue();
+  }
+
+  @Test
+  public void shouldNotCollectStatsForDisabledRepo() throws IOException {
+    String disabledRepo = "disabledRepo";
+    gitRepoMetricsConfig = configSetupUtils.getGitRepoMetricsConfig();
+    gitRepoMetricsCacheModule =
+        new GitRepoMetricsCache(new FakeMetricMaker(), gitRepoMetricsConfig);
+
+    assertThat(gitRepoMetricsCacheModule.shouldCollectStats(disabledRepo)).isFalse();
+  }
+
   private class FakeMetricMaker extends DisabledMetricMaker {
     Integer callsCounter;
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitUpdateListenerTest.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitUpdateListenerTest.java
index 1975e8c..0747b23 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitUpdateListenerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitUpdateListenerTest.java
@@ -24,6 +24,7 @@
 import com.google.gerrit.extensions.api.changes.NotifyHandling;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.events.GitReferenceUpdatedListener;
+import com.google.gerrit.metrics.DisabledMetricMaker;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.testing.InMemoryModule;
 import com.google.gerrit.testing.InMemoryRepositoryManager;
@@ -33,6 +34,7 @@
 import com.google.inject.Injector;
 import com.google.inject.TypeLiteral;
 import java.io.IOException;
+import java.util.Collections;
 import java.util.concurrent.ExecutorService;
 import org.eclipse.jgit.lib.Repository;
 import org.junit.Before;
@@ -48,11 +50,21 @@
   private Repository repository;
   ArgumentCaptor<UpdateGitMetricsTask> valueCapture =
       ArgumentCaptor.forClass(UpdateGitMetricsTask.class);
+  private GitRepoMetricsCache gitRepoMetricsCache;
+
+  private final String disabledProject = "disabledProject";
+  private final Project.NameKey disabledProjectNameKey = Project.nameKey(disabledProject);
+  private Repository disabledRepository;
 
   @Inject private UpdateGitMetricsTask.Factory updateGitMetricsTaskFactory;
 
   @Before
   public void setupRepo() throws IOException {
+    ConfigSetupUtils configSetupUtils =
+        new ConfigSetupUtils(Collections.singletonList(testProject));
+    gitRepoMetricsCache =
+        new GitRepoMetricsCache(
+            new DisabledMetricMaker(), configSetupUtils.getGitRepoMetricsConfig());
 
     AbstractModule m =
         new AbstractModule() {
@@ -63,6 +75,7 @@
             bind(new TypeLiteral<String>() {})
                 .annotatedWith(PluginName.class)
                 .toInstance(ConfigSetupUtils.pluginName);
+            bind(GitRepoMetricsCache.class).toInstance(gitRepoMetricsCache);
           }
         };
     Injector injector = Guice.createInjector(m);
@@ -70,12 +83,14 @@
 
     reset(mockedExecutorService);
     gitRepoUpdateListener =
-        new GitRepoUpdateListener(mockedExecutorService, updateGitMetricsTaskFactory);
+        new GitRepoUpdateListener(
+            mockedExecutorService, updateGitMetricsTaskFactory, gitRepoMetricsCache);
     repository = repoManager.createRepository(testProjectNameKey);
+    disabledRepository = repoManager.createRepository(disabledProjectNameKey);
   }
 
   @Test
-  public void shouldUpdateMetrics() {
+  public void shouldUpdateMetricsIfProjectIsEnabled() {
     doNothing().when(mockedExecutorService).execute(valueCapture.capture());
     gitRepoUpdateListener.onGitReferenceUpdated(new TestEvent(testProject));
     UpdateGitMetricsTask expectedUpdateGitMetricsTask =