* Added a new class TopologyEvents that encapsulated the collections
  of all possible topology-related events.
* Updated the ITopologyListener API to use the new class TopologyEvents
* Updated the code that is affected by the ITopologyListener API change.

Change-Id: Ib836141d6a21e5317d645619eb685ff0b13788a2
diff --git a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
index 3cff46a..3a07693 100644
--- a/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/core/topology/TopologyManager.java
@@ -27,10 +27,13 @@
 import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.core.util.EventEntry;
 import net.onrc.onos.core.util.SwitchPort;
+import net.onrc.onos.core.util.serializers.KryoFactory;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.esotericsoftware.kryo.Kryo;
+
 /**
  * The TopologyManager receives topology updates from the southbound discovery
  * modules and from other ONOS instances. These updates are processed and
@@ -59,6 +62,7 @@
     private final TopologyImpl topology = new TopologyImpl();
     private final IControllerRegistryService registryService;
     private CopyOnWriteArrayList<ITopologyListener> topologyListeners;
+    private Kryo kryo = KryoFactory.newKryoObject();
 
     //
     // Local state for keeping track of reordered events.
@@ -457,16 +461,19 @@
         }
 
         // Deliver the events
+        long timestamp = System.nanoTime();
         for (ITopologyListener listener : this.topologyListeners) {
-            // TODO: Should copy before handing them over to listener?
-            listener.topologyEvents(apiAddedSwitchEvents,
-                    apiRemovedSwitchEvents,
-                    apiAddedPortEvents,
-                    apiRemovedPortEvents,
-                    apiAddedLinkEvents,
-                    apiRemovedLinkEvents,
-                    apiAddedDeviceEvents,
-                    apiRemovedDeviceEvents);
+            TopologyEvents events =
+                new TopologyEvents(timestamp,
+                                   kryo.copy(apiAddedSwitchEvents),
+                                   kryo.copy(apiRemovedSwitchEvents),
+                                   kryo.copy(apiAddedPortEvents),
+                                   kryo.copy(apiRemovedPortEvents),
+                                   kryo.copy(apiAddedLinkEvents),
+                                   kryo.copy(apiRemovedLinkEvents),
+                                   kryo.copy(apiAddedDeviceEvents),
+                                   kryo.copy(apiRemovedDeviceEvents));
+            listener.topologyEvents(events);
         }
 
         //