Allowing driver loaders to refer to classes loaded by others.

Change-Id: Ife4e50758620d4c052a7bb81740d9b9305647317
diff --git a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
index 9f88bc7..9718610 100644
--- a/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
+++ b/core/net/src/main/java/org/onosproject/net/driver/impl/DriverManager.java
@@ -70,6 +70,7 @@
 
     private Set<DriverProvider> providers = Sets.newConcurrentHashSet();
     private Map<String, Driver> driverByKey = Maps.newConcurrentMap();
+    private Map<String, Class<? extends Behaviour>> classes = Maps.newConcurrentMap();
 
     @Activate
     protected void activate() {
@@ -80,6 +81,9 @@
     @Deactivate
     protected void deactivate() {
         AbstractProjectableModel.setDriverService(this, null);
+        providers.clear();
+        driverByKey.clear();
+        classes.clear();
         log.info("Stopped");
     }
 
@@ -95,6 +99,11 @@
             driverByKey.put(key(driver.manufacturer(),
                                 driver.hwVersion(),
                                 driver.swVersion()), d);
+            d.behaviours().forEach(b -> {
+                Class<? extends Behaviour> implementation = d.implementation(b);
+                classes.put(b.getName(), b);
+                classes.put(implementation.getName(), implementation);
+            });
         });
         providers.add(provider);
     }
@@ -111,6 +120,11 @@
     }
 
     @Override
+    public Class<? extends Behaviour> getBehaviourClass(String className) {
+        return classes.get(className);
+    }
+
+    @Override
     public Set<Driver> getDrivers() {
         checkPermission(DRIVER_READ);
         ImmutableSet.Builder<Driver> builder = ImmutableSet.builder();