From b1debd114974a4ad01af2104ba33f8c877bca82b Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Thu, 23 May 2024 22:28:30 +0100 Subject: [PATCH 1/2] Added `.class` to LogManager --- .../jdi/core/processor/EventListenerValidator.java | 2 +- .../com/javadiscord/jdi/core/processor/ListenerLoader.java | 2 +- .../jdi/internal/api/DiscordRequestDispatcher.java | 2 +- core/src/main/java/com/javadiscord/jdi/core/Discord.java | 2 +- .../com/javadiscord/jdi/core/GatewayEventListener.java | 2 +- .../jdi/core/GatewayEventListenerAnnotations.java | 2 +- example/echo-bot/build.gradle | 7 +++++++ .../javadiscord/jdi/internal/gateway/WebSocketHandler.java | 2 +- .../javadiscord/jdi/internal/gateway/WebSocketManager.java | 2 +- .../jdi/internal/gateway/WebSocketRetryHandler.java | 2 +- .../gateway/handlers/events/EventCodecHandler.java | 2 +- .../events/codec/handlers/resume/ResumeEventHandler.java | 2 +- .../gateway/handlers/heartbeat/HeartbeatService.java | 2 +- .../gateway/handlers/heartbeat/HelloOperationHandler.java | 2 +- 14 files changed, 20 insertions(+), 13 deletions(-) diff --git a/annotations/src/main/java/com/javadiscord/jdi/core/processor/EventListenerValidator.java b/annotations/src/main/java/com/javadiscord/jdi/core/processor/EventListenerValidator.java index 3ea29634..06e66dc4 100644 --- a/annotations/src/main/java/com/javadiscord/jdi/core/processor/EventListenerValidator.java +++ b/annotations/src/main/java/com/javadiscord/jdi/core/processor/EventListenerValidator.java @@ -12,7 +12,7 @@ import org.apache.logging.log4j.Logger; public class EventListenerValidator { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(EventListenerValidator.class); private static final Map, String[]> EXPECTED_PARAM_TYPES_MAP = new HashMap<>(); diff --git a/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java b/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java index 231f14be..3d815248 100644 --- a/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java +++ b/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java @@ -10,7 +10,7 @@ import org.apache.logging.log4j.Logger; public class ListenerLoader { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(ListenerLoader.class); private final EventListenerValidator eventListenerValidator = new EventListenerValidator(); private final List eventListeners; diff --git a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java index 32dbe0ef..6511562e 100644 --- a/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java +++ b/api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java @@ -19,7 +19,7 @@ public class DiscordRequestDispatcher implements Runnable { ? System.getProperty("DISCORD_BASE_URL") : "https://discord.com/api"; - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(DiscordRequestDispatcher.class); private final HttpClient httpClient; private final BlockingQueue queue; private final String botToken; diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index 4185e688..de1252cc 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -27,7 +27,7 @@ import org.apache.logging.log4j.Logger; public class Discord { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(Discord.class); private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool(); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final String WEBSITE = "https://javadiscord.com/"; diff --git a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java index 34cd513d..148c7949 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java +++ b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java @@ -29,7 +29,7 @@ import org.apache.logging.log4j.Logger; public class GatewayEventListener implements GatewayObserver { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(GatewayEventListener.class); private final Discord discord; public GatewayEventListener(Discord discord) { diff --git a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java index 5c2fcf44..20def1a4 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java +++ b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java @@ -15,7 +15,7 @@ import org.apache.logging.log4j.Logger; public class GatewayEventListenerAnnotations implements GatewayObserver { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(GatewayEventListenerAnnotations.class); public static final Map EVENT_TYPE_ANNOTATIONS = new HashMap<>(); static { diff --git a/example/echo-bot/build.gradle b/example/echo-bot/build.gradle index a89a6fb4..598ab2f0 100644 --- a/example/echo-bot/build.gradle +++ b/example/echo-bot/build.gradle @@ -1,6 +1,7 @@ plugins { id 'java' id 'application' + id 'com.github.johnrengelman.shadow' version '8.1.1' } application { @@ -8,3 +9,9 @@ application { } dependencies {} + +shadowJar { + archiveBaseName.set('example-bot') + archiveClassifier.set('') + archiveVersion.set('') +} \ No newline at end of file diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketHandler.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketHandler.java index 4aa99864..4afe17c9 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketHandler.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketHandler.java @@ -20,7 +20,7 @@ import org.apache.logging.log4j.Logger; public class WebSocketHandler implements Handler { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(WebSocketHandler.class); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private static final Map OPERATION_HANDLER = new HashMap<>(); private final ConnectionMediator connectionMediator; diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManager.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManager.java index 73586d6d..37ae128a 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManager.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManager.java @@ -14,7 +14,7 @@ import org.apache.logging.log4j.Logger; public class WebSocketManager { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(WebSocketManager.class); private final GatewaySetting gatewaySetting; private final IdentifyRequest identifyRequest; private final Vertx vertx; diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketRetryHandler.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketRetryHandler.java index bef425ae..f3b773a8 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketRetryHandler.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketRetryHandler.java @@ -7,7 +7,7 @@ import org.apache.logging.log4j.Logger; public class WebSocketRetryHandler { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(WebSocketRetryHandler.class); private final Vertx vertx; private final AtomicInteger attempts; diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/EventCodecHandler.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/EventCodecHandler.java index 5058b8cb..b3ae2647 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/EventCodecHandler.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/EventCodecHandler.java @@ -40,7 +40,7 @@ import org.apache.logging.log4j.Logger; public class EventCodecHandler implements GatewayOperationHandler { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(EventCodecHandler.class); private static final Map> EVENT_DECODERS = new HashMap<>(); private static final Map> EVENT_HANDLERS = new HashMap<>(); diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/codec/handlers/resume/ResumeEventHandler.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/codec/handlers/resume/ResumeEventHandler.java index 69af2771..46b11bbd 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/codec/handlers/resume/ResumeEventHandler.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/codec/handlers/resume/ResumeEventHandler.java @@ -8,7 +8,7 @@ import org.apache.logging.log4j.Logger; public class ResumeEventHandler implements EventHandler { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(ResumeEventHandler.class); @Override public void handle(ResumeEvent message, ConnectionMediator connectionMediator, Cache cache) { diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HeartbeatService.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HeartbeatService.java index 26da537f..a8dcb19f 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HeartbeatService.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HeartbeatService.java @@ -14,7 +14,7 @@ import org.apache.logging.log4j.Logger; public class HeartbeatService { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(HeartbeatService.class); private static final ScheduledExecutorService EXECUTOR_SERVICE = Executors.newScheduledThreadPool(2); private final ConnectionMediator connectionMediator; diff --git a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HelloOperationHandler.java b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HelloOperationHandler.java index 241149ed..a087d4ac 100644 --- a/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HelloOperationHandler.java +++ b/gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HelloOperationHandler.java @@ -13,7 +13,7 @@ import org.apache.logging.log4j.Logger; public class HelloOperationHandler implements GatewayOperationHandler { - private static final Logger LOGGER = LogManager.getLogger(); + private static final Logger LOGGER = LogManager.getLogger(HelloOperationHandler.class); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); private final HeartbeatService heartbeatService; From 5f99fc8f0e470a4cb77c0a193eeeca6955ff852b Mon Sep 17 00:00:00 2001 From: Suraj Kumar Date: Thu, 23 May 2024 23:00:52 +0100 Subject: [PATCH 2/2] Important: Fix loading annotations from a .jar file --- .../jdi/core/processor/ClassFileUtil.java | 68 +++++++++++++++---- .../jdi/core/processor/ListenerLoader.java | 18 +++-- .../com/javadiscord/jdi/core/Discord.java | 14 ++-- .../core/GatewayEventListenerAnnotations.java | 3 +- 4 files changed, 75 insertions(+), 28 deletions(-) diff --git a/annotations/src/main/java/com/javadiscord/jdi/core/processor/ClassFileUtil.java b/annotations/src/main/java/com/javadiscord/jdi/core/processor/ClassFileUtil.java index 0c2c270f..a03aafbb 100644 --- a/annotations/src/main/java/com/javadiscord/jdi/core/processor/ClassFileUtil.java +++ b/annotations/src/main/java/com/javadiscord/jdi/core/processor/ClassFileUtil.java @@ -3,6 +3,7 @@ import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -20,7 +21,11 @@ public static List getClassesInClassPath() { String[] classpathEntries = classpath.split(File.pathSeparator); for (String entry : classpathEntries) { File file = new File(entry); - classes.addAll(getClasses(file)); + try { + classes.addAll(getClasses(file)); + } catch (IOException ignore) { + /* Ignore */ + } } return classes; } @@ -48,21 +53,44 @@ public static String getClassName(File file) throws IOException { return className; } - private static List getClasses(File file) { - List classes = new ArrayList<>(); + private static List getClasses(File file) throws IOException { + List classFiles = new ArrayList<>(); if (file.isDirectory()) { - File[] files = file.listFiles(); - if (files != null) { - for (File f : files) { - classes.addAll(getClasses(f)); - } + classFiles.addAll(getClassesFromDirectory(file)); + } else if (isJarFile(file)) { + classFiles.addAll(getClassesFromJar(file)); + } else if (file.getName().endsWith(".class")) { + classFiles.add(file); + } + return classFiles; + } + + private static List getClassesFromDirectory(File directory) throws IOException { + List classFiles = new ArrayList<>(); + File[] files = directory.listFiles(); + if (files != null) { + for (File file : files) { + classFiles.addAll(getClasses(file)); } - } else { - if (file.getName().endsWith(".class")) { - classes.add(file); + } + return classFiles; + } + + private static List getClassesFromJar(File jarFile) throws IOException { + List classFiles = new ArrayList<>(); + try ( + FileInputStream fis = new FileInputStream(jarFile); + ZipInputStream zip = new ZipInputStream(fis) + ) { + ZipEntry entry; + while ((entry = zip.getNextEntry()) != null) { + if (!entry.isDirectory() && entry.getName().endsWith(".class")) { + File tempFile = extractClassFileFromJar(zip, entry.getName()); + classFiles.add(tempFile); + } } } - return classes; + return classFiles; } private static boolean isJarFile(File file) { @@ -76,4 +104,20 @@ private static String extractClassName(DataInputStream dis) throws IOException { private static String extractClassName(ZipInputStream zip) throws IOException { return new ClassFile(new DataInputStream(zip)).getName(); } + + private static File extractClassFileFromJar( + ZipInputStream zip, + String entryName + ) throws IOException { + File tempFile = File.createTempFile(entryName.replace('/', '_'), ".class"); + tempFile.deleteOnExit(); + try (FileOutputStream fos = new FileOutputStream(tempFile)) { + byte[] buffer = new byte[1024]; + int len; + while ((len = zip.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + } + return tempFile; + } } diff --git a/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java b/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java index 3d815248..b7d9a79d 100644 --- a/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java +++ b/annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java @@ -23,16 +23,20 @@ public ListenerLoader(List eventListeners) { } } - public void loadListeners() throws Exception { + public void loadListeners() { List classes = ClassFileUtil.getClassesInClassPath(); for (File classFile : classes) { - Class clazz = Class.forName(ClassFileUtil.getClassName(classFile)); - if (clazz.isAnnotationPresent(EventListener.class)) { - if (validateListener(clazz)) { - registerListener(clazz); - } else { - LOGGER.error("{} failed validation", clazz.getName()); + try { + Class clazz = Class.forName(ClassFileUtil.getClassName(classFile)); + if (clazz.isAnnotationPresent(EventListener.class)) { + if (validateListener(clazz)) { + registerListener(clazz); + } else { + LOGGER.error("{} failed validation", clazz.getName()); + } } + } catch (Exception ignore) { + /* Ignore */ } } } diff --git a/core/src/main/java/com/javadiscord/jdi/core/Discord.java b/core/src/main/java/com/javadiscord/jdi/core/Discord.java index de1252cc..4ba97449 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/Discord.java +++ b/core/src/main/java/com/javadiscord/jdi/core/Discord.java @@ -1,6 +1,5 @@ package com.javadiscord.jdi.core; -import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Parameter; @@ -102,19 +101,18 @@ public Discord(String botToken, IdentifyRequest identifyRequest, Cache cache) { this.identifyRequest = identifyRequest; this.cache = cache; if (annotationLibPresent()) { + LOGGER.info("Annotation lib is present, loading annotations listeners..."); loadAnnotations(); } } private boolean annotationLibPresent() { - String classpath = System.getProperty("java.class.path"); - String[] classpathEntries = classpath.split(File.pathSeparator); - for (String entry : classpathEntries) { - if (entry.endsWith("annotations-1.0.0.jar")) { - return true; - } + try { + Class.forName("com.javadiscord.jdi.core.processor.ListenerLoader"); + return true; + } catch (Exception e) { + return false; } - return false; } private void loadAnnotations() { diff --git a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java index 20def1a4..3953f356 100644 --- a/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java +++ b/core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java @@ -15,7 +15,8 @@ import org.apache.logging.log4j.Logger; public class GatewayEventListenerAnnotations implements GatewayObserver { - private static final Logger LOGGER = LogManager.getLogger(GatewayEventListenerAnnotations.class); + private static final Logger LOGGER = + LogManager.getLogger(GatewayEventListenerAnnotations.class); public static final Map EVENT_TYPE_ANNOTATIONS = new HashMap<>(); static {