blob: 98e80f74b4f141bd227a44f6b7afae1f22f5317b [file] [log] [blame]
tom43e836a2014-09-30 01:50:29 -07001package org.onlab.onos.store.cluster.impl;
tom1d416c52014-09-29 20:55:24 -07002
tomd33e6402014-09-30 03:14:43 -07003import de.javakaffee.kryoserializers.URISerializer;
4import org.apache.felix.scr.annotations.Activate;
tom81583142014-09-30 01:40:29 -07005import org.apache.felix.scr.annotations.Component;
tomd33e6402014-09-30 03:14:43 -07006import org.apache.felix.scr.annotations.Deactivate;
tom81583142014-09-30 01:40:29 -07007import org.apache.felix.scr.annotations.Service;
tomd33e6402014-09-30 03:14:43 -07008import org.onlab.onos.cluster.ControllerNode;
9import org.onlab.onos.cluster.DefaultControllerNode;
tom81583142014-09-30 01:40:29 -070010import org.onlab.onos.cluster.NodeId;
tomd33e6402014-09-30 03:14:43 -070011import org.onlab.onos.net.ConnectPoint;
12import org.onlab.onos.net.DefaultDevice;
13import org.onlab.onos.net.DefaultLink;
14import org.onlab.onos.net.DefaultPort;
15import org.onlab.onos.net.Device;
16import org.onlab.onos.net.DeviceId;
17import org.onlab.onos.net.Element;
18import org.onlab.onos.net.Link;
19import org.onlab.onos.net.LinkKey;
20import org.onlab.onos.net.MastershipRole;
21import org.onlab.onos.net.Port;
22import org.onlab.onos.net.PortNumber;
23import org.onlab.onos.net.provider.ProviderId;
tom1d416c52014-09-29 20:55:24 -070024import org.onlab.onos.store.cluster.messaging.MessageSubject;
25import org.onlab.onos.store.cluster.messaging.SerializationService;
tomd33e6402014-09-30 03:14:43 -070026import org.onlab.onos.store.serializers.ConnectPointSerializer;
27import org.onlab.onos.store.serializers.DefaultLinkSerializer;
28import org.onlab.onos.store.serializers.DefaultPortSerializer;
29import org.onlab.onos.store.serializers.DeviceIdSerializer;
30import org.onlab.onos.store.serializers.IpPrefixSerializer;
31import org.onlab.onos.store.serializers.LinkKeySerializer;
32import org.onlab.onos.store.serializers.NodeIdSerializer;
33import org.onlab.onos.store.serializers.PortNumberSerializer;
34import org.onlab.onos.store.serializers.ProviderIdSerializer;
tom81583142014-09-30 01:40:29 -070035import org.onlab.packet.IpPrefix;
tomd33e6402014-09-30 03:14:43 -070036import org.onlab.util.KryoPool;
tom81583142014-09-30 01:40:29 -070037import org.slf4j.Logger;
38import org.slf4j.LoggerFactory;
tom1d416c52014-09-29 20:55:24 -070039
tomd33e6402014-09-30 03:14:43 -070040import java.net.URI;
tomd33e6402014-09-30 03:14:43 -070041import java.util.ArrayList;
42import java.util.HashMap;
tom1d416c52014-09-29 20:55:24 -070043
tom1d416c52014-09-29 20:55:24 -070044/**
45 * Factory for parsing messages sent between cluster members.
46 */
tom81583142014-09-30 01:40:29 -070047@Component(immediate = true)
48@Service
tom1d416c52014-09-29 20:55:24 -070049public class MessageSerializer implements SerializationService {
50
tom81583142014-09-30 01:40:29 -070051 private final Logger log = LoggerFactory.getLogger(getClass());
52
tomd33e6402014-09-30 03:14:43 -070053 private static final int METADATA_LENGTH = 12; // 8 + 4
54 private static final int LENGTH_OFFSET = 8;
tom1d416c52014-09-29 20:55:24 -070055
56 private static final long MARKER = 0xfeedcafebeaddeadL;
57
tomd33e6402014-09-30 03:14:43 -070058 private KryoPool serializerPool;
59
60 @Activate
61 public void activate() {
62 setupKryoPool();
63 log.info("Started");
64 }
65
66 @Deactivate
67 public void deactivate() {
68 log.info("Stopped");
69 }
70
71 /**
72 * Sets up the common serialzers pool.
73 */
74 protected void setupKryoPool() {
75 // FIXME Slice out types used in common to separate pool/namespace.
76 serializerPool = KryoPool.newBuilder()
77 .register(ArrayList.class,
78 HashMap.class,
79
80 ControllerNode.State.class,
81 Device.Type.class,
82
83 DefaultControllerNode.class,
84 DefaultDevice.class,
85 MastershipRole.class,
86 Port.class,
87 Element.class,
88
89 Link.Type.class,
90
Madan Jampani890bc352014-10-01 22:35:29 -070091 MessageSubject.class
tomd33e6402014-09-30 03:14:43 -070092 )
93 .register(IpPrefix.class, new IpPrefixSerializer())
94 .register(URI.class, new URISerializer())
95 .register(NodeId.class, new NodeIdSerializer())
96 .register(ProviderId.class, new ProviderIdSerializer())
97 .register(DeviceId.class, new DeviceIdSerializer())
98 .register(PortNumber.class, new PortNumberSerializer())
99 .register(DefaultPort.class, new DefaultPortSerializer())
100 .register(LinkKey.class, new LinkKeySerializer())
101 .register(ConnectPoint.class, new ConnectPointSerializer())
102 .register(DefaultLink.class, new DefaultLinkSerializer())
103 .build()
104 .populate(1);
105 }
106
107
tom1d416c52014-09-29 20:55:24 -0700108 @Override
Madan Jampani890bc352014-10-01 22:35:29 -0700109 public Object decode(byte[] data) {
110 return serializerPool.deserialize(data);
tom1d416c52014-09-29 20:55:24 -0700111 }
112
113 @Override
Madan Jampani890bc352014-10-01 22:35:29 -0700114 public byte[] encode(Object payload) {
115 return serializerPool.serialize(payload);
tom1d416c52014-09-29 20:55:24 -0700116 }
Madan Jampani890bc352014-10-01 22:35:29 -0700117}