From cd4a948b07bd2babf3e4fc292aaeb77aa8e6daf8 Mon Sep 17 00:00:00 2001
From: Rob Adams <rob.adams@bigswitch.com>
Date: Tue, 15 May 2012 17:40:58 -0700
Subject: [PATCH] Clean up serialization for REST APIs.  Get rid of the jackson
 converter module and just use annotations everywhere when appropriate.  There
 may still be a desire for something like the jackson converter module but it
 didn't really mesh with the plugin system, and the annotations work nicely.

---
 .../core/web/JacksonCustomConverter.java      | 125 ------------------
 ...tHistoryAttachmentPointJSONSerializer.java |  45 -------
 ...tHistoryTopologyClusterJSONSerializer.java |  47 -------
 ...ventHistoryTopologyLinkJSONSerializer.java |  49 -------
 ...ntHistoryTopologySwitchJSONSerializer.java |  47 -------
 .../NodePortTupleJSONSerializer.java          |  29 ----
 .../OneComponentTimeJSONSerializer.java       |  42 ------
 .../internal/EventHistoryAttachmentPoint.java |  33 -----
 .../linkdiscovery/LinkTuple.java              |   4 +
 .../internal/EventHistoryTopologyCluster.java |  27 ++++
 .../internal/EventHistoryTopologyLink.java    |  42 +++++-
 .../internal/EventHistoryTopologySwitch.java  |  31 ++++-
 .../internal/LinkDiscoveryManager.java        |  17 ++-
 .../perfmon/CumulativeTimeBucket.java         |   3 +
 .../CumulativeTimeBucketJSONSerializer.java   |   4 +-
 .../perfmon/OneComponentTime.java             |  10 ++
 .../restserver/RestApiServer.java             |   4 -
 .../topology/NodePortTuple.java               |   6 +
 .../util/EventHistoryBaseInfo.java            |   4 +
 .../EventHistoryBaseInfoJSONSerializer.java   |   3 +-
 .../openflow/protocol/OFFeaturesReply.java    |   4 +
 .../java/org/openflow/protocol/OFMatch.java   |   4 +
 .../org/openflow/protocol/OFPhysicalPort.java |   4 +
 .../OFFeaturesReplyJSONSerializer.java        |   2 +-
 .../serializers/OFMatchJSONSerializer.java    |   2 +-
 .../OFPhysicalPortJSONSerializer.java         |   2 +-
 26 files changed, 148 insertions(+), 442 deletions(-)
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/JacksonCustomConverter.java
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryAttachmentPointJSONSerializer.java
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyClusterJSONSerializer.java
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyLinkJSONSerializer.java
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologySwitchJSONSerializer.java
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java
 delete mode 100644 src/main/java/net/floodlightcontroller/core/web/serializers/OneComponentTimeJSONSerializer.java
 delete mode 100644 src/main/java/net/floodlightcontroller/devicemanager/internal/EventHistoryAttachmentPoint.java
 rename src/main/java/net/floodlightcontroller/{core/web/serializers => perfmon}/CumulativeTimeBucketJSONSerializer.java (90%)
 rename src/main/java/net/floodlightcontroller/{core/web/serializers => util}/EventHistoryBaseInfoJSONSerializer.java (95%)
 rename src/main/java/{net/floodlightcontroller/core/web => org/openflow/protocol}/serializers/OFFeaturesReplyJSONSerializer.java (97%)
 rename src/main/java/{net/floodlightcontroller/core/web => org/openflow/protocol}/serializers/OFMatchJSONSerializer.java (98%)
 rename src/main/java/{net/floodlightcontroller/core/web => org/openflow/protocol}/serializers/OFPhysicalPortJSONSerializer.java (97%)

diff --git a/src/main/java/net/floodlightcontroller/core/web/JacksonCustomConverter.java b/src/main/java/net/floodlightcontroller/core/web/JacksonCustomConverter.java
deleted file mode 100644
index e8d76376c..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/JacksonCustomConverter.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
-*    Copyright 2011, Big Switch Networks, Inc. 
-*    Originally created by David Erickson, Stanford University
-* 
-*    Licensed under the Apache License, Version 2.0 (the "License"); you may
-*    not use this file except in compliance with the License. You may obtain
-*    a copy of the License at
-*
-*         http://www.apache.org/licenses/LICENSE-2.0
-*
-*    Unless required by applicable law or agreed to in writing, software
-*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-*    License for the specific language governing permissions and limitations
-*    under the License.
-**/
-
-package net.floodlightcontroller.core.web;
-
-import java.util.List;
-
-import net.floodlightcontroller.core.web.serializers.EventHistoryAttachmentPointJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.EventHistoryBaseInfoJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.EventHistoryTopologyClusterJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.EventHistoryTopologyLinkJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.EventHistoryTopologySwitchJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.LinkTupleSerializer;
-import net.floodlightcontroller.core.web.serializers.OFFeaturesReplyJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.OFMatchJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.OFPhysicalPortJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.CumulativeTimeBucketJSONSerializer;
-import net.floodlightcontroller.core.web.serializers.OneComponentTimeJSONSerializer;
-
-import org.codehaus.jackson.JsonFactory;
-import org.codehaus.jackson.Version;
-import org.codehaus.jackson.JsonGenerator.Feature;
-import org.codehaus.jackson.map.ObjectMapper;
-import org.codehaus.jackson.map.module.SimpleModule;
-import org.restlet.data.MediaType;
-import org.restlet.engine.Engine;
-import org.restlet.engine.converter.ConverterHelper;
-import org.restlet.ext.jackson.JacksonConverter;
-import org.restlet.ext.jackson.JacksonRepresentation;
-import org.restlet.representation.Representation;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Wrap the standard JacksonConverter and use a custom object mapper
- * that contains custom serializers
- * @author readams
- *
- */
-public class JacksonCustomConverter extends JacksonConverter {
-    protected static Logger log =
-                        LoggerFactory.getLogger(JacksonCustomConverter.class);
-
-    protected static ObjectMapper jsonObjectMapper;
-    protected static SimpleModule jsonModule;
-    static {
-        JsonFactory jsonFactory = new JsonFactory();
-        jsonFactory.configure(Feature.AUTO_CLOSE_TARGET, false);
-        jsonObjectMapper = new ObjectMapper(jsonFactory);
-        jsonModule = new SimpleModule("JsonModule", new Version(1, 0, 0, null));
-        jsonModule.addSerializer(new OFMatchJSONSerializer());
-        jsonModule.addSerializer(new OFFeaturesReplyJSONSerializer());
-        jsonModule.addSerializer(new OFPhysicalPortJSONSerializer());
-        jsonModule.addSerializer(new EventHistoryBaseInfoJSONSerializer());
-        jsonModule.addSerializer(new EventHistoryAttachmentPointJSONSerializer());
-        jsonModule.addSerializer(new OneComponentTimeJSONSerializer());
-        jsonModule.addSerializer(new CumulativeTimeBucketJSONSerializer());
-        jsonModule.addSerializer(new LinkTupleSerializer());
-        jsonModule.addSerializer(new EventHistoryTopologySwitchJSONSerializer());
-        jsonModule.addSerializer(new EventHistoryTopologyLinkJSONSerializer());
-        jsonModule.addSerializer(new EventHistoryTopologyClusterJSONSerializer());
-        jsonObjectMapper.registerModule(jsonModule);
-    }
-
-    @Override
-    protected <T> JacksonRepresentation<T> 
-                                        create(MediaType mediaType, T source) {
-        JacksonRepresentation<T> jr = 
-                                new JacksonRepresentation<T>(mediaType, source);
-        jr.setObjectMapper(jsonObjectMapper);
-        return jr;
-    }
-
-    @Override
-    protected <T> JacksonRepresentation<T> 
-                        create(Representation source, Class<T> objectClass) {
-        JacksonRepresentation<T> jr = 
-                        new JacksonRepresentation<T>(source, objectClass);
-        jr.setObjectMapper(jsonObjectMapper);
-        return jr;
-    }
-
-    /**
-     * Replace the jackson converter with this one
-     * @param converterClass
-     * @param newConverter
-     */
-    public static void replaceConverter() {
-        ConverterHelper oldConverter = null;
-
-        List<ConverterHelper> converters = 
-                            Engine.getInstance().getRegisteredConverters();
-        for (ConverterHelper converter : converters) {
-            if (converter.getClass().equals(JacksonConverter.class)) {
-                converters.remove(converter);
-                oldConverter = converter;
-                break;
-            }
-        }
-
-        converters.add(new JacksonCustomConverter());
-
-        if (oldConverter == null) {
-            log.debug("Added {} to Restlet Engine", 
-                                                JacksonCustomConverter.class);
-        } else {
-            log.debug("Replaced {} with {} in Restlet Engine", 
-                         oldConverter.getClass(), JacksonCustomConverter.class);
-        }
-    }
-}
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryAttachmentPointJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryAttachmentPointJSONSerializer.java
deleted file mode 100644
index 6a8fb939d..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryAttachmentPointJSONSerializer.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package net.floodlightcontroller.core.web.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.devicemanager.internal.EventHistoryAttachmentPoint;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.openflow.util.HexString;
-
-/**
- * 
- * @author subrata
- *
- */
-
-public class EventHistoryAttachmentPointJSONSerializer 
-                        extends JsonSerializer<EventHistoryAttachmentPoint> {
-    /**
-     * Performs the serialization of a EventHistory.BaseInfo object
-     */
-   @Override
-   public void serialize(EventHistoryAttachmentPoint attachPt, 
-                   JsonGenerator jGen,
-                   SerializerProvider serializer) 
-                   throws IOException, JsonProcessingException {
-       jGen.writeStartObject();
-       jGen.writeStringField("Switch", HexString.toHexString(attachPt.dpid));
-       jGen.writeStringField("Host",   HexString.toHexString(attachPt.mac));
-       jGen.writeNumberField("Port",   attachPt.port);
-       jGen.writeNumberField("VLAN",   attachPt.vlan);
-       jGen.writeStringField("Reason", attachPt.reason);
-       jGen.writeEndObject();
-   }
-
-   /**
-    * Tells SimpleModule that we are the serializer for OFMatch
-    */
-   @Override
-   public Class<EventHistoryAttachmentPoint> handledType() {
-       return EventHistoryAttachmentPoint.class;
-   }
-}
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyClusterJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyClusterJSONSerializer.java
deleted file mode 100644
index c571bef59..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyClusterJSONSerializer.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.floodlightcontroller.core.web.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.linkdiscovery.internal.EventHistoryTopologyCluster;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.openflow.util.HexString;
-
-/**
- * 
- * @author subrata
- *
- */
-
-public class EventHistoryTopologyClusterJSONSerializer
-                        extends JsonSerializer<EventHistoryTopologyCluster> {
-    /**
-     * Performs the serialization of a EventHistory Topology-Switch object
-     */
-   @Override
-   public void serialize(EventHistoryTopologyCluster topoCluster,
-                   JsonGenerator jGen,
-                   SerializerProvider serializer) 
-                   throws IOException, JsonProcessingException {
-       jGen.writeStartObject();
-       jGen.writeStringField("Switch",
-               HexString.toHexString(topoCluster.dpid));
-       jGen.writeStringField("OldClusterId", 
-               HexString.toHexString(topoCluster.clusterIdOld));
-       jGen.writeStringField("NewClusterId", 
-               HexString.toHexString(topoCluster.clusterIdNew));
-       jGen.writeStringField("Reason", topoCluster.reason);
-       jGen.writeEndObject();
-   }
-
-   /**
-    * Tells SimpleModule that we are the serializer for OFMatch
-    */
-   @Override
-   public Class<EventHistoryTopologyCluster> handledType() {
-       return EventHistoryTopologyCluster.class;
-   }
-}
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyLinkJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyLinkJSONSerializer.java
deleted file mode 100644
index 1117db933..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologyLinkJSONSerializer.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package net.floodlightcontroller.core.web.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.linkdiscovery.internal.EventHistoryTopologyLink;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.openflow.util.HexString;
-
-/**
- * 
- * @author subrata
- *
- */
-
-public class EventHistoryTopologyLinkJSONSerializer
-                        extends JsonSerializer<EventHistoryTopologyLink> {
-    /**
-     * Performs the serialization of a EventHistory Topology-Switch object
-     */
-   @Override
-   public void serialize(EventHistoryTopologyLink topoLnk,
-                   JsonGenerator jGen,
-                   SerializerProvider serializer) 
-                   throws IOException, JsonProcessingException {
-       jGen.writeStartObject();
-       jGen.writeStringField("Source-Switch",
-               HexString.toHexString(topoLnk.srcSwDpid));
-       jGen.writeNumberField("SrcPort", topoLnk.srcSwport);
-       jGen.writeStringField("Dest-Switch",
-               HexString.toHexString(topoLnk.dstSwDpid));
-       jGen.writeNumberField("DstPort", topoLnk.dstSwport);
-       jGen.writeNumberField("SrcPortState", topoLnk.srcPortState);
-       jGen.writeNumberField("DstPortState", topoLnk.dstPortState);
-       jGen.writeStringField("Reason", topoLnk.reason);
-       jGen.writeEndObject();
-   }
-
-   /**
-    * Tells SimpleModule that we are the serializer for OFMatch
-    */
-   @Override
-   public Class<EventHistoryTopologyLink> handledType() {
-       return EventHistoryTopologyLink.class;
-   }
-}
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologySwitchJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologySwitchJSONSerializer.java
deleted file mode 100644
index fd076bbe9..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryTopologySwitchJSONSerializer.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.floodlightcontroller.core.web.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.linkdiscovery.internal.EventHistoryTopologySwitch;
-import net.floodlightcontroller.packet.IPv4;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.openflow.util.HexString;
-
-/**
- * 
- * @author subrata
- *
- */
-
-public class EventHistoryTopologySwitchJSONSerializer
-                        extends JsonSerializer<EventHistoryTopologySwitch> {
-    /**
-     * Performs the serialization of a EventHistory Topology-Switch object
-     */
-   @Override
-   public void serialize(EventHistoryTopologySwitch topoSw,
-                   JsonGenerator jGen,
-                   SerializerProvider serializer) 
-                   throws IOException, JsonProcessingException {
-       jGen.writeStartObject();
-       jGen.writeStringField("Switch", HexString.toHexString(topoSw.dpid));
-       jGen.writeStringField("Port",
-               "0x"+Integer.toHexString((int)(topoSw.l4Port)).substring(4));
-       jGen.writeStringField("IpAddr", 
-               IPv4.fromIPv4Address(IPv4.toIPv4Address(topoSw.ipv4Addr)));
-       jGen.writeStringField("Reason", topoSw.reason);
-       jGen.writeEndObject();
-   }
-
-   /**
-    * Tells SimpleModule that we are the serializer for OFMatch
-    */
-   @Override
-   public Class<EventHistoryTopologySwitch> handledType() {
-       return EventHistoryTopologySwitch.class;
-   }
-}
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java
deleted file mode 100644
index d3b44b95e..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/NodePortTupleJSONSerializer.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package net.floodlightcontroller.core.web.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.topology.NodePortTuple;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.openflow.util.HexString;
-
-public class NodePortTupleJSONSerializer extends JsonSerializer<NodePortTuple> {
-
-    @Override
-    public void serialize(NodePortTuple ntp, JsonGenerator jgen,
-                          SerializerProvider sp) throws IOException,
-                                                  JsonProcessingException {
-        jgen.writeStartObject();
-        jgen.writeStringField("switch", HexString.toHexString(ntp.getNodeId()));
-        jgen.writeNumberField("port", ntp.getPortId());
-        jgen.writeEndObject();
-    }
-
-    @Override
-    public Class<NodePortTuple> handledType() {
-        return NodePortTuple.class;
-    }
-}
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OneComponentTimeJSONSerializer.java b/src/main/java/net/floodlightcontroller/core/web/serializers/OneComponentTimeJSONSerializer.java
deleted file mode 100644
index a91ff89f5..000000000
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/OneComponentTimeJSONSerializer.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package net.floodlightcontroller.core.web.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.perfmon.OneComponentTime;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-public class OneComponentTimeJSONSerializer
-                                    extends JsonSerializer<OneComponentTime> {
-    /**
-     * Performs the serialization of a OneComponentTime object
-     */
-   @Override
-   public void serialize(OneComponentTime oct, 
-                   JsonGenerator jGen,
-                   SerializerProvider serializer) 
-                   throws IOException, JsonProcessingException {
-       jGen.writeStartObject();
-       jGen.writeStringField("module-name", oct.getCompName());
-       jGen.writeNumberField("num-packets", oct.getPktCnt());
-       jGen.writeNumberField("total", oct.getSumProcTimeNs());
-       jGen.writeNumberField("average", oct.getAvgProcTimeNs());
-       jGen.writeNumberField("max", oct.getMaxProcTimeNs());
-       jGen.writeNumberField("min", oct.getMinProcTimeNs());
-       jGen.writeNumberField("std-dev", oct.getSigmaProcTimeNs());
-       jGen.writeNumberField("average-squared",  oct.getSumSquaredProcTimeNs());
-       jGen.writeEndObject();
-   }
-
-   /**
-    * Tells SimpleModule that we are the serializer for OFMatch
-    */
-   @Override
-   public Class<OneComponentTime> handledType() {
-       return OneComponentTime.class;
-   }
-}
-
diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/EventHistoryAttachmentPoint.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/EventHistoryAttachmentPoint.java
deleted file mode 100644
index fb22b6049..000000000
--- a/src/main/java/net/floodlightcontroller/devicemanager/internal/EventHistoryAttachmentPoint.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.floodlightcontroller.devicemanager.internal;
-
-/***
- * Attachment-Point Event history related classes and members
- * @author subrata
- *
- */
-public class EventHistoryAttachmentPoint {
-    public String   reason;
-    // The following fields are not stored as String to save memory
-    // They shoudl be converted to appropriate human-readable strings by 
-    // the front end (e.g. in cli in python)
-    public long     mac;
-    public short    vlan;
-    public short    port;
-    public long     dpid;
-
-    public long getMac() {
-        return mac;
-    }
-    public short getVlan() {
-        return vlan;
-    }
-    public short getPort() {
-        return port;
-    }
-    public long getDpid() {
-        return dpid;
-    }
-    public String getReason() {
-        return reason;
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/LinkTuple.java b/src/main/java/net/floodlightcontroller/linkdiscovery/LinkTuple.java
index 66c348fd7..2c68e41e9 100755
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/LinkTuple.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/LinkTuple.java
@@ -17,13 +17,17 @@
 
 package net.floodlightcontroller.linkdiscovery;
 
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
 import net.floodlightcontroller.core.IOFSwitch;
+import net.floodlightcontroller.core.web.serializers.LinkTupleSerializer;
 
 /**
  *
  *
  * @author David Erickson (daviderickson@cs.stanford.edu)
  */
+@JsonSerialize(using=LinkTupleSerializer.class)
 public class LinkTuple {
     protected SwitchPortTuple src;
     protected SwitchPortTuple dst;
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java
index befe82945..d57e9870c 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java
@@ -1,5 +1,10 @@
 package net.floodlightcontroller.linkdiscovery.internal;
 
+import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
 /***
  * Topology Cluster merge/split event history related classes and members
  * @author subrata
@@ -13,4 +18,26 @@ public class EventHistoryTopologyCluster {
     public long     clusterIdOld; // Switch with dpid moved from cluster x to y
     public long     clusterIdNew;
     public String   reason;
+    
+    @JsonProperty("Switch")
+    @JsonSerialize(using=DPIDSerializer.class)
+    public long getDpid() {
+        return dpid;
+    }
+    @JsonProperty("OldClusterId")
+    @JsonSerialize(using=DPIDSerializer.class)
+    public long getClusterIdOld() {
+        return clusterIdOld;
+    }
+    @JsonProperty("NewClusterId")
+    @JsonSerialize(using=DPIDSerializer.class)
+    public long getClusterIdNew() {
+        return clusterIdNew;
+    }
+    @JsonProperty("Reason")
+    public String getReason() {
+        return reason;
+    }
+    
+    
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java
index 8e43b7a52..2b49a6293 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java
@@ -1,5 +1,10 @@
 package net.floodlightcontroller.linkdiscovery.internal;
 
+import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
 /***
  * Topology link up/down event history related classes and members
  * @author subrata
@@ -13,7 +18,40 @@ public class EventHistoryTopologyLink {
     public long     dstSwDpid;
     public int      srcPortState;
     public int      dstPortState;
-    public short    srcSwport;
-    public short    dstSwport;
+    public int      srcSwport;
+    public int      dstSwport;
     public String   reason;
+    
+    @JsonProperty("Source-Switch")
+    @JsonSerialize(using=DPIDSerializer.class)
+    public long getSrcSwDpid() {
+        return srcSwDpid;
+    }
+    @JsonProperty("Dest-Switch")
+    @JsonSerialize(using=DPIDSerializer.class)
+    public long getDstSwDpid() {
+        return dstSwDpid;
+    }
+    @JsonProperty("SrcPortState")
+    public int getSrcPortState() {
+        return srcPortState;
+    }
+    @JsonProperty("DstPortState")
+    public int getDstPortState() {
+        return dstPortState;
+    }
+    @JsonProperty("SrcPort")
+    public int getSrcSwport() {
+        return srcSwport;
+    }
+    @JsonProperty("DstPort")
+    public int getDstSwport() {
+        return dstSwport;
+    }
+    @JsonProperty("Reason")
+    public String getReason() {
+        return reason;
+    }
+    
+    
 }
\ No newline at end of file
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java
index 176687785..001942b2f 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java
@@ -1,5 +1,11 @@
 package net.floodlightcontroller.linkdiscovery.internal;
 
+import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
+import net.floodlightcontroller.core.web.serializers.IPv4Serializer;
+
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
 /***
  * Topology Switch event history related classes and members
  * @author subrata
@@ -10,7 +16,28 @@ public class EventHistoryTopologySwitch {
     // They should be converted to appropriate human-readable strings by 
     // the front end (e.g. in cli in Python)
     public long     dpid;
-    public byte []  ipv4Addr;
-    public short    l4Port;
+    public int  ipv4Addr;
+    public int    l4Port;
     public String   reason;
+    
+    @JsonProperty("Switch")
+    @JsonSerialize(using=DPIDSerializer.class)
+    public long getDpid() {
+        return dpid;
+    }
+    @JsonProperty("IpAddr")
+    @JsonSerialize(using=IPv4Serializer.class)
+    public int getIpv4Addr() {
+        return ipv4Addr;
+    }
+    @JsonProperty("Port")
+    public int getL4Port() {
+        return l4Port;
+    }
+    @JsonProperty("Reason")
+    public String getReason() {
+        return reason;
+    }
+    
+    
 }
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
index 9b27ec5c8..14da2f1f0 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
@@ -1457,15 +1457,14 @@ public class LinkDiscoveryManager
         if ((sw.getChannel() != null) &&
             (SocketAddress.class.isInstance(
                 sw.getChannel().getRemoteAddress()))) {
-            evTopoSwitch.ipv4Addr =
-                ((InetSocketAddress)(sw.getChannel().
-                        getRemoteAddress())).getAddress().getAddress();
+            evTopoSwitch.ipv4Addr = 
+                IPv4.toIPv4Address(((InetSocketAddress)(sw.getChannel().
+                        getRemoteAddress())).getAddress().getAddress());
             evTopoSwitch.l4Port   =
-                (short)(((InetSocketAddress)(sw.getChannel().
-                        getRemoteAddress())).getPort());
+                ((InetSocketAddress)(sw.getChannel().
+                        getRemoteAddress())).getPort();
         } else {
-            byte[] zeroIpa = new byte[] {(byte)0, (byte)0, (byte)0, (byte)0};
-            evTopoSwitch.ipv4Addr = zeroIpa;
+            evTopoSwitch.ipv4Addr = 0;
             evTopoSwitch.l4Port = 0;
         }
         evTopoSwitch.reason   = reason;
@@ -1480,8 +1479,8 @@ public class LinkDiscoveryManager
         }
         evTopoLink.srcSwDpid = srcDpid;
         evTopoLink.dstSwDpid = dstDpid;
-        evTopoLink.srcSwport = srcPort;
-        evTopoLink.dstSwport = dstPort;
+        evTopoLink.srcSwport = srcPort & 0xffff;
+        evTopoLink.dstSwport = dstPort & 0xffff;
         evTopoLink.srcPortState = srcPortState;
         evTopoLink.dstPortState = dstPortState;
         evTopoLink.reason    = reason;
diff --git a/src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucket.java b/src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucket.java
index d359da54a..e76253d12 100644
--- a/src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucket.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucket.java
@@ -5,8 +5,11 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
 import net.floodlightcontroller.core.IOFMessageListener;
 
+@JsonSerialize(using=CumulativeTimeBucketJSONSerializer.class)
 public class CumulativeTimeBucket {
     private long startTime_ns; // First pkt time-stamp in this bucket
     private Map<Integer, OneComponentTime> compStats;
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/CumulativeTimeBucketJSONSerializer.java b/src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucketJSONSerializer.java
similarity index 90%
rename from src/main/java/net/floodlightcontroller/core/web/serializers/CumulativeTimeBucketJSONSerializer.java
rename to src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucketJSONSerializer.java
index a44436d38..e49277703 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/CumulativeTimeBucketJSONSerializer.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/CumulativeTimeBucketJSONSerializer.java
@@ -1,10 +1,8 @@
-package net.floodlightcontroller.core.web.serializers;
+package net.floodlightcontroller.perfmon;
 
 import java.io.IOException;
 import java.sql.Timestamp;
 
-import net.floodlightcontroller.perfmon.CumulativeTimeBucket;
-import net.floodlightcontroller.perfmon.OneComponentTime;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.JsonProcessingException;
diff --git a/src/main/java/net/floodlightcontroller/perfmon/OneComponentTime.java b/src/main/java/net/floodlightcontroller/perfmon/OneComponentTime.java
index 556fb509c..3e9734b74 100644
--- a/src/main/java/net/floodlightcontroller/perfmon/OneComponentTime.java
+++ b/src/main/java/net/floodlightcontroller/perfmon/OneComponentTime.java
@@ -1,5 +1,7 @@
 package net.floodlightcontroller.perfmon;
 
+import org.codehaus.jackson.annotate.JsonProperty;
+
 import net.floodlightcontroller.core.IOFMessageListener;
 
 /**
@@ -34,34 +36,42 @@ public class OneComponentTime {
         sigmaProcTimeNs = 0;
     }
     
+    @JsonProperty("module-name")
     public String getCompName() {
         return compName;
     }
 
+    @JsonProperty("num-packets")
     public int getPktCnt() {
         return pktCnt;
     }
 
+    @JsonProperty("total")
     public long getSumProcTimeNs() {
         return totalProcTimeNs;
     }
 
+    @JsonProperty("max")
     public long getMaxProcTimeNs() {
         return maxProcTimeNs;
     }
 
+    @JsonProperty("min")
     public long getMinProcTimeNs() {
         return minProcTimeNs;
     }
 
+    @JsonProperty("average")
     public long getAvgProcTimeNs() {
         return avgProcTimeNs;
     }
 
+    @JsonProperty("std-dev")
     public long getSigmaProcTimeNs() {
         return sigmaProcTimeNs;
     }
     
+    @JsonProperty("average-squared")
     public long getSumSquaredProcTimeNs() {
         return sumSquaredProcTimeNs2;
     }
diff --git a/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java b/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java
index bf76d09d8..52d0f5b12 100644
--- a/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java
+++ b/src/main/java/net/floodlightcontroller/restserver/RestApiServer.java
@@ -28,7 +28,6 @@ import net.floodlightcontroller.core.module.FloodlightModuleContext;
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
-import net.floodlightcontroller.core.web.JacksonCustomConverter;
 
 public class RestApiServer
     implements IFloodlightModule, IRestApiService {
@@ -92,9 +91,6 @@ public class RestApiServer
                                             fmlContext.getServiceImpl(s));
             }
             
-            // Use our custom serializers
-            JacksonCustomConverter.replaceConverter();
-            
             // Start listening for REST requests
             try {
                 final Component component = new Component();
diff --git a/src/main/java/net/floodlightcontroller/topology/NodePortTuple.java b/src/main/java/net/floodlightcontroller/topology/NodePortTuple.java
index 07f492688..ea2ddca02 100644
--- a/src/main/java/net/floodlightcontroller/topology/NodePortTuple.java
+++ b/src/main/java/net/floodlightcontroller/topology/NodePortTuple.java
@@ -1,7 +1,10 @@
 package net.floodlightcontroller.topology;
 
+import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
 import net.floodlightcontroller.linkdiscovery.SwitchPortTuple;
 
+import org.codehaus.jackson.annotate.JsonProperty;
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.openflow.util.HexString;
 
 /**
@@ -37,12 +40,15 @@ public class NodePortTuple {
         this.portId = swt.getPort();
     }
 
+    @JsonProperty("switch")
+    @JsonSerialize(using=DPIDSerializer.class)
     public long getNodeId() {
         return nodeId;
     }
     public void setNodeId(long nodeId) {
         this.nodeId = nodeId;
     }
+    @JsonProperty("port")
     public short getPortId() {
         return portId;
     }
diff --git a/src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfo.java b/src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfo.java
index 87f71a9d0..74fc973f9 100644
--- a/src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfo.java
+++ b/src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfo.java
@@ -1,5 +1,9 @@
 package net.floodlightcontroller.util;
 
+
+import org.codehaus.jackson.map.annotate.JsonSerialize;
+
+@JsonSerialize(using=EventHistoryBaseInfoJSONSerializer.class)
 public class EventHistoryBaseInfo {
     public int              idx;
     public long             time_ms; // timestamp in milliseconds
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryBaseInfoJSONSerializer.java b/src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfoJSONSerializer.java
similarity index 95%
rename from src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryBaseInfoJSONSerializer.java
rename to src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfoJSONSerializer.java
index 395856045..6f1d1ff8b 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/EventHistoryBaseInfoJSONSerializer.java
+++ b/src/main/java/net/floodlightcontroller/util/EventHistoryBaseInfoJSONSerializer.java
@@ -14,13 +14,12 @@
 *    under the License.
 **/
 
-package net.floodlightcontroller.core.web.serializers;
+package net.floodlightcontroller.util;
 
 import java.io.IOException;
 
 import java.sql.Timestamp;
 
-import net.floodlightcontroller.util.EventHistoryBaseInfo;
 
 import org.codehaus.jackson.JsonGenerator;
 import org.codehaus.jackson.JsonProcessingException;
diff --git a/src/main/java/org/openflow/protocol/OFFeaturesReply.java b/src/main/java/org/openflow/protocol/OFFeaturesReply.java
index 40e0a42b7..d3af5741a 100644
--- a/src/main/java/org/openflow/protocol/OFFeaturesReply.java
+++ b/src/main/java/org/openflow/protocol/OFFeaturesReply.java
@@ -20,7 +20,10 @@ package org.openflow.protocol;
 import java.util.ArrayList;
 import java.util.List;
 
+
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.openflow.protocol.serializers.OFFeaturesReplyJSONSerializer;
 import org.openflow.util.U16;
 
 
@@ -29,6 +32,7 @@ import org.openflow.util.U16;
  * @author David Erickson (daviderickson@cs.stanford.edu)
  *
  */
+@JsonSerialize(using=OFFeaturesReplyJSONSerializer.class)
 public class OFFeaturesReply extends OFMessage {
     public static int MINIMUM_LENGTH = 32;
 
diff --git a/src/main/java/org/openflow/protocol/OFMatch.java b/src/main/java/org/openflow/protocol/OFMatch.java
index aaf825a70..b248af258 100644
--- a/src/main/java/org/openflow/protocol/OFMatch.java
+++ b/src/main/java/org/openflow/protocol/OFMatch.java
@@ -21,7 +21,10 @@ import java.io.Serializable;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
+
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.openflow.protocol.serializers.OFMatchJSONSerializer;
 import org.openflow.util.HexString;
 import org.openflow.util.U16;
 import org.openflow.util.U8;
@@ -33,6 +36,7 @@ import org.openflow.util.U8;
  * @author Rob Sherwood (rob.sherwood@stanford.edu)
  * 
  */
+@JsonSerialize(using=OFMatchJSONSerializer.class)
 public class OFMatch implements Cloneable, Serializable {
     /**
      * 
diff --git a/src/main/java/org/openflow/protocol/OFPhysicalPort.java b/src/main/java/org/openflow/protocol/OFPhysicalPort.java
index 39a9878dc..009bef529 100644
--- a/src/main/java/org/openflow/protocol/OFPhysicalPort.java
+++ b/src/main/java/org/openflow/protocol/OFPhysicalPort.java
@@ -21,12 +21,16 @@ import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
 import java.util.Arrays;
 
+
+import org.codehaus.jackson.map.annotate.JsonSerialize;
 import org.jboss.netty.buffer.ChannelBuffer;
+import org.openflow.protocol.serializers.OFPhysicalPortJSONSerializer;
 
 /**
  * Represents ofp_phy_port
  * @author David Erickson (daviderickson@cs.stanford.edu) - Mar 25, 2010
  */
+@JsonSerialize(using=OFPhysicalPortJSONSerializer.class)
 public class OFPhysicalPort {
     public static int MINIMUM_LENGTH = 48;
     public static int OFP_ETH_ALEN = 6;
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFFeaturesReplyJSONSerializer.java b/src/main/java/org/openflow/protocol/serializers/OFFeaturesReplyJSONSerializer.java
similarity index 97%
rename from src/main/java/net/floodlightcontroller/core/web/serializers/OFFeaturesReplyJSONSerializer.java
rename to src/main/java/org/openflow/protocol/serializers/OFFeaturesReplyJSONSerializer.java
index 31ffdb8cf..ad57312f1 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/OFFeaturesReplyJSONSerializer.java
+++ b/src/main/java/org/openflow/protocol/serializers/OFFeaturesReplyJSONSerializer.java
@@ -15,7 +15,7 @@
 *    under the License.
 **/
 
-package net.floodlightcontroller.core.web.serializers;
+package org.openflow.protocol.serializers;
 
 import java.io.IOException;
 
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFMatchJSONSerializer.java b/src/main/java/org/openflow/protocol/serializers/OFMatchJSONSerializer.java
similarity index 98%
rename from src/main/java/net/floodlightcontroller/core/web/serializers/OFMatchJSONSerializer.java
rename to src/main/java/org/openflow/protocol/serializers/OFMatchJSONSerializer.java
index 303750c4d..e6e297fd8 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/OFMatchJSONSerializer.java
+++ b/src/main/java/org/openflow/protocol/serializers/OFMatchJSONSerializer.java
@@ -15,7 +15,7 @@
 *    under the License.
 **/
 
-package net.floodlightcontroller.core.web.serializers;
+package org.openflow.protocol.serializers;
 
 import java.io.IOException;
 
diff --git a/src/main/java/net/floodlightcontroller/core/web/serializers/OFPhysicalPortJSONSerializer.java b/src/main/java/org/openflow/protocol/serializers/OFPhysicalPortJSONSerializer.java
similarity index 97%
rename from src/main/java/net/floodlightcontroller/core/web/serializers/OFPhysicalPortJSONSerializer.java
rename to src/main/java/org/openflow/protocol/serializers/OFPhysicalPortJSONSerializer.java
index 5500f49d8..b847a72c6 100644
--- a/src/main/java/net/floodlightcontroller/core/web/serializers/OFPhysicalPortJSONSerializer.java
+++ b/src/main/java/org/openflow/protocol/serializers/OFPhysicalPortJSONSerializer.java
@@ -15,7 +15,7 @@
 *    under the License.
 **/
 
-package net.floodlightcontroller.core.web.serializers;
+package org.openflow.protocol.serializers;
 
 import java.io.IOException;
 
-- 
GitLab