/** * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. * * You may not modify, use, reproduce, or distribute this software except in * compliance with the terms of the License at: * http://java.net/projects/javaeetutorial/pages/BerkeleyLicense */ package com.mgreau.wildfly.websocket.decoders; import java.io.StringReader; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.json.Json; import javax.json.stream.JsonParser; import javax.websocket.DecodeException; import javax.websocket.Decoder; import javax.websocket.EndpointConfig; import com.mgreau.wildfly.websocket.messages.BetMessage; /* Decode a JSON message into a BetMessage. */ public class MessageDecoder implements Decoder.Text<BetMessage> { /* Stores the name-value pairs from a JSON message as a Map */ private Map<String,String> messageMap; @Override public void init(EndpointConfig ec) { } @Override public void destroy() { } /* Create a new Message object if the message can be decoded */ @Override public BetMessage decode(String string) throws DecodeException { BetMessage msg = null; if (willDecode(string)) { switch (messageMap.get("type")) { case "betMatchWinner": msg = new BetMessage(messageMap.get("name")); break; } } else { throw new DecodeException(string, "[Message] Can't decode."); } return msg; } /* Decode a JSON message into a Map and check if it contains * all the required fields according to its type. */ @Override public boolean willDecode(String string) { boolean decodes = false; /* Convert the message into a map */ messageMap = new HashMap<>(); JsonParser parser = Json.createParser(new StringReader(string)); while (parser.hasNext()) { if (parser.next() == JsonParser.Event.KEY_NAME) { String key = parser.getString(); parser.next(); String value = parser.getString(); messageMap.put(key, value); } } /* Check the kind of message and if all fields are included */ Set keys = messageMap.keySet(); if (keys.contains("type")) { switch (messageMap.get("type")) { case "betMatchWinner": if (keys.contains("name")) decodes = true; break; } } return decodes; } }