Refactor the logic on collecting OpenFlow message statistics

Change-Id: I34c209c0ca90cb094ed5f82c96a8a43d3519b807
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 ba3eab5..43b91fd 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
@@ -34,6 +34,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;
@@ -134,7 +135,7 @@
 
     protected Set<OpenFlowEventListener> ofEventListener = new CopyOnWriteArraySet<>();
 
-    protected boolean monitorAllEvents = false;
+    protected Set<OpenFlowMessageListener> ofMessageListener = new CopyOnWriteArraySet<>();
 
     protected Multimap<Dpid, OFFlowStatsEntry> fullFlowStats =
             ArrayListMultimap.create();
@@ -217,11 +218,6 @@
     }
 
     @Override
-    public void monitorAllEvents(boolean monitor) {
-        this.monitorAllEvents = monitor;
-    }
-
-    @Override
     public void addListener(OpenFlowSwitchListener listener) {
         if (!ofSwitchListener.contains(listener)) {
             this.ofSwitchListener.add(listener);
@@ -234,6 +230,16 @@
     }
 
     @Override
+    public void addMessageListener(OpenFlowMessageListener listener) {
+        ofMessageListener.add(listener);
+    }
+
+    @Override
+    public void removeMessageListener(OpenFlowMessageListener listener) {
+        ofMessageListener.remove(listener);
+    }
+
+    @Override
     public void addPacketListener(int priority, PacketListener listener) {
         ofPacketListener.put(priority, listener);
     }
@@ -625,8 +631,20 @@
         }
 
         @Override
+        public void processDownstreamMessage(Dpid dpid, List<OFMessage> m) {
+            for (OpenFlowMessageListener listener : ofMessageListener) {
+                listener.handleOutgoingMessage(dpid, m);
+            }
+        }
+
+
+        @Override
         public void processMessage(Dpid dpid, OFMessage m) {
             processPacket(dpid, m);
+
+            for (OpenFlowMessageListener listener : ofMessageListener) {
+                listener.handleIncomingMessage(dpid, m);
+            }
         }
 
         @Override