Fix some problems for oplink netconf driver:
    1. Uses NETCONF get operation instead of get-config.
    2. Prevents reply-error log flooding in netconf session when polling port power range with protection switch, which does not support power range configuration retrieving.
    3. Some code optimization.

Change-Id: I5c4d0b0f6681dd1bf6b8c7450daf07db0104a758
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalDeviceDescription.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalDeviceDescription.java
index 8897793..463a74a 100755
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalDeviceDescription.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalDeviceDescription.java
@@ -19,7 +19,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.onosproject.drivers.utilities.XmlConfigParser;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.PortNumber;
@@ -59,7 +58,7 @@
     @Override
     public List<PortDescription> discoverPortDetails() {
         log.debug("Port description to be added for device {}", data().deviceId());
-        String reply = netconfGetConfig(handler(), getPortsFilter());
+        String reply = netconfGet(handler(), getPortsFilter());
         List<PortDescription> descriptions = parsePorts(reply);
         return ImmutableList.copyOf(descriptions);
     }
@@ -72,9 +71,8 @@
     }
 
     private List<PortDescription> parsePorts(String content) {
-        HierarchicalConfiguration cfg = XmlConfigParser.loadXmlString(content);
+        List<HierarchicalConfiguration> subtrees = configsAt(content, KEY_DATA_PORTS);
         List<PortDescription> portDescriptions = Lists.newArrayList();
-        List<HierarchicalConfiguration> subtrees = cfg.configurationsAt(KEY_DATA_PORTS);
         for (HierarchicalConfiguration portConfig : subtrees) {
             portDescriptions.add(parsePort(portConfig));
         }
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalFlowRuleProgrammable.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalFlowRuleProgrammable.java
index 01446f2..ba7f833 100644
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalFlowRuleProgrammable.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalFlowRuleProgrammable.java
@@ -17,7 +17,6 @@
 package org.onosproject.drivers.oplink;
 
 import org.apache.commons.configuration.HierarchicalConfiguration;
-import org.onosproject.drivers.utilities.XmlConfigParser;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.DefaultFlowEntry;
@@ -75,9 +74,8 @@
 
     private Collection<FlowEntry> parseConnections() {
         log.debug("Fetch connections...");
-        String reply = netconfGetConfig(handler(), getConnectionsFilter());
-        HierarchicalConfiguration cfg = XmlConfigParser.loadXmlString(reply);
-        List<HierarchicalConfiguration> subtrees = cfg.configurationsAt(KEY_DATA_CONNS);
+        String reply = netconfGet(handler(), getConnectionsFilter());
+        List<HierarchicalConfiguration> subtrees = configsAt(reply, KEY_DATA_CONNS);
         Collection<FlowEntry> list = new ArrayList<>();
         for (HierarchicalConfiguration connection : subtrees) {
             list.add(new DefaultFlowEntry(parseConnection(connection), FlowEntry.FlowEntryState.ADDED));
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
index 92847f9..6aba155 100755
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalPowerConfig.java
@@ -19,10 +19,12 @@
 import com.google.common.collect.Range;
 import org.apache.commons.configuration.HierarchicalConfiguration;
 import org.onosproject.driver.extensions.OplinkAttenuation;
+import org.onosproject.net.Device;
 import org.onosproject.net.Direction;
 import org.onosproject.net.OchSignal;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.behaviour.PowerConfig;
+import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
@@ -33,11 +35,11 @@
 
 import java.util.Optional;
 
-import static org.onosproject.drivers.oplink.OplinkOpticalUtility.MAX_ATTENUATION;
-import static org.onosproject.drivers.oplink.OplinkOpticalUtility.MIN_ATTENUATION;
 import static org.onosproject.drivers.oplink.OplinkOpticalUtility.POWER_MULTIPLIER;
-import static org.slf4j.LoggerFactory.getLogger;
+import static org.onosproject.drivers.oplink.OplinkOpticalUtility.RANGE_ATT;
+import static org.onosproject.drivers.oplink.OplinkOpticalUtility.RANGE_GENERAL;
 import static org.onosproject.drivers.oplink.OplinkNetconfUtility.*;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * Get current or target port/channel power from an Oplink optical netconf device.
@@ -65,7 +67,6 @@
     // log
     private static final Logger log = getLogger(OplinkOpticalPowerConfig.class);
 
-
     @Override
     public Optional<Long> getTargetPower(PortNumber port, T component) {
         return Optional.ofNullable(acquireTargetPower(port, component));
@@ -162,7 +163,7 @@
     }
 
     private Long acquirePortPower(PortNumber port, String selection) {
-        String reply = netconfGetConfig(handler(), getPortPowerFilter(port, selection));
+        String reply = netconfGet(handler(), getPortPowerFilter(port, selection));
         HierarchicalConfiguration info = configAt(reply, KEY_PORTS_PORT);
         if (info == null) {
             return null;
@@ -172,7 +173,7 @@
 
     private Long acquireChannelAttenuation(PortNumber port, OchSignal channel) {
         log.debug("Get port{} channel{} attenuation...", port, channel.channelSpacing());
-        String reply = netconfGetConfig(handler(), getChannelAttenuationFilter(port, channel));
+        String reply = netconfGet(handler(), getChannelAttenuationFilter(port, channel));
         HierarchicalConfiguration info = configAt(reply, KEY_CONNS);
         if (info == null) {
             return null;
@@ -182,7 +183,7 @@
 
     private Long acquireChannelPower(PortNumber port, OchSignal channel) {
         log.debug("Get port{} channel{} power...", port, channel.channelSpacing());
-        String reply = netconfGetConfig(handler(), getChannelPowerFilter(port, channel));
+        String reply = netconfGet(handler(), getChannelPowerFilter(port, channel));
         HierarchicalConfiguration info = configAt(reply, KEY_DATA_CONNS);
         if (info == null) {
             return null;
@@ -235,7 +236,15 @@
     }
 
     private Range<Long> getPowerRange(PortNumber port, String directionKey, String minKey, String maxKey) {
-        String reply = netconfGetConfig(handler(), getPowerRangeFilter(port, directionKey));
+        // TODO
+        // Optical protection switch does not support power range configuration, it'll reply error.
+        // To prevent replying error log flooding from netconf session when polling all ports information,
+        // use general power range of [-60, 60] instead.
+        if (handler().get(DeviceService.class).getDevice(data().deviceId()).type()
+                == Device.Type.FIBER_SWITCH) {
+            return RANGE_GENERAL;
+        }
+        String reply = netconfGet(handler(), getPowerRangeFilter(port, directionKey));
         HierarchicalConfiguration info = configAt(reply, KEY_PORTS_PORT_PROPERTY);
         if (info == null) {
             return null;
@@ -251,7 +260,7 @@
             return getPowerRange(port, KEY_PORTDIRECT_TX, KEY_PORTPWRCAPMINTX, KEY_PORTPWRCAPMAXTX);
         } else {
             log.debug("Get channel attenuation range...");
-            return Range.closed(MIN_ATTENUATION, MAX_ATTENUATION);
+            return RANGE_ATT;
         }
     }
 
diff --git a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalUtility.java b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalUtility.java
index 9785224..be372f3 100644
--- a/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalUtility.java
+++ b/drivers/oplink/src/main/java/org/onosproject/drivers/oplink/OplinkOpticalUtility.java
@@ -16,6 +16,7 @@
 
 package org.onosproject.drivers.oplink;
 
+import com.google.common.collect.Range;
 import org.onlab.util.Frequency;
 import org.onosproject.core.CoreService;
 import org.onosproject.driver.extensions.OplinkAttenuation;
@@ -61,9 +62,10 @@
     // Power multiply factor, the power accuracy supported by device is 0.01dBm.
     // Transforms the double typed number to long typed power for ONOS.
     public static final int POWER_MULTIPLIER = 100;
-    // Attenuation range supported by device, [0, 25dB].
-    public static final long MIN_ATTENUATION = 0L;
-    public static final long MAX_ATTENUATION = 2500L;
+    // Attenuation range supported by device, [0, 25.5dB].
+    public static final Range<Long> RANGE_ATT = Range.closed(0L, 2550L);
+    // General power range for fiber switch, [-60dBm, 60dBm].
+    public static final Range<Long> RANGE_GENERAL = Range.closed(-6000L, 6000L);
 
     // Default attenuation value if the attenuation instruction is not found.
     private static final int DEFAULT_ATT = 0;