/
SystemLogger.java
80 lines (65 loc) · 3.01 KB
/
SystemLogger.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package net.ME1312.Galaxi.Engine.Library.Log;
import net.ME1312.Galaxi.Engine.GalaxiEngine;
import net.ME1312.Galaxi.Engine.PluginManager;
import net.ME1312.Galaxi.Library.Container.Container;
import net.ME1312.Galaxi.Library.Log.LogStream;
import net.ME1312.Galaxi.Library.Log.Logger;
import net.ME1312.Galaxi.Library.Log.StringOutputStream;
import net.ME1312.Galaxi.Library.Util;
import org.jline.reader.LineReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static net.ME1312.Galaxi.Engine.GalaxiOption.COLOR_LOG_LEVELS;
/**
* System.out and System.err Override Class
*/
public final class SystemLogger extends OutputStream {
private HashMap<String, LogStream> last = new HashMap<String, LogStream>();
private boolean error;
SystemLogger(boolean level) {
this.error = level;
}
private static void start(LineReader jline) throws Exception {
if (Util.isNull(jline)) throw new NullPointerException();
Util.<Container<StringOutputStream>>reflect(Logger.class.getDeclaredField("pso"), null).set(new FileLogger(new ConsoleStream(jline)));
Util.reflect(Logger.class.getDeclaredMethod("log", boolean.class), null, COLOR_LOG_LEVELS.usr().equalsIgnoreCase("true") || (COLOR_LOG_LEVELS.usr().length() <= 0 && COLOR_LOG_LEVELS.get()));
System.setOut(new PrintStream(new SystemLogger(false), false, "UTF-8"));
System.setErr(new PrintStream(new SystemLogger(true), false, "UTF-8"));
}
@SuppressWarnings("unchecked")
private List<String> getKnownClasses() {
return new ArrayList<>(Util.<HashMap<String, ClassLoader>>getDespiteException(() -> Util.reflect(PluginManager.class.getDeclaredField("knownClasses"), GalaxiEngine.getInstance().getPluginManager()), null).keySet());
}
@Override
public void write(int c) throws IOException {
int i = 0;
String origin = java.lang.System.class.getCanonicalName();
for (StackTraceElement element : new Exception().getStackTrace()) {
if (i > 1 && getKnownClasses().contains(element.getClassName())) {
origin = element.getClassName().replaceAll("\\$([^.$\\d]+)", ".$1").replaceAll("\\$[\\d]+", "");
break;
}
i++;
}
if (!last.keySet().contains(origin)) {
Logger log = new Logger(origin);
last.put(origin, (error)?log.error:log.info);
}
LogStream log = last.get(origin);
log.toPrimitive().write(c);
if (c == '\n') last.remove(origin);
}
private static void stop() throws Exception {
Thread.sleep(125);
Util.reflect(Logger.class.getDeclaredField("running"), null, false);
Thread thread = Util.reflect(Logger.class.getDeclaredField("thread"), null);
if (thread != null) while (thread.isAlive()) {
Thread.sleep(125);
}
Util.reflect(FileLogger.class.getDeclaredMethod("stop"), null);
}
}