Encapsulate implementation details of RepoSizeCache

Change-Id: I51e5353521fe7e2c879ca8b04971deeaaf19e647
Signed-off-by: Adrian Görler <adrian.goerler@sap.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/MaxRepositorySizeQuota.java b/src/main/java/com/googlesource/gerrit/plugins/quota/MaxRepositorySizeQuota.java
index 3d42aa4..d5c9e6c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/MaxRepositorySizeQuota.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/MaxRepositorySizeQuota.java
@@ -48,7 +48,7 @@
 import java.util.concurrent.atomic.AtomicLong;
 
 @Singleton
-class MaxRepositorySizeQuota implements ReceivePackInitializer, PostReceiveHook {
+class MaxRepositorySizeQuota implements ReceivePackInitializer, PostReceiveHook, RepoSizeCache {
   private static final Logger log = LoggerFactory
       .getLogger(MaxRepositorySizeQuota.class);
 
@@ -60,6 +60,7 @@
         persist(REPO_SIZE_CACHE, Project.NameKey.class, AtomicLong.class)
             .loader(Loader.class)
             .expireAfterWrite(1, TimeUnit.DAYS);
+        bind(RepoSizeCache.class).to(MaxRepositorySizeQuota.class);
       }
     };
   }
@@ -173,4 +174,14 @@
       return size.longValue();
     }
   }
+
+  @Override
+  public long get(Project.NameKey p) {
+    try {
+      return cache.get(p).get();
+    } catch (ExecutionException e) {
+      log.warn("Error creating RepoSizeEvent", e);
+      return 0;
+    }
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/Publisher.java b/src/main/java/com/googlesource/gerrit/plugins/quota/Publisher.java
index b68e080..26637f8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/quota/Publisher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/Publisher.java
@@ -14,14 +14,12 @@
 
 package com.googlesource.gerrit.plugins.quota;
 
-import com.google.common.cache.LoadingCache;
 import com.google.gerrit.extensions.events.UsageDataPublishedListener;
 import com.google.gerrit.extensions.events.UsageDataPublishedListener.Data;
 import com.google.gerrit.extensions.events.UsageDataPublishedListener.Event;
 import com.google.gerrit.extensions.events.UsageDataPublishedListener.MetaData;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -33,8 +31,6 @@
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.atomic.AtomicLong;
 
 @Singleton
 public class Publisher implements Runnable {
@@ -51,7 +47,7 @@
 
   private final Iterable<UsageDataPublishedListener> listeners;
   private final ProjectCache projectCache;
-  private final LoadingCache<NameKey, AtomicLong> repoSizeCache;
+  private final RepoSizeCache repoSizeCache;
   private final PersistentCounter fetchCounts;
   private final PersistentCounter pushCounts;
 
@@ -59,7 +55,7 @@
   public Publisher(
       DynamicSet<UsageDataPublishedListener> listeners,
       ProjectCache projectCache,
-      @Named(MaxRepositorySizeQuota.REPO_SIZE_CACHE) LoadingCache<Project.NameKey, AtomicLong> repoSizeCache,
+      RepoSizeCache repoSizeCache,
       @Named(PersistentCounter.FETCH) PersistentCounter fetchCounts,
       @Named(PersistentCounter.PUSH) PersistentCounter pushCounts) {
     this.listeners = listeners;
@@ -75,29 +71,27 @@
       return;
     }
 
-    try {
-      UsageDataEvent repoSizeEvent = createRepoSizeEvent();
-      UsageDataEvent fetchCountEvent = createEvent(FETCH_COUNT, fetchCounts);
-      UsageDataEvent pushCountEvent = createEvent(PUSH_COUNT, pushCounts);
-      for (UsageDataPublishedListener l : listeners) {
-          try {
-            l.onUsageDataPublished(repoSizeEvent);
-            l.onUsageDataPublished(pushCountEvent);
-            l.onUsageDataPublished(fetchCountEvent);
-          } catch (RuntimeException e) {
-            log.warn("Failure in UsageDataPublishedListener", e);
-          }
+    UsageDataEvent repoSizeEvent = createRepoSizeEvent();
+    UsageDataEvent fetchCountEvent = createEvent(FETCH_COUNT, fetchCounts);
+    UsageDataEvent pushCountEvent = createEvent(PUSH_COUNT, pushCounts);
+    for (UsageDataPublishedListener l : listeners) {
+      try {
+        l.onUsageDataPublished(repoSizeEvent);
+        l.onUsageDataPublished(pushCountEvent);
+        l.onUsageDataPublished(fetchCountEvent);
+      } catch (RuntimeException e) {
+        log.warn("Failure in UsageDataPublishedListener", e);
       }
-    } catch (ExecutionException e) {
-      log.warn("Error creating RepoSizeEvent", e);
     }
   }
 
-  private UsageDataEvent createRepoSizeEvent() throws ExecutionException {
+  private UsageDataEvent createRepoSizeEvent() {
     UsageDataEvent event = new UsageDataEvent(REPO_SIZE);
     for (Project.NameKey p : projectCache.all()) {
-        long size = repoSizeCache.get(p).get();
+      long size = repoSizeCache.get(p);
+      if (size > 0) {
         event.addData(size, p.get());
+      }
     }
     return event;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/quota/RepoSizeCache.java b/src/main/java/com/googlesource/gerrit/plugins/quota/RepoSizeCache.java
new file mode 100644
index 0000000..697c61e
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/quota/RepoSizeCache.java
@@ -0,0 +1,22 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.quota;
+
+import com.google.gerrit.reviewdb.client.Project;
+
+public interface RepoSizeCache {
+
+  long get(Project.NameKey p);
+}