package eu.hgross.blaubot.admin; import eu.hgross.blaubot.messaging.BlaubotMessage; /** * Handles message creation and validation for AdminMessages. * * @author Henning Gross {@literal (mail.to@henning-gross.de)} */ public class AdminMessageFactory { private static final String LOG_TAG = "AdminMessageFactory"; /** * Create a {@link AbstractAdminMessage} instance from a received rawMessage. * * @param rawMessage the rawMessage * @return the deserialized, typed admin message */ public static AbstractAdminMessage createAdminMessageFromRawMessage(BlaubotMessage rawMessage) { byte classifier = rawMessage.getPayload()[0]; if (classifier == AbstractAdminMessage.CLASSIFIER_CENSUS_MESSAGE) { return new CensusMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_NEW_PRINCE_MESSAGE) { return new PronouncePrinceAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_PRINCE_FOUND_A_KING_MESSAGE) { return new PrinceFoundAKingAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_BOW_DOWN_TO_NEW_KING) { return new BowDownToNewKingAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_PRINCE_ACK) { return new ACKPronouncePrinceAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_ADD_SUBSCRIPTION) { return new AddSubscriptionAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_REMOVE_SUBSCRIPTION) { return new RemoveSubscriptionAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_STRING_MESSAGE) { return new StringAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_SERVER_CONNECTION_AVAILABLE) { return new ServerConnectionAvailableAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_SERVER_CONNECTION_DOWN) { return new ServerConnectionDownAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_SERVER_CONNECTION_RELAY_PAYLOAD) { return new RelayAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_CLOSE_SERVER_CONNECTION) { return new CloseRelayConnectionAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_DISCOVERED_DEVICE) { return new DiscoveredDeviceAdminMessage(rawMessage); } else if (classifier == AbstractAdminMessage.CLASSIFIER_FINISHED_HANDSHAKE) { return new FinishedHandshakeAdminMessage(rawMessage); } else throw new InvalidClassifierException("The given classifier " + classifier + " is unknown (-> invalid)."); } /** * Validates if the classifier is valid - throws an exception otherwise. * * @param classifier the classifier * @throws InvalidClassifierException if the classifier is unknown. */ protected static void validateClassifier(byte classifier) throws InvalidClassifierException { if (!(classifier == AbstractAdminMessage.CLASSIFIER_CENSUS_MESSAGE || classifier == AbstractAdminMessage.CLASSIFIER_NEW_PRINCE_MESSAGE || classifier == AbstractAdminMessage.CLASSIFIER_KEEP_ALIVE_MESSAGE || classifier == AbstractAdminMessage.CLASSIFIER_PRINCE_FOUND_A_KING_MESSAGE || classifier == AbstractAdminMessage.CLASSIFIER_BOW_DOWN_TO_NEW_KING || classifier == AbstractAdminMessage.CLASSIFIER_PRINCE_ACK || classifier == AbstractAdminMessage.CLASSIFIER_ADD_SUBSCRIPTION || classifier == AbstractAdminMessage.CLASSIFIER_REMOVE_SUBSCRIPTION || classifier == AbstractAdminMessage.CLASSIFIER_STRING_MESSAGE || classifier == AbstractAdminMessage.CLASSIFIER_SERVER_CONNECTION_AVAILABLE || classifier == AbstractAdminMessage.CLASSIFIER_SERVER_CONNECTION_DOWN || classifier == AbstractAdminMessage.CLASSIFIER_SERVER_CONNECTION_RELAY_PAYLOAD || classifier == AbstractAdminMessage.CLASSIFIER_CLOSE_SERVER_CONNECTION || classifier == AbstractAdminMessage.CLASSIFIER_DISCOVERED_DEVICE || classifier == AbstractAdminMessage.CLASSIFIER_FINISHED_HANDSHAKE)) { throw new InvalidClassifierException("The given classifier " + classifier + " is unknown (-> invalid)."); } } }