changeset 1125:625f166f74d1

Fix race condition in MainWindowControllerImpl can cause NPE (PR1456) Reviewed-by: jerboaa Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2013-May/006901.html PR1456
author Jon VanAlten <jon.vanalten@redhat.com>
date Wed, 29 May 2013 16:55:28 -0600
parents 49f6272156ff
children de5f9dc2154c
files client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindowControllerImpl.java
diffstat 1 files changed, 15 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindowControllerImpl.java	Fri May 31 12:15:17 2013 -0400
+++ b/client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindowControllerImpl.java	Wed May 29 16:55:28 2013 -0600
@@ -109,6 +109,8 @@
     private final CopyOnWriteArrayList<DecoratorProvider<HostRef>> hostTreeDecorators = new CopyOnWriteArrayList<>();
     private final CopyOnWriteArrayList<DecoratorProvider<VmRef>> vmTreeDecorators = new CopyOnWriteArrayList<>();
 
+    private final ApplicationInfo appInfo = new ApplicationInfo();
+
     private ApplicationService appSvc;
     private Timer backgroundUpdater;
 
@@ -125,8 +127,6 @@
     private VmInformationViewProvider vmInfoViewProvider;
     private AgentInformationViewProvider agentInfoViewProvider;
     private ClientConfigViewProvider clientConfigViewProvider;
-    
-    private ApplicationInfo appInfo;
 
     private InformationServiceTracker infoServiceTracker;
     private HostContextActionServiceTracker hostContextActionTracker;
@@ -134,6 +134,7 @@
     private MultipleServiceTracker depTracker;
     
     private CountDownLatch shutdown;
+    private CountDownLatch initViewLatch = new CountDownLatch(1);
 
     private MenuRegistry menuRegistry;
     private ActionListener<ThermostatExtensionRegistry.Action> menuListener =
@@ -200,6 +201,7 @@
             RegistryFactory registryFactory,
             final CountDownLatch shutdown) {
         this.appSvc = appSvc;
+        this.view = view;
         try {
             vmFilterRegistry = registryFactory.createVmFilterRegistry();
             hostFilterRegistry = registryFactory.createHostFilterRegistry();
@@ -265,13 +267,11 @@
                 Objects.requireNonNull(agentInfoViewProvider);
                 clientConfigViewProvider = (ClientConfigViewProvider) services.get(ClientConfigViewProvider.class.getName());
                 Objects.requireNonNull(clientConfigViewProvider);
-                
-                initView(view);
+
+                initView();
 
                 vmInfoControllerProvider = new VmInformationControllerProvider();
 
-                appInfo = new ApplicationInfo();
-                view.setWindowTitle(appInfo.getName());
                 initializeTimer();
 
                 updateView();
@@ -352,9 +352,9 @@
         view.updateTree(hostFilters, vmFilters, hostTreeDecorators, vmTreeDecorators, loader);
     }
 
-    private void initView(MainView mainView) {
-        this.view = mainView;
-        mainView.addActionListener(new ActionListener<MainView.Action>() {
+    private void initView() {
+        view.setWindowTitle(appInfo.getName());
+        view.addActionListener(new ActionListener<MainView.Action>() {
 
             @Override
             public void actionPerformed(ActionEvent<MainView.Action> evt) {
@@ -401,6 +401,7 @@
             }
 
         });
+        initViewLatch.countDown();
     }
 
     /*
@@ -510,6 +511,11 @@
 
     @Override
     public void showMainMainWindow() {
+        try {
+            initViewLatch.await();
+        } catch (InterruptedException e) {
+            logger.warning("Interrupted while awaiting view initialization.");
+        }
         view.showMainWindow();
     }