package lsr.common; import java.io.Serializable; /** * Represents the unique id of request. To ensure uniqueness, the id contains * the id of client and the request sequence number. Every client should have * assigned unique client id, so that unique requests id can be created. Clients * gives consecutive sequence numbers to every sent request. The sequence number * starts with 0. */ public final class RequestId implements Serializable, Comparable<RequestId> { private static final long serialVersionUID = 1L; /** Represents the no-op request. */ public static final RequestId NOP = new RequestId(-1, -1); private final long clientId; private final int seqNumber; /** * Creates new <code>RequestId</code> instance. * * @param clientId - the id of client * @param seqNumber - the request sequence number */ public RequestId(long clientId, int seqNumber) { this.clientId = clientId; this.seqNumber = seqNumber; } /** * Returns the id of client. * * @return the id of client */ public long getClientId() { return clientId; } /** * Returns the request sequence number. * * @return the request sequence number */ public int getSeqNumber() { return seqNumber; } public int compareTo(RequestId requestId) { if (clientId != requestId.clientId) { throw new IllegalArgumentException("Cannot compare requests from diffrents clients."); } return seqNumber - requestId.seqNumber; } public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || obj.getClass() != this.getClass()) { return false; } RequestId requestId = (RequestId) obj; return clientId == requestId.clientId && seqNumber == requestId.seqNumber; } public int hashCode() { int result = 17; result = 31 * result + (int) clientId; result = 31 * result + seqNumber; return result; } public boolean isNop() { return clientId == -1 && seqNumber == -1; } public String toString() { return isNop() ? "nop" : clientId + ":" + seqNumber; } }