Do not collect flow and port stats if unsupported

Change-Id: I8dd175803c64e2cafa57b7cbf8b9c268a6391739
diff --git a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
index 35bb730..f3dd6e0 100644
--- a/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
+++ b/providers/openflow/device/src/main/java/org/onosproject/provider/of/device/impl/OpenFlowDeviceProvider.java
@@ -75,6 +75,7 @@
 import org.projectfloodlight.openflow.protocol.OFCalientPortDescProp;
 import org.projectfloodlight.openflow.protocol.OFCalientPortDescPropOptical;
 import org.projectfloodlight.openflow.protocol.OFCalientPortDescStatsEntry;
+import org.projectfloodlight.openflow.protocol.OFCapabilities;
 import org.projectfloodlight.openflow.protocol.OFErrorMsg;
 import org.projectfloodlight.openflow.protocol.OFErrorType;
 import org.projectfloodlight.openflow.protocol.OFExpPort;
@@ -640,9 +641,11 @@
             providerService.deviceConnected(did, description);
             providerService.updatePorts(did, buildPortDescriptions(sw));
 
-            PortStatsCollector psc = new PortStatsCollector(timer, sw, portStatsPollFrequency);
-            stopCollectorIfNeeded(collectors.put(dpid, psc));
-            psc.start();
+            if (sw.features().getCapabilities().contains(OFCapabilities.PORT_STATS)) {
+                PortStatsCollector psc = new PortStatsCollector(timer, sw, portStatsPollFrequency);
+                stopCollectorIfNeeded(collectors.put(dpid, psc));
+                psc.start();
+            }
 
             //figure out race condition for collectors.remove() and collectors.put()
             if (controller.getSwitch(dpid) == null) {
diff --git a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
index ef013b59..8ee8cb0 100644
--- a/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
+++ b/providers/openflow/flow/src/main/java/org/onosproject/provider/of/flow/impl/OpenFlowRuleProvider.java
@@ -243,16 +243,18 @@
         if (sw == null) {
             return;
         }
-        if (adaptiveFlowSampling) {
-            // NewAdaptiveFlowStatsCollector Constructor
-            NewAdaptiveFlowStatsCollector fsc =
-                    new NewAdaptiveFlowStatsCollector(driverService, sw, flowPollFrequency);
-            stopCollectorIfNeeded(afsCollectors.put(new Dpid(sw.getId()), fsc));
-            fsc.start();
-        } else {
-            FlowStatsCollector fsc = new FlowStatsCollector(timer, sw, flowPollFrequency);
-            stopCollectorIfNeeded(simpleCollectors.put(new Dpid(sw.getId()), fsc));
-            fsc.start();
+        if (sw.features().getCapabilities().contains(OFCapabilities.FLOW_STATS)) {
+            if (adaptiveFlowSampling) {
+                // NewAdaptiveFlowStatsCollector Constructor
+                NewAdaptiveFlowStatsCollector fsc =
+                        new NewAdaptiveFlowStatsCollector(driverService, sw, flowPollFrequency);
+                stopCollectorIfNeeded(afsCollectors.put(new Dpid(sw.getId()), fsc));
+                fsc.start();
+            } else {
+                FlowStatsCollector fsc = new FlowStatsCollector(timer, sw, flowPollFrequency);
+                stopCollectorIfNeeded(simpleCollectors.put(new Dpid(sw.getId()), fsc));
+                fsc.start();
+            }
         }
         if (sw.features().getCapabilities().contains(OFCapabilities.TABLE_STATS)) {
             TableStatisticsCollector tsc = new TableStatisticsCollector(timer, sw, flowPollFrequency);