package io.vertx.example.core.eventbus.messagecodec.util; import io.vertx.core.buffer.Buffer; import io.vertx.core.eventbus.MessageCodec; import io.vertx.core.json.JsonObject; /** * Vert.x core example for {@link io.vertx.core.eventbus.EventBus} and {@link MessageCodec} * @author Junbong */ public class CustomMessageCodec implements MessageCodec<CustomMessage, CustomMessage> { @Override public void encodeToWire(Buffer buffer, CustomMessage customMessage) { // Easiest ways is using JSON object JsonObject jsonToEncode = new JsonObject(); jsonToEncode.put("statusCode", customMessage.getStatusCode()); jsonToEncode.put("resultCode", customMessage.getResultCode()); jsonToEncode.put("summary", customMessage.getSummary()); // Encode object to string String jsonToStr = jsonToEncode.encode(); // Length of JSON: is NOT characters count int length = jsonToStr.getBytes().length; // Write data into given buffer buffer.appendInt(length); buffer.appendString(jsonToStr); } @Override public CustomMessage decodeFromWire(int position, Buffer buffer) { // My custom message starting from this *position* of buffer int _pos = position; // Length of JSON int length = buffer.getInt(_pos); // Get JSON string by it`s length // Jump 4 because getInt() == 4 bytes String jsonStr = buffer.getString(_pos+=4, _pos+=length); JsonObject contentJson = new JsonObject(jsonStr); // Get fields int statusCode = contentJson.getInteger("statusCode"); String resultCode = contentJson.getString("resultCode"); String summary = contentJson.getString("summary"); // We can finally create custom message object return new CustomMessage(statusCode, resultCode, summary); } @Override public CustomMessage transform(CustomMessage customMessage) { // If a message is sent *locally* across the event bus. // This example sends message just as is return customMessage; } @Override public String name() { // Each codec must have a unique name. // This is used to identify a codec when sending a message and for unregistering codecs. return this.getClass().getSimpleName(); } @Override public byte systemCodecID() { // Always -1 return -1; } }