package lsr.common; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.Serializable; /** * Represents the reply message which replica send to client after handling * {@link ClientCommand} request. */ public class ClientReply implements Serializable { private static final long serialVersionUID = 1L; private final Result result; private final byte[] value; /** The result type of this reply message */ public enum Result { OK, NACK, REDIRECT }; /** * Create new client reply. * * @param result - type of reply * @param value - value for this reply */ public ClientReply(Result result, byte[] value) { this.result = result; this.value = value; } /** * Returns the result of this reply. * * @return result of reply */ public Result getResult() { return result; } /** * Returns the value of this reply. * * @return value of reply */ public byte[] getValue() { return value; } public String toString() { return result + " : " + (value == null ? "null" : ("Size: " + value.length)); } public ClientReply(DataInputStream input) throws IOException { result = Result.values()[input.readInt()]; value = new byte[input.readInt()]; input.readFully(value); } public byte[] toByteArray() { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); try { write(dos); } catch (IOException e) { throw new RuntimeException(e); } return baos.toByteArray(); } public void write(DataOutputStream output) throws IOException { output.writeInt(result.ordinal()); output.writeInt(value.length); output.write(value); } }