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.Message; import ch.ethz.syslab.telesto.common.model.Queue; import ch.ethz.syslab.telesto.common.protocol.handler.PacketProcessingException; import ch.ethz.syslab.telesto.common.protocol.handler.ProtocolHandler; /* * Do not edit this file! * * Edit the template at tools/protocol/telesto/templates/superclass.java instead. */ public abstract class Packet { 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 Packet 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 { packets[1] = new PingPacket(); packets[2] = new PongPacket(); packets[3] = new SuccessPacket(); packets[5] = new ErrorPacket(); packets[17] = new RegisterClientPacket(); packets[18] = new RegisterClientResponsePacket(); packets[19] = new IdentifyClientPacket(); packets[20] = new IdentifyClientResponsePacket(); packets[21] = new DeleteClientPacket(); packets[33] = new CreateQueuePacket(); packets[34] = new CreateQueueResponsePacket(); packets[35] = new DeleteQueuePacket(); packets[37] = new GetQueueIdPacket(); packets[38] = new GetQueueIdResponsePacket(); packets[39] = new GetQueueNamePacket(); packets[40] = new GetQueueNameResponsePacket(); packets[41] = new GetQueuesPacket(); packets[42] = new GetQueuesResponsePacket(); packets[43] = new GetActiveQueuesPacket(); packets[44] = new GetActiveQueuesResponsePacket(); packets[45] = new GetMessagesPacket(); packets[46] = new GetMessagesResponsePacket(); packets[49] = new PutMessagePacket(); packets[51] = new ReadMessagePacket(); packets[52] = new ReadMessageResponsePacket(); packets[53] = new ReadResponsePacket(); packets[113] = new ComplexTestPacket(); packets[114] = new MessageTestPacket(); packets[115] = new QueueTestPacket(); } }