Use inject replications state logger

As we have a generic interface for a replication state listener
we are moving the state logging to Slf4J into an injected 
singleton to make the code decoupled with the actual state
notification mechanism.

Change-Id: Idd890ae6786dff2a96a71a96079dc0d8b33c64cf
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java b/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java
index 6b1687c..2c946a5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java
@@ -44,12 +44,14 @@
   private final GitRepositoryManager gitRepositoryManager;
   private final GroupBackend groupBackend;
   private final WorkQueue workQueue;
+  private final ReplicationStateListener stateLog;
 
   @Inject
   public AutoReloadConfigDecorator(Injector injector, SitePaths site,
       RemoteSiteUser.Factory ruf, PluginUser pu,
       GitRepositoryManager grm, GroupBackend gb,
-      WorkQueue workQueue) throws ConfigInvalidException,
+      WorkQueue workQueue,
+      ReplicationStateListener stateLog) throws ConfigInvalidException,
       IOException {
     this.injector = injector;
     this.site = site;
@@ -60,6 +62,7 @@
     this.currentConfig = loadConfig();
     this.currentConfigTs = getLastModified(currentConfig);
     this.workQueue = workQueue;
+    this.stateLog = stateLog;
   }
 
   private static long getLastModified(ReplicationFileBasedConfig cfg) {
@@ -70,7 +73,7 @@
       throws ConfigInvalidException, IOException {
     return new ReplicationFileBasedConfig(injector, site,
         remoteSiteUserFactory, pluginUser, gitRepositoryManager,
-        groupBackend);
+        groupBackend, stateLog);
   }
 
   private synchronized boolean isAutoReload() {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
index a175285..4a760c0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
@@ -65,8 +65,7 @@
 
 class Destination {
   private static final Logger repLog = ReplicationQueue.repLog;
-  private static final ReplicationStateLogger stateLog =
-      new ReplicationStateLogger(repLog);
+  private final ReplicationStateListener stateLog;
 
   private final int poolThreads;
   private final String poolName;
@@ -100,9 +99,12 @@
       final RemoteSiteUser.Factory replicationUserFactory,
       final PluginUser pluginUser,
       final GitRepositoryManager gitRepositoryManager,
-      final GroupBackend groupBackend) {
+      final GroupBackend groupBackend,
+      final ReplicationStateListener stateLog) {
     remote = rc;
     gitManager = gitRepositoryManager;
+    this.stateLog = stateLog;
+
     delay = Math.max(0, getInt(rc, cfg, "replicationdelay", 15));
     retryDelay = Math.max(0, getInt(rc, cfg, "replicationretry", 1));
     lockErrorMaxRetries = cfg.getInt("replication", "lockErrorMaxRetries", 0);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java b/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java
index c6ad873..5ff4035 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushAll.java
@@ -25,8 +25,7 @@
 import java.util.concurrent.TimeUnit;
 
 class PushAll implements Runnable {
-  private static final ReplicationStateLogger stateLog =
-      new ReplicationStateLogger(ReplicationQueue.repLog);
+  private final ReplicationStateListener stateLog;
 
   interface Factory {
     PushAll create(String urlMatch,
@@ -45,12 +44,14 @@
   PushAll(WorkQueue wq,
       ProjectCache projectCache,
       ReplicationQueue rq,
+      ReplicationStateListener stateLog,
       @Assisted @Nullable String urlMatch,
       @Assisted ReplicationFilter filter,
       @Assisted ReplicationState state) {
     this.workQueue = wq;
     this.projectCache = projectCache;
     this.replication = rq;
+    this.stateLog = stateLog;
     this.urlMatch = urlMatch;
     this.filter = filter;
     this.state = state;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
index 32ffcbd..4bbb191 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/PushOne.java
@@ -80,8 +80,7 @@
  * take that lock to ensure they are working with a current view of the object.
  */
 class PushOne implements ProjectRunnable {
-  private static final ReplicationStateListener stateLog =
-      new ReplicationStateLogger(repLog);
+  private final ReplicationStateListener stateLog;
   static final String ALL_REFS = "..all..";
   static final String ID_MDC_KEY = "pushOneId";
 
@@ -124,6 +123,7 @@
       final ChangeCache cc,
       final ReplicationQueue rq,
       final IdGenerator ig,
+      final ReplicationStateListener sl,
       @Assisted final Project.NameKey d,
       @Assisted final URIish u) {
     gitManager = grm;
@@ -140,6 +140,7 @@
     lockRetryCount = 0;
     maxLockRetries = pool.getLockErrorMaxRetries();
     id = ig.next();
+    stateLog = sl;
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
index c360f75..01ced63 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
@@ -55,12 +55,14 @@
   private final GitRepositoryManager gitRepositoryManager;
   private final GroupBackend groupBackend;
   private final FileBasedConfig config;
+  private final ReplicationStateListener stateLog;
 
   @Inject
   public ReplicationFileBasedConfig(final Injector injector, final SitePaths site,
       final RemoteSiteUser.Factory ruf, final PluginUser pu,
       final GitRepositoryManager grm,
-      final GroupBackend gb) throws ConfigInvalidException, IOException {
+      final GroupBackend gb,
+      final ReplicationStateListener stateLog) throws ConfigInvalidException, IOException {
     this.cfgPath = site.etc_dir.resolve("replication.config");
     this.injector = injector;
     this.replicationUserFactory = ruf;
@@ -69,6 +71,7 @@
     this.groupBackend = gb;
     this.config = new FileBasedConfig(cfgPath.toFile(), FS.DETECTED);
     this.destinations = allDestinations();
+    this.stateLog = stateLog;
   }
 
   /*
@@ -159,7 +162,7 @@
 
       Destination destination =
           new Destination(injector, c, config, replicationUserFactory,
-              pluginUser, gitRepositoryManager, groupBackend);
+              pluginUser, gitRepositoryManager, groupBackend, stateLog);
 
       if (!destination.isSingleProjectMatch()) {
         for (URIish u : c.getURIs()) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
index b9575b9..a426e89 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
@@ -62,6 +62,7 @@
     install(new FactoryModuleBuilder().build(RemoteSiteUser.Factory.class));
 
     bind(ReplicationConfig.class).to(AutoReloadConfigDecorator.class);
+    bind(ReplicationStateListener.class).to(ReplicationStateLogger.class);
 
     EventTypes.registerClass(new RefReplicatedEvent(null, null, null, SUCCEEDED));
     EventTypes.registerClass(new RefReplicationDoneEvent(null, null, 0));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
index e010131..6e75ca0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationQueue.java
@@ -63,8 +63,8 @@
   static final String REPLICATION_LOG_NAME = "replication_log";
   static final Logger repLog = LoggerFactory.getLogger(REPLICATION_LOG_NAME);
   private static final int SSH_REMOTE_TIMEOUT = 120 * 1000;
-  private static final ReplicationStateListener stateLog =
-      new ReplicationStateLogger(repLog);
+
+  private final ReplicationStateListener stateLog;
 
   static String replaceName(String in, String name, boolean keyIsOptional) {
     String key = "${name}";
@@ -85,12 +85,16 @@
   private volatile boolean running;
 
   @Inject
-  ReplicationQueue(final WorkQueue wq, final ReplicationConfig rc,
-      final SchemaFactory<ReviewDb> db, final EventDispatcher dis) {
+  ReplicationQueue(final WorkQueue wq,
+      final ReplicationConfig rc,
+      final SchemaFactory<ReviewDb> db,
+      final EventDispatcher dis,
+      final ReplicationStateListener sl) {
     workQueue = wq;
     database = db;
     dispatcher = dis;
     config = rc;
+    stateLog = sl;
   }
 
   @Override
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java
index a1bc5a4..0a59ad3 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationStateLogger.java
@@ -14,7 +14,9 @@
 
 package com.googlesource.gerrit.plugins.replication;
 
-import org.slf4j.Logger;
+import static com.googlesource.gerrit.plugins.replication.ReplicationQueue.repLog;
+
+import com.google.inject.Singleton;
 
 /**
  * Wrapper around a Logger that also logs out the replication state.
@@ -24,30 +26,25 @@
  * and logs additional information about the replication state to the
  * stderr console.
  */
-public class ReplicationStateLogger implements ReplicationStateListener {
-
-  private final Logger logger;
-
-  public ReplicationStateLogger(Logger logger) {
-    this.logger = logger;
-  }
+@Singleton
+class ReplicationStateLogger implements ReplicationStateListener {
 
   @Override
   public void warn(String msg, ReplicationState... states) {
     stateWriteErr("Warning: " + msg, states);
-    logger.warn(msg);
+    repLog.warn(msg);
   }
 
   @Override
   public void error(String msg, ReplicationState... states) {
     stateWriteErr("Error: " + msg, states);
-    logger.error(msg);
+    repLog.error(msg);
   }
 
   @Override
   public void error(String msg, Throwable t, ReplicationState... states) {
     stateWriteErr("Error: " + msg, states);
-    logger.error(msg, t);
+    repLog.error(msg, t);
   }
 
   private void stateWriteErr(String msg, ReplicationState[] states) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/StartCommand.java b/src/main/java/com/googlesource/gerrit/plugins/replication/StartCommand.java
index 17a2df9..be5242e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/StartCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/StartCommand.java
@@ -23,8 +23,6 @@
 
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -35,8 +33,9 @@
 @RequiresCapability(StartReplicationCapability.START_REPLICATION)
 @CommandMetaData(name = "start", description = "Start replication for specific project or all projects")
 final class StartCommand extends SshCommand {
-  private static final Logger log = LoggerFactory.getLogger(StartCommand.class);
-  private static final ReplicationStateLogger stateLog = new ReplicationStateLogger(log);
+  @Inject
+  private ReplicationStateLogger stateLog;
+
   @Option(name = "--all", usage = "push all known projects")
   private boolean all;