JSON Serializers for Intents

Implements JSON serializers for objects
used by the Intent REST APIs:
- ShortestPathIntent
- LinkEvent
- SwitchPort

Change-Id: I7dfe98d7b9d0d2449af02b1e1f9361a105a7efa5
diff --git a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
index 92f57ad..5c4e961 100644
--- a/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
+++ b/src/main/java/net/onrc/onos/core/intent/ShortestPathIntent.java
@@ -1,11 +1,14 @@
 package net.onrc.onos.core.intent;
 
 import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.core.topology.web.serializers.ShortestPathIntentSerializer;
 import net.onrc.onos.core.util.Dpid;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
  * @author Toshio Koide (t-koide@onlab.us)
  */
+@JsonSerialize(using = ShortestPathIntentSerializer.class)
 public class ShortestPathIntent extends Intent {
     public static final long EMPTYMACADDRESS = 0;
     public static final int EMPTYIPADDRESS = 0;
diff --git a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
index 40d7400..9b6630f 100644
--- a/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/LinkEvent.java
@@ -3,12 +3,16 @@
 import java.nio.ByteBuffer;
 
 import net.onrc.onos.core.topology.PortEvent.SwitchPort;
+import net.onrc.onos.core.topology.web.serializers.LinkEventSerializer;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 
 /**
  * Self-contained Link event Object.
  * <p/>
  * TODO: We probably want common base class/interface for Self-Contained Event Object.
  */
+
+@JsonSerialize(using = LinkEventSerializer.class)
 public class LinkEvent {
     protected final SwitchPort src;
     protected final SwitchPort dst;
diff --git a/src/main/java/net/onrc/onos/core/topology/PortEvent.java b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
index 1f20f22..39af378 100644
--- a/src/main/java/net/onrc/onos/core/topology/PortEvent.java
+++ b/src/main/java/net/onrc/onos/core/topology/PortEvent.java
@@ -1,5 +1,8 @@
 package net.onrc.onos.core.topology;
 
+import net.onrc.onos.core.topology.web.serializers.SwitchPortSerializer;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
 import java.nio.ByteBuffer;
 
 /**
@@ -8,6 +11,7 @@
  * TODO: We probably want common base class/interface for Self-Contained Event Object.
  */
 public class PortEvent {
+    @JsonSerialize(using = SwitchPortSerializer.class)
     public static class SwitchPort {
         public final Long dpid;
         public final Long number;
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
new file mode 100644
index 0000000..2621167
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/LinkEventSerializer.java
@@ -0,0 +1,43 @@
+package net.onrc.onos.core.topology.web.serializers;
+
+import net.onrc.onos.core.topology.LinkEvent;
+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 LinkEvents.
+ */
+public class LinkEventSerializer extends SerializerBase<LinkEvent> {
+
+    /**
+     * Public constructor - just calls its super class constructor.
+     */
+    public LinkEventSerializer() {
+        super(LinkEvent.class);
+    }
+
+    /**
+     * Serializes a LinkEvent object.
+     *
+     * @param linkEvent LinkEvent to serialize
+     * @param jsonGenerator generator to add the serialized object to
+     * @param serializerProvider not used
+     * @throws IOException if the JSON serialization fails
+     */
+    @Override
+    public void serialize(final LinkEvent linkEvent,
+                          final JsonGenerator jsonGenerator,
+                          final SerializerProvider serializerProvider)
+            throws IOException {
+
+        jsonGenerator.writeStartObject();
+
+        jsonGenerator.writeObjectField("src", linkEvent.getSrc());
+        jsonGenerator.writeObjectField("dst", linkEvent.getDst());
+
+        jsonGenerator.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/ShortestPathIntentSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/ShortestPathIntentSerializer.java
new file mode 100644
index 0000000..f0fa00c
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/ShortestPathIntentSerializer.java
@@ -0,0 +1,90 @@
+package net.onrc.onos.core.topology.web.serializers;
+
+
+import com.google.common.net.InetAddresses;
+import net.onrc.onos.core.intent.ShortestPathIntent;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+import org.openflow.util.HexString;
+
+import java.io.IOException;
+
+/**
+ * JSON serializer for ShortestPathIntents.
+ */
+public class ShortestPathIntentSerializer extends SerializerBase<ShortestPathIntent> {
+
+    /**
+     * Public constructor - just calls its super class constructor.
+     */
+    public ShortestPathIntentSerializer() {
+        super(ShortestPathIntent.class);
+    }
+
+    /**
+     * Converts an integer into a string representing an IP address.
+     *
+     * @param ipAddress integer representation of the address
+     * @return string that represents the address
+     */
+    private String toIPAddressString(final int ipAddress) {
+        return InetAddresses.fromInteger(ipAddress).getHostAddress();
+    }
+
+    /**
+     * Serializes a ShortestPathIntent object.
+     *
+     * @param intent Intent to serialize
+     * @param jsonGenerator generator to add the serialized object to
+     * @param serializerProvider not used
+     * @throws IOException if the JSON serialization fails
+     */
+    @Override
+    public void serialize(final ShortestPathIntent intent,
+                          final JsonGenerator jsonGenerator,
+                          final SerializerProvider serializerProvider)
+           throws IOException {
+        jsonGenerator.writeStartObject();
+
+        jsonGenerator.writeStringField("id", intent.getId());
+        jsonGenerator.writeStringField("state", intent.getState().toString());
+        jsonGenerator.writeStringField("pathFrozen",
+                                       Boolean.toString(intent.isPathFrozen()));
+
+        jsonGenerator.writeStringField("srcSwitchDpid",
+                                       HexString.toHexString(intent.getSrcSwitchDpid()));
+        jsonGenerator.writeStringField("srcPortNumber",
+                                       Long.toString(intent.getSrcPortNumber()));
+        jsonGenerator.writeStringField("srcMac",
+                                       HexString.toHexString(intent.getSrcMac()));
+        jsonGenerator.writeStringField("srcIp",
+                                       toIPAddressString(intent.getSrcIp()));
+
+        jsonGenerator.writeStringField("dstSwitchDpid",
+                HexString.toHexString(intent.getDstSwitchDpid()));
+        jsonGenerator.writeStringField("dstPortNumber",
+                                       Long.toString(intent.getDstPortNumber()));
+        jsonGenerator.writeStringField("dstMac",
+                                       HexString.toHexString(intent.getDstMac()));
+        jsonGenerator.writeStringField("dstIp",
+                                       toIPAddressString(intent.getDstIp()));
+
+        jsonGenerator.writeStringField("idleTimeout",
+                                       Integer.toString(intent.getIdleTimeout()));
+        jsonGenerator.writeStringField("hardTimeout",
+                                       Integer.toString(intent.getHardTimeout()));
+        jsonGenerator.writeStringField("firstSwitchIdleTimeout",
+                                       Integer.toString(intent.getFirstSwitchIdleTimeout()));
+        jsonGenerator.writeStringField("firstSwitchHardTimeout",
+                                       Integer.toString(intent.getFirstSwitchHardTimeout()));
+
+        jsonGenerator.writeArrayFieldStart("logs");
+        for (final String log : intent.getLogs()) {
+            jsonGenerator.writeObject(log);
+        }
+        jsonGenerator.writeEndArray();
+
+        jsonGenerator.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchPortSerializer.java b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchPortSerializer.java
new file mode 100644
index 0000000..c9820a5
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/topology/web/serializers/SwitchPortSerializer.java
@@ -0,0 +1,46 @@
+package net.onrc.onos.core.topology.web.serializers;
+
+import net.onrc.onos.core.topology.PortEvent.SwitchPort;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+import org.openflow.util.HexString;
+
+import java.io.IOException;
+
+/**
+ * JSON Serializer for SwitchPorts.
+ */
+public class SwitchPortSerializer extends SerializerBase<SwitchPort> {
+
+    /**
+     * Public constructor - just calls its super class constructor.
+     */
+    public SwitchPortSerializer() {
+        super(SwitchPort.class);
+    }
+
+    /**
+     * Serializes a SwitchPort object.
+     *
+     * @param switchPort object to serialize
+     * @param jsonGenerator generator to add the serialized object to
+     * @param serializerProvider not used
+     * @throws IOException if the serialization fails
+     */
+    @Override
+    public void serialize(final SwitchPort switchPort,
+                          final JsonGenerator jsonGenerator,
+                          final SerializerProvider serializerProvider)
+            throws IOException {
+        jsonGenerator.writeStartObject();
+
+        jsonGenerator.writeStringField("dpid",
+                                       HexString.toHexString(switchPort.getDpid()));
+        jsonGenerator.writeStringField("portNumber",
+                                       Long.toString(switchPort.getNumber()));
+
+        jsonGenerator.writeEndObject();
+    }
+
+}