From 58c027f162391100509d7b7fdf68218bc35ab31c Mon Sep 17 00:00:00 2001 From: "Kristian S. Stangeland" Date: Sun, 29 Dec 2013 11:58:54 +0100 Subject: [PATCH] Print caught exceptions in debug mode. --- .../comphenix/protocol/ProtocolConfig.java | 1 - .../comphenix/protocol/ProtocolLibrary.java | 37 +++++++++++++------ .../protocol/async/PacketSendingQueue.java | 1 - .../injector/DelayedPacketManager.java | 17 +++++++++ .../protocol/injector/InternalManager.java | 12 ++++++ .../injector/PacketFilterManager.java | 18 +++++++++ .../injector/netty/ChannelInjector.java | 7 ++++ .../injector/netty/ChannelListener.java | 6 +++ .../injector/netty/NettyProtocolInjector.java | 14 +++++++ 9 files changed, 99 insertions(+), 14 deletions(-) diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolConfig.java b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolConfig.java index c7cf03cc..9a7f686b 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolConfig.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolConfig.java @@ -356,7 +356,6 @@ class ProtocolConfig { * Set whether or not the background compiler for structure modifiers is enabled or not. *

* This setting will take effect next time ProtocolLib is started. - * * @param enabled - TRUE if is enabled/running, FALSE otherwise. */ public void setBackgroundCompilerEnabled(boolean enabled) { diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java index 3bc60b31..1845df7a 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/ProtocolLibrary.java @@ -126,14 +126,15 @@ public class ProtocolLibrary extends JavaPlugin { // Used to clean up server packets that have expired. But mostly required to simulate // recieving client packets. - private int asyncPacketTask = -1; + private int packetTask = -1; private int tickCounter = 0; - private static final int ASYNC_PACKET_DELAY = 1; + private static final int ASYNC_MANAGER_DELAY = 1; // Used to unhook players after a delay private DelayedSingleTask unhookTask; // Settings/options + private int configExpectedMod = -1; private ProtocolConfig config; // Updater @@ -364,7 +365,7 @@ public class ProtocolLibrary extends JavaPlugin { // Worker that ensures that async packets are eventually sent // It also performs the update check. - createAsyncTask(server); + createPacketTask(server); } catch (Throwable e) { reporter.reportDetailed(this, Report.newBuilder(REPORT_PLUGIN_ENABLE_ERROR).error(e)); @@ -483,34 +484,46 @@ public class ProtocolLibrary extends JavaPlugin { getServer().getPluginManager().disablePlugin(this); } - private void createAsyncTask(Server server) { + private void createPacketTask(Server server) { try { - if (asyncPacketTask >= 0) - throw new IllegalStateException("Async task has already been created"); + if (packetTask >= 0) + throw new IllegalStateException("Packet task has already been created"); // Attempt to create task - asyncPacketTask = server.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { + packetTask = server.getScheduler().scheduleSyncRepeatingTask(this, new Runnable() { @Override public void run() { AsyncFilterManager manager = (AsyncFilterManager) protocolManager.getAsynchronousManager(); // We KNOW we're on the main thread at the moment manager.sendProcessedPackets(tickCounter++, true); + + // House keeping + updateConfiguration(); // Check for updates too if (!UPDATES_DISABLED) { checkUpdates(); } } - }, ASYNC_PACKET_DELAY, ASYNC_PACKET_DELAY); + }, ASYNC_MANAGER_DELAY, ASYNC_MANAGER_DELAY); } catch (Throwable e) { - if (asyncPacketTask == -1) { + if (packetTask == -1) { reporter.reportDetailed(this, Report.newBuilder(REPORT_CANNOT_CREATE_TIMEOUT_TASK).error(e)); } } } + private void updateConfiguration() { + if (config != null && config.getModificationCount() != configExpectedMod) { + configExpectedMod = config.getModificationCount(); + + // Update the debug flag + protocolManager.setDebug(config.isDebug()); + } + } + private void checkUpdates() { // Ignore milliseconds - it's pointless long currentTime = System.currentTimeMillis() / MILLI_PER_SECOND; @@ -551,9 +564,9 @@ public class ProtocolLibrary extends JavaPlugin { } // Clean up - if (asyncPacketTask >= 0) { - getServer().getScheduler().cancelTask(asyncPacketTask); - asyncPacketTask = -1; + if (packetTask >= 0) { + getServer().getScheduler().cancelTask(packetTask); + packetTask = -1; } // And redirect handler too 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 c8a02bae..95579114 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketSendingQueue.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/async/PacketSendingQueue.java @@ -28,7 +28,6 @@ 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; diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/DelayedPacketManager.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/DelayedPacketManager.java index 5ffd0121..779f9d8b 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/DelayedPacketManager.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/DelayedPacketManager.java @@ -60,6 +60,7 @@ public class DelayedPacketManager implements ProtocolManager, InternalManager { // If we have been closed private boolean closed; + private boolean debug; // Queued registration private PluginManager queuedManager; @@ -110,6 +111,8 @@ public class DelayedPacketManager implements ProtocolManager, InternalManager { if (queuedManager != null && queuedPlugin != null) { delegate.registerEvents(queuedManager, queuedPlugin); } + // And update the debug mode + delegate.setDebug(debug); // Add any pending listeners synchronized (queuedListeners) { @@ -428,6 +431,20 @@ public class DelayedPacketManager implements ProtocolManager, InternalManager { return asyncManager; } + @Override + public boolean isDebug() { + return debug; + } + + @Override + public void setDebug(boolean debug) { + this.debug = debug; + + if (delegate != null) { + delegate.setDebug(debug); + } + } + /** * Update the asynchronous manager. This must be set. * @param asyncManager - the asynchronous manager. diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/InternalManager.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/InternalManager.java index fe37d341..b533de2b 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/InternalManager.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/InternalManager.java @@ -35,4 +35,16 @@ public interface InternalManager extends ProtocolManager { * Called when ProtocolLib is closing. */ public void close(); + + /** + * Determine if debug mode is enabled. + * @return TRUE if it is, FALSE otherwise. + */ + public boolean isDebug(); + + /** + * Set whether or not debug mode is enabled. + * @param debug - TRUE if it is, FALSE otherwise. + */ + public void setDebug(boolean debug); } diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java index 3e9b81cd..d174b8e8 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/PacketFilterManager.java @@ -199,6 +199,9 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok // Login packets private LoginPackets loginPackets; + // Debug mode + private boolean debug; + /** * Only create instances of this class if protocol lib is disabled. */ @@ -301,6 +304,21 @@ public final class PacketFilterManager implements ProtocolManager, ListenerInvok return asyncFilterManager; } + @Override + public boolean isDebug() { + return debug; + } + + @Override + public void setDebug(boolean debug) { + this.debug = debug; + + // Inform components that can handle debug mode + if (nettyInjector != null) { + nettyInjector.setDebug(debug); + } + } + /** * Retrieves how the server packets are read. * @return Injection method for reading server packets. diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java index 3a0fd943..0e6ab530 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelInjector.java @@ -210,6 +210,13 @@ class ChannelInjector extends ByteToMessageDecoder implements Injector { ENCODER_TYPE_MATCHER.set(encoder, TypeParameterMatcher.get(MinecraftReflection.getPacketClass())); } + @Override + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { + if (channelListener.isDebug()) + cause.printStackTrace(); + super.exceptionCaught(ctx, cause); + } + /** * Encode a packet to a byte buffer, taking over for the standard Minecraft encoder. * @param ctx - the current context. diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelListener.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelListener.java index 15f6ae5d..14160053 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelListener.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/ChannelListener.java @@ -57,4 +57,10 @@ interface ChannelListener { * @return The error reporter. */ public ErrorReporter getReporter(); + + /** + * Determine if debug mode is enabled. + * @return TRUE if it is, FALSE otherwise. + */ + boolean isDebug(); } \ No newline at end of file diff --git a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/NettyProtocolInjector.java b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/NettyProtocolInjector.java index a8d4ccf9..4a4b6314 100644 --- a/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/NettyProtocolInjector.java +++ b/ProtocolLib/src/main/java/com/comphenix/protocol/injector/netty/NettyProtocolInjector.java @@ -65,12 +65,26 @@ public class NettyProtocolInjector implements ChannelListener { // Handle errors private ErrorReporter reporter; + private boolean debug; public NettyProtocolInjector(ListenerInvoker invoker, ErrorReporter reporter) { this.invoker = invoker; this.reporter = reporter; } + @Override + public boolean isDebug() { + return debug; + } + + /** + * Set whether or not the debug mode is enabled. + * @param debug - TRUE if it is, FALSE otherwise. + */ + public void setDebug(boolean debug) { + this.debug = debug; + } + /** * Inject into the spigot connection class. */