public interface Message ... { short BYTES_MSG = 0, NIO_MSG = 1, EMPTY_MSG = 2, OBJ_MSG = 3, LONG_MSG = 4, COMPOSITE_MSG = 5, FRAG_MSG = 6; short getType (); Address getDest (); Message setDest (Address new_dest); Address getSrc (); Message setSrc (Address new_src); // Headers are internal and interpreted by individual protocol modules Message putHeader (short id, Header hdr); <T extends Header> T getHeader (short id); Map<Short,Header> getHeaders (); // Flags are interpreted by individual protocol modules // Examples include disabling flow control or reliability short getFlags (boolean transient_flags); Message setFlag (short flag, boolean transient_flags); // Convenience methods on the interface // May not make sense for all message classes byte [] getArray (); int getOffset (); int getLength (); public Message setBuffer (byte [] b); Message setArray (byte [] b, int offset, int length); <T extends Object> T getObject (); Message setObject (Object obj); <T extends Object> T getPayload (); Message setPayload (Object pl); ... } public class BytesMessage ... { public BytesMessage (Address dest, byte [] array) { ... } public BytesMessage (Address dest, byte [] array, int offset, int length) { ... } ... } public class NioMessage ... { // Uses java.nio.ByteBuffer that can reduce copying overhead public NioMessage (Address dest, ByteBuffer buf) { ... } public ByteBuffer getBuf () { ... } public NioMessage setBuf (ByteBuffer b) { ... } ... } public class ObjectMessage ... { public ObjectMessage(Address dest, Object obj) { ... } public class CompositeMessage ... implements Iterable<Message> { public CompositeMessage (Address dest, Message ... messages) { ... } public CompositeMessage add (Message msg) { ... } public <T extends Message> T get (int index) { ... } public Iterator<Message> iterator () { ... } ... }