org.apache.mina.filter.codec
Class CumulativeProtocolDecoder
- ProtocolDecoder
public abstract class CumulativeProtocolDecoder
A
ProtocolDecoder
that cumulates the content of received
buffers to a
cumulative buffer to help users implement decoders.
If the received
ByteBuffer
is only a part of a message.
decoders should cumulate received buffers to make a message complete or
to postpone decoding until more buffers arrive.
Here is an example decoder that decodes CRLF terminated lines into
Command
objects:
public class CRLFTerminatedCommandLineDecoder
extends CumulativeProtocolDecoder {
private Command parseCommand(ByteBuffer in) {
// Convert the bytes in the specified buffer to a
// Command object.
...
}
protected boolean doDecode(IoSession session, ByteBuffer in,
ProtocolDecoderOutput out)
throws Exception {
// Remember the initial position.
int start = in.position();
// Now find the first CRLF in the buffer.
byte previous = 0;
while (in.hasRemaining()) {
byte current = in.get();
if (previous == '\r' && current == '\n') {
// Remember the current position and limit.
int position = in.position();
int limit = in.limit();
try {
in.position(start);
in.limit(position);
// The bytes between in.position() and in.limit()
// now contain a full CRLF terminated line.
out.write(parseCommand(in.slice()));
} finally {
// Set the position to point right after the
// detected line and set the limit to the old
// one.
in.position(position);
in.limit(limit);
}
// Decoded one line; CumulativeProtocolDecoder will
// call me again until I return false. So just
// return true until there are no more lines in the
// buffer.
return true;
}
previous = current;
}
// Could not find CRLF in the buffer. Reset the initial
// position to the one we recorded above.
in.position(start);
return false;
}
}
CumulativeProtocolDecoder
protected CumulativeProtocolDecoder()
Creates a new instance.
doDecode
protected abstract boolean doDecode(IoSession session,
ByteBuffer in,
ProtocolDecoderOutput out)
throws Exception
Implement this method to consume the specified cumulative buffer and
decode its content into message(s).
in
- the cumulative buffer
- true if and only if there's more to decode in the buffer
and you want to have doDecode method invoked again.
Return false if remaining data is not enough to decode,
then this method will be invoked again when more data is cumulated.