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(); } }