Refactor the logic on collecting OpenFlow message statistics

Change-Id: I34c209c0ca90cb094ed5f82c96a8a43d3519b807
diff --git a/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java b/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java
index 02465f1..9dd27a0 100644
--- a/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java
+++ b/providers/openflow/device/src/test/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProviderTest.java
@@ -38,6 +38,7 @@
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowController;
 import org.onosproject.openflow.controller.OpenFlowEventListener;
+import org.onosproject.openflow.controller.OpenFlowMessageListener;
 import org.onosproject.openflow.controller.OpenFlowSwitch;
 import org.onosproject.openflow.controller.OpenFlowSwitchListener;
 import org.onosproject.openflow.controller.PacketListener;
@@ -275,10 +276,6 @@
         }
 
         @Override
-        public void monitorAllEvents(boolean monitor) {
-        }
-
-        @Override
         public void addListener(OpenFlowSwitchListener listener) {
             this.listener = listener;
         }
@@ -289,6 +286,16 @@
         }
 
         @Override
+        public void addMessageListener(OpenFlowMessageListener listener) {
+
+        }
+
+        @Override
+        public void removeMessageListener(OpenFlowMessageListener listener) {
+
+        }
+
+        @Override
         public void addPacketListener(int priority, PacketListener listener) {
         }
 
@@ -416,14 +423,6 @@
             return "1.2.3.4:1";
         }
 
-        @Override
-        public void addEventListener(OpenFlowEventListener listener) {
-        }
-
-        @Override
-        public void removeEventListener(OpenFlowEventListener listener) {
-        }
-
     }
 
 }
diff --git a/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java b/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
index 0fc3287..ff08f72 100644
--- a/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
+++ b/providers/openflow/group/src/test/java/org/onosproject/provider/of/group/impl/OpenFlowGroupProviderTest.java
@@ -41,6 +41,7 @@
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowController;
 import org.onosproject.openflow.controller.OpenFlowEventListener;
+import org.onosproject.openflow.controller.OpenFlowMessageListener;
 import org.onosproject.openflow.controller.OpenFlowSwitch;
 import org.onosproject.openflow.controller.OpenFlowSwitchListener;
 import org.onosproject.openflow.controller.PacketListener;
@@ -225,6 +226,16 @@
         }
 
         @Override
+        public void addMessageListener(OpenFlowMessageListener listener) {
+
+        }
+
+        @Override
+        public void removeMessageListener(OpenFlowMessageListener listener) {
+
+        }
+
+        @Override
         public void addPacketListener(int priority, PacketListener listener) {
 
         }
@@ -288,11 +299,6 @@
         public OpenFlowSwitch getEqualSwitch(Dpid dpid) {
             return null;
         }
-
-        @Override
-        public void monitorAllEvents(boolean monitor) {
-        }
-
     }
 
     private class TestGroupProviderRegistry implements GroupProviderRegistry {
@@ -411,14 +417,5 @@
         public String channelId() {
             return null;
         }
-
-        @Override
-        public void addEventListener(OpenFlowEventListener listener) {
-        }
-
-        @Override
-        public void removeEventListener(OpenFlowEventListener listener) {
-        }
-
     }
 }
\ No newline at end of file
diff --git a/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java b/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java
index 42bed2d..a2e21dc 100644
--- a/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java
+++ b/providers/openflow/message/src/main/java/org/onosproject/provider/of/message/impl/OpenFlowControlMessageProvider.java
@@ -32,7 +32,7 @@
 import org.onosproject.net.provider.ProviderId;
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowController;
-import org.onosproject.openflow.controller.OpenFlowEventListener;
+import org.onosproject.openflow.controller.OpenFlowMessageListener;
 import org.onosproject.openflow.controller.OpenFlowSwitch;
 import org.onosproject.openflow.controller.OpenFlowSwitchListener;
 import org.onosproject.openflow.controller.RoleState;
@@ -42,6 +42,7 @@
 import org.slf4j.Logger;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
@@ -71,11 +72,8 @@
 
     private final InternalDeviceProvider listener = new InternalDeviceProvider();
 
-    private final InternalIncomingMessageProvider inMsgListener =
-                    new InternalIncomingMessageProvider();
-
-    private final InternalOutgoingMessageProvider outMsgListener =
-                    new InternalOutgoingMessageProvider();
+    private final InternalControlMessageListener messageListener =
+                    new InternalControlMessageListener();
 
     private HashMap<Dpid, OpenFlowControlMessageAggregator> aggregators = Maps.newHashMap();
     private SharedScheduledExecutorService executor;
@@ -98,12 +96,8 @@
         // listens all OpenFlow device related events
         controller.addListener(listener);
 
-        // listens all OpenFlow incoming message events
-        controller.addEventListener(inMsgListener);
-        controller.monitorAllEvents(true);
-
-        // listens all OpenFlow outgoing message events
-        controller.getSwitches().forEach(sw -> sw.addEventListener(outMsgListener));
+        // listens all OpenFlow control message
+        controller.addMessageListener(messageListener);
 
         executor = SharedScheduledExecutors.getSingleThreadExecutor();
 
@@ -117,12 +111,8 @@
         providerRegistry.unregister(this);
         providerService = null;
 
-        // stops listening all OpenFlow incoming message events
-        controller.monitorAllEvents(false);
-        controller.removeEventListener(inMsgListener);
-
-        // stops listening all OpenFlow outgoing message events
-        controller.getSwitches().forEach(sw -> sw.removeEventListener(outMsgListener));
+        // stops listening all OpenFlow control message events
+        controller.removeMessageListener(messageListener);
 
         log.info("Stopped");
     }
@@ -149,12 +139,6 @@
                 return;
             }
 
-            OpenFlowSwitch sw = controller.getSwitch(dpid);
-            if (sw != null) {
-                // start to monitor the outgoing control messages
-                sw.addEventListener(outMsgListener);
-            }
-
             DeviceId deviceId = deviceId(uri(dpid));
             OpenFlowControlMessageAggregator ofcma =
                     new OpenFlowControlMessageAggregator(metricsService,
@@ -171,12 +155,6 @@
                 return;
             }
 
-            OpenFlowSwitch sw = controller.getSwitch(dpid);
-            if (sw != null) {
-                // stop monitoring the outgoing control messages
-                sw.removeEventListener(outMsgListener);
-            }
-
             // removes the aggregator when switch is removed
             // this also stops the aggregator from running
             OpenFlowControlMessageAggregator aggregator = aggregators.remove(dpid);
@@ -200,12 +178,12 @@
     }
 
     /**
-     * A listener for incoming OpenFlow messages.
+     * A listener for all OpenFlow control messages.
      */
-    private class InternalIncomingMessageProvider implements OpenFlowEventListener {
+    private class InternalControlMessageListener implements OpenFlowMessageListener {
 
         @Override
-        public void handleMessage(Dpid dpid, OFMessage msg) {
+        public void handleIncomingMessage(Dpid dpid, OFMessage msg) {
             if (msg.getType() == OFType.PACKET_IN ||
                     msg.getType() == OFType.FLOW_MOD ||
                     msg.getType() == OFType.STATS_REPLY) {
@@ -215,19 +193,19 @@
                 });
             }
         }
-    }
-
-    /**
-     * A listener for outgoing OpenFlow messages.
-     */
-    private class InternalOutgoingMessageProvider implements OpenFlowEventListener {
 
         @Override
-        public void handleMessage(Dpid dpid, OFMessage msg) {
-            aggregators.computeIfPresent(dpid, (k, v) -> {
-                v.increment(msg);
-                return v;
-            });
+        public void handleOutgoingMessage(Dpid dpid, List<OFMessage> msgs) {
+            for (OFMessage msg : msgs) {
+                if (msg.getType() == OFType.PACKET_OUT ||
+                        msg.getType() == OFType.FLOW_MOD ||
+                        msg.getType() == OFType.STATS_REQUEST) {
+                    aggregators.computeIfPresent(dpid, (k, v) -> {
+                        v.increment(msg);
+                        return v;
+                    });
+                }
+            }
         }
     }
 }
diff --git a/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java b/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java
index ebc8cc7..1b4fe93 100644
--- a/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java
+++ b/providers/openflow/packet/src/test/java/org/onosproject/provider/of/packet/impl/OpenFlowPacketProviderTest.java
@@ -40,6 +40,7 @@
 import org.onosproject.openflow.controller.Dpid;
 import org.onosproject.openflow.controller.OpenFlowController;
 import org.onosproject.openflow.controller.OpenFlowEventListener;
+import org.onosproject.openflow.controller.OpenFlowMessageListener;
 import org.onosproject.openflow.controller.OpenFlowPacketContext;
 import org.onosproject.openflow.controller.OpenFlowSwitch;
 import org.onosproject.openflow.controller.OpenFlowSwitchListener;
@@ -287,10 +288,6 @@
         }
 
         @Override
-        public void monitorAllEvents(boolean monitor) {
-        }
-
-        @Override
         public void addListener(OpenFlowSwitchListener listener) {
         }
 
@@ -299,6 +296,16 @@
         }
 
         @Override
+        public void addMessageListener(OpenFlowMessageListener listener) {
+
+        }
+
+        @Override
+        public void removeMessageListener(OpenFlowMessageListener listener) {
+
+        }
+
+        @Override
         public void addPacketListener(int priority, PacketListener listener) {
             pktListener = listener;
         }
@@ -428,16 +435,6 @@
         public String channelId() {
             return "1.2.3.4:1";
         }
-
-        @Override
-        public void addEventListener(OpenFlowEventListener listener) {
-        }
-
-        @Override
-        public void removeEventListener(OpenFlowEventListener listener) {
-        }
-
-
     }
 
 }