diff --git a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java index 5bc2f0687a9..542e1cb3c16 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/DefaultRowSorter.java @@ -182,6 +182,8 @@ public abstract class DefaultRowSorter extends RowSorter { */ private int modelRowCount; + // Whether to print warning about JDK-8160087 + private static boolean warning8160087 = true; /** * Creates an empty DefaultRowSorter. @@ -489,10 +491,7 @@ public abstract class DefaultRowSorter extends RowSorter { */ public int convertRowIndexToView(int index) { if (modelToView == null) { - if (index < 0 || index >= modelRowCount) { - throw new IndexOutOfBoundsException("Invalid index"); - } - return index; + return convertUnsortedUnfiltered(index); } return modelToView[index]; } @@ -504,14 +503,30 @@ public abstract class DefaultRowSorter extends RowSorter { */ public int convertRowIndexToModel(int index) { if (viewToModel == null) { - if (index < 0 || index >= modelRowCount) { - throw new IndexOutOfBoundsException("Invalid index"); - } - return index; + return convertUnsortedUnfiltered(index); } return viewToModel[index].modelIndex; } + private int convertUnsortedUnfiltered(int index) { + if (index < 0 || index >= modelRowCount) { + if(index >= modelRowCount && + index < getModelWrapper().getRowCount()) { + // 8160087 + if(warning8160087) { + warning8160087 = false; + System.err.println("WARNING: row index is bigger than " + + "sorter's row count. Most likely this is a wrong " + + "sorter usage."); + } + } else { + throw new IndexOutOfBoundsException("Invalid index"); + } + } + return index; + } + + private boolean isUnsorted() { List keys = getSortKeys(); int keySize = keys.size(); diff --git a/jdk/test/javax/swing/JTable/SorterIOOBEtest/DefaultRowSorterIOOBEtest.java b/jdk/test/javax/swing/JTable/SorterIOOBEtest/DefaultRowSorterIOOBEtest.java new file mode 100644 index 00000000000..fec08479521 --- /dev/null +++ b/jdk/test/javax/swing/JTable/SorterIOOBEtest/DefaultRowSorterIOOBEtest.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8160087 + * @summary Change IOOBE to warning in the scenarios when it had not being + * thrown before the JDK-8078514 + * @run main/othervm DefaultRowSorterIOOBEtest + */ + +import javax.swing.*; +import javax.swing.table.AbstractTableModel; +import javax.swing.table.TableModel; +import javax.swing.table.TableRowSorter; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +public class DefaultRowSorterIOOBEtest extends TableRowSorter { + static List rows = new ArrayList<>(); + + static TableModel tableModel = new AbstractTableModel() { + + @Override + public int getRowCount() { + return rows.size(); + } + + @Override + public int getColumnCount() { + return 1; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return rows.get(rowIndex); + } + }; + + public static void main(String[] args) { + DefaultRowSorter sorter = + new DefaultRowSorter<>() { + { + setModelWrapper(new SorterModelWrapper()); + } + }; + + PrintStream err = System.err; + ByteArrayOutputStream bos = new ByteArrayOutputStream(10000) { + @Override + public synchronized void write(byte[] b, int off, int len) { + super.write(b, off, len); + err.print(new String(b, off, len)); + } + }; + System.setErr(new PrintStream(bos)); + + rows.add("New"); + + sorter.convertRowIndexToView(0); + sorter.convertRowIndexToModel(0); + + String out = new String(bos.toByteArray()); + if(out.indexOf("WARNING:") < 0) { + throw new RuntimeException("No warnings found"); + } + } + + static class SorterModelWrapper extends + DefaultRowSorter.ModelWrapper { + + @Override + public TableModel getModel() { + return tableModel; + } + + @Override + public int getColumnCount() { + return tableModel.getColumnCount(); + } + + @Override + public int getRowCount() { + return tableModel.getRowCount(); + } + + @Override + public Object getValueAt(int row, int column) { + return tableModel.getValueAt(row, column); + } + + @Override + public Integer getIdentifier(int row) { + return row; + } + } +}