Prevent NPE if an event comes in during start up

Change-Id: I00c3a8c587c382c551d2b7212cf3d689c872fe1d
diff --git a/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index c75de3c..acef076 100644
--- a/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -308,6 +308,7 @@
     final InternalClusterListener clusterListener = new InternalClusterListener();
     //Completable future for network configuration process to buffer config events handling during activation
     private CompletableFuture<Boolean> networkConfigCompletion = null;
+    private final Object networkConfigCompletionLock = new Object();
     private List<Event> queuedEvents = new CopyOnWriteArrayList<>();
 
     // Handles device, link, topology and network config events
@@ -531,14 +532,16 @@
         linkHandler.init();
         l2TunnelHandler.init();
 
-        networkConfigCompletion.whenComplete((value, ex) -> {
-            //setting to null for easier fall through
-            networkConfigCompletion = null;
-            //process all queued events
-            queuedEvents.forEach(event -> {
-                mainEventExecutor.execute(new InternalEventHandler(event));
+        synchronized (networkConfigCompletionLock) {
+            networkConfigCompletion.whenComplete((value, ex) -> {
+                //setting to null for easier fall through
+                networkConfigCompletion = null;
+                //process all queued events
+                queuedEvents.forEach(event -> {
+                    mainEventExecutor.execute(new InternalEventHandler(event));
+                });
             });
-        });
+        }
 
         log.info("Started");
     }
@@ -1717,30 +1720,32 @@
             // The completable future is needed because of the async behaviour of the configureNetwork,
             // listener registration and event arrival
             // Enables us to buffer the events and execute them when the configure network is done.
-            networkConfigCompletion = new CompletableFuture<>();
+            synchronized (networkConfigCompletionLock) {
+                networkConfigCompletion = new CompletableFuture<>();
 
-            // add a small delay to absorb multiple network config added notifications
-            if (!programmingScheduled.get()) {
-                log.info("Buffering config calls for {} secs", PROGRAM_DELAY);
-                programmingScheduled.set(true);
-                mainEventExecutor.schedule(new ConfigChange(), PROGRAM_DELAY, TimeUnit.SECONDS);
+                // add a small delay to absorb multiple network config added notifications
+                if (!programmingScheduled.get()) {
+                    log.info("Buffering config calls for {} secs", PROGRAM_DELAY);
+                    programmingScheduled.set(true);
+                    mainEventExecutor.schedule(new ConfigChange(), PROGRAM_DELAY, TimeUnit.SECONDS);
+                }
+
+                createOrUpdateDeviceConfiguration();
+
+                arpHandler = new ArpHandler(srManager);
+                icmpHandler = new IcmpHandler(srManager);
+                ipHandler = new IpHandler(srManager);
+                routingRulePopulator = new RoutingRulePopulator(srManager);
+                createOrUpdateDefaultRoutingHandler();
+
+                tunnelHandler = new TunnelHandler(linkService, deviceConfiguration,
+                    groupHandlerMap, tunnelStore);
+                policyHandler = new PolicyHandler(appId, deviceConfiguration,
+                    flowObjectiveService,
+                    tunnelHandler, policyStore);
+                networkConfigCompletion.complete(true);
             }
 
-            createOrUpdateDeviceConfiguration();
-
-            arpHandler = new ArpHandler(srManager);
-            icmpHandler = new IcmpHandler(srManager);
-            ipHandler = new IpHandler(srManager);
-            routingRulePopulator = new RoutingRulePopulator(srManager);
-            createOrUpdateDefaultRoutingHandler();
-
-            tunnelHandler = new TunnelHandler(linkService, deviceConfiguration,
-                                              groupHandlerMap, tunnelStore);
-            policyHandler = new PolicyHandler(appId, deviceConfiguration,
-                                              flowObjectiveService,
-                                              tunnelHandler, policyStore);
-            networkConfigCompletion.complete(true);
-
             mcastHandler.init();
 
         }