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
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/MockOfPacketIn.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/MockOfPacketIn.java
deleted file mode 100644
index 6763819..0000000
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/MockOfPacketIn.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openflow;
-
-import org.projectfloodlight.openflow.protocol.OFPacketIn;
-import org.projectfloodlight.openflow.protocol.OFPacketInReason;
-import org.projectfloodlight.openflow.protocol.OFType;
-import org.projectfloodlight.openflow.protocol.match.Match;
-import org.projectfloodlight.openflow.types.OFBufferId;
-import org.projectfloodlight.openflow.types.OFPort;
-import org.projectfloodlight.openflow.types.TableId;
-import org.projectfloodlight.openflow.types.U64;
-
-/**
- * Mock of the Open Flow packet in message.
- */
-public class MockOfPacketIn extends OfMessageAdapter implements OFPacketIn {
-    public MockOfPacketIn() {
-        super(OFType.PACKET_IN);
-    }
-
-    @Override
-    public OFBufferId getBufferId() {
-        return null;
-    }
-
-    @Override
-    public int getTotalLen() {
-        return 0;
-    }
-
-    @Override
-    public OFPacketInReason getReason() {
-        return null;
-    }
-
-    @Override
-    public TableId getTableId() {
-        return null;
-    }
-
-    @Override
-    public Match getMatch() {
-        return null;
-    }
-
-    @Override
-    public byte[] getData() {
-        return new byte[0];
-    }
-
-    @Override
-    public OFPort getInPort() {
-        return null;
-    }
-
-    @Override
-    public OFPort getInPhyPort() {
-        return null;
-    }
-
-    @Override
-    public U64 getCookie() {
-        return null;
-    }
-
-    @Override
-    public OFPacketIn.Builder createBuilder() {
-        return null;
-    }
-}
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OpenflowSwitchDriverAdapter.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OpenflowSwitchDriverAdapter.java
index 0efd6fa..115c9ea 100644
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OpenflowSwitchDriverAdapter.java
+++ b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/OpenflowSwitchDriverAdapter.java
@@ -15,14 +15,11 @@
  */
 package org.onosproject.openflow;
 
-import java.util.List;
-
 import org.jboss.netty.channel.Channel;
 import org.onosproject.net.Device;
 import org.onosproject.net.driver.DriverData;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.openflow.controller.Dpid;
-import org.onosproject.openflow.controller.OpenFlowEventListener;
 import org.onosproject.openflow.controller.RoleState;
 import org.onosproject.openflow.controller.driver.OpenFlowAgent;
 import org.onosproject.openflow.controller.driver.OpenFlowSwitchDriver;
@@ -38,6 +35,8 @@
 import org.projectfloodlight.openflow.protocol.OFPortDescStatsReply;
 import org.projectfloodlight.openflow.protocol.OFVersion;
 
+import java.util.List;
+
 /**
  * Testing adapter for the OpenFlow switch driver class.
  */
@@ -300,12 +299,4 @@
     public String channelId() {
         return null;
     }
-
-    @Override
-    public void addEventListener(OpenFlowEventListener listener) {
-    }
-
-    @Override
-    public void removeEventListener(OpenFlowEventListener listener) {
-    }
 }
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/MockOfFlowRemoved.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/MockOfFlowRemoved.java
deleted file mode 100644
index 9aee677..0000000
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/MockOfFlowRemoved.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright 2015-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.openflow.controller.impl;
-
-import org.onosproject.openflow.OfMessageAdapter;
-import org.projectfloodlight.openflow.protocol.OFFlowRemoved;
-import org.projectfloodlight.openflow.protocol.OFType;
-import org.projectfloodlight.openflow.protocol.match.Match;
-import org.projectfloodlight.openflow.types.TableId;
-import org.projectfloodlight.openflow.types.U64;
-
-/**
- * Mock of the Open Flow packet removed message.
- */
-public class MockOfFlowRemoved extends OfMessageAdapter implements OFFlowRemoved {
-
-    public MockOfFlowRemoved() {
-        super(OFType.FLOW_REMOVED);
-    }
-
-    @Override
-    public U64 getCookie() {
-        return null;
-    }
-
-    @Override
-    public int getPriority() {
-        return 0;
-    }
-
-    @Override
-    public short getReason() {
-        return 0;
-    }
-
-    @Override
-    public TableId getTableId() throws UnsupportedOperationException {
-        return null;
-    }
-
-    @Override
-    public long getDurationSec() {
-        return 0;
-    }
-
-    @Override
-    public long getDurationNsec() {
-        return 0;
-    }
-
-    @Override
-    public int getIdleTimeout() {
-        return 0;
-    }
-
-    @Override
-    public int getHardTimeout() throws UnsupportedOperationException {
-        return 0;
-    }
-
-    @Override
-    public U64 getPacketCount() {
-        return null;
-    }
-
-    @Override
-    public U64 getByteCount() {
-        return null;
-    }
-
-    @Override
-    public Match getMatch() {
-        return null;
-    }
-
-    @Override
-    public OFFlowRemoved.Builder createBuilder() {
-        return null;
-    }
-}
diff --git a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplPacketsTest.java b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplPacketsTest.java
index d87913a..54fae4e 100644
--- a/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplPacketsTest.java
+++ b/protocols/openflow/ctl/src/test/java/org/onosproject/openflow/controller/impl/OpenFlowControllerImplPacketsTest.java
@@ -104,7 +104,6 @@
         agent = controller.agent;
         switchListener = new OpenFlowSwitchListenerAdapter();
         controller.addListener(switchListener);
-        controller.monitorAllEvents(true);
 
         packetListener = new TestPacketListener();
         controller.addPacketListener(100, packetListener);