Fix ONOS-7958 - problems that were causing failures when onos-core restarts

Change-Id: I186107a386827d66f017182a573377a6a7bb7b00
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
index 42af52e..2fa8abb 100644
--- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
@@ -364,10 +364,16 @@
                     } else if (!Objects.equals(globalValue, localValue)) {
                         // If the local value is different from global value
                         // validate the global value and apply it locally.
+                        String newValue;
+                        if (globalValue != null) {
+                            newValue = globalValue;
+                        } else {
+                            newValue = localValue;
+                        }
                         log.debug("Setting {} property {} to {}",
-                                  componentName, name, globalValue);
-                        checkValidity(componentName, name, globalValue);
-                        set(componentName, name, globalValue);
+                                  componentName, name, newValue);
+                        checkValidity(componentName, name, newValue);
+                        set(componentName, name, newValue);
 
                     } else {
                         // Otherwise, simply update the registered property
@@ -377,8 +383,8 @@
                         map.put(name, ConfigProperty.setProperty(p, globalValue));
                     }
                 } catch (IllegalArgumentException e) {
-                    log.warn("Value {} is not a valid {}; using default",
-                             globalValue, p.type());
+                    log.warn("Value {} for property {} is not a valid {}; using default",
+                             globalValue, name, p.type());
                     reset(componentName, name);
                 }
             }
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 8ed8a57..e274ae8 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
@@ -1064,7 +1064,9 @@
         private DeviceId extractDeviceId(NetworkConfigEvent event) {
             DeviceId deviceId = null;
             if (event.configClass().equals(PortAnnotationConfig.class)) {
-                deviceId = ((ConnectPoint) event.subject()).deviceId();
+                if (event.subject().getClass() == ConnectPoint.class) {
+                    deviceId = ((ConnectPoint) event.subject()).deviceId();
+                }
             } else if (event.subject().getClass() == DeviceId.class) {
                 deviceId = (DeviceId) event.subject();
             }
diff --git a/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java b/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java
index 1bb8fa5..a85c5ff 100644
--- a/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java
+++ b/utils/misc/src/main/java/org/onlab/util/SharedScheduledExecutors.java
@@ -36,28 +36,37 @@
 
     public static final int DEFAULT_POOL_SIZE = 30;
 
-    private static SharedScheduledExecutorService singleThreadExecutor =
-            new SharedScheduledExecutorService(
-                    newSingleThreadScheduledExecutor(
-                            groupedThreads("onos/shared/scheduled",
-                                           "onos-single-executor")));
+    private static SharedScheduledExecutorService singleThreadExecutor = null;
 
-    private static SharedScheduledExecutorService poolThreadExecutor =
-            new SharedScheduledExecutorService(
-                    newScheduledThreadPool(DEFAULT_POOL_SIZE,
-                            groupedThreads("onos/shared/scheduled",
-                                           "onos-pool-executor-%d")));
+    private static SharedScheduledExecutorService poolThreadExecutor = null;
 
     // Ban public construction
     private SharedScheduledExecutors() {
     }
 
+    private static void setup() {
+        if (singleThreadExecutor == null) {
+            singleThreadExecutor =
+                new SharedScheduledExecutorService(
+                    newSingleThreadScheduledExecutor(
+                        groupedThreads("onos/shared/scheduled",
+                            "onos-single-executor")));
+
+            poolThreadExecutor =
+                new SharedScheduledExecutorService(
+                    newScheduledThreadPool(DEFAULT_POOL_SIZE,
+                        groupedThreads("onos/shared/scheduled",
+                            "onos-pool-executor-%d")));
+        }
+    }
+
     /**
      * Returns the shared scheduled single thread executor.
      *
      * @return shared scheduled single thread executor
      */
     public static SharedScheduledExecutorService getSingleThreadExecutor() {
+        setup();
         return singleThreadExecutor;
     }
 
@@ -71,6 +80,7 @@
      *         and whose get() method will return null upon completion
      */
     public static ScheduledFuture<?> newTimeout(Runnable task, long delay, TimeUnit unit) {
+        setup();
         return SharedScheduledExecutors.getPoolThreadExecutor()
                 .schedule(task, delay, unit);
     }
@@ -81,6 +91,7 @@
      * @return shared scheduled executor pool
      */
     public static SharedScheduledExecutorService getPoolThreadExecutor() {
+        setup();
         return poolThreadExecutor;
     }
 
@@ -90,6 +101,7 @@
      * @param poolSize new pool size
      */
     public static void setPoolSize(int poolSize) {
+        setup();
         checkArgument(poolSize > 0, "Shared pool size size must be greater than 0");
         poolThreadExecutor.setBackingExecutor(
                 newScheduledThreadPool(poolSize, groupedThreads("onos/shared/scheduled",
@@ -102,6 +114,8 @@
      */
     public static void shutdown() {
         singleThreadExecutor.backingExecutor().shutdown();
+        singleThreadExecutor = null;
         poolThreadExecutor.backingExecutor().shutdown();
+        poolThreadExecutor = null;
     }
 }