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 -%} } }