changeset 1944:328d0595e5ee

Possible IOOBE in ThreadTableView review-thread: http://icedtea.classpath.org/pipermail/thermostat/2016-June/019799.html reviewed-by: jerboaa PR3027
author Mario Torre <neugens.limasoftware@gmail.com>
date Mon, 27 Jun 2016 14:30:03 +0200
parents bf03ca16dabf
children 0bcf2b7b82b7
files thread/client-swing/src/main/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableView.java thread/client-swing/src/test/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableViewTest.java
diffstat 2 files changed, 64 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/thread/client-swing/src/main/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableView.java	Thu Jun 23 15:59:55 2016 +0200
+++ b/thread/client-swing/src/main/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableView.java	Mon Jun 27 14:30:03 2016 +0200
@@ -130,6 +130,7 @@
             @Override
             public void run() {
                 beans.clear();
+                currentSelection = -1;
 
                 ThreadViewTableModel model = (ThreadViewTableModel) table.getModel();
                 model.clear();
@@ -156,14 +157,18 @@
         SwingUtilities.invokeLater(new Runnable() {
             @Override
             public void run() {
-                
+                int selectedRow = -1;
+
+                ThreadViewTableModel model = (ThreadViewTableModel) table.getModel();
+                // just ignore the selection is the model has been cleared
+                if (!model.infos.isEmpty()) {
+                    selectedRow = table.getSelectedRow();
+                }
+
                 // reset the selection for the next iteration
                 // everything is happening in one thread, so there's no fear
                 currentSelection = -1;
-                
-                ThreadViewTableModel model = (ThreadViewTableModel) table.getModel();
-                int selectedRow = table.getSelectedRow();
-                
+
                 ThreadTableBean info = null;
                 if (selectedRow != -1) {
                     info = model.infos.get(selectedRow);
@@ -249,8 +254,10 @@
         }
 
         void clear() {
+            setRowCount(0);
             infos.clear();
-            setRowCount(0);
+
+            fireTableDataChanged();
         }
 
         @Override
@@ -271,6 +278,9 @@
         
         @Override
         public Object getValueAt(int row, int column) {
+            if (infos.isEmpty() || infos.size() < row) {
+                return "n/a";
+            }
 
             DecimalFormat format = new DecimalFormat("###.00");
 
--- a/thread/client-swing/src/test/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableViewTest.java	Thu Jun 23 15:59:55 2016 +0200
+++ b/thread/client-swing/src/test/java/com/redhat/thermostat/thread/client/swing/impl/SwingThreadTableViewTest.java	Mon Jun 27 14:30:03 2016 +0200
@@ -39,25 +39,26 @@
 import com.redhat.thermostat.annotations.internal.CacioTest;
 import com.redhat.thermostat.test.Bug;
 import com.redhat.thermostat.thread.client.common.ThreadTableBean;
-import com.redhat.thermostat.thread.client.swing.impl.SwingThreadTableView;
 import net.java.openjdk.cacio.ctc.junit.CacioFESTRunner;
 import org.fest.swing.annotation.GUITest;
+import org.fest.swing.edt.FailOnThreadViolationRepaintManager;
 import org.fest.swing.edt.GuiActionRunner;
 import org.fest.swing.edt.GuiTask;
 import org.fest.swing.fixture.FrameFixture;
+import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 import org.junit.runner.RunWith;
-import org.mockito.Mockito;
 
 import javax.swing.JFrame;
 import javax.swing.SwingUtilities;
+import javax.swing.event.TableModelEvent;
+import javax.swing.event.TableModelListener;
 
-import java.awt.Component;
-import java.awt.Toolkit;
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
 /**
@@ -70,6 +71,17 @@
     private JFrame frame;
     private FrameFixture frameFixture;
 
+    @BeforeClass
+    public static void setUpOnce() {
+        FailOnThreadViolationRepaintManager.install();
+    }
+
+    @After
+    public void tearDown() {
+        frameFixture.cleanUp();
+        frameFixture = null;
+    }
+
     @Before
     public void setUp() {
         GuiActionRunner.execute(new GuiTask() {
@@ -121,4 +133,34 @@
         assertFalse(view.getBeans().containsKey(bean0));
         assertFalse(view.getInfos().contains(bean0));
     }
+
+    @Category(GUITest.class)
+    @GUITest
+    @Test
+    public void clearNotifyModelChange() throws Exception {
+
+        frameFixture.show();
+
+        final boolean [] result = new boolean[1];
+
+        frameFixture.table("threadBeansTable").target.getModel().
+                addTableModelListener(new TableModelListener() {
+                                          @Override
+                                          public void tableChanged(TableModelEvent e) {
+                                              result[0] = true;
+                                          }
+                                      }
+                );
+
+        view.clear();
+
+        SwingUtilities.invokeAndWait(new Runnable() {
+            @Override
+            public void run() {
+                // just flush pending events
+            }
+        });
+
+        assertTrue(result[0]);
+    }
 }