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