blob: 0ed9e8d3c46edd31dde919debc3d2f823db1c01f [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
tomf7e13b02014-09-26 11:12:25 -07009import static com.google.common.base.Preconditions.checkArgument;
tom0e0863f2014-09-26 09:02:33 -070010import static com.google.common.base.Preconditions.checkState;
11
tomf110fff2014-09-26 00:38:18 -070012/**
13 * Fixed-length message transfer buffer.
14 */
15public class TestMessageStream extends MessageStream<TestMessage> {
16
17 private static final String E_WRONG_LEN = "Illegal message length: ";
tom0e0863f2014-09-26 09:02:33 -070018 private static final long START_TAG = 0xfeedcafedeaddeedL;
19 private static final long END_TAG = 0xbeadcafedeaddeedL;
20 private static final int META_LENGTH = 40;
tomf110fff2014-09-26 00:38:18 -070021
22 private final int length;
tomf7e13b02014-09-26 11:12:25 -070023 private boolean isStrict = true;
tomf110fff2014-09-26 00:38:18 -070024
tom0e0863f2014-09-26 09:02:33 -070025 public TestMessageStream(int length, ByteChannel ch, IOLoop<TestMessage, ?> loop) {
tomf110fff2014-09-26 00:38:18 -070026 super(loop, ch, 64 * 1024, 500);
tomf7e13b02014-09-26 11:12:25 -070027 checkArgument(length >= META_LENGTH, "Length must be greater than header length of 40");
tomf110fff2014-09-26 00:38:18 -070028 this.length = length;
29 }
30
tomf7e13b02014-09-26 11:12:25 -070031 void setNonStrict() {
32 isStrict = false;
33 }
34
tomf110fff2014-09-26 00:38:18 -070035 @Override
36 protected TestMessage read(ByteBuffer rb) {
37 if (rb.remaining() < length) {
38 return null;
39 }
tom0e0863f2014-09-26 09:02:33 -070040
41 long startTag = rb.getLong();
tomf7e13b02014-09-26 11:12:25 -070042 if (isStrict) {
43 checkState(startTag == START_TAG, "Incorrect message start");
44 }
tom0e0863f2014-09-26 09:02:33 -070045
46 long size = rb.getLong();
47 long requestorTime = rb.getLong();
48 long responderTime = rb.getLong();
tomf7e13b02014-09-26 11:12:25 -070049 byte[] padding = padding();
tom0e0863f2014-09-26 09:02:33 -070050 rb.get(padding);
51
52 long endTag = rb.getLong();
tomf7e13b02014-09-26 11:12:25 -070053 if (isStrict) {
54 checkState(endTag == END_TAG, "Incorrect message end");
55 }
tom0e0863f2014-09-26 09:02:33 -070056
57 return new TestMessage((int) size, requestorTime, responderTime, padding);
tomf110fff2014-09-26 00:38:18 -070058 }
59
tomf110fff2014-09-26 00:38:18 -070060 @Override
61 protected void write(TestMessage message, ByteBuffer wb) {
62 if (message.length() != length) {
63 throw new IllegalArgumentException(E_WRONG_LEN + message.length());
64 }
tom0e0863f2014-09-26 09:02:33 -070065
66 wb.putLong(START_TAG);
67 wb.putLong(message.length());
68 wb.putLong(message.requestorTime());
69 wb.putLong(message.responderTime());
70 wb.put(message.padding(), 0, length - META_LENGTH);
71 wb.putLong(END_TAG);
tomf110fff2014-09-26 00:38:18 -070072 }
73
tomf7e13b02014-09-26 11:12:25 -070074 public byte[] padding() {
75 return new byte[length - META_LENGTH];
tom0e0863f2014-09-26 09:02:33 -070076 }
tomf110fff2014-09-26 00:38:18 -070077}