diff options
author | 2015-09-09 22:15:21 -0700 | |
---|---|---|
committer | 2015-09-09 22:15:21 -0700 | |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/utils/netty/src/main/java/org/onlab/netty/MessageEncoder.java | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/utils/netty/src/main/java/org/onlab/netty/MessageEncoder.java')
-rw-r--r-- | framework/src/onos/utils/netty/src/main/java/org/onlab/netty/MessageEncoder.java | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/framework/src/onos/utils/netty/src/main/java/org/onlab/netty/MessageEncoder.java b/framework/src/onos/utils/netty/src/main/java/org/onlab/netty/MessageEncoder.java new file mode 100644 index 00000000..2b7784f8 --- /dev/null +++ b/framework/src/onos/utils/netty/src/main/java/org/onlab/netty/MessageEncoder.java @@ -0,0 +1,89 @@ +/* + * Copyright 2014-2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.onlab.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandler.Sharable; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.codec.MessageToByteEncoder; + +import java.io.IOException; + +import org.onlab.packet.IpAddress; +import org.onlab.packet.IpAddress.Version; +import org.onosproject.store.cluster.messaging.Endpoint; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Charsets; + +/** + * Encode InternalMessage out into a byte buffer. + */ +@Sharable +public class MessageEncoder extends MessageToByteEncoder<InternalMessage> { + + private final Logger log = LoggerFactory.getLogger(getClass()); + + @Override + protected void encode( + ChannelHandlerContext context, + InternalMessage message, + ByteBuf out) throws Exception { + + // write message id + out.writeLong(message.id()); + + Endpoint sender = message.sender(); + + IpAddress senderIp = sender.host(); + if (senderIp.version() == Version.INET) { + out.writeByte(0); + } else { + out.writeByte(1); + } + out.writeBytes(senderIp.toOctets()); + + // write sender port + out.writeInt(sender.port()); + + byte[] messageTypeBytes = message.type().getBytes(Charsets.UTF_8); + + // write length of message type + out.writeInt(messageTypeBytes.length); + + // write message type bytes + out.writeBytes(messageTypeBytes); + + byte[] payload = message.payload(); + + // write payload length + out.writeInt(payload.length); + + // write payload. + out.writeBytes(payload); + } + + @Override + public void exceptionCaught(ChannelHandlerContext context, Throwable cause) { + if (cause instanceof IOException) { + log.debug("IOException inside channel handling pipeline.", cause); + } else { + log.error("non-IOException inside channel handling pipeline.", cause); + } + context.close(); + } +} |