Remove not used SingletonManager

Now we fully relay on the Guice bindings and injections. Therefore we
can safely remove `SingletonManager`, `CustomClassLoader` and
`ClassUtils`.

Change-Id: I0d079135d358975e8fe5c8c049398bb54d2de03b
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
deleted file mode 100644
index 115f353..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/data/singleton/SingletonManager.java
+++ /dev/null
@@ -1,42 +0,0 @@
-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/utils/ClassUtils.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/ClassUtils.java
deleted file mode 100644
index 712ec54..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/ClassUtils.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.utils;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.List;
-
-public class ClassUtils {
-    public static synchronized <T> T createNewInstanceWithArgs(Class<T> clazz, Object... constructorArgs) {
-        Class<?>[] argClasses = new Class[constructorArgs.length];
-        for (int i = 0; i < constructorArgs.length; i++) {
-            argClasses[i] = constructorArgs[i].getClass();
-        }
-        try {
-            return clazz.getDeclaredConstructor(argClasses).newInstance(constructorArgs);
-        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static void registerDynamicClasses(Class<?>... classes) {
-        for (Class<?> clazz : classes) {
-            assert clazz != null; // This assertion is always true; serves to silence "unused" warnings
-        }
-    }
-
-    public static String joinUsingDotNotation(List<String> components) {
-        return String.join(".", components);
-    }
-
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/CustomClassLoader.java b/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/CustomClassLoader.java
deleted file mode 100644
index 0b0b272..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/chatgpt/utils/CustomClassLoader.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.googlesource.gerrit.plugins.chatgpt.utils;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-public class CustomClassLoader extends ClassLoader {
-    @Override
-    protected Class<?> findClass(String name) {
-        try {
-            // Attempt to load the class using the default class loader
-            return Class.forName(name);
-        } catch (ClassNotFoundException e) {
-            return loadLocalClass(name);
-        }
-    }
-
-    private Class<?> loadLocalClass(String name) {
-        try {
-            byte[] b = loadClassData(name);
-            return defineClass(name, b, 0, b.length);
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to load local class " + name, e);
-        }
-    }
-
-    private byte[] loadClassData(String name) throws IOException {
-        ByteArrayOutputStream byteSt;
-        try (InputStream is = getClass().getClassLoader().getResourceAsStream(
-                name.replace('.', '/') + ".class")) {
-            byteSt = new ByteArrayOutputStream();
-            int len;
-            while ((len = is.read()) != -1) {
-                byteSt.write(len);
-            }
-        }
-        catch (NullPointerException e) {
-            throw new RuntimeException("Failed to load class data for class " + name, e);
-        }
-        return byteSt.toByteArray();
-    }
-
-}