Fixing a discrepancy in driver manager implementation.
Change-Id: I774a3ed26dc6d34d6bdc5834e8e38d4d1741c5ed
diff --git a/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverProvider.java b/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverProvider.java
index b2b5281..23d1047 100644
--- a/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverProvider.java
+++ b/core/api/src/main/java/org/onosproject/net/driver/DefaultDriverProvider.java
@@ -45,19 +45,17 @@
}
/**
- * Adds the specified driver to the provider.
+ * Adds the specified driver to the provider. If a driver with the same
+ * does not exist yet, the specified one will be added. Otherwise, the
+ * existing driver will be merged with the new one and the result will be
+ * registered.
*
* @param driver driver to be provided
+ * @return registered driver
*/
- public void addDriver(Driver driver) {
- Driver ddc = drivers.get(driver.name());
- if (ddc == null) {
- // If we don't have the driver yet, just use the new one.
- drivers.put(driver.name(), driver);
- } else {
- // Otherwise merge the existing driver with the new one and rebind.
- drivers.put(driver.name(), ddc.merge(driver));
- }
+ public Driver addDriver(Driver driver) {
+ return drivers.compute(driver.name(), (name, oldDriver) ->
+ oldDriver == null ? driver : oldDriver.merge(driver));
}
/**
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 c793ca4..72492db 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
@@ -89,10 +89,10 @@
@Override
public void registerProvider(DriverProvider provider) {
provider.getDrivers().forEach(driver -> {
- addDrivers(provider.getDrivers());
+ Driver d = addDriver(driver);
driverByKey.put(key(driver.manufacturer(),
driver.hwVersion(),
- driver.swVersion()), driver);
+ driver.swVersion()), d);
});
providers.add(provider);
}
@@ -100,7 +100,7 @@
@Override
public void unregisterProvider(DriverProvider provider) {
provider.getDrivers().forEach(driver -> {
- removeDrivers(provider.getDrivers());
+ removeDriver(driver);
driverByKey.remove(key(driver.manufacturer(),
driver.hwVersion(),
driver.swVersion()));
@@ -111,7 +111,6 @@
@Override
public Set<Driver> getDrivers() {
checkPermission(DRIVER_READ);
-
ImmutableSet.Builder<Driver> builder = ImmutableSet.builder();
drivers.values().forEach(builder::add);
return builder.build();
@@ -120,7 +119,6 @@
@Override
public Set<Driver> getDrivers(Class<? extends Behaviour> withBehaviour) {
checkPermission(DRIVER_READ);
-
return drivers.values().stream()
.filter(d -> d.hasBehaviour(withBehaviour))
.collect(Collectors.toSet());
@@ -129,7 +127,6 @@
@Override
public Driver getDriver(String driverName) {
checkPermission(DRIVER_READ);
-
return nullIsNotFound(drivers.get(driverName), NO_DRIVER);
}
@@ -182,7 +179,6 @@
@Override
public DriverHandler createHandler(DeviceId deviceId, String... credentials) {
checkPermission(DRIVER_WRITE);
-
Driver driver = getDriver(deviceId);
return new DefaultDriverHandler(new DefaultDriverData(driver, deviceId));
}