blob: d026deca16a38a0bfba9538e9213cf543c7ece56 [file] [log] [blame]
Madan Jampaniab6d3112014-10-02 16:30:14 -07001package org.onlab.netty;
2
Madan Jampani29e5dfd2014-10-07 17:26:25 -07003import org.slf4j.Logger;
4import org.slf4j.LoggerFactory;
5
Madan Jampaniab6d3112014-10-02 16:30:14 -07006import io.netty.buffer.ByteBuf;
Madan Jampaniddf76222014-10-04 23:48:44 -07007import io.netty.channel.ChannelHandler.Sharable;
Madan Jampaniab6d3112014-10-02 16:30:14 -07008import io.netty.channel.ChannelHandlerContext;
9import io.netty.handler.codec.MessageToByteEncoder;
10
11/**
12 * Encode InternalMessage out into a byte buffer.
13 */
Madan Jampaniddf76222014-10-04 23:48:44 -070014@Sharable
Madan Jampaniab6d3112014-10-02 16:30:14 -070015public class MessageEncoder extends MessageToByteEncoder<InternalMessage> {
16
Madan Jampani29e5dfd2014-10-07 17:26:25 -070017 private final Logger log = LoggerFactory.getLogger(getClass());
18
Madan Jampaniab6d3112014-10-02 16:30:14 -070019 // onosiscool in ascii
20 public static final byte[] PREAMBLE = "onosiscool".getBytes();
Madan Jampani938aa432014-10-04 17:37:23 -070021 public static final int HEADER_VERSION = 1;
22 public static final int SERIALIZER_VERSION = 1;
23
Madan Jampaniab6d3112014-10-02 16:30:14 -070024
Madan Jampani53e44e62014-10-07 12:39:51 -070025 private static final KryoSerializer SERIALIZER = new KryoSerializer();
Madan Jampaniab6d3112014-10-02 16:30:14 -070026
27 @Override
Madan Jampani86ed0552014-10-03 16:45:42 -070028 protected void encode(
29 ChannelHandlerContext context,
30 InternalMessage message,
Madan Jampaniab6d3112014-10-02 16:30:14 -070031 ByteBuf out) throws Exception {
32
Madan Jampani938aa432014-10-04 17:37:23 -070033 // write version
34 out.writeInt(HEADER_VERSION);
35
Madan Jampaniab6d3112014-10-02 16:30:14 -070036 // write preamble
37 out.writeBytes(PREAMBLE);
38
Madan Jampani53e44e62014-10-07 12:39:51 -070039 byte[] payload = SERIALIZER.encode(message);
Madan Jampaniab6d3112014-10-02 16:30:14 -070040
Madan Jampani86ed0552014-10-03 16:45:42 -070041 // write payload length
Madan Jampaniab6d3112014-10-02 16:30:14 -070042 out.writeInt(payload.length);
43
Yuta HIGUCHI993d7aa2014-10-06 22:54:38 -070044 // write payloadSerializer version
Madan Jampani938aa432014-10-04 17:37:23 -070045 out.writeInt(SERIALIZER_VERSION);
46
Madan Jampani86ed0552014-10-03 16:45:42 -070047 // write payload.
Madan Jampaniab6d3112014-10-02 16:30:14 -070048 out.writeBytes(payload);
49 }
Madan Jampani29e5dfd2014-10-07 17:26:25 -070050
51 @Override
52 public void exceptionCaught(ChannelHandlerContext context, Throwable cause) {
53 log.error("Exception inside channel handling pipeline.", cause);
54 context.close();
55 }
Madan Jampaniab6d3112014-10-02 16:30:14 -070056}