package ch.ethz.syslab.telesto.common.protocol;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.sql.Timestamp;
import ch.ethz.syslab.telesto.common.model.*;
import ch.ethz.syslab.telesto.common.protocol.handler.PacketProcessingException;
import ch.ethz.syslab.telesto.common.protocol.handler.ProtocolHandler;
/*
* Do not edit this file! {# Ignore this, you're in the right place. #}
*
* Edit the template at tools/protocol/telesto/templates/superclass.java instead.
*/
public abstract class {{ superclass }} {
public static final Charset CHARSET = Charset.forName("UTF-8");
public static Packet[] packets = new Packet[Byte.MAX_VALUE + 1];
public int packetId;
public abstract void emit(ByteBuffer buffer);
public abstract void parse(ByteBuffer buffer);
public abstract {{ superclass }} newInstance();
public abstract byte methodId();
public abstract Packet getHandled(ProtocolHandler handler) throws PacketProcessingException;
public static Packet create(ByteBuffer buffer) throws UnknownMethodException {
int method = buffer.get();
if (method > Byte.MAX_VALUE || packets[method] == null) {
throw new UnknownMethodException(method);
}
Packet packet = packets[method].newInstance();
packet.parse(buffer);
return packet;
}
protected static String getString(ByteBuffer buffer) {
byte[] bytes = new byte[buffer.getShort()];
buffer.get(bytes);
return new String(bytes);
}
protected static void putString(ByteBuffer buffer, String value) {
byte[] bytes = value.getBytes(CHARSET);
buffer.putShort((short) bytes.length);
buffer.put(bytes);
}
protected static boolean getBoolean(ByteBuffer buffer) {
return buffer.get() == 1;
}
protected static void putBoolean(ByteBuffer buffer, boolean value) {
buffer.put((byte)(value ? 1 : 0));
}
protected static Message getMessage(ByteBuffer buffer) {
return new Message(buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.getInt(),
buffer.get(),
new Timestamp(buffer.getLong()),
getString(buffer));
}
protected static void putMessage(ByteBuffer buffer, Message message) {
buffer.putInt(message.id);
buffer.putInt(message.queueId);
buffer.putInt(message.senderId);
buffer.putInt(message.receiverId);
buffer.putInt(message.context);
buffer.put(message.priority);
buffer.putLong(message.timeOfArrival == null ? 0 : message.timeOfArrival.getTime());
putString(buffer, message.message);
}
protected static Queue getQueue(ByteBuffer buffer) {
return new Queue(buffer.getInt(),
getString(buffer));
}
protected static void putQueue(ByteBuffer buffer, Queue queue) {
buffer.putInt(queue.id);
putString(buffer, queue.name);
}
public static class UnknownMethodException extends Exception {
private static final long serialVersionUID = 1L;
UnknownMethodException(int method) {
super("Unknown packet method: " + method);
}
}
static {
{%- for message in messages if message %}
packets[{{ message.method_id }}] = new {{ message.__name__ }}{{ superclass }}();
{%- endfor -%}
}
}