Remove ProjectDataHandler class

Use Guice for creation of `PluginDataHandler` insted of using a static
field in `ProjectDataHandler`.

Also removes `ChatGptReviewStatefulTest.assistantCreated` test, as now
assistant creation is delegated to Guice.

Change-Id: Ie5a76de046058534c471d33b1eefd4107a3395b9
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/PluginDataHandler.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/PluginDataHandler.java
index 55585d2..bfa16e8 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/PluginDataHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/PluginDataHandler.java
@@ -1,12 +1,14 @@
 package com.googlesource.gerrit.plugins.chatgpt.data;
 
 import com.google.inject.Inject;
+import com.google.inject.Singleton;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Properties;
 
+@Singleton
 public class PluginDataHandler {
     private final Path configFile;
     private final Properties configProperties = new Properties();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ProjectDataHandler.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ProjectDataHandler.java
deleted file mode 100644
index 9df9944..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ProjectDataHandler.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.data;
-
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-public class ProjectDataHandler {
-    private static PluginDataHandler pluginDataHandler;
-
-    public static void createNewInstance(PluginDataHandler loadedPluginDataHandler) {
-        pluginDataHandler = loadedPluginDataHandler;
-    }
-
-    public static synchronized void setValue(GerritChange change, String key, String value) {
-        pluginDataHandler.setValue(getProjectKey(change, key), value);
-    }
-
-    public static String getValue(GerritChange change, String key) {
-        return pluginDataHandler.getValue(getProjectKey(change, key));
-    }
-
-    public static synchronized void removeValue(GerritChange change, String key) {
-        pluginDataHandler.removeValue(getProjectKey(change, key));
-    }
-
-    private static String getProjectKey(GerritChange change, String key) {
-        return change.getProjectName() + "." + key;
-    }
-
-}
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 ea6b1fe..b1877bf 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
@@ -8,12 +8,9 @@
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.chatgpt.PatchSetReviewer;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandler;
-import com.googlesource.gerrit.plugins.chatgpt.data.ProjectDataHandler;
 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.model.data.ChangeSetData;
-import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.git.GitRepoFiles;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.List;
@@ -39,7 +36,6 @@
     private final ChangeSetData changeSetData;
     private final GerritChange change;
     private final PatchSetReviewer reviewer;
-    private final PluginDataHandler pluginDataHandler;
 
     @Inject
     EventHandlerTask(
@@ -47,15 +43,13 @@
             ChangeSetData changeSetData,
             GerritChange change,
             PatchSetReviewer reviewer,
-            GerritClient gerritClient,
-            PluginDataHandler pluginDataHandler
+            GerritClient gerritClient
     ) {
         this.changeSetData = changeSetData;
         this.change = change;
         this.reviewer = reviewer;
         this.gerritClient = gerritClient;
         this.config = config;
-        this.pluginDataHandler = pluginDataHandler;
     }
 
     @Override
@@ -65,8 +59,6 @@
 
     @VisibleForTesting
     public Result execute() {
-        ProjectDataHandler.createNewInstance(pluginDataHandler);
-
         if (!preProcessEvent(change, changeSetData)) {
             return Result.NOT_SUPPORTED;
         }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java
index 4b4a86d..7a8071a 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/chatgpt/ChatGptAssistant.java
@@ -1,7 +1,7 @@
 package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt;
 
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.data.ProjectDataHandler;
+import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.ClientBase;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.chatgpt.ChatGptTools;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
@@ -33,20 +33,22 @@
     private final HttpClient httpClient = new HttpClient();
     private final GerritChange change;
     private final GitRepoFiles gitRepoFiles;
+    private final PluginDataHandler pluginDataHandler;
 
-    public ChatGptAssistant(Configuration config, GerritChange change, GitRepoFiles gitRepoFiles) {
+    public ChatGptAssistant(Configuration config, GerritChange change, GitRepoFiles gitRepoFiles, PluginDataHandler pluginDataHandler) {
         super(config);
         this.change = change;
         this.gitRepoFiles = gitRepoFiles;
+        this.pluginDataHandler = pluginDataHandler;
     }
 
     public void setupAssistant() {
-        String assistantId = ProjectDataHandler.getValue(change, KEY_ASSISTANT_ID);
+        String assistantId = pluginDataHandler.getValue(KEY_ASSISTANT_ID);
         if (assistantId == null) {
             String fileId = uploadRepoFiles();
-            ProjectDataHandler.setValue(change, KEY_FILE_ID, fileId);
+            pluginDataHandler.setValue(KEY_FILE_ID, fileId);
             assistantId = createAssistant(fileId);
-            ProjectDataHandler.setValue(change, KEY_ASSISTANT_ID, assistantId);
+            pluginDataHandler.setValue(KEY_ASSISTANT_ID, assistantId);
             log.info("Project assistant created with ID: {}", assistantId);
         }
         else {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java
index 22107e1..257cddf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateful/client/api/gerrit/GerritClientPatchSetStateful.java
@@ -2,6 +2,7 @@
 
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
+import com.googlesource.gerrit.plugins.chatgpt.data.PluginDataHandler;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
 import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptAssistant;
 import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
@@ -13,15 +14,17 @@
 @Slf4j
 public class GerritClientPatchSetStateful extends GerritClientPatchSet implements IGerritClientPatchSet {
     private final GitRepoFiles gitRepoFiles;
+    private final PluginDataHandler pluginDataHandler;
 
     @Inject
-    public GerritClientPatchSetStateful(Configuration config, GitRepoFiles gitRepoFiles) {
+    public GerritClientPatchSetStateful(Configuration config, GitRepoFiles gitRepoFiles, PluginDataHandler pluginDataHandler) {
         super(config);
         this.gitRepoFiles = gitRepoFiles;
+        this.pluginDataHandler = pluginDataHandler;
     }
 
     public String getPatchSet(ChangeSetData changeSetData, GerritChange change) {
-        ChatGptAssistant chatGptAssistant = new ChatGptAssistant(config, change, gitRepoFiles);
+        ChatGptAssistant chatGptAssistant = new ChatGptAssistant(config, change, gitRepoFiles, pluginDataHandler);
         chatGptAssistant.setupAssistant();
 
         return "";
diff --git a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java
index 432e7f9..852531d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewStatefulTest.java
@@ -7,18 +7,12 @@
 import com.googlesource.gerrit.plugins.chatgpt.settings.Settings.MODES;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.entity.ContentType;
-import org.junit.Assert;
-import org.junit.Test;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
 
-import static com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptAssistant.*;
 import static java.net.HttpURLConnection.HTTP_OK;
-import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.*;
 
 @Slf4j
@@ -71,30 +65,4 @@
         super.initComparisonContent();
     }
 
-    private void setupAssistantCreatedTest(Map<String, String> mockedPluginDataHandler) {
-        // Mock the behavior of the Git Repository Manager
-        String repoJson = readTestFile("__files/gitProjectFiles.json");
-        when(gitRepoFiles.getGitRepoFiles(any())).thenReturn(repoJson);
-
-        // Mock the behavior of the `setValue` method of the Plugin Data Handler
-        doAnswer(invocation -> {
-            String key = invocation.getArgument(0);
-            String value = invocation.getArgument(1);
-            mockedPluginDataHandler.put(key, value);
-            return null;  // since setValue is void
-        }).when(pluginDataHandler).setValue(anyString(), anyString());
-    }
-
-    @Test
-    public void assistantCreated() {
-        Map<String, String> mockedPluginDataHandler = new HashMap<>();
-        setupAssistantCreatedTest(mockedPluginDataHandler);
-        handleEventBasedOnType(false);
-
-        String projectFileIdKey = PROJECT_NAME + "." + KEY_FILE_ID;
-        Assert.assertEquals(mockedPluginDataHandler.get(projectFileIdKey), CHAT_GPT_FILE_ID);
-        String projectAssistantKey = PROJECT_NAME + "." + KEY_ASSISTANT_ID;
-        Assert.assertEquals(mockedPluginDataHandler.get(projectAssistantKey), CHAT_GPT_ASSISTANT_ID);
-    }
-
 }
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 305ff60..a8af5a5 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -315,7 +315,7 @@
 
     private IGerritClientPatchSet getGerritClientPatchSet() {
         return switch (config.getGptMode()) {
-            case stateful -> new GerritClientPatchSetStateful(config, gitRepoFiles);
+            case stateful -> new GerritClientPatchSetStateful(config, gitRepoFiles, pluginDataHandler);
             case stateless -> new GerritClientPatchSetStateless(config);
         };
     }