Refactor: Convert HookArgs to use guava Factory interface

Instead of injecting all of the HookArgs dependencies into the
HookFactory and then explicitly passing them into the HookArgs
constructor, inject the dependencies into HookArgs itself and let
it be created using the guava Factory interface.

This allows to remove several injected members from HookFactory
that were only necessary for creation of HookArgs. Having these
members only in HookArgs, where they are actually used, is cleaner.

Change-Id: I56fa559d37c625c5c2c7e36e3ec58d3dd5f19462
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookArgs.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookArgs.java
index cea53e5..e3febaa 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookArgs.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookArgs.java
@@ -25,12 +25,17 @@
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.inject.Inject;
 import com.google.inject.Provider;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 class HookArgs {
+  interface Factory {
+    HookArgs create();
+  }
+
   final IdentifiedUser.GenericFactory identifiedUserFactory;
   final Provider<String> urlProvider;
   final HookMetrics metrics;
@@ -39,6 +44,7 @@
 
   private final List<String> args;
 
+  @Inject
   HookArgs(
       IdentifiedUser.GenericFactory identifiedUserFactory,
       Provider<String> urlProvider,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java
index 2969358..ab4a615 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/HookFactory.java
@@ -16,14 +16,9 @@
 
 import static com.google.common.base.MoreObjects.firstNonNull;
 
-import com.google.gerrit.common.Nullable;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.config.CanonicalWebUrl;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.SitePaths;
-import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -34,31 +29,20 @@
   private final HookQueue queue;
   private final HookExecutor syncHookExecutor;
   private final Config config;
-  private final IdentifiedUser.GenericFactory identifiedUserFactory;
-  private final HookMetrics metrics;
-  private final Provider<String> urlProvider;
   private final Path hooksPath;
-  private final GitRepositoryManager gitManager;
-  private final SitePaths sitePaths;
+  private final HookArgs.Factory argsFactory;
 
   @Inject
   HookFactory(
       HookQueue queue,
       HookExecutor syncHookExecutor,
       @GerritServerConfig Config config,
-      IdentifiedUser.GenericFactory identifiedUserFactory,
-      @CanonicalWebUrl @Nullable Provider<String> urlProvider,
-      HookMetrics metrics,
       SitePaths sitePaths,
-      GitRepositoryManager gitManager) {
+      HookArgs.Factory argsFactory) {
     this.queue = queue;
     this.syncHookExecutor = syncHookExecutor;
     this.config = config;
-    this.identifiedUserFactory = identifiedUserFactory;
-    this.metrics = metrics;
-    this.urlProvider = urlProvider;
-    this.gitManager = gitManager;
-    this.sitePaths = sitePaths;
+    this.argsFactory = argsFactory;
 
     String v = config.getString("hooks", null, "path");
     if (v != null) {
@@ -82,6 +66,6 @@
   }
 
   public HookArgs createArgs() {
-    return new HookArgs(identifiedUserFactory, urlProvider, metrics, gitManager, sitePaths);
+    return argsFactory.create();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/hooks/Module.java b/src/main/java/com/googlesource/gerrit/plugins/hooks/Module.java
index 2dcce56..427d15b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/hooks/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/hooks/Module.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.hooks;
 
+import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.events.AgreementSignupListener;
 import com.google.gerrit.extensions.events.ChangeAbandonedListener;
 import com.google.gerrit.extensions.events.ChangeMergedListener;
@@ -31,11 +32,10 @@
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.server.git.validators.CommitValidationListener;
 import com.google.gerrit.server.git.validators.RefOperationValidationListener;
-import com.google.inject.AbstractModule;
 import com.google.inject.Scopes;
 import com.google.inject.internal.UniqueAnnotations;
 
-class Module extends AbstractModule {
+class Module extends FactoryModule {
   @Override
   protected void configure() {
     bind(HookQueue.class).in(Scopes.SINGLETON);
@@ -43,6 +43,8 @@
     bind(HookExecutor.class).in(Scopes.SINGLETON);
     bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(HookExecutor.class);
 
+    factory(HookArgs.Factory.class);
+
     DynamicSet.bind(binder(), AgreementSignupListener.class).to(AgreementSignup.class);
     DynamicSet.bind(binder(), ChangeAbandonedListener.class).to(ChangeAbandoned.class);
     DynamicSet.bind(binder(), ChangeMergedListener.class).to(ChangeMerged.class);