Implemented REST API for multicast RIB.

Change-Id: I5de6fe0aae412083597113e355ba0e8c984be5f1
diff --git a/core/api/src/main/java/org/onosproject/net/mcast/McastStore.java b/core/api/src/main/java/org/onosproject/net/mcast/McastStore.java
index 96b21f6..067f517 100644
--- a/core/api/src/main/java/org/onosproject/net/mcast/McastStore.java
+++ b/core/api/src/main/java/org/onosproject/net/mcast/McastStore.java
@@ -51,7 +51,7 @@
     void storeSink(McastRoute route, ConnectPoint sink, Type operation);
 
     /**
-     * Obtain the source for a multicast route.
+     * Obtains the source for a multicast route.
      *
      * @param route a multicast route
      * @return a connect point
@@ -59,10 +59,17 @@
     ConnectPoint sourceFor(McastRoute route);
 
     /**
-     * Obtain the sinks for a multicast route.
+     * Obtains the sinks for a multicast route.
      *
      * @param route a multicast route
      * @return a set of sinks
      */
     Set<ConnectPoint> sinksFor(McastRoute route);
+
+    /**
+     * Gets the set of all known multicast routes.
+     *
+     * @return set of multicast routes
+     */
+    Set<McastRoute> getRoutes();
 }
diff --git a/core/api/src/main/java/org/onosproject/net/mcast/MulticastRouteService.java b/core/api/src/main/java/org/onosproject/net/mcast/MulticastRouteService.java
index 05bd6cb..64aa842 100644
--- a/core/api/src/main/java/org/onosproject/net/mcast/MulticastRouteService.java
+++ b/core/api/src/main/java/org/onosproject/net/mcast/MulticastRouteService.java
@@ -43,6 +43,13 @@
     void remove(McastRoute route);
 
     /**
+     * Gets all multicast routes in the system.
+     *
+     * @return set of multicast routes
+     */
+    Set<McastRoute> getRoutes();
+
+    /**
      * Adds a source connection to the route from where the
      * data stream is originating.
      *
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
index 99030ca..cbed1c2 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CodecManager.java
@@ -53,6 +53,7 @@
 import org.onosproject.net.intent.HostToHostIntent;
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.PointToPointIntent;
+import org.onosproject.net.mcast.McastRoute;
 import org.onosproject.net.meter.Band;
 import org.onosproject.net.meter.Meter;
 import org.onosproject.net.meter.MeterRequest;
@@ -117,6 +118,7 @@
         registerCodec(FilteringObjective.class, new FilteringObjectiveCodec());
         registerCodec(ForwardingObjective.class, new ForwardingObjectiveCodec());
         registerCodec(NextObjective.class, new NextObjectiveCodec());
+        registerCodec(McastRoute.class, new McastRouteCodec());
         log.info("Started");
     }
 
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/McastRouteCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/McastRouteCodec.java
new file mode 100644
index 0000000..58bd95c
--- /dev/null
+++ b/core/common/src/main/java/org/onosproject/codec/impl/McastRouteCodec.java
@@ -0,0 +1,44 @@
+package org.onosproject.codec.impl;
+
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.onlab.packet.IpAddress;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.mcast.McastRoute;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * Codec to encode and decode a multicast route to and from JSON.
+ */
+public class McastRouteCodec extends JsonCodec<McastRoute> {
+
+    private static final String SOURCE = "source";
+    private static final String GROUP = "group";
+    private static final String TYPE = "type";
+
+    @Override
+    public ObjectNode encode(McastRoute route, CodecContext context) {
+        checkNotNull(route);
+        ObjectNode root = context.mapper().createObjectNode()
+                .put(TYPE, route.type().toString())
+                .put(SOURCE, route.source().toString())
+                .put(GROUP, route.group().toString());
+
+        return root;
+    }
+
+    @Override
+    public McastRoute decode(ObjectNode json, CodecContext context) {
+        if (json == null || !json.isObject()) {
+            return null;
+        }
+
+        IpAddress source = IpAddress.valueOf(json.path(SOURCE).asText());
+        IpAddress group = IpAddress.valueOf(json.path(GROUP).asText());
+
+        McastRoute route = new McastRoute(source, group, McastRoute.Type.STATIC);
+
+        return route;
+    }
+}
diff --git a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
index 13092fe..d5a73c0 100644
--- a/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
+++ b/core/store/serializers/src/main/java/org/onosproject/store/serializers/KryoNamespaces.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
 
+import com.google.common.collect.Sets;
 import org.onlab.packet.ChassisId;
 import org.onlab.packet.EthType;
 import org.onlab.packet.Ip4Address;
@@ -219,6 +220,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
 
 public final class KryoNamespaces {
 
@@ -228,6 +230,7 @@
             .register(AtomicBoolean.class)
             .register(AtomicInteger.class)
             .register(AtomicLong.class)
+            .register(AtomicReference.class)
             .register(new ImmutableListSerializer(),
                       ImmutableList.class,
                       ImmutableList.of(1).getClass(),
@@ -245,6 +248,7 @@
             .register(HashMap.class)
             .register(ConcurrentHashMap.class)
             .register(CopyOnWriteArraySet.class)
+            .register(Sets.newConcurrentHashSet().getClass())
             .register(ArrayList.class,
                       LinkedList.class,
                       HashSet.class,