Renamed devicemanager, flowprogrammer, linkdiscovery and util packages

net.onrc.onos.ofcontroller.devicemanager.* => net.onrc.onos.core.devicemanager.*
net.onrc.onos.ofcontroller.flowprogrammer.* => net.onrc.onos.core.flowprogrammer.*
net.onrc.onos.ofcontroller.linkdiscovery.* => net.onrc.onos.core.linkdiscovery.*
net.onrc.onos.ofcontroller.util.* => net.onrc.onos.core.util.*

Change-Id: Iaa865af552e8fb3a589e73d006569ac79f5a0f08
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/DpidDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/DpidDeserializer.java
new file mode 100644
index 0000000..7a8c570
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/DpidDeserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.Dpid;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize a DPID from a string.
+ */
+public class DpidDeserializer extends JsonDeserializer<Dpid> {
+
+    protected final static Logger log = LoggerFactory.getLogger(DpidDeserializer.class);
+
+    @Override
+    public Dpid deserialize(JsonParser jp,
+			    DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	Dpid dpid = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		dpid = new Dpid(value);
+	    }
+	}
+	return dpid;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/DpidSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/DpidSerializer.java
new file mode 100644
index 0000000..4e784f2
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/DpidSerializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.Dpid;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize a DPID as a string.
+ */
+public class DpidSerializer extends JsonSerializer<Dpid> {
+
+    @Override
+    public void serialize(Dpid dpid, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", dpid.toString());
+	jGen.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdDeserializer.java
new file mode 100644
index 0000000..712daa8
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdDeserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.FlowEntryId;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize a Flow Entry ID from a string.
+ */
+public class FlowEntryIdDeserializer extends JsonDeserializer<FlowEntryId> {
+
+    protected final static Logger log = LoggerFactory.getLogger(FlowEntryIdDeserializer.class);
+
+    @Override
+    public FlowEntryId deserialize(JsonParser jp,
+				   DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	FlowEntryId flowEntryId = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: " + fieldname + " Value: " + value);
+		flowEntryId = new FlowEntryId(value);
+	    }
+	}
+	return flowEntryId;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdSerializer.java
new file mode 100644
index 0000000..3911a4c
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdSerializer.java
@@ -0,0 +1,23 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.FlowEntryId;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize a Flow Entry ID as a hexadecimal string.
+ */
+public class FlowEntryIdSerializer extends JsonSerializer<FlowEntryId> {
+
+    @Override
+    public void serialize(FlowEntryId flowEntryId, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeString(flowEntryId.toString());
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowIdDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowIdDeserializer.java
new file mode 100644
index 0000000..d1b91a8
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/FlowIdDeserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.FlowId;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize a Flow ID from a string.
+ */
+public class FlowIdDeserializer extends JsonDeserializer<FlowId> {
+
+    protected final static Logger log = LoggerFactory.getLogger(FlowIdDeserializer.class);
+
+    @Override
+    public FlowId deserialize(JsonParser jp,
+			      DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	FlowId flowId = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		flowId = new FlowId(value);
+	    }
+	}
+	return flowId;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowIdSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowIdSerializer.java
new file mode 100644
index 0000000..b0d020e
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/FlowIdSerializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.FlowId;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize a Flow ID as a hexadecimal string.
+ */
+public class FlowIdSerializer extends JsonSerializer<FlowId> {
+
+    @Override
+    public void serialize(FlowId flowId, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", flowId.toString());
+	jGen.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv4Deserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv4Deserializer.java
new file mode 100644
index 0000000..2992bfd
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv4Deserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv4;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize an IPv4 address from a string.
+ */
+public class IPv4Deserializer extends JsonDeserializer<IPv4> {
+
+    protected final static Logger log = LoggerFactory.getLogger(IPv4Deserializer.class);
+
+    @Override
+    public IPv4 deserialize(JsonParser jp,
+			    DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	IPv4 ipv4 = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		ipv4 = new IPv4(value);
+	    }
+	}
+	return ipv4;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv4NetDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv4NetDeserializer.java
new file mode 100644
index 0000000..68f74c4
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv4NetDeserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv4Net;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize an IPv4Net address from a string.
+ */
+public class IPv4NetDeserializer extends JsonDeserializer<IPv4Net> {
+
+    protected final static Logger log = LoggerFactory.getLogger(IPv4NetDeserializer.class);
+
+    @Override
+    public IPv4Net deserialize(JsonParser jp,
+			       DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	IPv4Net ipv4Net = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		ipv4Net = new IPv4Net(value);
+	    }
+	}
+	return ipv4Net;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv4NetSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv4NetSerializer.java
new file mode 100644
index 0000000..697f846
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv4NetSerializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv4Net;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize an IPv4Net address as a string.
+ */
+public class IPv4NetSerializer extends JsonSerializer<IPv4Net> {
+
+    @Override
+    public void serialize(IPv4Net ipv4Net, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", ipv4Net.toString());
+	jGen.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv4Serializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv4Serializer.java
new file mode 100644
index 0000000..773fd1d
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv4Serializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv4;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize an IPv4 address as a string.
+ */
+public class IPv4Serializer extends JsonSerializer<IPv4> {
+
+    @Override
+    public void serialize(IPv4 ipv4, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", ipv4.toString());
+	jGen.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv6Deserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv6Deserializer.java
new file mode 100644
index 0000000..6627d2a
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv6Deserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv6;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize an IPv6 address from a string.
+ */
+public class IPv6Deserializer extends JsonDeserializer<IPv6> {
+
+    protected final static Logger log = LoggerFactory.getLogger(IPv6Deserializer.class);
+
+    @Override
+    public IPv6 deserialize(JsonParser jp,
+			    DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	IPv6 ipv6 = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		ipv6 = new IPv6(value);
+	    }
+	}
+	return ipv6;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv6NetDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv6NetDeserializer.java
new file mode 100644
index 0000000..08b8018
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv6NetDeserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv6Net;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize an IPv6Net address from a string.
+ */
+public class IPv6NetDeserializer extends JsonDeserializer<IPv6Net> {
+
+    protected final static Logger log = LoggerFactory.getLogger(IPv6NetDeserializer.class);
+
+    @Override
+    public IPv6Net deserialize(JsonParser jp,
+			       DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	IPv6Net ipv6Net = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		ipv6Net = new IPv6Net(value);
+	    }
+	}
+	return ipv6Net;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv6NetSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv6NetSerializer.java
new file mode 100644
index 0000000..99bd654
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv6NetSerializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv6Net;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize an IPv6Net address as a string.
+ */
+public class IPv6NetSerializer extends JsonSerializer<IPv6Net> {
+
+    @Override
+    public void serialize(IPv6Net ipv6Net, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", ipv6Net.toString());
+	jGen.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/IPv6Serializer.java b/src/main/java/net/onrc/onos/core/util/serializers/IPv6Serializer.java
new file mode 100644
index 0000000..b165658
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/IPv6Serializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.onrc.onos.core.util.IPv6;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize an IPv6 address as a string.
+ */
+public class IPv6Serializer extends JsonSerializer<IPv6> {
+
+    @Override
+    public void serialize(IPv6 ipv6, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", ipv6.toString());
+	jGen.writeEndObject();
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
new file mode 100644
index 0000000..4cd4a00
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
@@ -0,0 +1,238 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.net.Inet4Address;
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashSet;
+
+import net.floodlightcontroller.util.MACAddress;
+import net.onrc.onos.apps.proxyarp.ArpReplyNotification;
+import net.onrc.onos.apps.proxyarp.BroadcastPacketOutNotification;
+import net.onrc.onos.apps.proxyarp.PacketOutNotification;
+import net.onrc.onos.apps.proxyarp.SinglePacketOutNotification;
+import net.onrc.onos.core.devicemanager.OnosDevice;
+import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
+import net.onrc.onos.core.intent.ErrorIntent;
+import net.onrc.onos.core.intent.Intent;
+import net.onrc.onos.core.intent.IntentOperation;
+import net.onrc.onos.core.intent.IntentOperationList;
+import net.onrc.onos.core.intent.PathIntent;
+import net.onrc.onos.core.intent.ShortestPathIntent;
+import net.onrc.onos.core.intent.runtime.IntentStateList;
+import net.onrc.onos.core.util.CallerId;
+import net.onrc.onos.core.util.DataPath;
+import net.onrc.onos.core.util.DataPathEndpoints;
+import net.onrc.onos.core.util.Dpid;
+import net.onrc.onos.core.util.FlowEntry;
+import net.onrc.onos.core.util.FlowEntryAction;
+import net.onrc.onos.core.util.FlowEntryActions;
+import net.onrc.onos.core.util.FlowEntryErrorState;
+import net.onrc.onos.core.util.FlowEntryId;
+import net.onrc.onos.core.util.FlowEntryMatch;
+import net.onrc.onos.core.util.FlowEntrySwitchState;
+import net.onrc.onos.core.util.FlowEntryUserState;
+import net.onrc.onos.core.util.FlowId;
+import net.onrc.onos.core.util.FlowPath;
+import net.onrc.onos.core.util.FlowPathFlags;
+import net.onrc.onos.core.util.FlowPathType;
+import net.onrc.onos.core.util.FlowPathUserState;
+import net.onrc.onos.core.util.IPv4;
+import net.onrc.onos.core.util.IPv4Net;
+import net.onrc.onos.core.util.IPv6;
+import net.onrc.onos.core.util.IPv6Net;
+import net.onrc.onos.core.util.Port;
+import net.onrc.onos.core.util.Switch;
+import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
+import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
+import net.onrc.onos.ofcontroller.networkgraph.Path;
+import net.onrc.onos.ofcontroller.networkgraph.PortEvent;
+import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
+import net.onrc.onos.ofcontroller.networkgraph.TopologyEvent;
+// import net.onrc.onos.core.util.SwitchPort;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+import com.esotericsoftware.kryo.Kryo;
+
+/**
+ * Class factory for allocating Kryo instances for
+ * serialization/deserialization of classes.
+ */
+public class KryoFactory {
+    private static final int DEFAULT_PREALLOCATIONS = 100;
+    private ArrayList<Kryo> kryoList = new ArrayList<Kryo>();
+
+    /**
+     * Default constructor.
+     *
+     * Preallocates {@code DEFAULT_PREALLOCATIONS} Kryo instances.
+     */
+    public KryoFactory() {
+        this(DEFAULT_PREALLOCATIONS);
+    }
+
+    /**
+     * Constructor to explicitly specify number of Kryo instances to pool
+     *
+     * @param initialCapacity number of Kryo instance to preallocate
+     */
+    public KryoFactory(final int initialCapacity) {
+        // Preallocate
+        kryoList.ensureCapacity(initialCapacity);
+        for (int i = 0; i < initialCapacity; i++) {
+            Kryo kryo = newKryoImpl();
+            kryoList.add(kryo);
+        }
+    }
+
+    /**
+     * Create and initialize a new Kryo object.
+     *
+     * @return the created Kryo object.
+     */
+    public Kryo newKryo() {
+	return newDeleteKryo(null);
+    }
+
+    /**
+     * Delete an existing Kryo object.
+     *
+     * @param deleteKryo the object to delete.
+     */
+    public void deleteKryo(Kryo deleteKryo) {
+	newDeleteKryo(deleteKryo);
+    }
+
+    /**
+     * Create or delete a Kryo object.
+     *
+     * @param deleteKryo if null, then allocate and return a new object,
+     * otherwise delete the provided object.
+     * @return a new Kryo object if needed, otherwise null.
+     */
+    synchronized private Kryo newDeleteKryo(Kryo deleteKryo) {
+	if (deleteKryo != null) {
+	    // Delete an entry by moving it back to the buffer
+	    kryoList.add(deleteKryo);
+	    return null;
+	} else {
+	    Kryo kryo = null;
+	    if (kryoList.isEmpty()) {
+		// Preallocate
+		for (int i = 0; i < 100; i++) {
+		    kryo = newKryoImpl();
+		    kryoList.add(kryo);
+		}
+	    }
+
+	    kryo = kryoList.remove(kryoList.size() - 1);
+	    return kryo;
+	}
+    }
+
+    /**
+     * Create and initialize a new Kryo object.
+     *
+     * @return the created Kryo object.
+     */
+    private Kryo newKryoImpl() {
+	Kryo kryo = new Kryo();
+	kryo.setRegistrationRequired(true);
+	//
+	// WARNING: Order of register() calls affects serialized bytes.
+	//  - Do no insert new entry in the middle, always add to the end.
+	//  - Do not simply remove existing entry
+	//
+
+	// kryo.setReferences(false);
+	//
+	kryo.register(ArrayList.class);
+
+	// FlowPath and related classes
+	kryo.register(CallerId.class);
+	kryo.register(DataPath.class);
+	kryo.register(DataPathEndpoints.class);
+	kryo.register(Dpid.class);
+	kryo.register(FlowEntryAction.class);
+	kryo.register(FlowEntryAction.ActionEnqueue.class);
+	kryo.register(FlowEntryAction.ActionOutput.class);
+	kryo.register(FlowEntryAction.ActionSetEthernetAddr.class);
+	kryo.register(FlowEntryAction.ActionSetIpToS.class);
+	kryo.register(FlowEntryAction.ActionSetIPv4Addr.class);
+	kryo.register(FlowEntryAction.ActionSetTcpUdpPort.class);
+	kryo.register(FlowEntryAction.ActionSetVlanId.class);
+	kryo.register(FlowEntryAction.ActionSetVlanPriority.class);
+	kryo.register(FlowEntryAction.ActionStripVlan.class);
+	kryo.register(FlowEntryAction.ActionValues.class);
+	kryo.register(FlowEntryActions.class);
+	kryo.register(FlowEntryErrorState.class);
+	kryo.register(FlowEntryId.class);
+	kryo.register(FlowEntry.class);
+	kryo.register(FlowEntryMatch.class);
+	kryo.register(FlowEntryMatch.Field.class);
+	kryo.register(FlowEntrySwitchState.class);
+	kryo.register(FlowEntryUserState.class);
+	kryo.register(FlowId.class);
+	kryo.register(FlowPath.class);
+	kryo.register(FlowPathFlags.class);
+	kryo.register(FlowPathType.class);
+	kryo.register(FlowPathUserState.class);
+	kryo.register(IPv4.class);
+	kryo.register(IPv4Net.class);
+	kryo.register(IPv6.class);
+	kryo.register(IPv6Net.class);
+	kryo.register(byte[].class);
+	kryo.register(MACAddress.class);
+	kryo.register(Port.class);
+	kryo.register(Switch.class);
+	// kryo.register(SwitchPort.class);
+
+	// New data model-related classes
+	kryo.register(DeviceEvent.class);
+	kryo.register(InetAddress.class);
+	kryo.register(LinkEvent.class);
+	kryo.register(PortEvent.class);
+	kryo.register(PortEvent.SwitchPort.class);
+	kryo.register(SwitchEvent.class);
+	kryo.register(TopologyEvent.class);
+
+	// Intent-related classes
+	kryo.register(Path.class);
+	kryo.register(Intent.class);
+	kryo.register(Intent.IntentState.class);
+	kryo.register(PathIntent.class);
+	kryo.register(ShortestPathIntent.class);
+	kryo.register(ConstrainedShortestPathIntent.class);
+	kryo.register(ErrorIntent.class);
+	kryo.register(ErrorIntent.ErrorType.class);
+	kryo.register(IntentOperation.class);
+	kryo.register(IntentOperation.Operator.class);
+	kryo.register(IntentOperationList.class);
+	kryo.register(IntentStateList.class);
+
+	// Device-related classes
+	kryo.register(HashSet.class);
+	kryo.register(Inet4Address.class);
+	kryo.register(OnosDevice.class);
+	kryo.register(Date.class);
+
+	// ProxyArp-related classes
+	kryo.register(BroadcastPacketOutNotification.class);
+	kryo.register(SinglePacketOutNotification.class);
+	kryo.register(ArpReplyNotification.class);
+
+	return kryo;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/MACAddressDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/MACAddressDeserializer.java
new file mode 100644
index 0000000..4ed31a5
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/MACAddressDeserializer.java
@@ -0,0 +1,40 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.floodlightcontroller.util.MACAddress;
+
+import org.codehaus.jackson.JsonParser;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.JsonToken;
+import org.codehaus.jackson.map.DeserializationContext;
+import org.codehaus.jackson.map.JsonDeserializer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Deserialize a MAC address from a string.
+ */
+public class MACAddressDeserializer extends JsonDeserializer<MACAddress> {
+
+    protected final static Logger log = LoggerFactory.getLogger(MACAddressDeserializer.class);
+
+    @Override
+    public MACAddress deserialize(JsonParser jp,
+				  DeserializationContext ctxt)
+	throws IOException, JsonProcessingException {
+
+	MACAddress mac = null;
+
+	jp.nextToken();		// Move to JsonToken.START_OBJECT
+	while (jp.nextToken() != JsonToken.END_OBJECT) {
+	    String fieldname = jp.getCurrentName();
+	    if ("value".equals(fieldname)) {
+		String value = jp.getText();
+		log.debug("Fieldname: {} Value: {}", fieldname, value);
+		mac = MACAddress.valueOf(value);
+	    }
+	}
+	return mac;
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/MACAddressSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/MACAddressSerializer.java
new file mode 100644
index 0000000..e57a777
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/serializers/MACAddressSerializer.java
@@ -0,0 +1,25 @@
+package net.onrc.onos.core.util.serializers;
+
+import java.io.IOException;
+
+import net.floodlightcontroller.util.MACAddress;
+
+import org.codehaus.jackson.JsonGenerator;
+import org.codehaus.jackson.JsonProcessingException;
+import org.codehaus.jackson.map.JsonSerializer;
+import org.codehaus.jackson.map.SerializerProvider;
+
+/**
+ * Serialize a MAC address as a string.
+ */
+public class MACAddressSerializer extends JsonSerializer<MACAddress> {
+
+    @Override
+    public void serialize(MACAddress mac, JsonGenerator jGen,
+			  SerializerProvider serializer)
+	throws IOException, JsonProcessingException {
+	jGen.writeStartObject();
+	jGen.writeStringField("value", mac.toString());
+	jGen.writeEndObject();
+    }
+}