package lsr.common; import java.io.Serializable; import java.nio.ByteBuffer; /** * Represents command which is sent by client to replica. In response to this * command, replica should send {@link ClientReply}. */ public class ClientCommand implements Serializable { private static final long serialVersionUID = 1L; private final CommandType commandType; private final ClientRequest request; /** * The type of command. */ public enum CommandType { REQUEST, ALIVE }; /** * Creates new command. * * @param commandType - the type of command * @param args - the argument for this command */ public ClientCommand(CommandType commandType, ClientRequest args) { this.commandType = commandType; request = args; } /** * Creates new command from <code>ByteBuffer</code> which contain serialized * command. * * @param input - the buffer with serialized command */ public ClientCommand(ByteBuffer input) { commandType = CommandType.values()[input.getInt()]; request = ClientRequest.create(input); } /** * Writes serialized command to specified buffer. The remaining amount of * bytes in the buffer has to be greater or equal than * <code>byteSize()</code>. * * @param buffer - the byte buffer to write command to */ public void writeTo(ByteBuffer buffer) { buffer.putInt(commandType.ordinal()); request.writeTo(buffer); } /** * The size of the command after serialization in bytes. * * @return the size of the command in bytes */ public int byteSize() { return 4 + request.byteSize(); } /** * Returns the type of command. * * @return command type */ public CommandType getCommandType() { return commandType; } /** * Returns the request (argument) for this command. * * @return request (argument) object */ public ClientRequest getRequest() { return request; } public String toString() { return commandType + ": " + request; } /** Used to determine how many bytes must be read as header */ public static int HEADERS_SIZE = 4 + ClientRequest.HEADERS_SIZE; /** After how many bytes the size of value is stored */ public static final int HEADER_VALUE_SIZE_OFFSET = 4 + ClientRequest.HEADER_VALUE_SIZE_OFFSET; }