Refactor: specialize ChangeSetSingletonManager
The ChangeSetSingletonManager class has been extracted from
SingletonManager to enhance separation of scopes and pave the way for
forthcoming assistant mode implementation, for example to allow
employing the generic SingletonManager with a project ID. Furthermore,
SingletonManager has been relocated to the `data.singleton` package to
improve project comprehension.
Change-Id: I4f46de175f4843b64863792c48b2f1e63c9e406c
Signed-off-by: Patrizio <patrizio.gelosi@amarulasolutions.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
index 3789eee..9f953ce 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/ChangeSetDataHandler.java
@@ -1,13 +1,13 @@
package com.googlesource.gerrit.plugins.chatgpt.data;
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.api.gerrit.GerritChange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClient;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.prompt.ChatGptUserPrompt;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPermittedVotingRange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.GerritClientData;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
-import com.googlesource.gerrit.plugins.chatgpt.utils.SingletonManager;
import lombok.extern.slf4j.Slf4j;
import java.util.HashSet;
@@ -16,18 +16,18 @@
public class ChangeSetDataHandler {
public static ChangeSetData getNewInstance(Configuration config, GerritChange change, Integer gptAccountId) {
- return SingletonManager.getNewInstance(ChangeSetData.class, change,
+ return ChangeSetSingletonManager.getNewInstance(ChangeSetData.class, change,
gptAccountId,
config.getVotingMinScore(),
config.getVotingMaxScore());
}
public static ChangeSetData getInstance(GerritChange change) {
- return SingletonManager.getInstance(ChangeSetData.class, change);
+ return ChangeSetSingletonManager.getInstance(ChangeSetData.class, change);
}
public static ChangeSetData getInstance(String changeId) {
- return SingletonManager.getInstance(ChangeSetData.class, changeId);
+ return getInstance(new GerritChange(changeId));
}
public static void update(Configuration config, GerritChange change, GerritClient gerritClient) {
@@ -54,7 +54,7 @@
}
public static void removeInstance(GerritChange change) {
- SingletonManager.removeInstance(ChangeSetData.class, change.getFullChangeId());
+ ChangeSetSingletonManager.removeInstance(ChangeSetData.class, change);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/ChangeSetSingletonManager.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/ChangeSetSingletonManager.java
new file mode 100644
index 0000000..d5b6d30
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/ChangeSetSingletonManager.java
@@ -0,0 +1,22 @@
+package com.googlesource.gerrit.plugins.chatgpt.data.singleton;
+
+import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
+
+public class ChangeSetSingletonManager {
+ public static synchronized <T> T getNewInstance(Class<T> clazz, GerritChange change, Object... constructorArgs) {
+ return SingletonManager.getNewInstance(clazz, getInstanceKey(clazz, change), constructorArgs);
+ }
+
+ public static synchronized <T> T getInstance(Class<T> clazz, GerritChange change, Object... constructorArgs) {
+ return SingletonManager.getInstance(clazz, getInstanceKey(clazz, change), constructorArgs);
+ }
+
+ public static synchronized void removeInstance(Class<?> clazz, GerritChange change) {
+ SingletonManager.removeInstance(clazz, getInstanceKey(clazz, change));
+ }
+
+ private static String getInstanceKey(Class<?> clazz, GerritChange change) {
+ return clazz.getName() + ":" + change.getFullChangeId();
+ }
+
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/SingletonManager.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/SingletonManager.java
new file mode 100644
index 0000000..115f353
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/SingletonManager.java
@@ -0,0 +1,42 @@
+package com.googlesource.gerrit.plugins.chatgpt.data.singleton;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static com.googlesource.gerrit.plugins.chatgpt.utils.ClassUtils.createNewInstanceWithArgs;
+
+public class SingletonManager {
+ private static final Map<String, Object> instances = new HashMap<>();
+
+ public static synchronized <T> T getInstance(Class<T> clazz, String key, Object... constructorArgs) {
+ if (!instances.containsKey(key)) {
+ return createNewInstance(clazz, key, constructorArgs);
+ }
+ return clazz.cast(instances.get(key));
+ }
+
+ public static synchronized <T> T getNewInstance(Class<T> clazz, String key, Object... constructorArgs) {
+ return createNewInstance(clazz, key, constructorArgs);
+ }
+
+ public static synchronized void removeInstance(Class<?> clazz, String key) {
+ instances.remove(key);
+ }
+
+ private static synchronized <T> T createNewInstance(Class<T> clazz, String key, Object... constructorArgs) {
+ try {
+ // Use reflection to invoke constructor with arguments
+ T instance;
+ if (constructorArgs == null || constructorArgs.length == 0) {
+ instance = clazz.getDeclaredConstructor().newInstance();
+ } else {
+ instance = createNewInstanceWithArgs(clazz, constructorArgs);
+ }
+ instances.put(key, instance);
+ return instance;
+ } catch (Exception e) {
+ throw new RuntimeException("Error creating instance for class: " + clazz.getName(), e);
+ }
+ }
+
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritChange.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritChange.java
index 770ea70..2d15939 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritChange.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/common/client/api/gerrit/GerritChange.java
@@ -47,7 +47,6 @@
patchSetEvent = (PatchSetEvent) event;
}
- // Incomplete initialization used by CodeReviewPluginIT
public GerritChange(String fullChangeId) {
this.fullChangeId = fullChangeId;
}
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 60ec451..166cca8 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
@@ -2,10 +2,10 @@
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;
-import com.googlesource.gerrit.plugins.chatgpt.utils.SingletonManager;
import lombok.extern.slf4j.Slf4j;
import java.util.HashMap;
@@ -22,7 +22,7 @@
public void initialize(Configuration config, GerritChange change) {
log.debug("Initializing client instances for change: {}", change.getFullChangeId());
- gerritClientFacade = SingletonManager.getInstance(GerritClientFacade.class, change, config);
+ gerritClientFacade = ChangeSetSingletonManager.getInstance(GerritClientFacade.class, change, config);
}
public GerritPermittedVotingRange getPermittedVotingRange(GerritChange change) {
@@ -79,11 +79,11 @@
public void destroy(GerritChange change) {
log.debug("Destroying GerritClientFacade instance for change: {}", change.getFullChangeId());
- SingletonManager.removeInstance(GerritClientFacade.class, change.getFullChangeId());
+ ChangeSetSingletonManager.removeInstance(GerritClientFacade.class, change);
}
private void updateGerritClientFacade(GerritChange change) {
- gerritClientFacade = SingletonManager.getInstance(GerritClientFacade.class, change);
+ gerritClientFacade = ChangeSetSingletonManager.getInstance(GerritClientFacade.class, change);
}
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/SingletonManager.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/SingletonManager.java
deleted file mode 100644
index bb848e5..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/SingletonManager.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.utils;
-
-import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static com.googlesource.gerrit.plugins.chatgpt.utils.ClassUtils.createNewInstanceWithArgs;
-
-public class SingletonManager {
- private static final Map<String, Object> instances = new HashMap<>();
-
- public static synchronized <T> T getInstance(Class<T> clazz, String id, Object... constructorArgs) {
- String key = getInstanceKey(clazz, id);
- if (!instances.containsKey(key)) {
- return createNewInstance(clazz, key, constructorArgs);
- }
- return clazz.cast(instances.get(key));
- }
-
- public static synchronized <T> T getInstance(Class<T> clazz, GerritChange change, Object... constructorArgs) {
- return getInstance(clazz, change.getFullChangeId(), constructorArgs);
- }
-
- public static synchronized <T> T getNewInstance(Class<T> clazz, String id, Object... constructorArgs) {
- return createNewInstance(clazz, getInstanceKey(clazz, id), constructorArgs);
- }
-
- public static synchronized <T> T getNewInstance(Class<T> clazz, GerritChange change, Object... constructorArgs) {
- return getNewInstance(clazz, change.getFullChangeId(), constructorArgs);
- }
-
- public static synchronized void removeInstance(Class<?> clazz, String id) {
- instances.remove(getInstanceKey(clazz, id));
- }
-
- private static synchronized <T> T createNewInstance(Class<T> clazz, String key, Object... constructorArgs) {
- try {
- // Use reflection to invoke constructor with arguments
- T instance;
- if (constructorArgs == null || constructorArgs.length == 0) {
- instance = clazz.getDeclaredConstructor().newInstance();
- } else {
- instance = createNewInstanceWithArgs(clazz, constructorArgs);
- }
- instances.put(key, instance);
- return instance;
- } catch (Exception e) {
- throw new RuntimeException("Error creating instance for class: " + clazz.getName(), e);
- }
- }
-
- private static String getInstanceKey(Class<?> clazz, String id) {
- return clazz.getName() + ":" + id;
- }
-
-}