package common.messages; import java.nio.ByteBuffer; /** * MessageAnalyzer translates from the enumerated * types of messages to their corresponding byte * values. As well, it constructs messages * given an array of bytes that contain the whole * message. * @author Raphael Lagman * */ public abstract class MessageAnalyzer { public static final byte PLAYER_MOTION = 0; public static final byte MAP_CHANGE = 1; public static final byte SCORE_UPDATE = 2; public static final byte HEALTH_UPDATE = 3; public static final byte CHAT_MESSAGE = 4; public static final byte DEATH_MESSAGE = 5; public static final byte LOGIN_MESSAGE = 6; public static final byte PLAYER_JOIN = 7; public static final byte PLAYER_LEAVE = 8; public static final byte MULTI_MESSAGE = 9; public static final byte PJTILE_MESSAGE = 10; public static final byte UNDEFINED = -1; public static final int INIT = 0; public static final int MESSAGE_TYPE = 0; /** * Translates from a byte to its corresponding * message type value. * @param type The byte representation of the type of message. * @return The enumerated type representation of the type of message. */ public static MessageType getMessageType(byte type) { MessageType message; switch (type) { case PLAYER_MOTION: message = MessageType.PlayerMotion; break; case MAP_CHANGE: message = MessageType.MapChange; break; case SCORE_UPDATE: message = MessageType.ScoreUpdate; break; case HEALTH_UPDATE: message = MessageType.HealthUpdate; break; case CHAT_MESSAGE: message = MessageType.Chat; break; case DEATH_MESSAGE: message = MessageType.Death; break; case LOGIN_MESSAGE: message = MessageType.Login; break; case PLAYER_JOIN: message = MessageType.PlayerJoin; break; case PLAYER_LEAVE: message = MessageType.PlayerLeave; break; case MULTI_MESSAGE: message = MessageType.MulticastGroup; break; case PJTILE_MESSAGE: message = MessageType.Projectile; break; default: message = MessageType.Undefined; } return message; } /** * Translates from a byte to its corresponding * message type value. * @param type The enumerated type representation of the type of message. * @return The byte representation of the type of message. */ public static byte getMessageType(MessageType type) { byte message; switch (type) { case PlayerMotion: message = PLAYER_MOTION; break; case MapChange: message = MAP_CHANGE; break; case ScoreUpdate: message = SCORE_UPDATE; break; case HealthUpdate: message = HEALTH_UPDATE; break; case Chat: message = CHAT_MESSAGE; break; case Death: message = DEATH_MESSAGE; break; case Login: message = LOGIN_MESSAGE; break; case PlayerJoin: message = PLAYER_JOIN; break; case PlayerLeave: message = PLAYER_LEAVE; break; case MulticastGroup: message = MULTI_MESSAGE; break; case Projectile: message = PJTILE_MESSAGE; break; default: message = UNDEFINED; } return message; } /** * Retrieves a message given its header and the data portion of the message. * @return The message that the byte array represeneted. */ public static Message getMessage(byte[] message) throws Exception { ByteBuffer buffer = ByteBuffer.wrap(message); return getMessage(buffer); } /** * Retrieves a message given its header and the data portion of the message. * @return The message that the byte array represeneted. */ public static Message getMessage(ByteBuffer buffer) throws Exception { // Store the header information byte[] byteHeader = new byte[Header.HEADER_MAX]; buffer.get(byteHeader,INIT,Header.HEADER_MAX); // Store the data information int dataLength = buffer.array().length - Header.HEADER_MAX; byte[] byteData = new byte[dataLength]; buffer.get(byteData,INIT,dataLength); // Construct the header Message receivedMessage = null; switch (getMessageType(byteHeader[MESSAGE_TYPE])) { case PlayerMotion: receivedMessage = new PlayerMotionMessage(byteHeader,byteData); break; case MapChange: break; case ScoreUpdate: receivedMessage = new ScoreUpdateMessage(byteHeader,byteData); break; case HealthUpdate: receivedMessage = new HealthUpdateMessage(byteHeader,byteData); break; case Chat: receivedMessage = new ChatMessage(byteHeader,byteData); break; case Death: receivedMessage = new DeathMessage(byteHeader,byteData); break; case Login: receivedMessage = new LoginMessage(byteHeader,byteData); break; case PlayerJoin: receivedMessage = new PlayerJoinMessage(byteHeader,byteData); break; case PlayerLeave: receivedMessage = new PlayerLeaveMessage(byteHeader,byteData); break; case MulticastGroup: receivedMessage = new MulticastGroupMessage(byteHeader,byteData); break; case Projectile: receivedMessage = new ProjectileMessage(byteHeader,byteData); break; default: System.out.println("Unknown packet."); } return receivedMessage; } }