Modify the topology event handling procedure

Change-Id: I7bda0b9a6554aee2488c4204d2ffb48a293dbe13
diff --git a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
index 429eadc..98427bb 100644
--- a/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/net/onrc/onos/apps/segmentrouting/SegmentRoutingManager.java
@@ -302,13 +302,13 @@
     private void handleTopologyChangeEvents() {
         numOfEventProcess ++;
 
-        Collection<LinkData> linkEntriesAdded = new ArrayList<LinkData>();
-        Collection<PortData> portEntriesAdded = new ArrayList<PortData>();
-        Collection<PortData> portEntriesRemoved = new ArrayList<PortData>();
-        Collection<LinkData> linkEntriesRemoved = new ArrayList<LinkData>();
-        Collection<SwitchData> switchAdded = new ArrayList<SwitchData>();
-        Collection<SwitchData> switchRemoved = new ArrayList<SwitchData>();
-        Collection<MastershipData> mastershipRemoved = new ArrayList<MastershipData>();
+        Collection<LinkData> linkEntriesAddedAll = new ArrayList<LinkData>();
+        Collection<PortData> portEntriesAddedAll = new ArrayList<PortData>();
+        Collection<PortData> portEntriesRemovedAll = new ArrayList<PortData>();
+        Collection<LinkData> linkEntriesRemovedAll = new ArrayList<LinkData>();
+        Collection<SwitchData> switchAddedAll = new ArrayList<SwitchData>();
+        Collection<SwitchData> switchRemovedAll = new ArrayList<SwitchData>();
+        Collection<MastershipData> mastershipRemovedAll = new ArrayList<MastershipData>();
 
         while (!topologyEventQueue.isEmpty()) {
             // We should handle the events in the order of when they happen
@@ -316,14 +316,24 @@
             // and shoot only the final state.
             // Ex: link s1-s2 down, link s1-s2 up --> Do nothing
             // Ex: ink s1-s2 up, s1-p1,p2 down --> link s1-s2 down
+
             TopologyEvents topologyEvents = topologyEventQueue.poll();
-            linkEntriesAdded.addAll(topologyEvents.getAddedLinkDataEntries());
-            portEntriesAdded.addAll(topologyEvents.getAddedPortDataEntries());
-            portEntriesRemoved.addAll(topologyEvents.getRemovedPortDataEntries());
-            linkEntriesRemoved.addAll(topologyEvents.getRemovedLinkDataEntries());
-            switchAdded.addAll(topologyEvents.getAddedSwitchDataEntries());
-            switchRemoved.addAll(topologyEvents.getRemovedSwitchDataEntries());
-            mastershipRemoved.addAll(topologyEvents.getRemovedMastershipDataEntries());
+
+            Collection<LinkData> linkEntriesAdded = topologyEvents.getAddedLinkDataEntries();
+            Collection<PortData> portEntriesAdded = topologyEvents.getAddedPortDataEntries();
+            Collection<PortData> portEntriesRemoved = topologyEvents.getRemovedPortDataEntries();
+            Collection<LinkData> linkEntriesRemoved = topologyEvents.getRemovedLinkDataEntries();
+            Collection<SwitchData> switchAdded = topologyEvents.getAddedSwitchDataEntries();
+            Collection<SwitchData> switchRemoved = topologyEvents.getRemovedSwitchDataEntries();
+            Collection<MastershipData> mastershipRemoved = topologyEvents.getRemovedMastershipDataEntries();
+
+            linkEntriesAddedAll.addAll(linkEntriesAdded);
+            portEntriesAddedAll.addAll(portEntriesAdded);
+            portEntriesRemovedAll.addAll(portEntriesRemoved);
+            linkEntriesRemovedAll.addAll(linkEntriesRemoved);
+            switchAddedAll.addAll(switchAdded);
+            switchRemovedAll.addAll(switchRemoved);
+            mastershipRemovedAll.addAll(mastershipRemoved);
             numOfEvents++;
 
             if (!portEntriesRemoved.isEmpty()) {
@@ -353,6 +363,8 @@
             if (!switchAdded.isEmpty()) {
                 processSwitchAdd(switchAdded);
             }
+
+            /*
             linkEntriesAdded.clear();
             portEntriesAdded.clear();
             portEntriesRemoved.clear();
@@ -360,20 +372,20 @@
             switchAdded.clear();
             switchRemoved.clear();
             mastershipRemoved.clear();
-
+            */
         }
 
         // TODO: 100ms is enough to check both mastership removed events
         // and the port removed events? What if the PORT_STATUS packets comes late?
-        if (!mastershipRemoved.isEmpty()) {
-            if (portEntriesRemoved.isEmpty()) {
+        if (!mastershipRemovedAll.isEmpty()) {
+            if (portEntriesRemovedAll.isEmpty()) {
                 log.debug("Just mastership is removed. Do not do anthing.");
             }
             else {
                 HashMap<String, MastershipData> mastershipToRemove =
                         new HashMap<String, MastershipData>();
-                for (MastershipData ms: mastershipRemoved) {
-                    for (PortData port: portEntriesRemoved) {
+                for (MastershipData ms: mastershipRemovedAll) {
+                    for (PortData port: portEntriesRemovedAll) {
                         // TODO: check ALL ports of the switch are dead ..
                         if (port.getDpid().equals(ms.getDpid())) {
                             mastershipToRemove.put(ms.getDpid().toString(), ms);
@@ -1144,7 +1156,7 @@
      * @param sw
      * @param mplsLabel
      */
-    private void setPolicyTable(MACAddress srcMac, MACAddress dstMac,
+    public void setPolicyTable(MACAddress srcMac, MACAddress dstMac,
             Short etherType, IPv4Net srcIp, IPv4Net dstIp, Byte ipProto,
             Short srcTcpPort, Short dstTcpPort, int tid) {