[Emu] new ResourceService related bug fixes

- ResourceDeviceListener should also react to availability events.
- Should check if device supports the behavior before
  retrieving Behaviour class
- ResourceManager should unregister when requested
- opticalUtils was specifying wrong driver name. Should've been "linc-oe"

Change-Id: I9364b6307cb537b04b57ac00f2451c13e3379471
diff --git a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
index bfc6a99..46aeeb0 100644
--- a/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
+++ b/core/net/src/main/java/org/onosproject/net/newresource/impl/ResourceDeviceListener.java
@@ -32,6 +32,8 @@
 import org.onosproject.net.behaviour.VlanQuery;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.driver.Driver;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.net.newresource.ResourceAdminService;
@@ -67,18 +69,22 @@
     private static final List<TributarySlot> ENTIRE_ODU4_TRIBUTARY_SLOTS = getEntireOdu4TributarySlots();
 
     private final ResourceAdminService adminService;
+    private final DeviceService deviceService;
     private final DriverService driverService;
     private final ExecutorService executor;
 
+
     /**
      * Creates an instance with the specified ResourceAdminService and ExecutorService.
      *
      * @param adminService instance invoked to register resources
+     * @param deviceService {@link DeviceService} to be used.
      * @param executor executor used for processing resource registration
      */
-    ResourceDeviceListener(ResourceAdminService adminService, DriverService driverService,
+    ResourceDeviceListener(ResourceAdminService adminService, DeviceService deviceService, DriverService driverService,
                            ExecutorService executor) {
         this.adminService = checkNotNull(adminService);
+        this.deviceService = checkNotNull(deviceService);
         this.driverService = checkNotNull(driverService);
         this.executor = checkNotNull(executor);
     }
@@ -93,8 +99,21 @@
             case DEVICE_REMOVED:
                 unregisterDeviceResource(device);
                 break;
+            case DEVICE_AVAILABILITY_CHANGED:
+                if (deviceService.isAvailable(device.id())) {
+                    registerDeviceResource(device);
+                    // TODO: do we need to walk the ports?
+                } else {
+                    unregisterDeviceResource(device);
+                }
+                break;
             case PORT_ADDED:
-                registerPortResource(device, event.port());
+            case PORT_UPDATED:
+                if (event.port().isEnabled()) {
+                    registerPortResource(device, event.port());
+                } else {
+                    unregisterPortResource(device, event.port());
+                }
                 break;
             case PORT_REMOVED:
                 unregisterPortResource(device, event.port());
@@ -168,12 +187,22 @@
 
     private SortedSet<OchSignal> queryLambdas(DeviceId did, PortNumber port) {
         try {
+            // DriverHandler does not provide a way to check if a
+            // behaviour is supported.
+            Driver driver = driverService.getDriver(did);
+            if (driver == null || !driver.hasBehaviour(LambdaQuery.class)) {
+                return Collections.emptySortedSet();
+            }
             DriverHandler handler = driverService.createHandler(did);
             if (handler == null) {
                 return Collections.emptySortedSet();
             }
             LambdaQuery query = handler.behaviour(LambdaQuery.class);
-            return query.queryLambdas(port);
+            if (query != null) {
+                return query.queryLambdas(port);
+            } else {
+                return Collections.emptySortedSet();
+            }
         } catch (ItemNotFoundException e) {
             return Collections.emptySortedSet();
         }
@@ -181,6 +210,14 @@
 
     private boolean isVlanEnabled(DeviceId device, PortNumber port) {
         try {
+            // DriverHandler does not provide a way to check if a
+            // behaviour is supported.
+            Driver driver = driverService.getDriver(device);
+            if (driver == null || !driver.hasBehaviour(VlanQuery.class)) {
+                // device does not support this
+                return false;
+            }
+
             DriverHandler handler = driverService.createHandler(device);
             if (handler == null) {
                 return false;
@@ -195,6 +232,13 @@
 
     private boolean isMplsEnabled(DeviceId device, PortNumber port) {
         try {
+            // DriverHandler does not provide a way to check if a
+            // behaviour is supported.
+            Driver driver = driverService.getDriver(device);
+            if (driver == null || !driver.hasBehaviour(MplsQuery.class)) {
+                // device does not support this
+                return false;
+            }
             DriverHandler handler = driverService.createHandler(device);
             if (handler == null) {
                 return false;