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();
+ }
+
+}