package com.mediamonks.googleflip.pages.game.management.gamemessages; import com.crashlytics.android.Crashlytics; import com.google.gson.Gson; import com.mediamonks.googleflip.pages.game.management.gamemessages.c2s.C2SClientNameMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.c2s.C2SRoundFinishedMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.s2c.S2CClientAckMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.s2c.S2CClientsScoreChangedMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.s2c.S2CConnectedClientsChangedMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.s2c.S2CGameFinishedMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.s2c.S2CRoundFinishedMessage; import com.mediamonks.googleflip.pages.game.management.gamemessages.s2c.S2CRoundStartedMessage; import java.util.HashMap; import java.util.Map; /** * Utility class for converting game messages to and from a textual format to be sent between clients and server * All supported game messages need to be present in the class map */ public class GameMessageConverter { // special character separating game message type identifier from game message content private static final String SEPARATOR = "|"; private static Gson sGson; private static Map<GameMessageType, Class> sClassMap; public static GameMessage readMessage(String message) { initGson(); initClassMap(); String[] messageParts = message.split("\\" + SEPARATOR); if (messageParts.length < 2) { Crashlytics.logException(new Exception("Message could not be split, message = '" + message + "'")); return null; } String typePart = messageParts[0]; String jsonPart = messageParts[1]; int typeIndex = Integer.parseInt(typePart); GameMessageType messageType = GameMessageType.values()[typeIndex]; if (!sClassMap.containsKey(messageType)) { throw new Error("No class found for message type " + messageType); } try { return (GameMessage) sGson.fromJson(jsonPart, sClassMap.get(messageType)); } catch (Exception e) { Crashlytics.logException(e); return null; } } public static String writeMessage(GameMessage gameMessage) { initGson(); return gameMessage.getType().ordinal() + SEPARATOR + sGson.toJson(gameMessage); } private static void initGson() { if (sGson == null) { sGson = new Gson(); } } private static void initClassMap() { if (sClassMap == null) { sClassMap = new HashMap<>(); sClassMap.put(GameMessageType.S2C_CLIENT_ACK, S2CClientAckMessage.class); sClassMap.put(GameMessageType.S2C_ROUND_STARTED, S2CRoundStartedMessage.class); sClassMap.put(GameMessageType.S2C_CLIENTS_SCORE_CHANGED, S2CClientsScoreChangedMessage.class); sClassMap.put(GameMessageType.S2C_CONNECTED_CLIENTS_CHANGED, S2CConnectedClientsChangedMessage.class); sClassMap.put(GameMessageType.S2C_ROUND_FINISHED, S2CRoundFinishedMessage.class); sClassMap.put(GameMessageType.S2C_GAME_FINISHED, S2CGameFinishedMessage.class); sClassMap.put(GameMessageType.C2S_CLIENT_NAME, C2SClientNameMessage.class); sClassMap.put(GameMessageType.C2S_ROUND_FINISHED, C2SRoundFinishedMessage.class); } } }