A couple examples will better help illustrate what this decoder actually does.
Given an input array of bytes split over 3 frames like this:
+-----+-----+-----------+ | <an | Xml | Element/> | +-----+-----+-----------+
this decoder would output a single frame:
+-----------------+ | <anXmlElement/> | +-----------------+Given an input array of bytes split over 5 frames like this:
+-----+-----+-----------+-----+----------------------------------+ | <an | Xml | Element/> | <ro | ot><child>content</child></root> | +-----+-----+-----------+-----+----------------------------------+
this decoder would output two frames:
+-----------------+-------------------------------------+ | <anXmlElement/> | <root><child>content</child></root> | +-----------------+-------------------------------------+
The byte stream is expected to be in UTF-8 character encoding or ASCII. The current implementation
uses direct byte to char cast and then compares that char to a few low range
ASCII characters like '<', '>' or '/'. UTF-8 is not using low range [0..0x7F]
byte values for multibyte codepoint representations therefore fully supported by this implementation.
Please note that this decoder is not suitable for xml streaming protocols such as XMPP, where an initial xml element opens the stream and only gets closed at the end of the session, although this class could probably allow for such type of message flow with minor modifications.
| Modifier and Type | Field and Description |
|---|---|
| private final int |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| protected void | decode(ChannelHandlerContext
the ctx, ByteBuf ChannelHandlerContext which this ByteToMessageDecoder belongs tothe in, List<Object> ByteBuf from which to read datathe out)List to which decoded messages should be addedImplements abstract io. ByteBuf to an other.
|
| private static ByteBuf | |
| private void | |
| private static void | |
| private static boolean | |
| private static boolean | |
| private static boolean | Returns: true if the char is a valid start charthe input char b)Asks whether the given byte is a valid start char for an xml element name. |
| maxFrameLength | back to summary |
|---|---|
| private final int maxFrameLength | |
| XmlFrameDecoder | back to summary |
|---|---|
| public XmlFrameDecoder(int maxFrameLength) | |
| decode | back to summary |
|---|---|
| protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception Implements abstract io. Doc from io. Decode the from one
| |
| extractFrame | back to summary |
|---|---|
| private static ByteBuf extractFrame(ByteBuf buffer, int index, int length) | |
| fail | back to summary |
|---|---|
| private void fail(long frameLength) | |
| fail | back to summary |
|---|---|
| private static void fail(ChannelHandlerContext ctx) | |
| isCDATABlockStart | back to summary |
|---|---|
| private static boolean isCDATABlockStart(final ByteBuf in, final int i) | |
| isCommentBlockStart | back to summary |
|---|---|
| private static boolean isCommentBlockStart(final ByteBuf in, final int i) | |
| isValidStartCharForXmlElement | back to summary |
|---|---|
| private static boolean isValidStartCharForXmlElement(final byte b) Asks whether the given byte is a valid start char for an xml element name. Please refer to the NameStartChar formal definition in the W3C XML spec for further info.
| |