Remove ModeClassLoader
Instead of dynamically loading mode related classes, use Guice bindings
to select proper implementation based on configuration.
Change-Id: I47d21062a249d03118b1e0f8575b0cb0b047a3ae
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
index 187d7c2..719cb5e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/PatchSetReviewer.java
@@ -3,7 +3,6 @@
import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataHandler;
-import com.googlesource.gerrit.plugins.chatgpt.mode.ModeClassLoader;
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.GerritClientReview;
@@ -33,19 +32,20 @@
private final Configuration config;
private final GerritClient gerritClient;
private final ChangeSetData changeSetData;
-
@Getter
- private IChatGptClient chatGptClient;
+ private final IChatGptClient chatGptClient;
+
private GerritCommentRange gerritCommentRange;
private List<ReviewBatch> reviewBatches;
private List<GerritComment> commentProperties;
private List<Integer> reviewScores;
@Inject
- PatchSetReviewer(GerritClient gerritClient, Configuration config, ChangeSetData changeSetData) {
+ PatchSetReviewer(GerritClient gerritClient, Configuration config, ChangeSetData changeSetData, IChatGptClient chatGptClient) {
this.config = config;
this.gerritClient = gerritClient;
this.changeSetData = changeSetData;
+ this.chatGptClient = chatGptClient;
}
public void review(GerritChange change) throws Exception {
@@ -131,8 +131,6 @@
log.warn("Patch set too large. Skipping review. changeId: {}", change.getFullChangeId());
return String.format(SPLIT_REVIEW_MSG, config.getMaxReviewLines());
}
- chatGptClient = (IChatGptClient) ModeClassLoader.getInstance(
- "client.api.chatgpt.ChatGptClient", config);
registerDynamicClasses(ChatGptClientStateless.class);
return chatGptClient.ask(config, changeSetData, change, patchSet);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java
index 9baa8ef..0d76a17 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/listener/GerritEventContextModule.java
@@ -6,6 +6,12 @@
import com.googlesource.gerrit.plugins.chatgpt.data.ChangeSetDataProvider;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.chatgpt.IChatGptClient;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.gerrit.IGerritClientPatchSet;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptClientStateful;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.gerrit.GerritClientPatchSetStateful;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.chatgpt.ChatGptClientStateless;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.gerrit.GerritClientPatchSetStateless;
import static com.google.inject.Scopes.SINGLETON;
@@ -20,8 +26,25 @@
@Override
protected void configure() {
+ bind(IChatGptClient.class).to(getChatGptMode());
+ bind(IGerritClientPatchSet.class).to(getClientPatchSet());
+
bind(Configuration.class).toInstance(config);
bind(GerritChange.class).toInstance(new GerritChange(event));
bind(ChangeSetData.class).toProvider(ChangeSetDataProvider.class).in(SINGLETON);
}
+
+ private Class<? extends IChatGptClient> getChatGptMode() {
+ return switch (config.getGptMode()){
+ case stateful -> ChatGptClientStateful.class;
+ case stateless -> ChatGptClientStateless.class;
+ };
+ }
+
+ private Class<? extends IGerritClientPatchSet> getClientPatchSet() {
+ return switch (config.getGptMode()){
+ case stateful -> GerritClientPatchSetStateful.class;
+ case stateless -> GerritClientPatchSetStateless.class;
+ };
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/ModeClassLoader.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/ModeClassLoader.java
deleted file mode 100644
index 4a67dfe..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/ModeClassLoader.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.mode;
-
-import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
-import com.googlesource.gerrit.plugins.chatgpt.utils.CustomClassLoader;
-import lombok.extern.slf4j.Slf4j;
-
-import java.util.ArrayList;
-
-import static com.googlesource.gerrit.plugins.chatgpt.utils.ClassUtils.createNewInstanceWithArgs;
-import static com.googlesource.gerrit.plugins.chatgpt.utils.ClassUtils.joinUsingDotNotation;
-import static com.googlesource.gerrit.plugins.chatgpt.utils.StringUtils.capitalizeFirstLetter;
-
-@Slf4j
-public class ModeClassLoader {
- private static final String BASE_NAME = "com.googlesource.gerrit.plugins.chatgpt.mode";
-
- public static Object getInstance(String className, Configuration config, Object... constructorArgs) {
- CustomClassLoader customClassLoader = new CustomClassLoader();
- String fullClassName = getFullClassName(className, config);
- log.debug("Attempt to load Class '{}'", fullClassName);
- try {
- Class<?> DynamicallyLoadedClass = Class.forName(fullClassName, true, customClassLoader);
- log.debug("Class '{}' loaded", fullClassName);
- return createNewInstanceWithArgs(DynamicallyLoadedClass, constructorArgs);
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
-
- private static String getFullClassName(String className, Configuration config) {
- String mode = config.getGptMode().name();
- return joinUsingDotNotation(new ArrayList<>() {{
- add(BASE_NAME);
- add(mode);
- add(className + capitalizeFirstLetter(mode));
- }});
- }
-
-}
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 0da1a4e..ff744d1 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
@@ -2,7 +2,6 @@
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;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.api.gerrit.GerritPermittedVotingRange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
@@ -24,10 +23,9 @@
private final GerritClientComments gerritClientComments;
@Inject
- public GerritClientFacade(Configuration config, ChangeSetData changeSetData) {
+ public GerritClientFacade(Configuration config, ChangeSetData changeSetData, IGerritClientPatchSet gerritClientPatchSet) {
gerritClientDetail = new GerritClientDetail(config, changeSetData);
- gerritClientPatchSet = (IGerritClientPatchSet) ModeClassLoader.getInstance(
- "client.api.gerrit.GerritClientPatchSet", config, config);
+ this.gerritClientPatchSet = gerritClientPatchSet;
this.changeSetData = changeSetData;
registerDynamicClasses(GerritClientPatchSetStateless.class, GerritClientPatchSetStateful.class);
gerritClientComments = new GerritClientComments(config, changeSetData);
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 e563337..0b62eb0 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
@@ -1,5 +1,6 @@
package com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.gerrit;
+import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.model.data.ChangeSetData;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptAssistant;
@@ -11,6 +12,7 @@
@Slf4j
public class GerritClientPatchSetStateful extends GerritClientPatchSet implements IGerritClientPatchSet {
+ @Inject
public GerritClientPatchSetStateful(Configuration config) {
super(config);
}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java
index a843172..531d872 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/mode/stateless/client/api/gerrit/GerritClientPatchSetStateless.java
@@ -2,6 +2,7 @@
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
+import com.google.inject.Inject;
import com.googlesource.gerrit.plugins.chatgpt.config.Configuration;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritChange;
import com.googlesource.gerrit.plugins.chatgpt.mode.common.client.api.gerrit.GerritClientPatchSet;
@@ -26,6 +27,7 @@
private final List<String> diffs;
private boolean isCommitMessage;
+ @Inject
public GerritClientPatchSetStateless(Configuration config) {
super(config);
diffs = new ArrayList<>();
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 c63ec7e..4966a2a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/chatgpt/ChatGptReviewTestBase.java
@@ -33,7 +33,13 @@
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.common.model.data.ChangeSetData;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.chatgpt.IChatGptClient;
+import com.googlesource.gerrit.plugins.chatgpt.mode.interfaces.client.api.gerrit.IGerritClientPatchSet;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.chatgpt.ChatGptClientStateful;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.gerrit.GerritClientPatchSetStateful;
import com.googlesource.gerrit.plugins.chatgpt.mode.stateful.client.api.git.GitRepoFiles;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.chatgpt.ChatGptClientStateless;
+import com.googlesource.gerrit.plugins.chatgpt.mode.stateless.client.api.gerrit.GerritClientPatchSetStateless;
import lombok.NonNull;
import org.apache.http.entity.ContentType;
import org.junit.Assert;
@@ -241,10 +247,10 @@
prompts = gptRequestBody.get("messages").getAsJsonArray();
}
- private void initTest () throws NoSuchProjectException {
+ private void initTest() {
ChangeSetData changeSetData = new ChangeSetData(GPT_USER_ACCOUNT_ID, config.getVotingMinScore(), config.getMaxReviewFileSize());
- gerritClient = new GerritClient(new GerritClientFacade(config, changeSetData));
- patchSetReviewer = new PatchSetReviewer(gerritClient, config, changeSetData);
+ gerritClient = new GerritClient(new GerritClientFacade(config, changeSetData, getGerritClientPatchSet()));
+ patchSetReviewer = new PatchSetReviewer(gerritClient, config, changeSetData, getChatGptClient());
mockConfigCreator = mock(ConfigCreator.class);
}
@@ -299,4 +305,18 @@
return accountCache;
}
+
+ private IChatGptClient getChatGptClient() {
+ return switch (config.getGptMode()) {
+ case stateful -> new ChatGptClientStateful();
+ case stateless -> new ChatGptClientStateless();
+ };
+ }
+
+ private IGerritClientPatchSet getGerritClientPatchSet() {
+ return switch (config.getGptMode()) {
+ case stateful -> new GerritClientPatchSetStateful(config);
+ case stateless -> new GerritClientPatchSetStateless(config);
+ };
+ }
}