changeset 315:a1c880bbe8a1

Fix application shutdown. Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-May/001401.html
author Roman Kennke <rkennke@redhat.com>
date Fri, 18 May 2012 15:25:57 +0200
parents ff110704a157
children bb3c20b82ce3 37659cac5fd4
files client/core/src/main/java/com/redhat/thermostat/client/MainWindowControllerImpl.java client/core/src/main/java/com/redhat/thermostat/client/UiFacadeFactory.java client/core/src/main/java/com/redhat/thermostat/client/UiFacadeFactoryImpl.java client/core/src/main/java/com/redhat/thermostat/client/osgi/ThermostatActivator.java client/core/src/test/java/com/redhat/thermostat/client/MainWindowControllerImplTest.java
diffstat 5 files changed, 52 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/client/core/src/main/java/com/redhat/thermostat/client/MainWindowControllerImpl.java	Fri May 18 07:17:35 2012 -0400
+++ b/client/core/src/main/java/com/redhat/thermostat/client/MainWindowControllerImpl.java	Fri May 18 15:25:57 2012 +0200
@@ -41,6 +41,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
+import org.osgi.framework.BundleException;
+
 import com.redhat.thermostat.client.osgi.service.VMContextAction;
 import com.redhat.thermostat.client.ui.AboutDialog;
 import com.redhat.thermostat.client.ui.AgentConfigurationController;
@@ -199,16 +201,30 @@
                     handleVMHooks(evt);
                     break;
                 case SHUTDOWN:
-                    view.hideMainWindow();
-                    ApplicationContext.getInstance().getTimerFactory().shutdown();
+                    shutdownApplication();
                     break;
                 default:
                     throw new IllegalStateException("unhandled action");
                 }
             }
+
         });
     }
 
+    private void shutdownApplication() {
+        view.hideMainWindow();
+        ApplicationContext.getInstance().getTimerFactory().shutdown();
+        shutdownOSGiFramework();
+    }
+
+    private void shutdownOSGiFramework() {
+        try {
+            facadeFactory.getBundleContext().getBundle(0).stop();
+        } catch (BundleException e) {
+            logger.log(Level.SEVERE, "Unexpected error during OSGi framework shutdown", e);
+        }
+    }
+
     private void handleVMHooks(ActionEvent<MainView.Action> event) {
         Object payload = event.getPayload();
         if (payload instanceof VMContextAction) { 
--- a/client/core/src/main/java/com/redhat/thermostat/client/UiFacadeFactory.java	Fri May 18 07:17:35 2012 -0400
+++ b/client/core/src/main/java/com/redhat/thermostat/client/UiFacadeFactory.java	Fri May 18 15:25:57 2012 +0200
@@ -38,6 +38,8 @@
 
 import java.util.Collection;
 
+import org.osgi.framework.BundleContext;
+
 import com.redhat.thermostat.client.osgi.service.VMContextAction;
 import com.redhat.thermostat.client.osgi.service.VmInformationService;
 import com.redhat.thermostat.client.ui.HostInformationController;
@@ -62,4 +64,6 @@
 
     Collection<VMContextAction> getVMContextActions();
     void addVMContextAction(VMContextAction service);
+
+    BundleContext getBundleContext();
 }
--- a/client/core/src/main/java/com/redhat/thermostat/client/UiFacadeFactoryImpl.java	Fri May 18 07:17:35 2012 -0400
+++ b/client/core/src/main/java/com/redhat/thermostat/client/UiFacadeFactoryImpl.java	Fri May 18 15:25:57 2012 +0200
@@ -39,6 +39,8 @@
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.osgi.framework.BundleContext;
+
 import com.redhat.thermostat.client.osgi.service.VMContextAction;
 import com.redhat.thermostat.client.osgi.service.VmInformationService;
 import com.redhat.thermostat.client.ui.HostInformationController;
@@ -50,9 +52,15 @@
 
 public class UiFacadeFactoryImpl implements UiFacadeFactory {
 
+    private BundleContext context;
+
     private Collection<VmInformationService> vmInformationServices = new ArrayList<>();
     private Collection<VMContextAction> contextAction = new ArrayList<>();
     
+    public UiFacadeFactoryImpl(BundleContext context) {
+        this.context = context;
+    }
+
     @Override
     public MainWindowController getMainWindow() {
         MainView mainView = new MainWindow();
@@ -96,4 +104,9 @@
     public void addVMContextAction(VMContextAction service) {
         contextAction.add(service);
     }
+
+    @Override
+    public BundleContext getBundleContext() {
+        return context;
+    }
 }
--- a/client/core/src/main/java/com/redhat/thermostat/client/osgi/ThermostatActivator.java	Fri May 18 07:17:35 2012 -0400
+++ b/client/core/src/main/java/com/redhat/thermostat/client/osgi/ThermostatActivator.java	Fri May 18 15:25:57 2012 +0200
@@ -52,7 +52,7 @@
     
     @Override
     public void start(final BundleContext context) throws Exception {
-        UiFacadeFactory uiFacadeFactory = new UiFacadeFactoryImpl();
+        UiFacadeFactory uiFacadeFactory = new UiFacadeFactoryImpl(context);
         
         vmInfoServiceTracker = new VmInformationServiceTracker(context, uiFacadeFactory);
         vmInfoServiceTracker.open();
--- a/client/core/src/test/java/com/redhat/thermostat/client/MainWindowControllerImplTest.java	Fri May 18 07:17:35 2012 -0400
+++ b/client/core/src/test/java/com/redhat/thermostat/client/MainWindowControllerImplTest.java	Fri May 18 15:25:57 2012 +0200
@@ -43,9 +43,9 @@
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-import static org.mockito.Mockito.times;
 
 import java.awt.Component;
 import java.lang.reflect.InvocationTargetException;
@@ -59,6 +59,9 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
 
 import com.redhat.thermostat.client.osgi.service.VMContextAction;
 import com.redhat.thermostat.client.ui.SummaryController;
@@ -343,4 +346,16 @@
         verify(action1, times(1)).execute(any(VmRef.class));
         verify(action2, times(0)).execute(any(VmRef.class));
     }
+
+   @Test
+   public void testOSGiFrameworkShutdown() throws BundleException {
+       Bundle systemBundle = mock(Bundle.class);
+       BundleContext ctx = mock(BundleContext.class);
+       when(ctx.getBundle(0)).thenReturn(systemBundle);
+       when(uiFacadeFactory.getBundleContext()).thenReturn(ctx);
+
+       l.actionPerformed(new ActionEvent<MainView.Action>(view, MainView.Action.SHUTDOWN));
+
+       verify(systemBundle).stop();
+   }
 }