Flow stats collection optimization - Flag introduced to stop periodic collection and collect only in 3 scenarios (Flows Add/Delete/Mod, Switch Add/Change, Mastership Change)

Change-Id: I1ad143a416f34135a622818c60dbc97310fe905e
diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitchListener.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitchListener.java
index 5ad5a4f..41ec50b 100644
--- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitchListener.java
+++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/OpenFlowSwitchListener.java
@@ -55,4 +55,11 @@
      * @param response role reply from the switch
      */
     void receivedRoleReply(Dpid dpid, RoleState requested, RoleState response);
+
+    /**
+     * Notify that role of the switch changed to Master.
+     *
+     * @param dpid the switch for which the role is changed
+     */
+    default void roleChangedToMaster(Dpid dpid) {}
 }
diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
index 8431068..9434c59 100644
--- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
+++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/AbstractOpenFlowSwitch.java
@@ -340,6 +340,7 @@
             }
             // perform role transition after clearing messages queue
             this.role = RoleState.MASTER;
+            this.agent.roleChangedToMaster(dpid);
         }
     }
 
diff --git a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/OpenFlowAgent.java b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/OpenFlowAgent.java
index 4451b19..d6bda5d 100644
--- a/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/OpenFlowAgent.java
+++ b/protocols/openflow/api/src/main/java/org/onosproject/openflow/controller/driver/OpenFlowAgent.java
@@ -124,4 +124,11 @@
      * @param listener the OpenFlow classifier listener
      */
     void removeClassifierListener(OpenFlowClassifierListener listener);
+
+    /**
+     * Notify that role of the switch changed to Master.
+     *
+     * @param dpid the switch for which the role is changed
+     */
+    default void roleChangedToMaster(Dpid dpid) {}
 }
diff --git a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
index 9dd52cc..ae5d94e 100644
--- a/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
+++ b/protocols/openflow/ctl/src/main/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImpl.java
@@ -949,6 +949,13 @@
         public void removeClassifierListener(OpenFlowClassifierListener listener) {
             ofClassifierListener.remove(listener);
         }
+
+        @Override
+        public void roleChangedToMaster(Dpid dpid) {
+            for (OpenFlowSwitchListener l : ofSwitchListener) {
+                l.roleChangedToMaster(dpid);
+            }
+        }
     }
 
     /**