package org.corfudb.protocols.wireprotocol; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import io.netty.buffer.ByteBuf; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import lombok.ToString; import org.corfudb.runtime.view.Layout; import java.nio.charset.StandardCharsets; /** * Created by mwei on 12/14/15. */ @Getter @Setter @NoArgsConstructor @ToString(callSuper = true) public class LayoutMsg extends CorfuMsg { static final Gson parser = new GsonBuilder().create(); /** * The current layout. */ @Getter Layout layout; public LayoutMsg(Layout layout, CorfuMsgType type) { this.msgType = type; this.layout = layout; } /** * Serialize the message into the given bytebuffer. * * @param buffer The buffer to serialize to. */ @Override public void serialize(ByteBuf buffer) { super.serialize(buffer); byte[] b = parser.toJson(layout).getBytes(); buffer.writeInt(b.length); buffer.writeBytes(b); } /** * Parse the rest of the message from the buffer. Classes that extend CorfuMsg * should parse their fields in this method. * * @param buffer */ @Override public void fromBuffer(ByteBuf buffer) { super.fromBuffer(buffer); int length = buffer.readInt(); byte[] byteArray = new byte[length]; buffer.readBytes(byteArray, 0, length); String str = new String(byteArray, StandardCharsets.UTF_8); layout = parser.fromJson(str, Layout.class); } }