Custom serializer for IOFSwitch.

The default serialization now breaks when it tries to serialize the OFFactory.
Also using a custom serializer provides better information for debugging.

Change-Id: Ib180681ddde879186425025fa551bbd891d3ee7a
diff --git a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
index 530da78..40aa530 100644
--- a/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
+++ b/src/main/java/net/floodlightcontroller/core/IOFSwitch.java
@@ -26,11 +26,13 @@
 import java.util.concurrent.Future;
 
 import net.floodlightcontroller.core.IFloodlightProviderService.Role;
+import net.floodlightcontroller.core.web.serializers.IOFSwitchSerializer;
 import net.floodlightcontroller.debugcounter.IDebugCounterService;
 import net.floodlightcontroller.debugcounter.IDebugCounterService.CounterException;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
 import net.floodlightcontroller.util.OrderedCollection;
 
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.jboss.netty.channel.Channel;
 import org.projectfloodlight.openflow.protocol.OFActionType;
 import org.projectfloodlight.openflow.protocol.OFCapabilities;
@@ -44,7 +46,7 @@
 import org.projectfloodlight.openflow.protocol.OFVersion;
 import org.projectfloodlight.openflow.types.U64;
 
-
+@JsonSerialize(using = IOFSwitchSerializer.class)
 public interface IOFSwitch {
 
 	/**
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/IOFSwitchSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/IOFSwitchSerializer.java
new file mode 100644
index 0000000..e8c9e1a
--- /dev/null
+++ b/src/main/java/net/floodlightcontroller/core/web/serializers/IOFSwitchSerializer.java
@@ -0,0 +1,55 @@
+package net.floodlightcontroller.core.web.serializers;
+
+import java.io.IOException;
+
+import net.floodlightcontroller.core.IOFSwitch;
+
+import org.codehaus.jackson.JsonGenerationException;
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.map.SerializerProvider;
+import org.codehaus.jackson.map.ser.std.SerializerBase;
+import org.projectfloodlight.openflow.protocol.OFDescStatsReply;
+import org.projectfloodlight.openflow.protocol.OFPortDesc;
+
+public class IOFSwitchSerializer extends SerializerBase<IOFSwitch> {
+
+    protected IOFSwitchSerializer() {
+        super(IOFSwitch.class);
+    }
+
+    @Override
+    public void serialize(IOFSwitch sw, JsonGenerator jGen, SerializerProvider sp)
+            throws IOException, JsonGenerationException {
+
+        jGen.writeStartObject();
+        jGen.writeStringField("dpid", sw.getStringId());
+
+        jGen.writeArrayFieldStart("ports");
+        for (OFPortDesc port : sw.getPorts()) {
+            jGen.writeStartObject();
+            jGen.writeNumberField("number", port.getPortNo().getPortNumber());
+            jGen.writeStringField("macAddress", port.getHwAddr().toString());
+            jGen.writeStringField("name", port.getName());
+            jGen.writeEndObject();
+        }
+        jGen.writeEndArray();
+
+        jGen.writeStringField("version", sw.getOFVersion().toString());
+
+        // Description from OFDescStatsReply
+        OFDescStatsReply desc = sw.getSwitchDescription();
+        jGen.writeObjectFieldStart("description");
+        jGen.writeStringField("manufacturer", desc.getMfrDesc());
+        jGen.writeStringField("hardware", desc.getHwDesc());
+        jGen.writeStringField("switch", desc.getSwDesc());
+        jGen.writeStringField("serialNum", desc.getSerialNum());
+        jGen.writeStringField("datapath", desc.getDpDesc());
+        jGen.writeEndObject();
+
+        jGen.writeStringField("connectedSince", sw.getConnectedSince().toString());
+        jGen.writeObjectField("role", sw.getRole());
+
+        jGen.writeEndObject();
+    }
+
+}