# HG changeset patch # User Jon VanAlten # Date 1369868128 21600 # Node ID 625f166f74d1acc462b743df0b95cd3e731a4498 # Parent 49f6272156ffa4ae25e2d24ba54cec5f701aaf3c 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 diff -r 49f6272156ff -r 625f166f74d1 client/swing/src/main/java/com/redhat/thermostat/client/swing/internal/MainWindowControllerImpl.java --- 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> hostTreeDecorators = new CopyOnWriteArrayList<>(); private final CopyOnWriteArrayList> 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 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() { + private void initView() { + view.setWindowTitle(appInfo.getName()); + view.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent 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(); }