package org.corfudb.protocols.wireprotocol;
import io.netty.buffer.ByteBuf;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Map;
import java.util.UUID;
/**
* Created by mwei on 8/8/16.
*/
@Data
@AllArgsConstructor
public class TokenResponse implements ICorfuPayload<TokenResponse>, IToken {
public static Integer NO_CONFLICT_KEY = Integer.MIN_VALUE;
public TokenResponse(long tokenValue, long epoch, Map<UUID, Long> backpointerMap) {
respType = TokenType.NORMAL;
conflictKey = NO_CONFLICT_KEY;
token = new Token(tokenValue, epoch);
this.backpointerMap = backpointerMap;
}
/** the cause/type of response */
final TokenType respType;
/**
* In case there is a conflict, signal to the client which key was responsible for the conflict.
*/
final Integer conflictKey;
/** The current token,
* or overload with "cause address" in case token request is denied. */
final Token token;
/** The backpointer map, if available. */
final Map<UUID, Long> backpointerMap;
public TokenResponse(ByteBuf buf) {
respType = TokenType.values()[ICorfuPayload.fromBuffer(buf, Byte.class)];
conflictKey = ICorfuPayload.fromBuffer(buf, Integer.class);
Long tokenValue = ICorfuPayload.fromBuffer(buf, Long.class);
Long epoch = ICorfuPayload.fromBuffer(buf, Long.class);
token = new Token(tokenValue, epoch);
backpointerMap = ICorfuPayload.mapFromBuffer(buf, UUID.class, Long.class);
}
@Override
public void doSerialize(ByteBuf buf) {
ICorfuPayload.serialize(buf, respType);
ICorfuPayload.serialize(buf, conflictKey);
ICorfuPayload.serialize(buf, token.getTokenValue());
ICorfuPayload.serialize(buf, token.getEpoch());
ICorfuPayload.serialize(buf, backpointerMap);
}
@Override
public long getTokenValue() {
return token.getTokenValue();
}
@Override
public long getEpoch() {
return token.getEpoch();
}
}