Mercurial > hg > release > thermostat-1.6
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]); + } }