ONOS-1440: Implements port statistics feature, which polls port statistics of all devices every 10 seconds. Also, implemented a simple portstats ONOS CLI command to show the statistics.

Change-Id: I57e046ae2c2463a58b478d3a5b523422cde71ba2
diff --git a/core/api/src/main/java/org/onosproject/net/device/DefaultPortStatistics.java b/core/api/src/main/java/org/onosproject/net/device/DefaultPortStatistics.java
new file mode 100644
index 0000000..93c91ce
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/device/DefaultPortStatistics.java
@@ -0,0 +1,330 @@
+/*
+ * Copyright 2015 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.net.device;
+
+import org.onosproject.net.DeviceId;
+
+/**
+ * Default implementation of immutable port statistics.
+ */
+public final class DefaultPortStatistics implements PortStatistics {
+
+    private final DeviceId deviceId;
+    private final int  port;
+    private final long packetsReceived;
+    private final long packetsSent;
+    private final long bytesReceived;
+    private final long bytesSent;
+    private final long packetsRxDropped;
+    private final long packetsTxDropped;
+    private final long packetsRxErrors;
+    private final long packetsTxErrors;
+    private final long durationSec;
+    private final long durationNano;
+
+    private DefaultPortStatistics(DeviceId deviceId,
+                                  int  port,
+                                  long packetsReceived,
+                                  long packetsSent,
+                                  long bytesReceived,
+                                  long bytesSent,
+                                  long packetsRxDropped,
+                                  long packetsTxDropped,
+                                  long packetsRxErrors,
+                                  long packetsTxErrors,
+                                  long durationSec,
+                                  long durationNano) {
+        this.deviceId = deviceId;
+        this.port = port;
+        this.packetsReceived = packetsReceived;
+        this.packetsSent = packetsSent;
+        this.bytesReceived = bytesReceived;
+        this.bytesSent = bytesSent;
+        this.packetsRxDropped = packetsRxDropped;
+        this.packetsTxDropped = packetsTxDropped;
+        this.packetsRxErrors = packetsRxErrors;
+        this.packetsTxErrors = packetsTxErrors;
+        this.durationSec = durationSec;
+        this.durationNano = durationNano;
+    }
+
+    /**
+     * Creates a builder for DefaultPortStatistics object.
+     *
+     * @return builder object for DefaultPortStatistics object
+     */
+    public static DefaultPortStatistics.Builder builder() {
+        return new Builder();
+    }
+
+    @Override
+    public int port() {
+        return this.port;
+    }
+
+    @Override
+    public long packetsReceived() {
+        return this.packetsReceived;
+    }
+
+    @Override
+    public long packetsSent() {
+        return this.packetsSent;
+    }
+
+    @Override
+    public long bytesReceived() {
+        return this.bytesReceived;
+    }
+
+    @Override
+    public long bytesSent() {
+        return this.bytesSent;
+    }
+
+    @Override
+    public long packetsRxDropped() {
+        return this.packetsRxDropped;
+    }
+
+    @Override
+    public long packetsTxDropped() {
+        return this.packetsTxDropped;
+    }
+
+    @Override
+    public long packetsRxErrors() {
+        return this.packetsRxErrors;
+    }
+
+    @Override
+    public long packetsTxErrors() {
+        return this.packetsTxErrors;
+    }
+
+    @Override
+    public long durationSec() {
+        return this.durationSec;
+    }
+
+    @Override
+    public long durationNano() {
+        return this.durationNano;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("device: " + deviceId + ", ");
+
+        sb.append("port: " + this.port + ", ");
+        sb.append("pktRx: " + this.packetsReceived + ", ");
+        sb.append("pktTx: " + this.packetsSent + ", ");
+        sb.append("byteRx: " + this.bytesReceived + ", ");
+        sb.append("byteTx: " + this.bytesSent + ", ");
+        sb.append("pktRxErr: " + this.packetsRxErrors + ", ");
+        sb.append("pktTxErr: " + this.packetsTxErrors + ", ");
+        sb.append("pktRxDrp: " + this.packetsRxDropped + ", ");
+        sb.append("pktTxDrp: " + this.packetsTxDropped);
+
+        return sb.toString();
+    }
+
+    public static final class Builder {
+
+        DeviceId deviceId;
+        int port;
+        long packetsReceived;
+        long packetsSent;
+        long bytesReceived;
+        long bytesSent;
+        long packetsRxDropped;
+        long packetsTxDropped;
+        long packetsRxErrors;
+        long packetsTxErrors;
+        long durationSec;
+        long durationNano;
+
+        private Builder() {
+
+        }
+
+        /**
+         * Sets port number.
+         *
+         * @param port port number
+         * @return builder object
+         */
+        public Builder setPort(int port) {
+            this.port = port;
+
+            return this;
+        }
+
+        /**
+         * Sets the device identifier.
+         *
+         * @param deviceId device identifier
+         * @return builder object
+         */
+        public Builder setDeviceId(DeviceId deviceId) {
+            this.deviceId = deviceId;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of packet received.
+         *
+         * @param packets number of packets received
+         * @return  builder object
+         */
+        public Builder setPacketsReceived(long packets) {
+            packetsReceived = packets;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of packets sent.
+         *
+         * @param packets number of packets sent
+         * @return  builder object
+         */
+        public Builder setPacketsSent(long packets) {
+            packetsSent = packets;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of received bytes.
+         *
+         * @param bytes number of received bytes.
+         * @return  builder object
+         */
+        public Builder setBytesReceived(long bytes) {
+            bytesReceived = bytes;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of sent bytes.
+         *
+         * @param bytes number of sent bytes
+         * @return builder object
+         */
+        public Builder setBytesSent(long bytes) {
+            bytesSent = bytes;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of packets dropped by RX.
+         *
+         * @param packets  number of packets dropped by RX
+         * @return builder object
+         */
+        public Builder setPacketsRxDropped(long packets) {
+            packetsRxDropped = packets;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of packets dropped by TX.
+         *
+         * @param packets
+         * @return builder object
+         */
+        public Builder setPacketsTxDropped(long packets) {
+            packetsTxDropped = packets;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of receive errors.
+         *
+         * @param packets number of receive errors
+         * @return builder object
+         */
+        public Builder setPacketsRxErrors(long packets) {
+            packetsRxErrors = packets;
+
+            return this;
+        }
+
+        /**
+         * Sets the number of transmit errors.
+         *
+         * @param packets number of transmit errors
+         * @return builder object
+         */
+        public Builder setPacketsTxErrors(long packets) {
+            packetsTxErrors = packets;
+
+            return this;
+        }
+
+        /**
+         * Sets the time port has been alive in seconds.
+         *
+         * @param sec time port has been alive in seconds
+         * @return builder object
+         */
+        public Builder setDurationSec(long sec) {
+            durationSec = sec;
+
+            return this;
+        }
+
+        /**
+         * Sets the time port has been alive in nano seconds.
+         *
+         * @param nano time port has been alive in nano seconds
+         * @return builder object
+         */
+        public Builder setDurationNano(long nano) {
+            durationNano = nano;
+
+            return this;
+        }
+
+        /**
+         * Creates a PortStatistics object.
+         *
+         * @return DefaultPortStatistics object
+         */
+        public DefaultPortStatistics build() {
+            return new DefaultPortStatistics(
+                    deviceId,
+                    port,
+                    packetsReceived,
+                    packetsSent,
+                    bytesReceived,
+                    bytesSent,
+                    packetsRxDropped,
+                    packetsTxDropped,
+                    packetsRxErrors,
+                    packetsTxErrors,
+                    durationSec,
+                    durationNano);
+        }
+
+    }
+}