package se.sics.gvod.interas.msgs;
import io.netty.buffer.ByteBuf;
import java.util.List;
import se.sics.gvod.common.VodDescriptor;
import se.sics.gvod.common.msgs.MessageEncodingException;
import se.sics.gvod.common.msgs.RelayMsgNetty;
import se.sics.gvod.common.msgs.RelayMsgNetty.Status;
import se.sics.gvod.net.VodAddress;
import se.sics.gvod.net.VodMsgFrameDecoder;
import se.sics.gvod.net.msgs.RewriteableMsg;
import se.sics.gvod.net.msgs.RewriteableRetryTimeout;
import se.sics.gvod.net.msgs.ScheduleRetryTimeout;
import se.sics.gvod.net.util.UserTypesEncoderFactory;
import se.sics.gvod.timer.ScheduleTimeout;
import se.sics.gvod.timer.Timeout;
import se.sics.gvod.timer.TimeoutId;
public class InterAsGossipMsg {
public static class Request extends RelayMsgNetty.Request {
public Request(VodAddress source, VodAddress destination) {
this(source, destination, null);
}
public Request(VodAddress source, VodAddress destination, TimeoutId timeoutId) {
super(source, destination, source.getId(), destination.getId(), timeoutId);
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.INTER_AS_GOSSIP_REQUEST;
}
@Override
public RewriteableMsg copy() {
return new InterAsGossipMsg.Request(vodSrc,
vodDest, timeoutId);
}
}
public static class Response extends RelayMsgNetty.Response {
private final List<VodDescriptor> interAsNeighbours;
public Response(VodAddress source, Request request,
List<VodDescriptor> interAsNeighbours) {
super(source, request, Status.OK);
this.interAsNeighbours = interAsNeighbours;
}
public Response(VodAddress source, VodAddress destination,
VodAddress nextDest, TimeoutId timeoutId,
List<VodDescriptor> similarPeers) {
super(source, destination,
nextDest.getId(), source.getId(),
nextDest, timeoutId, Status.OK);
this.interAsNeighbours = similarPeers;
}
@Override
public int getSize() {
return super.getSize()
+ UserTypesEncoderFactory.getListVodNodeDescriptorSize(interAsNeighbours);
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buffer = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeListVodNodeDescriptors(buffer, interAsNeighbours);
return buffer;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.INTER_AS_GOSSIP_RESPONSE;
}
public List<VodDescriptor> getInterAsNeighbours() {
return interAsNeighbours;
}
@Override
public RewriteableMsg copy() {
return new InterAsGossipMsg.Response(vodSrc, vodDest,
nextDest, timeoutId, interAsNeighbours);
}
}
public static class RequestRetryTimeout extends RewriteableRetryTimeout {
private final se.sics.gvod.interas.msgs.InterAsGossipMsg.Request requestMsg;
public RequestRetryTimeout(ScheduleRetryTimeout st, se.sics.gvod.interas.msgs.InterAsGossipMsg.Request requestMsg) {
super(st, requestMsg, requestMsg.getVodSource().getOverlayId());
this.requestMsg = requestMsg;
}
public se.sics.gvod.interas.msgs.InterAsGossipMsg.Request getRequestMsg() {
return requestMsg;
}
}
public static class RequestTimeout extends Timeout {
private final se.sics.gvod.interas.msgs.InterAsGossipMsg.Request requestMsg;
public RequestTimeout(ScheduleTimeout st, se.sics.gvod.interas.msgs.InterAsGossipMsg.Request requestMsg) {
super(st);
this.requestMsg = requestMsg;
}
public se.sics.gvod.interas.msgs.InterAsGossipMsg.Request getRequestMsg() {
return requestMsg;
}
}
}