Managers refactored to use ConfigOperators:

o Device, Host, and LinkManagers now use respecive ConfigOperator
implementations to combine Descriptions with Network Configs. This
refactors work done in 3a0cdd57e7b2c2bbdc44743b780b072cb0475f2d.

o Touchups on ConfigOperator impls

Change-Id: I735e7e6bfa0c47c8727433aab804cb2782eebfff
diff --git a/core/net/src/main/java/org/onosproject/net/device/impl/BasicDeviceOperator.java b/core/net/src/main/java/org/onosproject/net/device/impl/BasicDeviceOperator.java
index 4af8000..c10b7e8 100644
--- a/core/net/src/main/java/org/onosproject/net/device/impl/BasicDeviceOperator.java
+++ b/core/net/src/main/java/org/onosproject/net/device/impl/BasicDeviceOperator.java
@@ -17,6 +17,7 @@
 
 import static org.slf4j.LoggerFactory.getLogger;
 
+import org.onosproject.incubator.net.config.ConfigOperator;
 import org.onosproject.incubator.net.config.basics.BasicDeviceConfig;
 import org.onosproject.net.AnnotationKeys;
 import org.onosproject.net.DefaultAnnotations;
@@ -30,7 +31,7 @@
  * Implementations of merge policies for various sources of device configuration
  * information. This includes applications, provides, and network configurations.
  */
-public final class BasicDeviceOperator {
+public final class BasicDeviceOperator implements ConfigOperator {
 
     protected static final double DEFAULT_COORD = -1.0;
     private static final Logger log = getLogger(BasicDeviceOperator.class);
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 b1390d1..01f85d8 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
@@ -37,14 +37,12 @@
 import org.onosproject.mastership.MastershipService;
 import org.onosproject.mastership.MastershipTerm;
 import org.onosproject.mastership.MastershipTermService;
-import org.onosproject.net.DefaultAnnotations;
 import org.onosproject.net.Device;
 import org.onosproject.net.Device.Type;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.MastershipRole;
 import org.onosproject.net.Port;
 import org.onosproject.net.PortNumber;
-import org.onosproject.net.SparseAnnotations;
 import org.onosproject.net.device.DefaultDeviceDescription;
 import org.onosproject.net.device.DefaultPortDescription;
 import org.onosproject.net.device.DeviceAdminService;
@@ -334,17 +332,8 @@
             BasicDeviceConfig cfg = networkConfigService.getConfig(deviceId, BasicDeviceConfig.class);
             checkState(cfg == null || cfg.isAllowed(), "Device " + deviceId + " is not allowed");
             log.info("Device {} connected", deviceId);
-            if (cfg != null) {
-                SparseAnnotations finalSparse = processAnnotations(cfg, deviceDescription, deviceId);
-                if (cfg.type() != Type.SWITCH) {
-                    deviceDescription = new DefaultDeviceDescription(deviceDescription,
-                                                                     cfg.type(), finalSparse);
-                } else {
-                    deviceDescription = new DefaultDeviceDescription(deviceDescription,
-                                                                     deviceDescription.type(), finalSparse);
-                }
-            }
-            return deviceDescription;
+
+            return BasicDeviceOperator.combine(cfg, deviceDescription);
         }
 
         @Override
@@ -500,37 +489,6 @@
                                                            deviceId, portStatistics);
             post(event);
         }
-
-        // supplements or replaces deviceDescription annotations with
-        // BasicDeviceConfig annotations
-        private SparseAnnotations processAnnotations(BasicDeviceConfig cfg, DeviceDescription deviceDescription,
-                                                     DeviceId deviceId) {
-            SparseAnnotations originalAnnotations = deviceDescription.annotations();
-            DefaultAnnotations.Builder newBuilder = DefaultAnnotations.builder();
-            if (cfg.driver() != deviceId.toString()) {
-                newBuilder.set(cfg.DRIVER, cfg.driver());
-            }
-            if (cfg.type() != Type.SWITCH) {
-                newBuilder.set(cfg.TYPE, cfg.type().toString());
-            }
-            if (cfg.name() != null) {
-                newBuilder.set(cfg.NAME, cfg.name());
-            }
-            if (cfg.latitude() != -1) {
-                newBuilder.set(cfg.LATITUDE, Double.toString(cfg.latitude()));
-            }
-            if (cfg.longitude() != -1) {
-                newBuilder.set(cfg.LONGITUDE, Double.toString(cfg.longitude()));
-            }
-            if (cfg.rackAddress() != null) {
-                newBuilder.set(cfg.RACK_ADDRESS, cfg.rackAddress());
-            }
-            if (cfg.owner() != null) {
-                newBuilder.set(cfg.OWNER, cfg.owner());
-            }
-            DefaultAnnotations newAnnotations = newBuilder.build();
-            return DefaultAnnotations.union(originalAnnotations, newAnnotations);
-        }
     }
 
     // Applies the specified role to the device; ignores NONE