Merge "Replace DestinationFactory with Guice generated Factory and assisted injection"
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 0b35379..53f56a7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/AutoReloadConfigDecorator.java
@@ -39,7 +39,7 @@
   private long lastFailedConfigTs;
 
   private final SitePaths site;
-  private final DestinationFactory destinationFactory;
+  private final Destination.Factory destinationFactory;
   private final Path pluginDataDir;
   // Use Provider<> instead of injecting the ReplicationQueue because of circular dependency with
   // ReplicationConfig
@@ -48,7 +48,7 @@
   @Inject
   public AutoReloadConfigDecorator(
       SitePaths site,
-      DestinationFactory destinationFactory,
+      Destination.Factory destinationFactory,
       Provider<ReplicationQueue> replicationQueue,
       @PluginData Path pluginDataDir)
       throws ConfigInvalidException, IOException {
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 ef269eb..46484d0 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/Destination.java
@@ -51,10 +51,12 @@
 import com.google.gerrit.server.project.ProjectCache;
 import com.google.gerrit.server.project.ProjectState;
 import com.google.gerrit.server.util.RequestContext;
+import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Provider;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
+import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.FactoryModuleBuilder;
 import com.google.inject.servlet.RequestScoped;
 import com.googlesource.gerrit.plugins.replication.ReplicationState.RefPushResult;
@@ -81,6 +83,11 @@
 
 public class Destination {
   private static final Logger repLog = ReplicationQueue.repLog;
+
+  public interface Factory {
+    Destination create(DestinationConfiguration config);
+  }
+
   private final ReplicationStateListener stateLog;
   private final Object stateLock = new Object();
   private final Map<URIish, PushOne> pending = new HashMap<>();
@@ -113,9 +120,9 @@
     }
   }
 
+  @Inject
   protected Destination(
       Injector injector,
-      DestinationConfiguration cfg,
       RemoteSiteUser.Factory replicationUserFactory,
       PluginUser pluginUser,
       GitRepositoryManager gitRepositoryManager,
@@ -125,15 +132,15 @@
       GroupBackend groupBackend,
       ReplicationStateListener stateLog,
       GroupIncludeCache groupIncludeCache,
-      DynamicItem<EventDispatcher> eventDispatcher) {
-    config = cfg;
+      DynamicItem<EventDispatcher> eventDispatcher,
+      @Assisted DestinationConfiguration cfg) {
     this.eventDispatcher = eventDispatcher;
     gitManager = gitRepositoryManager;
     this.permissionBackend = permissionBackend;
     this.userProvider = userProvider;
     this.projectCache = projectCache;
     this.stateLog = stateLog;
-
+    config = cfg;
     CurrentUser remoteUser;
     if (!cfg.getAuthGroupNames().isEmpty()) {
       ImmutableSet.Builder<AccountGroup.UUID> builder = ImmutableSet.builder();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationFactory.java b/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationFactory.java
deleted file mode 100644
index 5e41e12..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/DestinationFactory.java
+++ /dev/null
@@ -1,86 +0,0 @@
-// Copyright (C) 2016 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.replication;
-
-import com.google.gerrit.extensions.registration.DynamicItem;
-import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.PluginUser;
-import com.google.gerrit.server.account.GroupBackend;
-import com.google.gerrit.server.account.GroupIncludeCache;
-import com.google.gerrit.server.events.EventDispatcher;
-import com.google.gerrit.server.git.GitRepositoryManager;
-import com.google.gerrit.server.permissions.PermissionBackend;
-import com.google.gerrit.server.project.ProjectCache;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-
-@Singleton
-public class DestinationFactory {
-  private final Injector injector;
-  private final RemoteSiteUser.Factory replicationUserFactory;
-  private final PluginUser pluginUser;
-  private final GitRepositoryManager gitRepositoryManager;
-  private final PermissionBackend permissionBackend;
-  private final Provider<CurrentUser> userProvider;
-  private final ProjectCache projectCache;
-  private final GroupBackend groupBackend;
-  private final ReplicationStateListener stateLog;
-  private final GroupIncludeCache groupIncludeCache;
-  private final DynamicItem<EventDispatcher> eventDispatcher;
-
-  @Inject
-  public DestinationFactory(
-      Injector injector,
-      RemoteSiteUser.Factory replicationUserFactory,
-      PluginUser pluginUser,
-      GitRepositoryManager gitRepositoryManager,
-      PermissionBackend permissionBackend,
-      Provider<CurrentUser> userProvider,
-      ProjectCache projectCache,
-      GroupBackend groupBackend,
-      ReplicationStateListener stateLog,
-      GroupIncludeCache groupIncludeCache,
-      DynamicItem<EventDispatcher> eventDispatcher) {
-    this.injector = injector;
-    this.replicationUserFactory = replicationUserFactory;
-    this.pluginUser = pluginUser;
-    this.gitRepositoryManager = gitRepositoryManager;
-    this.permissionBackend = permissionBackend;
-    this.userProvider = userProvider;
-    this.projectCache = projectCache;
-    this.groupBackend = groupBackend;
-    this.stateLog = stateLog;
-    this.groupIncludeCache = groupIncludeCache;
-    this.eventDispatcher = eventDispatcher;
-  }
-
-  Destination create(DestinationConfiguration config) {
-    return new Destination(
-        injector,
-        config,
-        replicationUserFactory,
-        pluginUser,
-        gitRepositoryManager,
-        permissionBackend,
-        userProvider,
-        projectCache,
-        groupBackend,
-        stateLog,
-        groupIncludeCache,
-        eventDispatcher);
-  }
-}
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 8e0ecf0..64eacf9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationFileBasedConfig.java
@@ -64,7 +64,7 @@
 
   @Inject
   public ReplicationFileBasedConfig(
-      SitePaths site, DestinationFactory destinationFactory, @PluginData Path pluginDataDir)
+      SitePaths site, Destination.Factory destinationFactory, @PluginData Path pluginDataDir)
       throws ConfigInvalidException, IOException {
     this.site = site;
     this.cfgPath = site.etc_dir.resolve("replication.config");
@@ -97,7 +97,7 @@
     return destinations.stream().filter(Objects::nonNull).filter(filter).collect(toList());
   }
 
-  private List<Destination> allDestinations(DestinationFactory destinationFactory)
+  private List<Destination> allDestinations(Destination.Factory destinationFactory)
       throws ConfigInvalidException, IOException {
     if (!config.getFile().exists()) {
       logger.atWarning().log("Config file %s does not exist; not replicating", config.getFile());
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 5a73268..b0a0e75 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/replication/ReplicationModule.java
@@ -33,7 +33,7 @@
 class ReplicationModule extends AbstractModule {
   @Override
   protected void configure() {
-    bind(DestinationFactory.class).in(Scopes.SINGLETON);
+    install(new FactoryModuleBuilder().build(Destination.Factory.class));
     bind(ReplicationQueue.class).in(Scopes.SINGLETON);
     bind(LifecycleListener.class)
         .annotatedWith(UniqueAnnotations.create())