Formatted and cleaned up the MessageHandlerChain.

This commit is contained in:
Ryley Kimmel
2015-02-26 22:11:59 -05:00
parent 6ce4fe198a
commit b7edf786a5
2 changed files with 36 additions and 24 deletions
@@ -1,5 +1,9 @@
package org.apollo.game.message.handler; 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.message.Message;
import org.apollo.game.model.entity.Player; import org.apollo.game.model.entity.Player;
@@ -7,6 +11,7 @@ import org.apollo.game.model.entity.Player;
* A chain of message handlers. * A chain of message handlers.
* *
* @author Graham * @author Graham
* @author Ryley
* @param <M> The type of message handled by this chain. * @param <M> The type of message handled by this chain.
*/ */
public final class MessageHandlerChain<M extends Message> { public final class MessageHandlerChain<M extends Message> {
@@ -14,7 +19,7 @@ public final class MessageHandlerChain<M extends Message> {
/** /**
* The handlers. * The handlers.
*/ */
private MessageHandler<M>[] handlers; private final Deque<MessageHandler<M>> handlers;
/** /**
* Creates the message handler chain. * Creates the message handler chain.
@@ -23,7 +28,7 @@ public final class MessageHandlerChain<M extends Message> {
*/ */
@SafeVarargs @SafeVarargs
public MessageHandlerChain(MessageHandler<M>... handlers) { public MessageHandlerChain(MessageHandler<M>... handlers) {
this.handlers = handlers; this.handlers = new ArrayDeque<>(Arrays.asList(handlers));
} }
/** /**
@@ -31,36 +36,24 @@ public final class MessageHandlerChain<M extends Message> {
* *
* @param handler The handler. * @param handler The handler.
*/ */
@SuppressWarnings("unchecked")
public void addLast(MessageHandler<M> handler) { public void addLast(MessageHandler<M> handler) {
MessageHandler<M>[] old = handlers; handlers.addLast(handler);
handlers = new MessageHandler[old.length + 1];
System.arraycopy(old, 0, handlers, 0, old.length);
handlers[old.length] = handler;
} }
/** /**
* Handles the message, passing it down the chain until the chain is broken or the message reaches the end of the * Handles the message, passing it down the chain until the chain is broken
* chain. * or the message reaches the end of the chain.
* *
* @param player The player. * @param player The player.
* @param message The message. * @param message The message.
*/ */
public void handle(Player player, M message) { public void handle(Player player, M message) {
final boolean[] running = new boolean[1]; MessageHandlerContext context = new MessageHandlerContext();
running[0] = true;
MessageHandlerContext ctx = new MessageHandlerContext() {
@Override
public void breakHandlerChain() {
running[0] = false;
}
};
for (MessageHandler<M> handler : handlers) { for (MessageHandler<M> handler : handlers) {
handler.handle(ctx, player, message); handler.handle(context, player, message);
if (!running[0]) {
if (context.isBroken()) {
break; break;
} }
} }
@@ -1,15 +1,34 @@
package org.apollo.game.message.handler; 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 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. * 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;
}
} }