Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
153 changes: 144 additions & 9 deletions patches/server/0638-Add-System.out-err-catcher.patch
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,26 @@ Subject: [PATCH] Add System.out/err catcher

diff --git a/src/main/java/io/papermc/paper/logging/SysoutCatcher.java b/src/main/java/io/papermc/paper/logging/SysoutCatcher.java
new file mode 100644
index 0000000000000000000000000000000000000000..a8e813ca89b033f061e695288b3383bdcf128531
index 0000000000000000000000000000000000000000..64b8bf47162811334a934136d6aaa6c71a0f47ee
--- /dev/null
+++ b/src/main/java/io/papermc/paper/logging/SysoutCatcher.java
@@ -0,0 +1,94 @@
@@ -0,0 +1,229 @@
+package io.papermc.paper.logging;
+
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.io.FilterOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Objects;
+import java.nio.charset.StandardCharsets;
+import java.util.Formatter;
+import java.util.Locale;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public final class SysoutCatcher {
+ private static final boolean SUPPRESS_NAGS = Boolean.getBoolean("io.papermc.paper.suppress.sout.nags");
Expand Down Expand Up @@ -61,7 +63,16 @@ index 0000000000000000000000000000000000000000..a8e813ca89b033f061e695288b3383bd
+
+ @Override
+ public void println(@Nullable final String line) {
+ final Class<?> clazz = STACK_WALKER.getCallerClass();
+ final Class<?> clazz = STACK_WALKER.walk(stream -> {
+ return stream.filter(it -> {
+ final Class<?> declr = it.getDeclaringClass();
+ return !declr.equals(WrappedOutStream.class) && !declr.equals(PrintStream.class)
+ && !declr.equals(FilterOutputStream.class) && !declr.getName().equals("java.lang.Throwable$WrappedPrintStream")
+ && !declr.equals(Throwable.class);
+ }).findFirst()
+ .map(StackWalker.StackFrame::getDeclaringClass)
+ .orElseThrow();
+ });
+ try {
+ final JavaPlugin plugin = JavaPlugin.getProvidingPlugin(clazz);
+
Expand Down Expand Up @@ -97,6 +108,130 @@ index 0000000000000000000000000000000000000000..a8e813ca89b033f061e695288b3383bd
+ Bukkit.getLogger().log(this.level, String.format("%s[%s] %s", this.prefix, clazz.getName(), line));
+ }
+ }
+
+ @Override
+ public void write(final int b) {
+ this.println(b);
+ }
+
+ @Override
+ public void write(@NotNull final byte[] buf, final int off, final int len) {
+ final byte[] bytes = new byte[len];
+ System.arraycopy(buf, off, bytes, 0, len);
+ this.write(bytes);
+ }
+
+ @Override
+ public void write(final byte[] buf) {
+ this.println(new String(buf, StandardCharsets.UTF_8));
+ }
+
+ @Override
+ public void writeBytes(final byte[] buf) {
+ this.write(buf);
+ }
+
+ @Override
+ public void print(final boolean b) {
+ this.println(b);
+ }
+
+ @Override
+ public void print(final char c) {
+ this.println(c);
+ }
+
+ @Override
+ public void print(final int i) {
+ this.println(i);
+ }
+
+ @Override
+ public void print(final long l) {
+ this.println(l);
+ }
+
+ @Override
+ public void print(final float f) {
+ this.println(f);
+ }
+
+ @Override
+ public void print(final double d) {
+ this.println(d);
+ }
+
+ @Override
+ public void print(@NotNull final char[] s) {
+ this.println(s);
+ }
+
+ @Override
+ public void print(@Nullable final String s) {
+ this.println(s);
+ }
+
+ @Override
+ public void print(@Nullable final Object obj) {
+ this.println(obj);
+ }
+
+ @Override
+ public PrintStream format(@NotNull final String format, final Object... args) {
+ this.println(format.formatted(args));
+ return this;
+ }
+
+ @Override
+ public PrintStream format(final Locale l, @NotNull final String format, final Object... args) {
+ this.println(new Formatter(l).format(format, args).toString());
+ return this;
+ }
+
+ @Override
+ public void println() {
+ this.println("");
+ }
+
+ @Override
+ public void println(final boolean x) {
+ this.println(String.valueOf(x));
+ }
+
+ @Override
+ public void println(final char x) {
+ this.println(String.valueOf(x));
+ }
+
+ @Override
+ public void println(final int x) {
+ this.println(String.valueOf(x));
+ }
+
+ @Override
+ public void println(final long x) {
+ this.println(String.valueOf(x));
+ }
+
+ @Override
+ public void println(final float x) {
+ this.println(String.valueOf(x));
+ }
+
+ @Override
+ public void println(final double x) {
+ this.println(String.valueOf(x));
+ }
+
+ @Override
+ public void println(@NotNull final char[] x) {
+ this.println(new String(x));
+ }
+
+ @Override
+ public void println(@Nullable final Object x) {
+ this.println(String.valueOf(String.valueOf(x)));
+ }
+ }
+
+ private static class PluginNag {
Expand Down