package lsr.common;
import java.io.Serializable;
import java.nio.ByteBuffer;
/**
* The reply to client request. It is send to client when replica execute this
* command on state machine.
*
* @see ClientBatch
*/
public class Reply implements Serializable {
private static final long serialVersionUID = 1L;
private final RequestId requestId;
private final byte[] value;
/**
* Creates new reply instance.
*
* @param requestId - the id of request this reply is related to
* @param value - result from state machine
*/
public Reply(RequestId requestId, byte[] value) {
assert requestId != null;
assert value != null;
this.requestId = requestId;
this.value = value;
}
/**
* Deserializes a <code>Reply</code> from the given byte array.
*
* @param bytes - the bytes with serialized reply
*/
public Reply(byte[] bytes) {
ByteBuffer buffer = ByteBuffer.wrap(bytes);
Long clientId = buffer.getLong();
int sequenceId = buffer.getInt();
requestId = new RequestId(clientId, sequenceId);
value = new byte[buffer.getInt()];
buffer.get(value);
}
/**
* Returns the id of request for which this reply is generated.
*
* @return id of request
*/
public RequestId getRequestId() {
return requestId;
}
/**
* Returns the total sum from state machine after executing request.
*
* @return the sum from state machine
*/
public byte[] getValue() {
return value;
}
public byte[] toByteArray() {
ByteBuffer buffer = ByteBuffer.allocate(byteSize());
buffer.putLong(requestId.getClientId());
buffer.putInt(requestId.getSeqNumber());
buffer.putInt(value.length);
buffer.put(value);
return buffer.array();
}
/**
* The size of the reply after serialization in bytes.
*
* @return the size of the reply in bytes
*/
public int byteSize() {
int size = 8; // client ID
size += 4; // sequential number
size += 4; // value.length
size += value.length; // value
return size;
}
public String toString() {
return requestId + " : " + (value == null ? "null" : ("Size: " + value.length));
}
}