/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package se.sics.gvod.gradient.msgs;
import io.netty.buffer.ByteBuf;
import java.util.List;
import se.sics.gvod.common.Utility;
import se.sics.gvod.common.VodDescriptor;
import se.sics.gvod.config.VodConfig;
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.VodMsgFrameDecoder;
import se.sics.gvod.net.VodAddress;
import se.sics.gvod.net.msgs.RewriteableMsg;
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 GradientSearchMsg {
public static class Request extends RelayMsgNetty.Request {
private final int ttl;
private final Utility targetUtility;
private final VodAddress origSrc;
public Request(VodAddress source, VodAddress destination, VodAddress originalSrc,
TimeoutId timeoutId, Utility targetUtility, int ttl) {
// do not retry this msg, set params to 0.
super(source, destination, source.getId(), destination.getId(), timeoutId);
this.targetUtility = targetUtility;
this.ttl = ttl;
this.origSrc = originalSrc;
}
public VodAddress getOrigSrc() {
return origSrc;
}
@Override
public int getSize() {
return super.getSize()
+ /*ttl size*/ 1
+ 24 /* guess at utility size */
+ UserTypesEncoderFactory.VOD_ADDRESS_LEN_NO_PARENTS
+ VodConfig.PM_NUM_PARENTS * UserTypesEncoderFactory.ADDRESS_LEN
;
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buffer = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeUnsignedintAsOneByte(buffer, ttl);
UserTypesEncoderFactory.writeUtility(buffer, targetUtility);
UserTypesEncoderFactory.writeVodAddress(buffer, origSrc);
return buffer;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.TARGET_UTILITY_PROBE_REQUEST;
}
/**
* @return the ttl
*/
public int getTtl() {
return ttl;
}
/**
* @return the targetChunk
*/
public Utility getTargetUtility() {
return targetUtility;
}
@Override
public RewriteableMsg copy() {
GradientSearchMsg.Request copy =
new GradientSearchMsg.Request(vodSrc, vodDest, origSrc, timeoutId,
targetUtility.clone(), ttl);
copy.setTimeoutId(timeoutId);
return copy;
}
}
public static class Response extends RelayMsgNetty.Response {
private final List<VodDescriptor> similarPeers;
public Response(VodAddress source, VodAddress destination,
int clientId, int remoteId,
VodAddress nextDest, TimeoutId timeoutId,
List<VodDescriptor> similarPeers) {
super(source, destination, clientId, remoteId, nextDest, timeoutId, Status.OK);
this.similarPeers = similarPeers;
}
public Response(VodAddress source, Request request,
List<VodDescriptor> similarPeers) {
super(source, request, Status.OK);
this.similarPeers = similarPeers;
}
@Override
public int getSize() {
return super.getSize()
+ UserTypesEncoderFactory.getListVodNodeDescriptorSize(getSimilarPeers());
}
@Override
public ByteBuf toByteArray() throws MessageEncodingException {
ByteBuf buffer = createChannelBufferWithHeader();
UserTypesEncoderFactory.writeListVodNodeDescriptors(buffer, getSimilarPeers());
return buffer;
}
@Override
public byte getOpcode() {
return VodMsgFrameDecoder.TARGET_UTILITY_PROBE_RESPONSE;
}
/**
* @return the similarPeers
*/
public List<VodDescriptor> getSimilarPeers() {
return similarPeers;
}
@Override
public RewriteableMsg copy() {
return new GradientSearchMsg.Response(vodSrc, vodDest, clientId,
remoteId, nextDest, timeoutId, similarPeers);
}
}
public static class RequestRetryTimeout extends Timeout {
public RequestRetryTimeout(ScheduleTimeout st) {
super(st);
}
}
}