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 () { ... }
...
}