diff --git a/src/org/apollo/game/message/handler/MessageHandlerChain.java b/src/org/apollo/game/message/handler/MessageHandlerChain.java index c3c9942c..96e20db5 100644 --- a/src/org/apollo/game/message/handler/MessageHandlerChain.java +++ b/src/org/apollo/game/message/handler/MessageHandlerChain.java @@ -1,5 +1,9 @@ package org.apollo.game.message.handler; +import java.util.ArrayDeque; +import java.util.Arrays; +import java.util.Deque; + import org.apollo.game.message.Message; import org.apollo.game.model.entity.Player; @@ -7,6 +11,7 @@ import org.apollo.game.model.entity.Player; * A chain of message handlers. * * @author Graham + * @author Ryley * @param The type of message handled by this chain. */ public final class MessageHandlerChain { @@ -14,7 +19,7 @@ public final class MessageHandlerChain { /** * The handlers. */ - private MessageHandler[] handlers; + private final Deque> handlers; /** * Creates the message handler chain. @@ -23,7 +28,7 @@ public final class MessageHandlerChain { */ @SafeVarargs public MessageHandlerChain(MessageHandler... handlers) { - this.handlers = handlers; + this.handlers = new ArrayDeque<>(Arrays.asList(handlers)); } /** @@ -31,36 +36,24 @@ public final class MessageHandlerChain { * * @param handler The handler. */ - @SuppressWarnings("unchecked") public void addLast(MessageHandler handler) { - MessageHandler[] old = handlers; - handlers = new MessageHandler[old.length + 1]; - System.arraycopy(old, 0, handlers, 0, old.length); - handlers[old.length] = handler; + handlers.addLast(handler); } /** - * Handles the message, passing it down the chain until the chain is broken or the message reaches the end of the - * chain. + * Handles the message, passing it down the chain until the chain is broken + * or the message reaches the end of the chain. * * @param player The player. * @param message The message. */ public void handle(Player player, M message) { - final boolean[] running = new boolean[1]; - running[0] = true; - - MessageHandlerContext ctx = new MessageHandlerContext() { - - @Override - public void breakHandlerChain() { - running[0] = false; - } - }; + MessageHandlerContext context = new MessageHandlerContext(); for (MessageHandler handler : handlers) { - handler.handle(ctx, player, message); - if (!running[0]) { + handler.handle(context, player, message); + + if (context.isBroken()) { break; } } diff --git a/src/org/apollo/game/message/handler/MessageHandlerContext.java b/src/org/apollo/game/message/handler/MessageHandlerContext.java index 8658e1fa..6660d1e2 100644 --- a/src/org/apollo/game/message/handler/MessageHandlerContext.java +++ b/src/org/apollo/game/message/handler/MessageHandlerContext.java @@ -1,15 +1,34 @@ package org.apollo.game.message.handler; /** - * Provides operations specific to a {@link MessageHandler} in a {@link MessageHandlerChain}. + * Provides operations specific to a {@link MessageHandler} in a + * {@link MessageHandlerChain}. * * @author Graham + * @author Ryley */ -public abstract class MessageHandlerContext { +public final class MessageHandlerContext { + + /** + * Denotes whether or not this handler chain is broken. + */ + private boolean broken; /** * Breaks the handler chain. */ - public abstract void breakHandlerChain(); + public void breakHandlerChain() { + broken = true; + } + + /** + * Returns whether or not this handler chain is broken. + * + * @return {@code true} if this handler chain is broken, otherwise + * {@code false}. + */ + public boolean isBroken() { + return broken; + } } \ No newline at end of file