Make GerritClient injectable

This also fixes `ChatGptReviewStatelessTest.gptMentionedInComment`, as
we don't relay on the manually cached `GerritClient` but let Guice
manage that instance for us.

Change-Id: I6d8ec9abb516b18629c5e5d3f3fd0b50a726504a
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java
index fafe16c..229d396 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/EventHandlerTask.java
@@ -67,7 +67,6 @@
 
     @VisibleForTesting
     public Result execute() {
-        gerritClient.initialize(config, change);
         Integer gptAccountId = gerritClient.getNotNullAccountId(change, config.getGerritUserName());
         ChangeSetData changeSetData = ChangeSetDataHandler.getNewInstance(config, change, gptAccountId);
         GitRepoFilesHandler.createNewInstance(gitRepoFiles);
@@ -131,7 +130,6 @@
 
     private void destroy(GerritChange change) {
         log.info("destroying {}",change);
-        gerritClient.destroy(change);
         ChangeSetDataHandler.removeInstance(change);
     }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java
index 166cca8..dedd320 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClient.java
@@ -1,8 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit;
 
+import com.google.inject.Inject;
 import com.google.inject.Singleton;
-import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.data.singleton.ChangeSetSingletonManager;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.diff.FileDiffProcessed;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPermittedVotingRange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
@@ -13,20 +12,14 @@
 @Slf4j
 @Singleton
 public class GerritClient {
-    private static final String DEFAULT_CHANGE_ID = "DEFAULT_CHANGE_ID";
-    private static GerritClientFacade gerritClientFacade;
+    private final GerritClientFacade gerritClientFacade;
 
-    public void initialize(Configuration config) {
-        initialize(config, new GerritChange(DEFAULT_CHANGE_ID));
-    }
-
-    public void initialize(Configuration config, GerritChange change) {
-        log.debug("Initializing client instances for change: {}", change.getFullChangeId());
-        gerritClientFacade = ChangeSetSingletonManager.getInstance(GerritClientFacade.class, change, config);
+    @Inject
+    public GerritClient(GerritClientFacade gerritClientFacade) {
+        this.gerritClientFacade = gerritClientFacade;
     }
 
     public GerritPermittedVotingRange getPermittedVotingRange(GerritChange change) {
-        updateGerritClientFacade(change);
         return gerritClientFacade.getPermittedVotingRange(change);
     }
 
@@ -35,7 +28,6 @@
     }
 
     public String getPatchSet(GerritChange change) throws Exception {
-        updateGerritClientFacade(change);
         return gerritClientFacade.getPatchSet(change);
     }
 
@@ -48,42 +40,26 @@
     }
 
     public boolean isWorkInProgress(GerritChange change) {
-        updateGerritClientFacade(change);
         return gerritClientFacade.isWorkInProgress(change);
     }
 
     public HashMap<String, FileDiffProcessed> getFileDiffsProcessed(GerritChange change) {
-        updateGerritClientFacade(change);
         return gerritClientFacade.getFileDiffsProcessed();
     }
 
     public Integer getNotNullAccountId(GerritChange change, String authorUsername) {
-        updateGerritClientFacade(change);
         return gerritClientFacade.getNotNullAccountId(authorUsername);
     }
 
     public boolean retrieveLastComments(GerritChange change) {
-        updateGerritClientFacade(change);
         return gerritClientFacade.retrieveLastComments(change);
     }
 
     public void retrievePatchSetInfo(GerritChange change) {
-        updateGerritClientFacade(change);
         gerritClientFacade.retrievePatchSetInfo(change);
     }
 
     public GerritClientData getClientData(GerritChange change) {
-        updateGerritClientFacade(change);
         return gerritClientFacade.getClientData(change);
     }
-
-    public void destroy(GerritChange change) {
-        log.debug("Destroying GerritClientFacade instance for change: {}", change.getFullChangeId());
-        ChangeSetSingletonManager.removeInstance(GerritClientFacade.class, change);
-    }
-
-    private void updateGerritClientFacade(GerritChange change) {
-        gerritClientFacade = ChangeSetSingletonManager.getInstance(GerritClientFacade.class, change);
-    }
-
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java
index 5e872d1..0c253c1 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritClientFacade.java
@@ -1,5 +1,6 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit;
 
+import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
 import com.googlesource.gerrit.plugins.chatgpt.mode.ModeClassLoader;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.patch.diff.FileDiffProcessed;
@@ -20,6 +21,7 @@
     private final IGerritClientPatchSet gerritClientPatchSet;
     private final GerritClientComments gerritClientComments;
 
+    @Inject
     public GerritClientFacade(Configuration config) {
         gerritClientDetail = new GerritClientDetail(config);
         gerritClientPatchSet = (IGerritClientPatchSet) ModeClassLoader.getInstance(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
index fa94a95..07880e8 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatelessTest.java
@@ -156,8 +156,6 @@
     }
 
     @Test
-    @Ignore("Instance of GerritClient is unregistered from SingletonManager before we can access it in L#172." +
-            "This will be fixed when we migrate to Guice RequestScoped injection.")
     public void gptMentionedInComment() {
         when(config.getGerritUserName()).thenReturn(GERRIT_GPT_USERNAME);
         chatGptPromptStateless.setCommentEvent(true);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
index 55140c8..5f73c4d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -28,6 +28,7 @@
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.UriResourceLocator;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientFacade;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.git.GitRepoFiles;
 import lombok.NonNull;
 import org.apache.http.entity.ContentType;
@@ -231,7 +232,7 @@
     }
 
     private void initTest () throws NoSuchProjectException {
-        gerritClient = new GerritClient();
+        gerritClient = new GerritClient(new GerritClientFacade(config));
         patchSetReviewer = new PatchSetReviewer(gerritClient, config);
         mockConfigCreator = mock(ConfigCreator.class);
     }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
index 1268f6b..77baa74 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/integration/CodeReviewPluginIT.java
@@ -53,7 +53,6 @@
         when(config.getGerritUserName()).thenReturn("Your Gerrit username");
         when(config.getGerritPassword()).thenReturn("Your Gerrit password");
 
-        gerritClient.initialize(config);
         String patchSet = gerritClient.getPatchSet("${changeId}");
         log.info("patchSet: {}", patchSet);
         assertNotNull(patchSet);
@@ -69,8 +68,6 @@
         reviewBatches.add(new ReviewBatch());
         reviewBatches.get(0).setContent("message");
 
-        gerritClient.initialize(config);
-
         GerritClientReview gerritClientReview = new GerritClientReview(config);
         gerritClientReview.setReview("Your changeId", reviewBatches);
     }