changeset 394:963d557a7d00

Fix for crash during panel selection review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-June/001900.html reviewed-by: omajid
author Mario Torre <neugens.limasoftware@gmail.com>
date Tue, 19 Jun 2012 20:58:05 +0200
parents cb22cde2bd47
children 053bc97253ad
files client/core/src/main/java/com/redhat/thermostat/client/internal/MainWindowControllerImpl.java client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationController.java client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationPanel.java client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationView.java client/core/src/test/java/com/redhat/thermostat/client/internal/MainWindowControllerImplTest.java
diffstat 5 files changed, 88 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/client/core/src/main/java/com/redhat/thermostat/client/internal/MainWindowControllerImpl.java	Tue Jun 19 19:50:27 2012 +0200
+++ b/client/core/src/main/java/com/redhat/thermostat/client/internal/MainWindowControllerImpl.java	Tue Jun 19 20:58:05 2012 +0200
@@ -40,6 +40,8 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.logging.Level;
@@ -466,15 +468,23 @@
 
     private class VmInformationControllerProvider {
         private VmInformationController lastSelectedVM;
-
+        private Map<VmRef, Integer> selectedForVM = new ConcurrentHashMap<>();
+        
         VmInformationController getVmInfoController(VmRef vmRef) {
             int id = 0;
             if (lastSelectedVM != null) {
                 id = lastSelectedVM.getSelectedChildID();
             }
+            
             lastSelectedVM = facadeFactory.getVmController(vmRef);
-            lastSelectedVM.selectChildID(id);
+            if (!lastSelectedVM.selectChildID(id)) {
+                Integer _id = selectedForVM.get(vmRef);
+                id = _id != null? _id : 0;
+                lastSelectedVM.selectChildID(id);
+            }
 
+            selectedForVM.put(vmRef, id);
+            
             return lastSelectedVM;
         }
     }
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationController.java	Tue Jun 19 19:50:27 2012 +0200
+++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationController.java	Tue Jun 19 20:58:05 2012 +0200
@@ -86,8 +86,8 @@
         return view.getSelectedChildID();
     }
 
-    public void selectChildID(int id) {
-        view.selectChildID(id);
+    public boolean selectChildID(int id) {
+        return view.selectChildID(id);
     }
 
     public int getNumChildren() {
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationPanel.java	Tue Jun 19 19:50:27 2012 +0200
+++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationPanel.java	Tue Jun 19 20:58:05 2012 +0200
@@ -72,8 +72,12 @@
     }
 
     @Override
-    public void selectChildID(int id) {
-        tabPane.setSelectedIndex(id);
+    public boolean selectChildID(int id) {
+        if (tabPane.getComponentCount() > id) {
+            tabPane.setSelectedIndex(id);
+            return true;
+        }
+        return false;
     }
 
     @Override
--- a/client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationView.java	Tue Jun 19 19:50:27 2012 +0200
+++ b/client/core/src/main/java/com/redhat/thermostat/client/ui/VmInformationView.java	Tue Jun 19 20:58:05 2012 +0200
@@ -50,7 +50,7 @@
     Component getUiComponent();
 
     int getNumChildren();
-    void selectChildID(int id);
+    boolean selectChildID(int id);
     int getSelectedChildID();
 
 }
--- a/client/core/src/test/java/com/redhat/thermostat/client/internal/MainWindowControllerImplTest.java	Tue Jun 19 19:50:27 2012 +0200
+++ b/client/core/src/test/java/com/redhat/thermostat/client/internal/MainWindowControllerImplTest.java	Tue Jun 19 20:58:05 2012 +0200
@@ -40,6 +40,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.anyInt;
 import static org.mockito.Matchers.isA;
 import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.mock;
@@ -397,6 +398,7 @@
         VmInformationController vmInformationController = mock(VmInformationController.class);
         when(vmInformationController.getSelectedChildID()).thenReturn(3);
         when(uiFacadeFactory.getVmController(any(VmRef.class))).thenReturn(vmInformationController);
+        when(vmInformationController.selectChildID(anyInt())).thenReturn(true);
 
         l.actionPerformed(new ActionEvent<MainView.Action>(view, MainView.Action.HOST_VM_SELECTION_CHANGED));
 
@@ -417,7 +419,72 @@
 
         assertEquals(3, id);
     }
+    
+    @Test
+    public void verifyOpenSameHostVMTab2() {
 
+        VmRef vmRef1 = mock(VmRef.class);
+        VmRef vmRef2 = mock(VmRef.class);
+        when(view.getSelectedHostOrVm()).thenReturn(vmRef1).thenReturn(vmRef1).thenReturn(vmRef2).thenReturn(vmRef1);
+
+        VmInformationController vmInformationController1 = mock(VmInformationController.class);
+        VmInformationController vmInformationController2 = mock(VmInformationController.class);
+        
+        when(vmInformationController1.getSelectedChildID()).thenReturn(2).thenReturn(2);
+        when(vmInformationController2.getSelectedChildID()).thenReturn(3);
+        
+        when(vmInformationController1.selectChildID(0)).thenReturn(true);
+        when(vmInformationController1.selectChildID(2)).thenReturn(true);
+        when(vmInformationController1.selectChildID(3)).thenReturn(false);
+        
+        when(vmInformationController2.selectChildID(0)).thenReturn(true);
+        when(vmInformationController2.selectChildID(2)).thenReturn(true);
+        when(vmInformationController2.selectChildID(3)).thenReturn(true);
+        
+        when(uiFacadeFactory.getVmController(any(VmRef.class))).
+                             thenReturn(vmInformationController1).
+                             thenReturn(vmInformationController2).
+                             thenReturn(vmInformationController2).
+                             thenReturn(vmInformationController1);
+
+        l.actionPerformed(new ActionEvent<MainView.Action>(view, MainView.Action.HOST_VM_SELECTION_CHANGED));
+
+        ArgumentCaptor<Integer> arg = ArgumentCaptor.forClass(Integer.class);
+        verify(vmInformationController1).selectChildID(arg.capture());
+        verify(vmInformationController1, times(0)).getSelectedChildID();
+
+        int id = arg.getValue();
+
+        assertEquals(0, id);
+
+        l.actionPerformed(new ActionEvent<MainView.Action>(view, MainView.Action.HOST_VM_SELECTION_CHANGED));
+
+        arg = ArgumentCaptor.forClass(Integer.class);
+        verify(vmInformationController1).getSelectedChildID();
+        verify(vmInformationController2, times(1)).selectChildID(arg.capture());
+        id = arg.getValue();
+
+        assertEquals(2, id);
+        
+        l.actionPerformed(new ActionEvent<MainView.Action>(view, MainView.Action.HOST_VM_SELECTION_CHANGED));
+
+        arg = ArgumentCaptor.forClass(Integer.class);
+        verify(vmInformationController2, times(1)).getSelectedChildID();
+        verify(vmInformationController2, times(2)).selectChildID(arg.capture());
+        id = arg.getValue();
+
+        assertEquals(3, id);
+        
+        l.actionPerformed(new ActionEvent<MainView.Action>(view, MainView.Action.HOST_VM_SELECTION_CHANGED));
+
+        arg = ArgumentCaptor.forClass(Integer.class);
+        verify(vmInformationController2, times(2)).getSelectedChildID();
+        verify(vmInformationController1, times(3)).selectChildID(arg.capture());
+        id = arg.getValue();
+
+        assertEquals(2, id);
+    }
+    
     @Test
     public void verityVMActionsAreShown() {
         VmInfo vmInfo = new VmInfo(0, 1, 2, null, null, null, null, null, null, null, null, null, null, null);