Add a mechanism for printing debug reports.
Dieser Commit ist enthalten in:
Ursprung
d71bea9f8a
Commit
db8d08f602
@ -23,7 +23,10 @@ import java.util.PriorityQueue;
|
|||||||
import java.util.Queue;
|
import java.util.Queue;
|
||||||
import java.util.concurrent.Semaphore;
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
|
import com.comphenix.protocol.ProtocolLibrary;
|
||||||
import com.comphenix.protocol.concurrency.AbstractConcurrentListenerMultimap;
|
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.events.PacketEvent;
|
||||||
import com.comphenix.protocol.injector.PrioritizedListener;
|
import com.comphenix.protocol.injector.PrioritizedListener;
|
||||||
import com.google.common.collect.MinMaxPriorityQueue;
|
import com.google.common.collect.MinMaxPriorityQueue;
|
||||||
@ -35,6 +38,8 @@ import com.google.common.collect.MinMaxPriorityQueue;
|
|||||||
* @author Kristian
|
* @author Kristian
|
||||||
*/
|
*/
|
||||||
class PacketProcessingQueue extends AbstractConcurrentListenerMultimap<AsyncListenerHandler> {
|
class PacketProcessingQueue extends AbstractConcurrentListenerMultimap<AsyncListenerHandler> {
|
||||||
|
public static final ReportType REPORT_GUAVA_CORRUPT_MISSING =
|
||||||
|
new ReportType("Guava is either missing or corrupt. Reverting to PriorityQueue.");
|
||||||
|
|
||||||
// Initial number of elements
|
// Initial number of elements
|
||||||
public static final int INITIAL_CAPACITY = 64;
|
public static final int INITIAL_CAPACITY = 64;
|
||||||
@ -74,8 +79,9 @@ class PacketProcessingQueue extends AbstractConcurrentListenerMultimap<AsyncList
|
|||||||
maximumSize(maximumSize).
|
maximumSize(maximumSize).
|
||||||
<PacketEventHolder>create(), null);
|
<PacketEventHolder>create(), null);
|
||||||
} catch (IncompatibleClassChangeError e) {
|
} catch (IncompatibleClassChangeError e) {
|
||||||
System.out.println("[ProtocolLib] Guava is either missing or corrupt. Reverting to PriorityQueue.");
|
// Print in the console
|
||||||
e.printStackTrace();
|
ProtocolLibrary.getErrorReporter().reportWarning(
|
||||||
|
this, Report.newBuilder(REPORT_GUAVA_CORRUPT_MISSING).error(e));
|
||||||
|
|
||||||
// It's a Beta class after all
|
// It's a Beta class after all
|
||||||
this.processingQueue = Synchronization.queue(
|
this.processingQueue = Synchronization.queue(
|
||||||
|
@ -27,6 +27,10 @@ import java.util.concurrent.PriorityBlockingQueue;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
import com.comphenix.protocol.PacketType;
|
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.events.PacketEvent;
|
||||||
import com.comphenix.protocol.injector.PlayerLoggedOutException;
|
import com.comphenix.protocol.injector.PlayerLoggedOutException;
|
||||||
import com.comphenix.protocol.reflect.FieldAccessException;
|
import com.comphenix.protocol.reflect.FieldAccessException;
|
||||||
@ -36,6 +40,7 @@ import com.comphenix.protocol.reflect.FieldAccessException;
|
|||||||
* @author Kristian
|
* @author Kristian
|
||||||
*/
|
*/
|
||||||
abstract class PacketSendingQueue {
|
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;
|
public static final int INITIAL_CAPACITY = 10;
|
||||||
|
|
||||||
@ -43,10 +48,8 @@ abstract class PacketSendingQueue {
|
|||||||
|
|
||||||
// Asynchronous packet sending
|
// Asynchronous packet sending
|
||||||
private Executor asynchronousSender;
|
private Executor asynchronousSender;
|
||||||
|
|
||||||
// Whether or not packet transmission must occur on a specific thread
|
// Whether or not packet transmission must occur on a specific thread
|
||||||
private final boolean notThreadSafe;
|
private final boolean notThreadSafe;
|
||||||
|
|
||||||
// Whether or not we've run the cleanup procedure
|
// Whether or not we've run the cleanup procedure
|
||||||
private boolean cleanedUp = false;
|
private boolean cleanedUp = false;
|
||||||
|
|
||||||
@ -279,10 +282,10 @@ abstract class PacketSendingQueue {
|
|||||||
}
|
}
|
||||||
|
|
||||||
} catch (PlayerLoggedOutException e) {
|
} catch (PlayerLoggedOutException e) {
|
||||||
System.out.println(String.format(
|
ProtocolLibrary.getErrorReporter().reportDebug(this, Report.newBuilder(REPORT_DROPPED_PACKET).
|
||||||
"[ProtocolLib] Warning: Dropped packet index %s of type %s",
|
messageParam(marker.getOriginalSendingIndex(), event.getPacketType()).
|
||||||
marker.getOriginalSendingIndex(), event.getPacketType()
|
callerParam(event)
|
||||||
));
|
);
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
// Just print the error
|
// Just print the error
|
||||||
|
@ -45,6 +45,16 @@ public class BasicErrorReporter implements ErrorReporter {
|
|||||||
printParameters(parameters);
|
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
|
@Override
|
||||||
public void reportWarning(Object sender, Report report) {
|
public void reportWarning(Object sender, Report report) {
|
||||||
// Basic warning
|
// Basic warning
|
||||||
|
@ -37,6 +37,15 @@ public class DelegatedErrorReporter implements ErrorReporter {
|
|||||||
delegated.reportMinimal(sender, methodName, error, parameters);
|
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
|
@Override
|
||||||
public void reportWarning(Object sender, Report report) {
|
public void reportWarning(Object sender, Report report) {
|
||||||
Report transformed = filterReport(sender, report, false);
|
Report transformed = filterReport(sender, report, false);
|
||||||
@ -77,4 +86,9 @@ public class DelegatedErrorReporter implements ErrorReporter {
|
|||||||
public void reportDetailed(Object sender, ReportBuilder reportBuilder) {
|
public void reportDetailed(Object sender, ReportBuilder reportBuilder) {
|
||||||
reportDetailed(sender, reportBuilder.build());
|
reportDetailed(sender, reportBuilder.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reportDebug(Object sender, ReportBuilder builder) {
|
||||||
|
reportDebug(sender, builder.build());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@ import org.bukkit.plugin.Plugin;
|
|||||||
import com.comphenix.protocol.error.Report.ReportBuilder;
|
import com.comphenix.protocol.error.Report.ReportBuilder;
|
||||||
import com.comphenix.protocol.events.PacketAdapter;
|
import com.comphenix.protocol.events.PacketAdapter;
|
||||||
import com.comphenix.protocol.reflect.PrettyPrinter;
|
import com.comphenix.protocol.reflect.PrettyPrinter;
|
||||||
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.primitives.Primitives;
|
import com.google.common.primitives.Primitives;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -210,6 +211,18 @@ public class DetailedErrorReporter implements ErrorReporter {
|
|||||||
return (number & (number - 1)) == 0;
|
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
|
@Override
|
||||||
public void reportWarning(Object sender, ReportBuilder reportBuilder) {
|
public void reportWarning(Object sender, ReportBuilder reportBuilder) {
|
||||||
if (reportBuilder == null)
|
if (reportBuilder == null)
|
||||||
@ -220,24 +233,30 @@ public class DetailedErrorReporter implements ErrorReporter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void reportWarning(Object sender, Report report) {
|
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();
|
String message = "[" + pluginName + "] [" + getSenderName(sender) + "] " + report.getReportMessage();
|
||||||
|
|
||||||
// Print the main warning
|
// Print the main warning
|
||||||
if (report.getException() != null) {
|
if (report.getException() != null) {
|
||||||
logger.log(Level.WARNING, message, report.getException());
|
logger.log(level, message, report.getException());
|
||||||
} else {
|
} else {
|
||||||
logger.log(Level.WARNING, message);
|
logger.log(level, message);
|
||||||
|
|
||||||
// Remember the call stack
|
// Remember the call stack
|
||||||
if (detailedReporting) {
|
if (detailedReporting) {
|
||||||
printCallStack(Level.WARNING, logger);
|
printCallStack(level, logger);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parameters?
|
// Parameters?
|
||||||
if (report.hasCallerParameters()) {
|
if (report.hasCallerParameters()) {
|
||||||
// Write it
|
// Write it
|
||||||
logger.log(Level.WARNING, printParameters(report.getCallerParameters()));
|
logger.log(level, printParameters(report.getCallerParameters()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +44,22 @@ public interface ErrorReporter {
|
|||||||
*/
|
*/
|
||||||
public abstract void reportMinimal(Plugin sender, String methodName, Throwable error, Object... parameters);
|
public abstract void reportMinimal(Plugin sender, String methodName, Throwable error, Object... parameters);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints a debug message from the current sender.
|
||||||
|
* <p>
|
||||||
|
* 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.
|
* Prints a warning message from the current plugin.
|
||||||
* @param sender - the object containing the caller method.
|
* @param sender - the object containing the caller method.
|
||||||
|
@ -21,6 +21,16 @@ public class RethrowErrorReporter implements ErrorReporter {
|
|||||||
"Minimal error by " + sender + " in " + methodName + " with " + Joiner.on(",").join(parameters), error);
|
"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
|
@Override
|
||||||
public void reportWarning(Object sender, ReportBuilder reportBuilder) {
|
public void reportWarning(Object sender, ReportBuilder reportBuilder) {
|
||||||
reportWarning(sender, reportBuilder.build());
|
reportWarning(sender, reportBuilder.build());
|
||||||
|
@ -20,6 +20,7 @@ import com.google.common.util.concurrent.Futures;
|
|||||||
|
|
||||||
public class PacketFilterBuilder {
|
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_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 ClassLoader classLoader;
|
||||||
private Server server;
|
private Server server;
|
||||||
@ -218,7 +219,7 @@ 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
|
// Let plugins use this version instead
|
||||||
return delayed;
|
return delayed;
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren