Decouple facade, Conduit, and ConduitConnection

This will help resurrecting the tests and making them pass.

Change-Id: I07c9ff09cc7a3d5c69c1058e94934bb0407655e4
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
index 93c4e86..e2cea8c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorItsFacade.java
@@ -44,11 +44,14 @@
   private final Gson gson;
 
   @Inject
-  public PhabricatorItsFacade(@PluginName String pluginName, @GerritServerConfig Config cfg) {
+  public PhabricatorItsFacade(
+      @PluginName String pluginName,
+      @GerritServerConfig Config cfg,
+      Conduit.Factory conduitFactory) {
     String url = cfg.getString(pluginName, null, GERRIT_CONFIG_URL);
     String token = cfg.getString(pluginName, null, GERRIT_CONFIG_TOKEN);
 
-    this.conduit = new Conduit(url, token);
+    this.conduit = conduitFactory.create(url, token);
     this.gson = new Gson();
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorModule.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorModule.java
index b8e7aa4..402316e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/PhabricatorModule.java
@@ -16,17 +16,20 @@
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
-import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
+import com.google.inject.Scopes;
 import com.googlesource.gerrit.plugins.its.base.ItsHookModule;
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacade;
 import com.googlesource.gerrit.plugins.its.base.its.ItsFacadeFactory;
 import com.googlesource.gerrit.plugins.its.base.its.SingleItsServer;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.Conduit;
+import com.googlesource.gerrit.plugins.its.phabricator.conduit.ConduitConnection;
 import org.eclipse.jgit.lib.Config;
 
-public class PhabricatorModule extends AbstractModule {
+public class PhabricatorModule extends FactoryModule {
 
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
@@ -48,7 +51,9 @@
   protected void configure() {
     if (gerritConfig.getString(pluginName, null, "url") != null) {
       logger.atInfo().log("Phabricator is configured as ITS");
-      bind(ItsFacade.class).toInstance(new PhabricatorItsFacade(pluginName, gerritConfig));
+      factory(ConduitConnection.Factory.class);
+      factory(Conduit.Factory.class);
+      bind(ItsFacade.class).to(PhabricatorItsFacade.class).in(Scopes.SINGLETON);
       bind(ItsFacadeFactory.class).to(SingleItsServer.class);
 
       install(new ItsHookModule(pluginName, pluginCfgFactory));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
index fb7c1f7..298a83e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/Conduit.java
@@ -18,6 +18,8 @@
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ConduitPing;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestEdit;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.ManiphestResults;
@@ -34,6 +36,9 @@
  * <p>This class is not thread-safe.
  */
 public class Conduit {
+  public interface Factory {
+    Conduit create(@Assisted("baseUrl") String baseUrl, @Assisted("token") String token);
+  }
 
   public static final String ACTION_COMMENT = "comment";
 
@@ -48,12 +53,12 @@
 
   private String token;
 
-  public Conduit(final String baseUrl) {
-    this(baseUrl, null);
-  }
-
-  public Conduit(final String baseUrl, final String token) {
-    this.conduitConnection = new ConduitConnection(baseUrl);
+  @Inject
+  public Conduit(
+      ConduitConnection.Factory conduitConnectionFactory,
+      @Assisted("baseUrl") String baseUrl,
+      @Assisted("token") String token) {
+    this.conduitConnection = conduitConnectionFactory.create(baseUrl);
     this.token = token;
     this.gson = new Gson();
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitConnection.java b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitConnection.java
index 7a65c72..8eb695b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitConnection.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/its/phabricator/conduit/ConduitConnection.java
@@ -17,6 +17,8 @@
 import com.google.common.flogger.FluentLogger;
 import com.google.gson.Gson;
 import com.google.gson.JsonElement;
+import com.google.inject.Inject;
+import com.google.inject.assistedinject.Assisted;
 import com.googlesource.gerrit.plugins.its.phabricator.conduit.results.CallCapsule;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -31,15 +33,20 @@
 import org.apache.http.util.EntityUtils;
 
 /** Abstracts the connection to Conduit API */
-class ConduitConnection {
+public class ConduitConnection {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
+  public interface Factory {
+    ConduitConnection create(String baseUrl);
+  }
+
   private final String apiUrlBase;
   private final Gson gson;
 
   private CloseableHttpClient client;
 
-  ConduitConnection(final String baseUrl) {
+  @Inject
+  ConduitConnection(@Assisted String baseUrl) {
     apiUrlBase = baseUrl.replaceAll("/+$", "") + "/api/";
     gson = new Gson();
     client = null;