Skip to content

Commit 4a40c37

Browse files
authored
Added .class to LogManager (#128)
* Added `.class` to LogManager * Important: Fix loading annotations from a .jar file
1 parent 9402033 commit 4a40c37

File tree

15 files changed

+94
-40
lines changed

15 files changed

+94
-40
lines changed

annotations/src/main/java/com/javadiscord/jdi/core/processor/ClassFileUtil.java

Lines changed: 56 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.io.DataInputStream;
44
import java.io.File;
55
import java.io.FileInputStream;
6+
import java.io.FileOutputStream;
67
import java.io.IOException;
78
import java.util.ArrayList;
89
import java.util.List;
@@ -20,7 +21,11 @@ public static List<File> getClassesInClassPath() {
2021
String[] classpathEntries = classpath.split(File.pathSeparator);
2122
for (String entry : classpathEntries) {
2223
File file = new File(entry);
23-
classes.addAll(getClasses(file));
24+
try {
25+
classes.addAll(getClasses(file));
26+
} catch (IOException ignore) {
27+
/* Ignore */
28+
}
2429
}
2530
return classes;
2631
}
@@ -48,21 +53,44 @@ public static String getClassName(File file) throws IOException {
4853
return className;
4954
}
5055

51-
private static List<File> getClasses(File file) {
52-
List<File> classes = new ArrayList<>();
56+
private static List<File> getClasses(File file) throws IOException {
57+
List<File> classFiles = new ArrayList<>();
5358
if (file.isDirectory()) {
54-
File[] files = file.listFiles();
55-
if (files != null) {
56-
for (File f : files) {
57-
classes.addAll(getClasses(f));
58-
}
59+
classFiles.addAll(getClassesFromDirectory(file));
60+
} else if (isJarFile(file)) {
61+
classFiles.addAll(getClassesFromJar(file));
62+
} else if (file.getName().endsWith(".class")) {
63+
classFiles.add(file);
64+
}
65+
return classFiles;
66+
}
67+
68+
private static List<File> getClassesFromDirectory(File directory) throws IOException {
69+
List<File> classFiles = new ArrayList<>();
70+
File[] files = directory.listFiles();
71+
if (files != null) {
72+
for (File file : files) {
73+
classFiles.addAll(getClasses(file));
5974
}
60-
} else {
61-
if (file.getName().endsWith(".class")) {
62-
classes.add(file);
75+
}
76+
return classFiles;
77+
}
78+
79+
private static List<File> getClassesFromJar(File jarFile) throws IOException {
80+
List<File> classFiles = new ArrayList<>();
81+
try (
82+
FileInputStream fis = new FileInputStream(jarFile);
83+
ZipInputStream zip = new ZipInputStream(fis)
84+
) {
85+
ZipEntry entry;
86+
while ((entry = zip.getNextEntry()) != null) {
87+
if (!entry.isDirectory() && entry.getName().endsWith(".class")) {
88+
File tempFile = extractClassFileFromJar(zip, entry.getName());
89+
classFiles.add(tempFile);
90+
}
6391
}
6492
}
65-
return classes;
93+
return classFiles;
6694
}
6795

6896
private static boolean isJarFile(File file) {
@@ -76,4 +104,20 @@ private static String extractClassName(DataInputStream dis) throws IOException {
76104
private static String extractClassName(ZipInputStream zip) throws IOException {
77105
return new ClassFile(new DataInputStream(zip)).getName();
78106
}
107+
108+
private static File extractClassFileFromJar(
109+
ZipInputStream zip,
110+
String entryName
111+
) throws IOException {
112+
File tempFile = File.createTempFile(entryName.replace('/', '_'), ".class");
113+
tempFile.deleteOnExit();
114+
try (FileOutputStream fos = new FileOutputStream(tempFile)) {
115+
byte[] buffer = new byte[1024];
116+
int len;
117+
while ((len = zip.read(buffer)) > 0) {
118+
fos.write(buffer, 0, len);
119+
}
120+
}
121+
return tempFile;
122+
}
79123
}

annotations/src/main/java/com/javadiscord/jdi/core/processor/EventListenerValidator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.apache.logging.log4j.Logger;
1313

1414
public class EventListenerValidator {
15-
private static final Logger LOGGER = LogManager.getLogger();
15+
private static final Logger LOGGER = LogManager.getLogger(EventListenerValidator.class);
1616
private static final Map<Class<? extends Annotation>, String[]> EXPECTED_PARAM_TYPES_MAP =
1717
new HashMap<>();
1818

annotations/src/main/java/com/javadiscord/jdi/core/processor/ListenerLoader.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import org.apache.logging.log4j.Logger;
1111

1212
public class ListenerLoader {
13-
private static final Logger LOGGER = LogManager.getLogger();
13+
private static final Logger LOGGER = LogManager.getLogger(ListenerLoader.class);
1414
private final EventListenerValidator eventListenerValidator = new EventListenerValidator();
1515
private final List<Object> eventListeners;
1616

@@ -23,16 +23,20 @@ public ListenerLoader(List<Object> eventListeners) {
2323
}
2424
}
2525

26-
public void loadListeners() throws Exception {
26+
public void loadListeners() {
2727
List<File> classes = ClassFileUtil.getClassesInClassPath();
2828
for (File classFile : classes) {
29-
Class<?> clazz = Class.forName(ClassFileUtil.getClassName(classFile));
30-
if (clazz.isAnnotationPresent(EventListener.class)) {
31-
if (validateListener(clazz)) {
32-
registerListener(clazz);
33-
} else {
34-
LOGGER.error("{} failed validation", clazz.getName());
29+
try {
30+
Class<?> clazz = Class.forName(ClassFileUtil.getClassName(classFile));
31+
if (clazz.isAnnotationPresent(EventListener.class)) {
32+
if (validateListener(clazz)) {
33+
registerListener(clazz);
34+
} else {
35+
LOGGER.error("{} failed validation", clazz.getName());
36+
}
3537
}
38+
} catch (Exception ignore) {
39+
/* Ignore */
3640
}
3741
}
3842
}

api/src/main/java/com/javadiscord/jdi/internal/api/DiscordRequestDispatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public class DiscordRequestDispatcher implements Runnable {
1919
? System.getProperty("DISCORD_BASE_URL")
2020
: "https://discord.com/api";
2121

22-
private static final Logger LOGGER = LogManager.getLogger();
22+
private static final Logger LOGGER = LogManager.getLogger(DiscordRequestDispatcher.class);
2323
private final HttpClient httpClient;
2424
private final BlockingQueue<DiscordRequestBuilder> queue;
2525
private final String botToken;

core/src/main/java/com/javadiscord/jdi/core/Discord.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.javadiscord.jdi.core;
22

3-
import java.io.File;
43
import java.lang.reflect.Constructor;
54
import java.lang.reflect.InvocationTargetException;
65
import java.lang.reflect.Parameter;
@@ -27,7 +26,7 @@
2726
import org.apache.logging.log4j.Logger;
2827

2928
public class Discord {
30-
private static final Logger LOGGER = LogManager.getLogger();
29+
private static final Logger LOGGER = LogManager.getLogger(Discord.class);
3130
private static final ExecutorService EXECUTOR = Executors.newCachedThreadPool();
3231
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
3332
private static final String WEBSITE = "https://javadiscord.com/";
@@ -102,19 +101,18 @@ public Discord(String botToken, IdentifyRequest identifyRequest, Cache cache) {
102101
this.identifyRequest = identifyRequest;
103102
this.cache = cache;
104103
if (annotationLibPresent()) {
104+
LOGGER.info("Annotation lib is present, loading annotations listeners...");
105105
loadAnnotations();
106106
}
107107
}
108108

109109
private boolean annotationLibPresent() {
110-
String classpath = System.getProperty("java.class.path");
111-
String[] classpathEntries = classpath.split(File.pathSeparator);
112-
for (String entry : classpathEntries) {
113-
if (entry.endsWith("annotations-1.0.0.jar")) {
114-
return true;
115-
}
110+
try {
111+
Class.forName("com.javadiscord.jdi.core.processor.ListenerLoader");
112+
return true;
113+
} catch (Exception e) {
114+
return false;
116115
}
117-
return false;
118116
}
119117

120118
private void loadAnnotations() {

core/src/main/java/com/javadiscord/jdi/core/GatewayEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import org.apache.logging.log4j.Logger;
3030

3131
public class GatewayEventListener implements GatewayObserver {
32-
private static final Logger LOGGER = LogManager.getLogger();
32+
private static final Logger LOGGER = LogManager.getLogger(GatewayEventListener.class);
3333
private final Discord discord;
3434

3535
public GatewayEventListener(Discord discord) {

core/src/main/java/com/javadiscord/jdi/core/GatewayEventListenerAnnotations.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@
1515
import org.apache.logging.log4j.Logger;
1616

1717
public class GatewayEventListenerAnnotations implements GatewayObserver {
18-
private static final Logger LOGGER = LogManager.getLogger();
18+
private static final Logger LOGGER =
19+
LogManager.getLogger(GatewayEventListenerAnnotations.class);
1920
public static final Map<EventType, String> EVENT_TYPE_ANNOTATIONS = new HashMap<>();
2021

2122
static {

example/echo-bot/build.gradle

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
plugins {
22
id 'java'
33
id 'application'
4+
id 'com.github.johnrengelman.shadow' version '8.1.1'
45
}
56

67
application {
78
mainClass = 'com.javadiscord.jdi.example.Main'
89
}
910

1011
dependencies {}
12+
13+
shadowJar {
14+
archiveBaseName.set('example-bot')
15+
archiveClassifier.set('')
16+
archiveVersion.set('')
17+
}

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
import org.apache.logging.log4j.Logger;
2121

2222
public class WebSocketHandler implements Handler<WebSocket> {
23-
private static final Logger LOGGER = LogManager.getLogger();
23+
private static final Logger LOGGER = LogManager.getLogger(WebSocketHandler.class);
2424
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
2525
private static final Map<Integer, GatewayOperationHandler> OPERATION_HANDLER = new HashMap<>();
2626
private final ConnectionMediator connectionMediator;

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.apache.logging.log4j.Logger;
1515

1616
public class WebSocketManager {
17-
private static final Logger LOGGER = LogManager.getLogger();
17+
private static final Logger LOGGER = LogManager.getLogger(WebSocketManager.class);
1818
private final GatewaySetting gatewaySetting;
1919
private final IdentifyRequest identifyRequest;
2020
private final Vertx vertx;

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/WebSocketRetryHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.apache.logging.log4j.Logger;
88

99
public class WebSocketRetryHandler {
10-
private static final Logger LOGGER = LogManager.getLogger();
10+
private static final Logger LOGGER = LogManager.getLogger(WebSocketRetryHandler.class);
1111
private final Vertx vertx;
1212
private final AtomicInteger attempts;
1313

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/EventCodecHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
import org.apache.logging.log4j.Logger;
4141

4242
public class EventCodecHandler implements GatewayOperationHandler {
43-
private static final Logger LOGGER = LogManager.getLogger();
43+
private static final Logger LOGGER = LogManager.getLogger(EventCodecHandler.class);
4444
private static final Map<EventType, EventDecoder<?>> EVENT_DECODERS = new HashMap<>();
4545
private static final Map<EventType, EventHandler<?>> EVENT_HANDLERS = new HashMap<>();
4646

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/events/codec/handlers/resume/ResumeEventHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import org.apache.logging.log4j.Logger;
99

1010
public class ResumeEventHandler implements EventHandler<ResumeEvent> {
11-
private static final Logger LOGGER = LogManager.getLogger();
11+
private static final Logger LOGGER = LogManager.getLogger(ResumeEventHandler.class);
1212

1313
@Override
1414
public void handle(ResumeEvent message, ConnectionMediator connectionMediator, Cache cache) {

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HeartbeatService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import org.apache.logging.log4j.Logger;
1515

1616
public class HeartbeatService {
17-
private static final Logger LOGGER = LogManager.getLogger();
17+
private static final Logger LOGGER = LogManager.getLogger(HeartbeatService.class);
1818
private static final ScheduledExecutorService EXECUTOR_SERVICE =
1919
Executors.newScheduledThreadPool(2);
2020
private final ConnectionMediator connectionMediator;

gateway/src/main/java/com/javadiscord/jdi/internal/gateway/handlers/heartbeat/HelloOperationHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import org.apache.logging.log4j.Logger;
1414

1515
public class HelloOperationHandler implements GatewayOperationHandler {
16-
private static final Logger LOGGER = LogManager.getLogger();
16+
private static final Logger LOGGER = LogManager.getLogger(HelloOperationHandler.class);
1717
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
1818
private final HeartbeatService heartbeatService;
1919

0 commit comments

Comments
 (0)