blob: 4a44682011edeb9c2925a5e20f065f7bd9d29f5f [file] [log] [blame]
tomf110fff2014-09-26 00:38:18 -07001package org.onlab.onos.foo;
2
3import org.onlab.nio.IOLoop;
4import org.onlab.nio.MessageStream;
5
6import java.nio.ByteBuffer;
7import java.nio.channels.ByteChannel;
8
9/**
10 * Fixed-length message transfer buffer.
11 */
12public class TestMessageStream extends MessageStream<TestMessage> {
13
14 private static final String E_WRONG_LEN = "Illegal message length: ";
15
16 private final int length;
17
18 /**
19 * Create a new buffer for transferring messages of the specified length.
20 *
21 * @param length message length
22 * @param ch backing channel
23 * @param loop driver loop
24 */
25 public TestMessageStream(int length, ByteChannel ch,
26 IOLoop<TestMessage, ?> loop) {
27 super(loop, ch, 64 * 1024, 500);
28 this.length = length;
29 }
30
31 @Override
32 protected TestMessage read(ByteBuffer rb) {
33 if (rb.remaining() < length) {
34 return null;
35 }
36 TestMessage message = new TestMessage(length);
37 rb.get(message.data());
38 return message;
39 }
40
41 /**
42 * {@inheritDoc}
43 * <p/>
44 * This implementation enforces the message length against the buffer
45 * supported length.
46 *
47 * @throws IllegalArgumentException if message size does not match the
48 * supported buffer size
49 */
50 @Override
51 protected void write(TestMessage message, ByteBuffer wb) {
52 if (message.length() != length) {
53 throw new IllegalArgumentException(E_WRONG_LEN + message.length());
54 }
55 wb.put(message.data());
56 }
57
58}