blob: c0a84dfe088a8255bc2ae29816a928e80f609bd1 [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 try {
40 SERIALIZER.encode(message);
41 } catch (Exception e) {
42 e.printStackTrace();
43 }
44 byte[] payload = SERIALIZER.encode(message);
Madan Jampaniab6d3112014-10-02 16:30:14 -070045
Madan Jampani86ed0552014-10-03 16:45:42 -070046 // write payload length
Madan Jampaniab6d3112014-10-02 16:30:14 -070047 out.writeInt(payload.length);
48
Yuta HIGUCHI993d7aa2014-10-06 22:54:38 -070049 // write payloadSerializer version
Madan Jampani938aa432014-10-04 17:37:23 -070050 out.writeInt(SERIALIZER_VERSION);
51
Madan Jampani86ed0552014-10-03 16:45:42 -070052 // write payload.
Madan Jampaniab6d3112014-10-02 16:30:14 -070053 out.writeBytes(payload);
54 }
Madan Jampani29e5dfd2014-10-07 17:26:25 -070055
56 @Override
57 public void exceptionCaught(ChannelHandlerContext context, Throwable cause) {
58 log.error("Exception inside channel handling pipeline.", cause);
59 context.close();
60 }
Madan Jampaniab6d3112014-10-02 16:30:14 -070061}