Topology REST API modifications and unit tests

- added a Serializer for Topology operations
- added a REST test harness class for Topology tests
- added REST API tests for topology get of all
  topology, links, switches, and devices.

Change-Id: I13e3654aad7c0f5af41f07be66da82330933d3a3
diff --git a/src/main/java/net/onrc/onos/core/topology/Topology.java b/src/main/java/net/onrc/onos/core/topology/Topology.java
index 3b90f89..844507d 100644
--- a/src/main/java/net/onrc/onos/core/topology/Topology.java
+++ b/src/main/java/net/onrc/onos/core/topology/Topology.java
@@ -1,12 +1,15 @@
 package net.onrc.onos.core.topology;
 
 import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.topology.serializers.TopologySerializer;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
  * The northbound interface to the topology. This interface
  * is presented to the rest of ONOS. It is currently read-only, as we want
  * only the discovery modules to be allowed to modify the topology.
  */
+@JsonSerialize(using = TopologySerializer.class)
 public interface Topology {
     /**
      * Get the switch for a given switch DPID.
diff --git a/src/main/java/net/onrc/onos/core/topology/serializers/TopologySerializer.java b/src/main/java/net/onrc/onos/core/topology/serializers/TopologySerializer.java
new file mode 100644
index 0000000..1bc4ff2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/serializers/TopologySerializer.java
@@ -0,0 +1,68 @@
+package net.onrc.onos.core.topology.serializers;
+
+import net.onrc.onos.core.topology.Device;
+import net.onrc.onos.core.topology.Link;
+import net.onrc.onos.core.topology.Switch;
+import net.onrc.onos.core.topology.Topology;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+
+import java.io.IOException;
+
+/**
+ * JSON serializer for Topology objects.  Used by REST implementation of the
+ * topology APIs.
+ */
+public class TopologySerializer extends SerializerBase<Topology> {
+
+    /**
+     * Default constructor. Performs basic initialization of the JSON
+     * serializer.
+     */
+    public TopologySerializer() {
+        super(Topology.class);
+    }
+
+    /**
+     * Serialize a Topology object in JSON.  The resulting JSON contains the
+     * switches, links and ports provided by the Topology object.
+     *
+     * @param topology the Topology that is being converted to JSON
+     * @param jsonGenerator generator to place the serialized JSON into
+     * @param serializerProvider unused but required for method override
+     * @throws IOException if the JSON serialization process fails
+     */
+    @Override
+    public void serialize(Topology topology,
+                          JsonGenerator jsonGenerator,
+                          SerializerProvider serializerProvider)
+            throws IOException {
+        // Start the object
+        jsonGenerator.writeStartObject();
+
+        // Output the switches array
+        jsonGenerator.writeArrayFieldStart("switches");
+        for (final Switch swtch : topology.getSwitches()) {
+            jsonGenerator.writeObject(swtch);
+        }
+        jsonGenerator.writeEndArray();
+
+        // Output the links array
+        jsonGenerator.writeArrayFieldStart("links");
+        for (final Link link : topology.getLinks()) {
+            jsonGenerator.writeObject(link);
+        }
+        jsonGenerator.writeEndArray();
+
+        // Output the devices array
+        jsonGenerator.writeArrayFieldStart("devices");
+        for (final Device device : topology.getDevices()) {
+            jsonGenerator.writeObject(device);
+        }
+        jsonGenerator.writeEndArray();
+
+        // All done
+        jsonGenerator.writeEndObject();
+    }
+}