From db8d08f60262624fce7f397eb5b2c2b5a17d6ba5 Mon Sep 17 00:00:00 2001 From: "Kristian S. Stangeland" Date: Sun, 22 Dec 2013 17:31:31 +0100 Subject: [PATCH] Add a mechanism for printing debug reports. --- .../protocol/async/PacketProcessingQueue.java | 10 +++++-- .../protocol/async/PacketSendingQueue.java | 17 ++++++----- .../protocol/error/BasicErrorReporter.java | 10 +++++++ .../error/DelegatedErrorReporter.java | 14 +++++++++ .../protocol/error/DetailedErrorReporter.java | 29 +++++++++++++++---- .../protocol/error/ErrorReporter.java | 16 ++++++++++ .../protocol/error/RethrowErrorReporter.java | 10 +++++++ .../injector/PacketFilterBuilder.java | 5 ++-- 8 files changed, 95 insertions(+), 16 deletions(-) diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketProcessingQueue.java b/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketProcessingQueue.java index d3622e3b..8a72b645 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketProcessingQueue.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketProcessingQueue.java @@ -23,7 +23,10 @@ import java.util.PriorityQueue; import java.util.Queue; import java.util.concurrent.Semaphore; +import com.comphenix.protocol.ProtocolLibrary; import com.comphenix.protocol.concurrency.AbstractConcurrentListenerMultimap; +import com.comphenix.protocol.error.Report; +import com.comphenix.protocol.error.ReportType; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.injector.PrioritizedListener; import com.google.common.collect.MinMaxPriorityQueue; @@ -35,6 +38,8 @@ import com.google.common.collect.MinMaxPriorityQueue; * @author Kristian */ class PacketProcessingQueue extends AbstractConcurrentListenerMultimap { + public static final ReportType REPORT_GUAVA_CORRUPT_MISSING = + new ReportType("Guava is either missing or corrupt. Reverting to PriorityQueue."); // Initial number of elements public static final int INITIAL_CAPACITY = 64; @@ -74,8 +79,9 @@ class PacketProcessingQueue extends AbstractConcurrentListenerMultimapcreate(), null); } catch (IncompatibleClassChangeError e) { - System.out.println("[ProtocolLib] Guava is either missing or corrupt. Reverting to PriorityQueue."); - e.printStackTrace(); + // Print in the console + ProtocolLibrary.getErrorReporter().reportWarning( + this, Report.newBuilder(REPORT_GUAVA_CORRUPT_MISSING).error(e)); // It's a Beta class after all this.processingQueue = Synchronization.queue( diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketSendingQueue.java b/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketSendingQueue.java index 04dbdb05..c8a02bae 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketSendingQueue.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketSendingQueue.java @@ -27,6 +27,10 @@ import java.util.concurrent.PriorityBlockingQueue; import org.bukkit.entity.Player; import com.comphenix.protocol.PacketType; +import com.comphenix.protocol.ProtocolLibrary; +import com.comphenix.protocol.error.ErrorReporter; +import com.comphenix.protocol.error.Report; +import com.comphenix.protocol.error.ReportType; import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.injector.PlayerLoggedOutException; import com.comphenix.protocol.reflect.FieldAccessException; @@ -36,17 +40,16 @@ import com.comphenix.protocol.reflect.FieldAccessException; * @author Kristian */ abstract class PacketSendingQueue { - + public static final ReportType REPORT_DROPPED_PACKET = new ReportType("Warning: Dropped packet index %s of type %s."); + public static final int INITIAL_CAPACITY = 10; private PriorityBlockingQueue sendingQueue; // Asynchronous packet sending private Executor asynchronousSender; - // Whether or not packet transmission must occur on a specific thread private final boolean notThreadSafe; - // Whether or not we've run the cleanup procedure private boolean cleanedUp = false; @@ -279,10 +282,10 @@ abstract class PacketSendingQueue { } } catch (PlayerLoggedOutException e) { - System.out.println(String.format( - "[ProtocolLib] Warning: Dropped packet index %s of type %s", - marker.getOriginalSendingIndex(), event.getPacketType() - )); + ProtocolLibrary.getErrorReporter().reportDebug(this, Report.newBuilder(REPORT_DROPPED_PACKET). + messageParam(marker.getOriginalSendingIndex(), event.getPacketType()). + callerParam(event) + ); } catch (IOException e) { // Just print the error diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/error/BasicErrorReporter.java b/ProtocolLib/src/main/java/com/comphenix/protocol/error/BasicErrorReporter.java index dc4225d0..c70b15c7 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/error/BasicErrorReporter.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/error/BasicErrorReporter.java @@ -45,6 +45,16 @@ public class BasicErrorReporter implements ErrorReporter { printParameters(parameters); } + @Override + public void reportDebug(Object sender, Report report) { + // We just have to swallow it + } + + @Override + public void reportDebug(Object sender, ReportBuilder builder) { + // As above + } + @Override public void reportWarning(Object sender, Report report) { // Basic warning diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/error/DelegatedErrorReporter.java b/ProtocolLib/src/main/java/com/comphenix/protocol/error/DelegatedErrorReporter.java index 6d855320..1b7528e5 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/error/DelegatedErrorReporter.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/error/DelegatedErrorReporter.java @@ -37,6 +37,15 @@ public class DelegatedErrorReporter implements ErrorReporter { delegated.reportMinimal(sender, methodName, error, parameters); } + @Override + public void reportDebug(Object sender, Report report) { + Report transformed = filterReport(sender, report, false); + + if (transformed != null) { + delegated.reportDebug(sender, transformed); + } + } + @Override public void reportWarning(Object sender, Report report) { Report transformed = filterReport(sender, report, false); @@ -77,4 +86,9 @@ public class DelegatedErrorReporter implements ErrorReporter { public void reportDetailed(Object sender, ReportBuilder reportBuilder) { reportDetailed(sender, reportBuilder.build()); } + + @Override + public void reportDebug(Object sender, ReportBuilder builder) { + reportDebug(sender, builder.build()); + } } diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/error/DetailedErrorReporter.java b/ProtocolLib/src/main/java/com/comphenix/protocol/error/DetailedErrorReporter.java index 1f501ca5..9fab0e8c 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/error/DetailedErrorReporter.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/error/DetailedErrorReporter.java @@ -37,6 +37,7 @@ import org.bukkit.plugin.Plugin; import com.comphenix.protocol.error.Report.ReportBuilder; import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.reflect.PrettyPrinter; +import com.google.common.base.Preconditions; import com.google.common.primitives.Primitives; /** @@ -144,7 +145,7 @@ public class DetailedErrorReporter implements ErrorReporter { public void setDetailedReporting(boolean detailedReporting) { this.detailedReporting = detailedReporting; } - + @Override public void reportMinimal(Plugin sender, String methodName, Throwable error, Object... parameters) { if (reportMinimalNoSpam(sender, methodName, error)) { @@ -210,6 +211,18 @@ public class DetailedErrorReporter implements ErrorReporter { return (number & (number - 1)) == 0; } + @Override + public void reportDebug(Object sender, ReportBuilder builder) { + reportDebug(sender, Preconditions.checkNotNull(builder, "builder cannot be NULL").build()); + } + + @Override + public void reportDebug(Object sender, Report report) { + if (logger.isLoggable(Level.FINE)) { + reportLevel(Level.FINE, sender, report); + } + } + @Override public void reportWarning(Object sender, ReportBuilder reportBuilder) { if (reportBuilder == null) @@ -220,24 +233,30 @@ public class DetailedErrorReporter implements ErrorReporter { @Override public void reportWarning(Object sender, Report report) { + if (logger.isLoggable(Level.WARNING)) { + reportLevel(Level.WARNING, sender, report); + } + } + + private void reportLevel(Level level, Object sender, Report report) { String message = "[" + pluginName + "] [" + getSenderName(sender) + "] " + report.getReportMessage(); // Print the main warning if (report.getException() != null) { - logger.log(Level.WARNING, message, report.getException()); + logger.log(level, message, report.getException()); } else { - logger.log(Level.WARNING, message); + logger.log(level, message); // Remember the call stack if (detailedReporting) { - printCallStack(Level.WARNING, logger); + printCallStack(level, logger); } } // Parameters? if (report.hasCallerParameters()) { // Write it - logger.log(Level.WARNING, printParameters(report.getCallerParameters())); + logger.log(level, printParameters(report.getCallerParameters())); } } diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/error/ErrorReporter.java b/ProtocolLib/src/main/java/com/comphenix/protocol/error/ErrorReporter.java index f2da5e51..476321b6 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/error/ErrorReporter.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/error/ErrorReporter.java @@ -44,6 +44,22 @@ public interface ErrorReporter { */ public abstract void reportMinimal(Plugin sender, String methodName, Throwable error, Object... parameters); + /** + * Prints a debug message from the current sender. + *

+ * Most users will not see this message. + * @param sender - the sender. + * @param report - the report. + */ + public abstract void reportDebug(Object sender, Report report); + + /** + * Prints a debug message from the current sender. + * @param sender - the sender. + * @param report - the report builder. + */ + public abstract void reportDebug(Object sender, ReportBuilder builder); + /** * Prints a warning message from the current plugin. * @param sender - the object containing the caller method. diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/error/RethrowErrorReporter.java b/ProtocolLib/src/main/java/com/comphenix/protocol/error/RethrowErrorReporter.java index 2e9be463..ba63dc36 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/error/RethrowErrorReporter.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/error/RethrowErrorReporter.java @@ -21,6 +21,16 @@ public class RethrowErrorReporter implements ErrorReporter { "Minimal error by " + sender + " in " + methodName + " with " + Joiner.on(",").join(parameters), error); } + @Override + public void reportDebug(Object sender, Report report) { + // Do nothing - this is just a debug + } + + @Override + public void reportDebug(Object sender, ReportBuilder builder) { + // As above + } + @Override public void reportWarning(Object sender, ReportBuilder reportBuilder) { reportWarning(sender, reportBuilder.build()); diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterBuilder.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterBuilder.java index b781ba71..25e42559 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterBuilder.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterBuilder.java @@ -20,6 +20,7 @@ import com.google.common.util.concurrent.Futures; public class PacketFilterBuilder { public static final ReportType REPORT_TEMPORARY_EVENT_ERROR = new ReportType("Unable to register or handle temporary event."); + public static final ReportType REPORT_SPIGOT_IS_DELAYING_INJECTOR = new ReportType("Delaying due to Spigot."); private ClassLoader classLoader; private Server server; @@ -218,8 +219,8 @@ public class PacketFilterBuilder { } }); - System.out.println("Delaying due to Spigot"); - + reporter.reportWarning(this, Report.newBuilder(REPORT_SPIGOT_IS_DELAYING_INJECTOR)); + // Let plugins use this version instead return delayed; } else {