package iamrescue.communication.messages.codec; import iamrescue.communication.BitStream; import iamrescue.communication.messages.Message; import iamrescue.communication.messages.MessageChannel; import rescuecore2.worldmodel.EntityID; public abstract class AbstractMessageCodec<T extends Message> implements IMessageCodec<T> { // private static Log log = LogFactory.getLog(AbstractMessageCodec.class); @Override public BitStream encode(T message, ICommunicationBeliefBaseAdapter beliefBase) { BitStreamEncoder encoder = new BitStreamEncoder(beliefBase); encoder.appendByte(getMessagePrefix()); // let the concrete subclass encode the rest of the message encodeMessage(message, encoder); return encoder.getBitStream(); } @Override public T decode(EntityID senderAgentID, MessageChannel channel, int timestepReceived, BitStream bitStream, ICommunicationBeliefBaseAdapter beliefBase) throws Exception { // by this time, the Decoder has already removed the message prefix. // all we have to do is to let the subclass decode the contents of the // message bitStream.markStart(); bitStream.moveStart(-8); BitStreamDecoder decoder = new BitStreamDecoder(bitStream, beliefBase, timestepReceived); T decodedMessage = decodeMessage(decoder); decodedMessage.setSenderAgentID(senderAgentID); decodedMessage.setChannel(channel); decodedMessage.setTimestepReceived(timestepReceived); bitStream.markEnd(); decodedMessage.setEncoded(bitStream.extractStartToEnd()); return decodedMessage; } protected abstract void encodeMessage(T message, BitStreamEncoder encoder); protected abstract T decodeMessage(BitStreamDecoder decoder); }