Adding ability to project device, link and host model as alternate entities.

Change-Id: If23c018b024a3bbe693f0e66888c5f1707e3f66d
diff --git a/core/api/src/main/java/org/onosproject/net/DefaultDevice.java b/core/api/src/main/java/org/onosproject/net/DefaultDevice.java
index f3f0fe7..401740a 100644
--- a/core/api/src/main/java/org/onosproject/net/DefaultDevice.java
+++ b/core/api/src/main/java/org/onosproject/net/DefaultDevice.java
@@ -15,12 +15,15 @@
  */
 package org.onosproject.net;
 
-import org.onosproject.net.provider.ProviderId;
 import org.onlab.packet.ChassisId;
+import org.onosproject.net.driver.Driver;
+import org.onosproject.net.driver.DriverData;
+import org.onosproject.net.provider.ProviderId;
 
 import java.util.Objects;
 
 import static com.google.common.base.MoreObjects.toStringHelper;
+import static org.onlab.util.Tools.nullIsNotFound;
 
 /**
  * Default infrastructure device model implementation.
@@ -105,6 +108,33 @@
         return chassisId;
     }
 
+    /**
+     * Returns self as an immutable driver data instance.
+     *
+     * @return self as driver data
+     */
+    protected DriverData asData() {
+        return new DeviceDriverData();
+    }
+
+    @Override
+    protected Driver locateDriver() {
+        Driver driver = super.locateDriver();
+        return driver != null ? driver :
+                nullIsNotFound(driverService().getDriver(manufacturer, hwVersion, swVersion),
+                               "Driver not found");
+    }
+
+    /**
+     * Projection of the parent entity as a driver data entity.
+     */
+    protected class DeviceDriverData extends AnnotationDriverData {
+        @Override
+        public DeviceId deviceId() {
+            return id();
+        }
+    }
+
     @Override
     public int hashCode() {
         return Objects.hash(id, type, manufacturer, hwVersion, swVersion, serialNumber);
@@ -136,6 +166,7 @@
                 .add("hwVersion", hwVersion)
                 .add("swVersion", swVersion)
                 .add("serialNumber", serialNumber)
+                .add("driver", driver() != null ? driver().name() : "")
                 .toString();
     }