Addressing review comments of patch-3
Addressing review comments of patch-2
Fixing javadoc warnings
Pushing changes for onos-5146 - Added 2 new APIs in DeviceService.java to get port specific PortStatistics by specifying Device ID & Port Number. Also implemented the APIs in SimpleDeviceStore etc. This will be a very useful API for app developers who are intersted to query port specific port statistics

Change-Id: I8f3e5a443eb5b50237a679999311b48609e54a44
diff --git a/core/api/src/main/java/org/onosproject/net/device/DeviceService.java b/core/api/src/main/java/org/onosproject/net/device/DeviceService.java
index e6cd2d7..ce988c5 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DeviceService.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DeviceService.java
@@ -113,6 +113,28 @@
     List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId);
 
     /**
+     * Returns the port specific port statistics associated with the device and port.
+     *
+     * @param deviceId device identifier
+     * @param portNumber port identifier
+     * @return port statistics of specified port
+     */
+    default PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    /**
+     * Returns the port specific port delta statistics associated with the device and port.
+     *
+     * @param deviceId device identifier
+     * @param portNumber port identifier
+     * @return port delta statistics of specified port
+     */
+    default PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    /**
      * Returns the port with the specified number and hosted by the given device.
      *
      * @param deviceId   device identifier
diff --git a/core/api/src/main/java/org/onosproject/net/device/DeviceStore.java b/core/api/src/main/java/org/onosproject/net/device/DeviceStore.java
index e010202..626097d 100644
--- a/core/api/src/main/java/org/onosproject/net/device/DeviceStore.java
+++ b/core/api/src/main/java/org/onosproject/net/device/DeviceStore.java
@@ -152,6 +152,17 @@
     List<PortStatistics> getPortStatistics(DeviceId deviceId);
 
     /**
+     * Returns the port statistics of the specified device and port.
+     *
+     * @param deviceId device identifier
+     * @param portNumber port identifier
+     * @return  port statistics of specific port of the device
+     */
+    default PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    /**
      * Returns the list of delta port statistics of the specified device.
      *
      * @param deviceId device identifier
@@ -160,6 +171,17 @@
     List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId);
 
     /**
+     * Returns the port delta statistics of the specified device and port.
+     *
+     * @param deviceId device identifier
+     * @param portNumber port identifier
+     * @return port statistics of specific port of the device
+     */
+    default PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    /**
      * Returns the specified device port.
      *
      * @param deviceId   device identifier
diff --git a/core/api/src/test/java/org/onosproject/net/device/DeviceServiceAdapter.java b/core/api/src/test/java/org/onosproject/net/device/DeviceServiceAdapter.java
index 9ffa2bd..bc9411d 100644
--- a/core/api/src/test/java/org/onosproject/net/device/DeviceServiceAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/device/DeviceServiceAdapter.java
@@ -92,6 +92,16 @@
     }
 
     @Override
+    public PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    @Override
+    public PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    @Override
     public Port getPort(DeviceId deviceId, PortNumber portNumber) {
         return null;
     }
diff --git a/core/api/src/test/java/org/onosproject/net/device/DeviceStoreAdapter.java b/core/api/src/test/java/org/onosproject/net/device/DeviceStoreAdapter.java
index 9859892..b09b35f 100644
--- a/core/api/src/test/java/org/onosproject/net/device/DeviceStoreAdapter.java
+++ b/core/api/src/test/java/org/onosproject/net/device/DeviceStoreAdapter.java
@@ -101,11 +101,21 @@
     }
 
     @Override
+    public PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    @Override
     public List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId) {
         return null;
     }
 
     @Override
+    public PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        return null;
+    }
+
+    @Override
     public Port getPort(DeviceId deviceId, PortNumber portNumber) {
         return null;
     }
diff --git a/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java b/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java
index 4218d47..04d376c 100644
--- a/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java
+++ b/core/common/src/test/java/org/onosproject/store/trivial/SimpleDeviceStore.java
@@ -514,6 +514,16 @@
     }
 
     @Override
+    public PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, PortStatistics> portStatsMap = devicePortStats.get(deviceId);
+        if (portStatsMap == null) {
+            return null;
+        }
+        PortStatistics portStats = portStatsMap.get(portNumber);
+        return portStats;
+    }
+
+    @Override
     public List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId) {
         Map<PortNumber, PortStatistics> portStats = devicePortDeltaStats.get(deviceId);
         if (portStats == null) {
@@ -523,6 +533,16 @@
     }
 
     @Override
+    public PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, PortStatistics> portStatsMap = devicePortDeltaStats.get(deviceId);
+        if (portStatsMap == null) {
+            return null;
+        }
+        PortStatistics portStats = portStatsMap.get(portNumber);
+        return portStats;
+    }
+
+    @Override
     public boolean isAvailable(DeviceId deviceId) {
         return availableDevices.contains(deviceId);
     }
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
index cd3c543..5b92489 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/DeviceManager.java
@@ -228,6 +228,22 @@
     }
 
     @Override
+    public PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        checkPermission(DEVICE_READ);
+        checkNotNull(deviceId, DEVICE_ID_NULL);
+        checkNotNull(portNumber, PORT_NUMBER_NULL);
+        return store.getStatisticsForPort(deviceId, portNumber);
+    }
+
+    @Override
+    public PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        checkPermission(DEVICE_READ);
+        checkNotNull(deviceId, DEVICE_ID_NULL);
+        checkNotNull(portNumber, PORT_NUMBER_NULL);
+        return store.getDeltaStatisticsForPort(deviceId, portNumber);
+    }
+
+    @Override
     public Port getPort(DeviceId deviceId, PortNumber portNumber) {
         checkPermission(DEVICE_READ);
         checkNotNull(deviceId, DEVICE_ID_NULL);
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
index c291b4b..c64fa0a 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/ECDeviceStore.java
@@ -679,6 +679,16 @@
     }
 
     @Override
+    public PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, PortStatistics> portStatsMap = devicePortStats.get(deviceId);
+        if (portStatsMap == null) {
+            return null;
+        }
+        PortStatistics portStats = portStatsMap.get(portNumber);
+        return portStats;
+    }
+
+    @Override
     public List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId) {
         Map<PortNumber, PortStatistics> portStats = devicePortDeltaStats.get(deviceId);
         if (portStats == null) {
@@ -688,6 +698,16 @@
     }
 
     @Override
+    public PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, PortStatistics> portStatsMap = devicePortDeltaStats.get(deviceId);
+        if (portStatsMap == null) {
+            return null;
+        }
+        PortStatistics portStats = portStatsMap.get(portNumber);
+        return portStats;
+    }
+
+    @Override
     public boolean isAvailable(DeviceId deviceId) {
         return availableDevices.contains(deviceId);
     }
diff --git a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
index 02f65e4..faf7e50 100644
--- a/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
+++ b/core/store/dist/src/main/java/org/onosproject/store/device/impl/GossipDeviceStore.java
@@ -998,6 +998,16 @@
     }
 
     @Override
+    public PortStatistics getStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, PortStatistics> portStatsMap = devicePortStats.get(deviceId);
+        if (portStatsMap == null) {
+            return null;
+        }
+        PortStatistics portStats = portStatsMap.get(portNumber);
+        return portStats;
+    }
+
+    @Override
     public List<PortStatistics> getPortDeltaStatistics(DeviceId deviceId) {
         Map<PortNumber, PortStatistics> portStats = devicePortDeltaStats.get(deviceId);
         if (portStats == null) {
@@ -1007,6 +1017,16 @@
     }
 
     @Override
+    public PortStatistics getDeltaStatisticsForPort(DeviceId deviceId, PortNumber portNumber) {
+        Map<PortNumber, PortStatistics> portStatsMap = devicePortDeltaStats.get(deviceId);
+        if (portStatsMap == null) {
+            return null;
+        }
+        PortStatistics portStats = portStatsMap.get(portNumber);
+        return portStats;
+    }
+
+    @Override
     public Port getPort(DeviceId deviceId, PortNumber portNumber) {
         Map<PortNumber, Port> ports = devicePorts.get(deviceId);
         return ports == null ? null : ports.get(portNumber);