/* * Copyright (c) 2015, 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. */ package test.rowset.cachedrowset; import java.math.BigDecimal; import java.sql.Array; import java.sql.Date; import java.sql.JDBCType; import java.sql.Ref; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.util.Collection; import javax.sql.RowSet; import javax.sql.rowset.CachedRowSet; import javax.sql.rowset.RowSetMetaDataImpl; import javax.sql.rowset.serial.SerialRef; import javax.sql.rowset.spi.SyncFactory; import javax.sql.rowset.spi.SyncProvider; import javax.sql.rowset.spi.SyncProviderException; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertNull; import static org.testng.Assert.assertTrue; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import test.rowset.CommonRowSetTests; import util.StubArray; import util.StubRef; import util.StubSyncProvider; import util.TestRowSetListener; public abstract class CommonCachedRowSetTests extends CommonRowSetTests { /* * DATATYPES Table column names */ private final String[] DATATYPES_COLUMN_NAMES = {"AINTEGER", "ACHAR", "AVARCHAR", "ALONG", "ABOOLEAN", "ASHORT", "ADOUBLE", "ABIGDECIMAL", "AREAL", "ABYTE", "ADATE", "ATIME", "ATIMESTAMP", "ABYTES", "ARRAY", "AREF", "AFLOAT"}; /* * Initializes a RowSet containing the DATAYPES data */ protected <T extends RowSet> T createDataTypesRowSet() throws SQLException { T rs = (T) newInstance(); initDataTypesMetaData((CachedRowSet) rs); createDataTypesRows(rs); // Make sure you are not on the insertRow rs.moveToCurrentRow(); return rs; } //DataProviders to use for common tests /* * DataProvider that uses a RowSet with the COFFEE_HOUSES Table */ @DataProvider(name = "rowsetUsingCoffeeHouses") protected Object[][] rowsetUsingCoffeeHouses() throws Exception { RowSet rs = createCoffeeHousesRowSet(); return new Object[][]{ {rs} }; } /* * DataProvider that uses a RowSet with the COFFEES Table */ @DataProvider(name = "rowsetUsingCoffees") protected Object[][] rowsetUsingCoffees() throws Exception { RowSet rs = createCoffeesRowSet(); return new Object[][]{ {rs} }; } /* * DataProvider that uses a RowSet with the DATAYPES Table and * used to validate the various supported data types */ @DataProvider(name = "rowsetUsingDataTypes") protected Object[][] rowsetUsingDataTypes() throws Exception { CachedRowSet rs = createDataTypesRowSet(); return new Object[][]{ {rs, JDBCType.INTEGER}, {rs, JDBCType.CHAR}, {rs, JDBCType.VARCHAR}, {rs, JDBCType.BIGINT}, {rs, JDBCType.BOOLEAN}, {rs, JDBCType.SMALLINT}, {rs, JDBCType.DOUBLE}, {rs, JDBCType.DECIMAL}, {rs, JDBCType.REAL}, {rs, JDBCType.TINYINT}, {rs, JDBCType.DATE}, {rs, JDBCType.TIME}, {rs, JDBCType.TIMESTAMP}, {rs, JDBCType.VARBINARY}, {rs, JDBCType.ARRAY}, {rs, JDBCType.REF}, {rs, JDBCType.FLOAT} }; } /* * Initializes the DATAYPES table metadata */ protected void initDataTypesMetaData(CachedRowSet crs) throws SQLException { RowSetMetaDataImpl rsmd = new RowSetMetaDataImpl(); crs.setType(RowSet.TYPE_SCROLL_INSENSITIVE); rsmd.setColumnCount(DATATYPES_COLUMN_NAMES.length); for (int i = 1; i <= DATATYPES_COLUMN_NAMES.length; i++) { rsmd.setColumnName(i, DATATYPES_COLUMN_NAMES[i - 1]); rsmd.setColumnLabel(i, rsmd.getColumnName(i)); } rsmd.setColumnType(1, Types.INTEGER); rsmd.setColumnType(2, Types.CHAR); rsmd.setColumnType(3, Types.VARCHAR); rsmd.setColumnType(4, Types.BIGINT); rsmd.setColumnType(5, Types.BOOLEAN); rsmd.setColumnType(6, Types.SMALLINT); rsmd.setColumnType(7, Types.DOUBLE); rsmd.setColumnType(8, Types.DECIMAL); rsmd.setColumnType(9, Types.REAL); rsmd.setColumnType(10, Types.TINYINT); rsmd.setColumnType(11, Types.DATE); rsmd.setColumnType(12, Types.TIME); rsmd.setColumnType(13, Types.TIMESTAMP); rsmd.setColumnType(14, Types.VARBINARY); rsmd.setColumnType(15, Types.ARRAY); rsmd.setColumnType(16, Types.REF); rsmd.setColumnType(17, Types.FLOAT); crs.setMetaData(rsmd); } /* * Add rows to DATAYPES table */ protected void createDataTypesRows(RowSet crs) throws SQLException { Integer aInteger = 100; String aChar = "Oswald Cobblepot"; Long aLong = Long.MAX_VALUE; Short aShort = Short.MAX_VALUE; Double aDouble = Double.MAX_VALUE; BigDecimal aBigDecimal = BigDecimal.ONE; Boolean aBoolean = false; Float aFloat = Float.MAX_VALUE; Byte aByte = Byte.MAX_VALUE; Date aDate = Date.valueOf(LocalDate.now()); Time aTime = Time.valueOf(LocalTime.now()); Timestamp aTimeStamp = Timestamp.valueOf(LocalDateTime.now()); Array aArray = new StubArray("INTEGER", new Object[1]); Ref aRef = new SerialRef(new StubRef("INTEGER", query)); byte[] bytes = new byte[10]; crs.moveToInsertRow(); crs.updateInt(1, aInteger); crs.updateString(2, aChar); crs.updateString(3, aChar); crs.updateLong(4, aLong); crs.updateBoolean(5, aBoolean); crs.updateShort(6, aShort); crs.updateDouble(7, aDouble); crs.updateBigDecimal(8, aBigDecimal); crs.updateFloat(9, aFloat); crs.updateByte(10, aByte); crs.updateDate(11, aDate); crs.updateTime(12, aTime); crs.updateTimestamp(13, aTimeStamp); crs.updateBytes(14, bytes); crs.updateArray(15, aArray); crs.updateRef(16, aRef); crs.updateDouble(17, aDouble); crs.insertRow(); crs.moveToCurrentRow(); } /* * Dermine if a Row exists in a ResultSet by its primary key * If the parameter deleteRow is true, delete the row and validate * the RowSet indicates it is deleted */ protected boolean findRowByPrimaryKey(RowSet rs, int id, int idPos, boolean deleteRow) throws Exception { boolean foundRow = false; rs.beforeFirst(); while (rs.next()) { if (rs.getInt(idPos) == id) { foundRow = true; if (deleteRow) { rs.deleteRow(); // validate row is marked as deleted assertTrue(rs.rowDeleted()); } break; } } return foundRow; } /* * Wrapper method to find if a row exists within a RowSet by its primary key */ protected boolean findRowByPrimaryKey(RowSet rs, int id, int idPos) throws Exception { return findRowByPrimaryKey(rs, id, idPos, false); } /* * Wrapper method to find if a row exists within a RowSet by its primary key * and delete it */ protected boolean deleteRowByPrimaryKey(RowSet rs, int id, int idPos) throws Exception { return findRowByPrimaryKey(rs, id, idPos, true); } /* * Utility method that compares two ResultSetMetaDataImpls for containing * the same values */ private void compareMetaData(ResultSetMetaData rsmd, ResultSetMetaData rsmd1) throws SQLException { assertEquals(rsmd1.getColumnCount(), rsmd.getColumnCount()); int cols = rsmd.getColumnCount(); for (int i = 1; i <= cols; i++) { assertTrue(rsmd1.getCatalogName(i).equals(rsmd.getCatalogName(i))); assertTrue(rsmd1.getColumnClassName(i).equals(rsmd.getColumnClassName(i))); assertTrue(rsmd1.getColumnDisplaySize(i) == rsmd.getColumnDisplaySize(i)); assertTrue(rsmd1.getColumnLabel(i).equals(rsmd.getColumnLabel(i))); assertTrue(rsmd1.getColumnName(i).equals(rsmd.getColumnName(i))); assertTrue(rsmd1.getColumnType(i) == rsmd.getColumnType(i)); assertTrue(rsmd1.getPrecision(i) == rsmd.getPrecision(i)); assertTrue(rsmd1.getScale(i) == rsmd.getScale(i)); assertTrue(rsmd1.getSchemaName(i).equals(rsmd.getSchemaName(i))); assertTrue(rsmd1.getTableName(i).equals(rsmd.getTableName(i))); assertTrue(rsmd1.isAutoIncrement(i) == rsmd.isAutoIncrement(i)); assertTrue(rsmd1.isCaseSensitive(i) == rsmd.isCaseSensitive(i)); assertTrue(rsmd1.isCurrency(i) == rsmd.isCurrency(i)); assertTrue(rsmd1.isDefinitelyWritable(i) == rsmd.isDefinitelyWritable(i)); assertTrue(rsmd1.isNullable(i) == rsmd.isNullable(i)); assertTrue(rsmd1.isReadOnly(i) == rsmd.isReadOnly(i)); assertTrue(rsmd1.isSearchable(i) == rsmd.isSearchable(i)); assertTrue(rsmd1.isSigned(i) == rsmd.isSigned(i)); assertTrue(rsmd1.isWritable(i) == rsmd.isWritable(i)); } } /* * Utility method to compare two rowsets */ private void compareRowSets(CachedRowSet crs, CachedRowSet crs1) throws Exception { int rows = crs.size(); assertTrue(rows == crs1.size()); ResultSetMetaData rsmd = crs.getMetaData(); compareMetaData(rsmd, crs1.getMetaData()); int cols = rsmd.getColumnCount(); for (int row = 1; row <= rows; row++) { crs.absolute((row)); crs1.absolute(row); for (int col = 1; col <= cols; col++) { compareColumnValue(JDBCType.valueOf(rsmd.getColumnType(col)), crs, crs1, col); } } } /* * Utility method to compare two columns */ private void compareColumnValue(JDBCType type, ResultSet rs, ResultSet rs1, int col) throws SQLException { switch (type) { case INTEGER: assertTrue(rs.getInt(col) == rs1.getInt(col)); break; case CHAR: case VARCHAR: assertTrue(rs.getString(col).equals(rs1.getString(col))); break; case BIGINT: assertTrue(rs.getLong(col) == rs1.getLong(col)); break; case BOOLEAN: assertTrue(rs.getBoolean(col) == rs1.getBoolean(col)); break; case SMALLINT: assertTrue(rs.getShort(col) == rs1.getShort(col)); break; case DOUBLE: case FLOAT: assertTrue(rs.getDouble(col) == rs1.getDouble(col)); break; case DECIMAL: assertTrue(rs.getBigDecimal(col).equals(rs1.getBigDecimal(col))); break; case REAL: assertTrue(rs.getFloat(col) == rs1.getFloat(col)); break; case TINYINT: assertTrue(rs.getByte(col) == rs1.getByte(col)); break; case DATE: assertTrue(rs.getDate(col).equals(rs1.getDate(col))); break; case TIME: assertTrue(rs.getTime(col).equals(rs1.getTime(col))); break; case TIMESTAMP: assertTrue(rs.getTimestamp(col).equals(rs1.getTimestamp(col))); break; } } /* * Validate SyncProviderException is thrown when acceptChanges is called * but there is not a way to make a connection to the datasource */ @Test(dataProvider = "rowSetType", expectedExceptions = SyncProviderException.class) public void commonCachedRowSetTest0000(CachedRowSet rs) throws Exception { rs.acceptChanges(); rs.close(); } /* * Validate SyncProviderException is thrown when acceptChanges is called * when null is passed as the datasource */ @Test(dataProvider = "rowSetType", expectedExceptions = SyncProviderException.class) public void commonCachedRowSetTest0001(CachedRowSet rs) throws Exception { rs.acceptChanges(null); rs.close(); } /* * Validate that that RIOPtimsticProvider is the default SyncProvider */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0002(CachedRowSet rs) throws SQLException { SyncProvider sp = rs.getSyncProvider(); assertTrue(sp instanceof com.sun.rowset.providers.RIOptimisticProvider); rs.close(); } /* * Validate that you can specify a SyncProvider */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0003(CachedRowSet rs) throws SQLException { // Register a provider and make sure it is avaiable SyncFactory.registerProvider(stubProvider); rs.setSyncProvider(stubProvider); SyncProvider sp = rs.getSyncProvider(); assertTrue(sp instanceof StubSyncProvider); SyncFactory.unregisterProvider(stubProvider); rs.close(); } /* * Create a RowSetListener and validate that notifyRowSetChanged is called */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0004(CachedRowSet rs) throws Exception { TestRowSetListener rsl = new TestRowSetListener(); rs.addRowSetListener(rsl); rs.release(); assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED)); rs.close(); } /* * Create a RowSetListener and validate that notifyRowSetChanged is called */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0005(CachedRowSet rs) throws Exception { TestRowSetListener rsl = new TestRowSetListener(); rs.addRowSetListener(rsl); rs.restoreOriginal(); assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED)); rs.close(); } /* * Create a RowSetListener and validate that notifyRowChanged is called */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0006(RowSet rs) throws Exception { TestRowSetListener rsl = new TestRowSetListener(); rs.addRowSetListener(rsl); rs.moveToInsertRow(); rs.updateInt(1, 10024); rs.updateString(2, "Sacramento"); rs.updateInt(3, 1987); rs.updateInt(4, 2341); rs.updateInt(5, 4328); rs.insertRow(); assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED)); rs.close(); } /* * Create a multiple RowSetListeners and validate that notifyRowChanged, * notifiyMoved is called on all listners */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0007(RowSet rs) throws Exception { TestRowSetListener rsl = new TestRowSetListener(); TestRowSetListener rsl2 = new TestRowSetListener(); rs.addRowSetListener(rsl); rs.addRowSetListener(rsl2); rs.first(); rs.updateInt(1, 1961); rs.updateString(2, "Pittsburgh"); rs.updateInt(3, 1987); rs.updateInt(4, 2341); rs.updateInt(5, 6689); rs.updateRow(); assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED | TestRowSetListener.ROW_CHANGED)); assertTrue(rsl2.isNotified(TestRowSetListener.CURSOR_MOVED | TestRowSetListener.ROW_CHANGED)); rs.close(); } /* * Create a RowSetListener and validate that notifyRowChanged and * notifyCursorMoved are called */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0008(CachedRowSet rs) throws Exception { TestRowSetListener rsl = new TestRowSetListener(); rs.addRowSetListener(rsl); rs.first(); assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED)); rs.deleteRow(); assertTrue( rsl.isNotified(TestRowSetListener.ROW_CHANGED | TestRowSetListener.CURSOR_MOVED)); rsl.resetFlag(); rs.setShowDeleted(true); rs.undoDelete(); assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED)); rs.close(); } /* * Create a RowSetListener and validate that notifyCursorMoved is called */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0009(RowSet rs) throws Exception { TestRowSetListener rsl = new TestRowSetListener(); rs.addRowSetListener(rsl); rs.beforeFirst(); assertTrue(rsl.isNotified(TestRowSetListener.CURSOR_MOVED)); rs.close(); } /* * Validate that getTableName() returns the proper values */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0010(CachedRowSet rs) throws Exception { assertNull(rs.getTableName()); rs.setTableName(COFFEE_HOUSES_TABLE); assertTrue(rs.getTableName().equals(COFFEE_HOUSES_TABLE)); rs.close(); } /* * Validate that getKeyColumns() returns the proper values */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0011(CachedRowSet rs) throws Exception { int[] pkeys = {1, 3}; assertNull(rs.getKeyColumns()); rs.setKeyColumns(pkeys); assertEquals(rs.getKeyColumns(), pkeys); rs.close(); } /* * Validate that setMatchColumn throws a SQLException if the column * index specified is out of range */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0012(CachedRowSet rs) throws Exception { rs.setMatchColumn(-1); rs.close(); } /* * Validate that setMatchColumn throws a SQLException if the column * index specified is out of range */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0013(CachedRowSet rs) throws Exception { int[] cols = {1, -1}; rs.setMatchColumn(cols); rs.close(); } /* * Validate that setMatchColumn throws a SQLException if the column * index specified is out of range */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0014(CachedRowSet rs) throws Exception { rs.setMatchColumn((String) null); rs.close(); } /* * Validate that setMatchColumn throws a SQLException if the column * index specified is out of range */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0015(CachedRowSet rs) throws Exception { String[] cols = {"ID", null}; rs.setMatchColumn(cols); } /* * Validate that getMatchColumn returns the same value specified by * setMatchColumn */ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false) public void commonCachedRowSetTest0016(CachedRowSet rs) throws Exception { int[] expectedCols = {1}; String[] expectedColNames = {"ID"}; rs.setMatchColumn(1); int[] actualCols = rs.getMatchColumnIndexes(); String[] actualColNames = rs.getMatchColumnNames(); for (int i = 0; i < actualCols.length; i++) { System.out.println(actualCols[i]); } assertEquals(actualCols, expectedCols); assertEquals(actualColNames, expectedColNames); rs.close(); } /* * Validate that getMatchColumn returns the same value specified by * setMatchColumn */ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false) public void commonCachedRowSetTest0017(CachedRowSet rs) throws Exception { int[] expectedCols = {1}; String[] expectedColNames = {"ID"}; rs.setMatchColumn(expectedColNames[0]); int[] actualCols = rs.getMatchColumnIndexes(); String[] actualColNames = rs.getMatchColumnNames(); assertEquals(actualCols, expectedCols); assertEquals(actualColNames, expectedColNames); rs.close(); } /* * Validate that getMatchColumn returns the same valid value specified by * setMatchColumn */ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false) public void commonCachedRowSetTest0018(CachedRowSet rs) throws Exception { int[] expectedCols = {1, 3}; String[] expectedColNames = {"COF_ID", "SUP_ID"}; rs.setMatchColumn(expectedCols); int[] actualCols = rs.getMatchColumnIndexes(); String[] actualColNames = rs.getMatchColumnNames(); assertEquals(actualCols, expectedCols); assertEquals(actualColNames, expectedColNames); assertEquals(actualCols, expectedCols); rs.close(); } /* * Validate that getMatchColumn returns the same valid value specified by * setMatchColumn */ @Test(dataProvider = "rowsetUsingCoffeeHouses", enabled = false) public void commonCachedRowSetTest0019(CachedRowSet rs) throws Exception { int[] expectedCols = {1, 3}; String[] expectedColNames = {"COF_ID", "SUP_ID"}; rs.setMatchColumn(expectedColNames); int[] actualCols = rs.getMatchColumnIndexes(); String[] actualColNames = rs.getMatchColumnNames(); assertEquals(actualCols, expectedCols); assertEquals(actualColNames, expectedColNames); rs.close(); } /* * Validate that getMatchColumnIndexes throws a SQLException if * unsetMatchColumn has been called */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0020(CachedRowSet rs) throws Exception { rs.setMatchColumn(1); int[] actualCols = rs.getMatchColumnIndexes(); assertTrue(actualCols != null); rs.unsetMatchColumn(1); actualCols = rs.getMatchColumnIndexes(); rs.close(); } /* * Validate that getMatchColumnNames throws a SQLException if * unsetMatchColumn has been called */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0021(CachedRowSet rs) throws Exception { String matchColumn = "ID"; rs.setMatchColumn(matchColumn); String[] actualColNames = rs.getMatchColumnNames(); assertTrue(actualColNames != null); rs.unsetMatchColumn(matchColumn); actualColNames = rs.getMatchColumnNames(); rs.close(); } /* * Validate that getMatchColumnIndexes throws a SQLException if * unsetMatchColumn has been called */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0022(CachedRowSet rs) throws Exception { int[] expectedCols = {1, 3}; rs.setMatchColumn(expectedCols); int[] actualCols = rs.getMatchColumnIndexes(); assertTrue(actualCols != null); rs.unsetMatchColumn(expectedCols); actualCols = rs.getMatchColumnIndexes(); rs.close(); } /* * Validate that getMatchColumnNames throws a SQLException if * unsetMatchColumn has been called */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0023(CachedRowSet rs) throws Exception { String[] expectedColNames = {"COF_ID", "SUP_ID"}; rs.setMatchColumn(expectedColNames); String[] actualColNames = rs.getMatchColumnNames(); assertTrue(actualColNames != null); rs.unsetMatchColumn(expectedColNames); actualColNames = rs.getMatchColumnNames(); rs.close(); } /* * Validate size() returns the correct number of rows */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0024(CachedRowSet rs) throws Exception { assertTrue(rs.size() == COFFEE_HOUSES_ROWS); rs.close(); } /* * Validate that the correct rows are returned comparing the primary * keys */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0025(RowSet rs) throws SQLException { assertEquals(getPrimaryKeys(rs), COFFEE_HOUSES_PRIMARY_KEYS); rs.close(); } /* * Delete a row within the RowSet using its primary key * Validate the visibility of the row depending on the value of * setShowdelete */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0026(CachedRowSet rs) throws Exception { Object[] afterDelete = { 10023, 33002, 10040, 32001, 10042, 10024, 10039, 10041, 33005, 33010, 10037, 10034, 32004 }; int rowToDelete = 10035; // All rows should be found assertEquals(getPrimaryKeys(rs), COFFEE_HOUSES_PRIMARY_KEYS); // Delete the row assertTrue(deleteRowByPrimaryKey(rs, rowToDelete, 1)); // With setShowDeleted(false) which is the default, // the deleted row should not be visible assertFalse(findRowByPrimaryKey(rs, rowToDelete, 1)); assertEquals(getPrimaryKeys(rs), afterDelete); assertTrue(rs.size() == COFFEE_HOUSES_ROWS); // With setShowDeleted(true), the deleted row should be visible rs.setShowDeleted(true); assertTrue(findRowByPrimaryKey(rs, rowToDelete, 1)); rs.close(); } /* * Validate that there is no page size by default */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0027(CachedRowSet rs) throws Exception { assertTrue(rs.getPageSize() == 0); rs.close(); } /* * Validate the value you set via setPageSize is returned by getPageSize * then reset to having no limit */ @Test(dataProvider = "rowSetType") public void commonCachedRowSetTest0028(CachedRowSet rs) throws Exception { int rows = 100; rs.setPageSize(rows); assertTrue(rows == rs.getPageSize()); rs.setPageSize(0); assertTrue(rs.getPageSize() == 0); rs.close(); } /* * Validate SQLException is thrown when an invalid value is specified * for setPageSize */ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0029(CachedRowSet rs) throws Exception { rs.setPageSize(-1); rs.close(); } /* * Validate SQLException is thrown when nextPage is called without a * call to populate or execute */ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0030(CachedRowSet rs) throws Exception { rs.nextPage(); rs.close(); } /* * Validate SQLException is thrown when previousPage is called without a * call to populate or execute */ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0031(CachedRowSet rs) throws Exception { rs.previousPage(); rs.close(); } /* * Validate SQLException is thrown when execute is called * but there is not a way to make a connection to the datasource */ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0032(CachedRowSet rs) throws Exception { rs.execute(null); rs.close(); } /* * Validate SQLException is thrown when execute is called * but there is not a way to make a connection to the datasource */ @Test(dataProvider = "rowSetType", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0033(CachedRowSet rs) throws Exception { rs.execute(); rs.close(); } /* * Validate that toCollection(<column>) returns the proper values */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0034(CachedRowSet rs) throws Exception { Object[] cities = {"Mendocino", "Seattle", "SF", "Portland", "SF", "Sacramento", "Carmel", "LA", "Olympia", "Seattle", "SF", "LA", "San Jose", "Eugene"}; rs.beforeFirst(); assertEquals(rs.toCollection(2).toArray(), cities); assertEquals(rs.toCollection("CITY").toArray(), cities); rs.close(); } /* * Validate that toCollection() returns the proper values */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0035(CachedRowSet rs) throws Exception { Collection<?> col = rs.toCollection(); assertTrue(rs.size() == col.size()); assertTrue(rs.toCollection().containsAll(col) && col.containsAll(rs.toCollection())); try ( // Validate that False is returned when compared to a different RowSet; CachedRowSet crs1 = createCoffeesRowSet()) { assertFalse(crs1.toCollection().containsAll(col) && col.containsAll(crs1.toCollection())); } rs.close(); } /* * Validate that createCopy() returns the proper values */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0036(CachedRowSet rs) throws Exception { try (CachedRowSet crs1 = rs.createCopy()) { compareRowSets(rs, crs1); } rs.close(); } /* * Validate that createCopySchema() returns the proper values */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0037(CachedRowSet rs) throws Exception { try (CachedRowSet crs1 = rs.createCopySchema()) { assertTrue(crs1.size() == 0); compareMetaData(crs1.getMetaData(), rs.getMetaData()); } rs.close(); } /* * Validate that createCopyNoConstraints() returns the proper values * and getMatchColumnIndexes should throw a SQLException. This test * specifies setMatchColumn(int) */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0038(CachedRowSet rs) throws Exception { rs.setMatchColumn(1); try (CachedRowSet crs1 = rs.createCopyNoConstraints()) { assertTrue(crs1.size() == COFFEE_HOUSES_ROWS); compareRowSets(rs, crs1); boolean recievedSQE = false; try { int[] indexes = crs1.getMatchColumnIndexes(); } catch (SQLException e) { recievedSQE = true; } assertTrue(recievedSQE); recievedSQE = false; try { String[] colNames = crs1.getMatchColumnNames(); } catch (SQLException e) { recievedSQE = true; } assertTrue(recievedSQE); } rs.close(); } /* * Validate that createCopyNoConstraints() returns the proper values * and getMatchColumnIndexes should throw a SQLException. This test * specifies setMatchColumn(String) */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0039(CachedRowSet rs) throws Exception { rs.setMatchColumn("ID"); try (CachedRowSet crs1 = rs.createCopyNoConstraints()) { assertTrue(crs1.size() == COFFEE_HOUSES_ROWS); compareRowSets(rs, crs1); boolean recievedSQE = false; try { int[] indexes = crs1.getMatchColumnIndexes(); } catch (SQLException e) { recievedSQE = true; } assertTrue(recievedSQE); recievedSQE = false; try { String[] colNames = crs1.getMatchColumnNames(); } catch (SQLException e) { recievedSQE = true; } assertTrue(recievedSQE); } rs.close(); } /* * Validate that columnUpdated works with the various datatypes specifying * the column index */ @Test(dataProvider = "rowsetUsingDataTypes") public void commonCachedRowSetTest0040(CachedRowSet rs, JDBCType type) throws Exception { rs.beforeFirst(); assertTrue(rs.next()); switch (type) { case INTEGER: assertFalse(rs.columnUpdated(1)); rs.updateInt(1, Integer.MIN_VALUE); assertTrue(rs.columnUpdated(1)); break; case CHAR: assertFalse(rs.columnUpdated(2)); rs.updateString(2, "foo"); assertTrue(rs.columnUpdated(2)); break; case VARCHAR: assertFalse(rs.columnUpdated(3)); rs.updateString(3, "foo"); assertTrue(rs.columnUpdated(3)); break; case BIGINT: assertFalse(rs.columnUpdated(4)); rs.updateLong(4, Long.MIN_VALUE); assertTrue(rs.columnUpdated(4)); break; case BOOLEAN: assertFalse(rs.columnUpdated(5)); rs.updateBoolean(5, false); assertTrue(rs.columnUpdated(5)); break; case SMALLINT: assertFalse(rs.columnUpdated(6)); rs.updateShort(6, Short.MIN_VALUE); assertTrue(rs.columnUpdated(6)); break; case DOUBLE: assertFalse(rs.columnUpdated(7)); rs.updateDouble(7, Double.MIN_VALUE); assertTrue(rs.columnUpdated(7)); break; case DECIMAL: assertFalse(rs.columnUpdated(8)); rs.updateBigDecimal(8, BigDecimal.TEN); assertTrue(rs.columnUpdated(8)); break; case REAL: assertFalse(rs.columnUpdated(9)); rs.updateFloat(9, Float.MIN_VALUE); assertTrue(rs.columnUpdated(9)); break; case TINYINT: assertFalse(rs.columnUpdated(10)); rs.updateByte(10, Byte.MIN_VALUE); assertTrue(rs.columnUpdated(10)); break; case DATE: assertFalse(rs.columnUpdated(11)); rs.updateDate(11, Date.valueOf(LocalDate.now())); assertTrue(rs.columnUpdated(11)); break; case TIME: assertFalse(rs.columnUpdated(12)); rs.updateTime(12, Time.valueOf(LocalTime.now())); assertTrue(rs.columnUpdated(12)); break; case TIMESTAMP: assertFalse(rs.columnUpdated(13)); rs.updateTimestamp(13, Timestamp.valueOf(LocalDateTime.now())); assertTrue(rs.columnUpdated(13)); break; case VARBINARY: assertFalse(rs.columnUpdated(14)); rs.updateBytes(14, new byte[1]); assertTrue(rs.columnUpdated(14)); break; case ARRAY: assertFalse(rs.columnUpdated(15)); rs.updateArray(15, new StubArray("VARCHAR", new Object[10])); assertTrue(rs.columnUpdated(15)); break; case REF: assertFalse(rs.columnUpdated(16)); rs.updateRef(16, new StubRef("INTEGER", query)); assertTrue(rs.columnUpdated(16)); break; case FLOAT: assertFalse(rs.columnUpdated(17)); rs.updateDouble(17, Double.MIN_NORMAL); assertTrue(rs.columnUpdated(17)); } } /* * Validate that columnUpdated works with the various datatypes specifying * the column name */ @Test(dataProvider = "rowsetUsingDataTypes") public void commonCachedRowSetTest0041(CachedRowSet rs, JDBCType type) throws Exception { rs.beforeFirst(); assertTrue(rs.next()); switch (type) { case INTEGER: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[0])); rs.updateInt(DATATYPES_COLUMN_NAMES[0], Integer.MIN_VALUE); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[0])); break; case CHAR: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[1])); rs.updateString(DATATYPES_COLUMN_NAMES[1], "foo"); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[1])); break; case VARCHAR: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[2])); rs.updateString(DATATYPES_COLUMN_NAMES[2], "foo"); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[2])); break; case BIGINT: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[3])); rs.updateLong(DATATYPES_COLUMN_NAMES[3], Long.MIN_VALUE); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[3])); break; case BOOLEAN: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[4])); rs.updateBoolean(DATATYPES_COLUMN_NAMES[4], false); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[4])); break; case SMALLINT: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[5])); rs.updateShort(DATATYPES_COLUMN_NAMES[5], Short.MIN_VALUE); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[5])); break; case DOUBLE: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[6])); rs.updateDouble(DATATYPES_COLUMN_NAMES[6], Double.MIN_VALUE); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[6])); break; case DECIMAL: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[7])); rs.updateBigDecimal(DATATYPES_COLUMN_NAMES[7], BigDecimal.TEN); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[7])); break; case REAL: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[8])); rs.updateFloat(DATATYPES_COLUMN_NAMES[8], Float.MIN_VALUE); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[8])); break; case TINYINT: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[9])); rs.updateByte(DATATYPES_COLUMN_NAMES[9], Byte.MIN_VALUE); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[9])); break; case DATE: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[10])); rs.updateDate(DATATYPES_COLUMN_NAMES[10], Date.valueOf(LocalDate.now())); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[10])); break; case TIME: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[11])); rs.updateTime(DATATYPES_COLUMN_NAMES[11], Time.valueOf(LocalTime.now())); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[11])); break; case TIMESTAMP: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[12])); rs.updateTimestamp(DATATYPES_COLUMN_NAMES[12], Timestamp.valueOf(LocalDateTime.now())); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[12])); break; case VARBINARY: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[13])); rs.updateBytes(DATATYPES_COLUMN_NAMES[13], new byte[1]); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[13])); break; case ARRAY: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[14])); rs.updateArray(DATATYPES_COLUMN_NAMES[14], new StubArray("VARCHAR", new Object[10])); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[14])); break; case REF: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[15])); rs.updateRef(DATATYPES_COLUMN_NAMES[15], new StubRef("INTEGER", query)); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[15])); break; case FLOAT: assertFalse(rs.columnUpdated(DATATYPES_COLUMN_NAMES[16])); rs.updateDouble(DATATYPES_COLUMN_NAMES[16], Double.MIN_NORMAL); assertTrue(rs.columnUpdated(DATATYPES_COLUMN_NAMES[16])); break; } } /* * Validate isBeforeFirst(), isFirst() and first() return the correct * results */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0042(RowSet rs) throws Exception { assertFalse(rs.isBeforeFirst()); assertFalse(rs.isFirst()); rs.beforeFirst(); assertTrue(rs.isBeforeFirst()); assertFalse(rs.isFirst()); rs.next(); assertFalse(rs.isBeforeFirst()); assertTrue(rs.isFirst()); rs.next(); assertFalse(rs.isBeforeFirst()); assertFalse(rs.isFirst()); rs.first(); assertFalse(rs.isBeforeFirst()); assertTrue(rs.isFirst()); rs.close(); } /* * Validate isAfterLast(), isLast() and last() return the correct * results */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0043(RowSet rs) throws Exception { assertFalse(rs.isAfterLast()); assertFalse(rs.isLast()); rs.afterLast(); assertTrue(rs.isAfterLast()); assertFalse(rs.isLast()); rs.previous(); assertFalse(rs.isAfterLast()); assertTrue(rs.isLast()); rs.previous(); assertFalse(rs.isAfterLast()); assertFalse(rs.isLast()); rs.last(); assertFalse(rs.isAfterLast()); assertTrue(rs.isLast()); rs.close(); } /* * Validate a SQLException is thrown when undoDelete is called on the * insertRow */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0044(CachedRowSet rs) throws Exception { rs.insertRow(); rs.undoDelete(); rs.close(); } /* * Validate a SQLException is thrown when undoDelete is called when * cursor is before the first row */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0045(CachedRowSet rs) throws Exception { rs.setShowDeleted(true); rs.beforeFirst(); rs.undoDelete(); rs.close(); } /* * Validate a SQLException is thrown when undoDelete is called when * cursor is after the last row */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0046(CachedRowSet rs) throws Exception { rs.setShowDeleted(true); rs.afterLast(); rs.undoDelete(); rs.close(); } /* * Validate a SQLException is thrown when undoUpdate is called on the * insertRow */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0047(CachedRowSet rs) throws Exception { rs.insertRow(); rs.undoUpdate(); rs.close(); } /* * Validate a SQLException is thrown when undoUpdate is called when * cursor is before the first row */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0048(CachedRowSet rs) throws Exception { rs.setShowDeleted(true); rs.beforeFirst(); rs.undoUpdate(); rs.close(); } /* * Validate a SQLException is thrown when undoUpdate is called when * cursor is after the last row */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0049(CachedRowSet rs) throws Exception { rs.setShowDeleted(true); rs.afterLast(); rs.undoUpdate(); rs.close(); } /* * Validate a SQLException is thrown when undoInsert is called on the * insertRow */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0050(CachedRowSet rs) throws Exception { rs.insertRow(); rs.undoInsert(); rs.close(); } /* * Validate a SQLException is thrown when undoInsert is called when * cursor is before the first row */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0051(CachedRowSet rs) throws Exception { rs.setShowDeleted(true); rs.beforeFirst(); rs.undoInsert(); rs.close(); } /* * Validate a SQLException is thrown when undoInsert is called when * cursor is after the last row */ @Test(dataProvider = "rowsetUsingCoffeeHouses", expectedExceptions = SQLException.class) public void commonCachedRowSetTest0052(CachedRowSet rs) throws Exception { rs.setShowDeleted(true); rs.afterLast(); rs.undoInsert(); rs.close(); } /* * Insert a row, then call undoInsert to roll back the insert and validate * the row is not there */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0053(CachedRowSet rs) throws Exception { int rowToInsert = 1961; assertTrue(rs.size() == COFFEE_HOUSES_ROWS); // Add new row rs.moveToInsertRow(); rs.updateInt(1, rowToInsert); rs.updateString(2, "GOTHAM"); rs.updateInt(3, 3450); rs.updateInt(4, 2005); rs.updateInt(5, 5455); rs.insertRow(); rs.moveToCurrentRow(); // check that the number of rows has increased assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1); assertTrue(findRowByPrimaryKey(rs, rowToInsert, 1)); rs.undoInsert(); // Check to make sure the row is no longer there assertTrue(rs.size() == COFFEE_HOUSES_ROWS); assertFalse(findRowByPrimaryKey(rs, rowToInsert, 1)); rs.close(); } /* * Insert a row, delete the row and then call undoDelete to make sure it * is comes back */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0054(CachedRowSet rs) throws Exception { int rowToDelete = 1961; assertTrue(rs.size() == COFFEE_HOUSES_ROWS); // Add new row rs.moveToInsertRow(); rs.updateInt(1, rowToDelete); rs.updateString(2, "GOTHAM"); rs.updateInt(3, 3450); rs.updateInt(4, 2005); rs.updateInt(5, 5455); rs.insertRow(); rs.moveToCurrentRow(); // check that the number of rows has increased assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1); assertTrue(findRowByPrimaryKey(rs, rowToDelete, 1)); rs.absolute(COFFEE_HOUSES_ROWS + 1); rs.deleteRow(); // Check to make sure the row is no longer there //assertTrue(rs.size() == COFFEE_HOUSES_ROWS); assertFalse(findRowByPrimaryKey(rs, rowToDelete, 1)); rs.setShowDeleted(true); rs.absolute(COFFEE_HOUSES_ROWS + 1); rs.undoDelete(); // check that the row is back assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1); assertTrue(findRowByPrimaryKey(rs, rowToDelete, 1)); rs.close(); } /* * Insert a row, modify a field and then call undoUpdate to revert the * insert */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0055(CachedRowSet rs) throws Exception { int rowToInsert = 1961; assertTrue(rs.size() == COFFEE_HOUSES_ROWS); // Add new row rs.moveToInsertRow(); rs.updateInt(1, rowToInsert); rs.updateString(2, "GOTHAM"); rs.updateInt(3, 3450); rs.updateInt(4, 2005); rs.updateInt(5, 5455); rs.insertRow(); rs.moveToCurrentRow(); // check that the number of rows has increased assertTrue(rs.size() == COFFEE_HOUSES_ROWS + 1); assertTrue(findRowByPrimaryKey(rs, rowToInsert, 1)); rs.absolute(COFFEE_HOUSES_ROWS + 1); // Save off the original column values String f2 = rs.getString(2); int f3 = rs.getInt(3); rs.updateString(2, "SMALLVILLE"); rs.updateInt(3, 500); // Validate the columns have been updated assertTrue(rs.columnUpdated(2)); assertTrue(rs.columnUpdated(3)); // Undo the update and validate it has taken place rs.absolute(COFFEE_HOUSES_ROWS + 1); rs.undoUpdate(); assertTrue(rs.size() == COFFEE_HOUSES_ROWS); assertFalse(findRowByPrimaryKey(rs, rowToInsert, 1)); rs.close(); } /* * Validate getOriginal returns a ResultSet which is a copy of the original * RowSet */ @Test(dataProvider = "rowsetUsingCoffees") public void commonCachedRowSetTest0056(CachedRowSet rs) throws Exception { String coffee = "Hazelnut"; int sales = 100; int id = 200; Object[] updatedPkeys = {1, id, 3, 4, 5}; // Change the coffee name and sales total for row 2 and save the // previous values rs.absolute(2); int origId = rs.getInt(1); String origCoffee = rs.getString(2); int origSales = rs.getInt(5); rs.updateInt(1, id); rs.updateString(2, coffee); rs.updateInt(5, sales); // MetaData should match try ( // Get the original original RowSet and validate that the changes // are only made to the current, not the original ResultSet rs1 = rs.getOriginal()) { // MetaData should match compareMetaData(rs.getMetaData(), rs1.getMetaData()); assertTrue(rs1.isBeforeFirst()); assertTrue(rs1.getConcurrency() == ResultSet.CONCUR_UPDATABLE); assertTrue(rs1.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE); rs1.absolute(2); // Check original rowset is not changed assertTrue(rs1.getInt(1) == origId); assertTrue(rs1.getString(2).equals(origCoffee)); assertTrue(rs1.getInt(5) == origSales); assertEquals(getPrimaryKeys(rs1), COFFEES_PRIMARY_KEYS); // Check current rowset assertTrue(rs.getInt(1) == id); assertTrue(rs.getString(2).equals(coffee)); assertTrue(rs.getInt(5) == sales); assertEquals(getPrimaryKeys(rs), updatedPkeys); } rs.close(); } /* * Validate getOriginalRow returns a ResultSet which is a copy of the * original row that was modified */ @Test(dataProvider = "rowsetUsingCoffees") public void commonCachedRowSetTest0057(CachedRowSet rs) throws Exception { String coffee = "Hazelnut"; int sales = 100; int id = 200; Object[] updatedPkeys = {1, id, 3, 4, 5}; // Change the coffee name and sales total for row 2 and save the // previous values rs.absolute(2); int origId = rs.getInt(1); String origCoffee = rs.getString(2); int origSales = rs.getInt(5); rs.updateInt(1, id); rs.updateString(2, coffee); rs.updateInt(5, sales); // MetaData should match try ( // Get the original original row and validate that the changes // are only made to the current, not the original ResultSet rs1 = rs.getOriginalRow()) { // MetaData should match compareMetaData(rs.getMetaData(), rs1.getMetaData()); assertTrue(rs1.isBeforeFirst()); assertTrue(rs1.getConcurrency() == ResultSet.CONCUR_UPDATABLE); assertTrue(rs1.getType() == ResultSet.TYPE_SCROLL_INSENSITIVE); rs1.next(); assertTrue(rs1.isFirst() && rs1.isLast()); assertTrue(rs1.getRow() == 1); // Check original row is not changed assertTrue(rs1.getInt(1) == origId); assertTrue(rs1.getString(2).equals(origCoffee)); assertTrue(rs1.getInt(5) == origSales); // Check current row assertTrue(rs.getInt(1) == id); assertTrue(rs.getString(2).equals(coffee)); assertTrue(rs.getInt(5) == sales); assertEquals(getPrimaryKeys(rs), updatedPkeys); } rs.close(); } /* * Validate that restoreOrginal will restore the RowSet to its * state prior to the insert of a row */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0058(CachedRowSet rs) throws Exception { int rowToInsert = 1961; assertTrue(rs.size() == COFFEE_HOUSES_ROWS); try ( // Add new row CachedRowSet crs1 = rsf.createCachedRowSet()) { rs.beforeFirst(); crs1.populate(rs); TestRowSetListener rsl = new TestRowSetListener(); crs1.addRowSetListener(rsl); crs1.moveToInsertRow(); crs1.updateInt(1, rowToInsert); crs1.updateString(2, "GOTHAM"); crs1.updateInt(3, 3450); crs1.updateInt(4, 2005); crs1.updateInt(5, 5455); crs1.insertRow(); assertTrue(rsl.isNotified(TestRowSetListener.ROW_CHANGED)); crs1.moveToCurrentRow(); assertTrue(findRowByPrimaryKey(crs1, rowToInsert, 1)); // Restore back to our original state and the // previously inserted row should not be there rsl.resetFlag(); crs1.restoreOriginal(); assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED)); assertTrue(crs1.isBeforeFirst()); crs1.last(); assertFalse(crs1.rowInserted()); assertFalse(findRowByPrimaryKey(crs1, rowToInsert, 1)); } rs.close(); } /* * Validate that restoreOrginal will restore the RowSet to its * state prior to deleting a row */ @Test(dataProvider = "rowsetUsingCoffees", enabled = true) public void commonCachedRowSetTest0059(CachedRowSet rs) throws Exception { int rowToDelete = 2; try (CachedRowSet crs1 = rsf.createCachedRowSet()) { rs.beforeFirst(); crs1.populate(rs); TestRowSetListener rsl = new TestRowSetListener(); crs1.addRowSetListener(rsl); // Delete a row, the PK is also the absolute position as a List // backs the RowSet crs1.absolute(rowToDelete); crs1.deleteRow(); assertTrue(crs1.rowDeleted()); assertFalse(findRowByPrimaryKey(crs1, rowToDelete, 1)); // Restore back to our original state and the // previously deleted row should be there rsl.resetFlag(); crs1.restoreOriginal(); assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED)); assertTrue(crs1.isBeforeFirst()); crs1.absolute(rowToDelete); assertFalse(crs1.rowDeleted()); assertTrue(findRowByPrimaryKey(crs1, rowToDelete, 1)); } rs.close(); } /* * Validate that restoreOrginal will restore the RowSet to its * state prior to updating a row */ @Test(dataProvider = "rowsetUsingCoffees", enabled = true) public void commonCachedRowSetTest0060(CachedRowSet rs) throws Exception { int rowToUpdate = 2; String coffee = "Hazelnut"; try (CachedRowSet crs1 = rsf.createCachedRowSet()) { rs.beforeFirst(); crs1.populate(rs); TestRowSetListener rsl = new TestRowSetListener(); crs1.addRowSetListener(rsl); // Delete a row, the PK is also the absolute position as a List // backs the RowSet crs1.absolute(rowToUpdate); String origCoffee = crs1.getString(2); crs1.updateString(2, coffee); assertTrue(crs1.columnUpdated(2)); crs1.updateRow(); assertTrue(crs1.rowUpdated()); assertFalse(origCoffee.equals(crs1.getString(2))); // Restore back to our original state and the // previous value for the column within the row should be there rsl.resetFlag(); crs1.restoreOriginal(); assertTrue(rsl.isNotified(TestRowSetListener.ROWSET_CHANGED)); assertTrue(crs1.isBeforeFirst()); // absolute() is failing for some reason so need to look at this later crs1.next(); crs1.next(); assertFalse(crs1.columnUpdated(2)); assertFalse(crs1.rowUpdated()); assertTrue(origCoffee.equals(crs1.getString(2))); } rs.close(); } /* * Initialize a RowSet via the populate method. Validate it matches * the original ResultSet */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0061(CachedRowSet rs) throws Exception { try (CachedRowSet crs1 = rsf.createCachedRowSet()) { rs.beforeFirst(); crs1.populate(rs); compareRowSets(rs, crs1); } rs.close(); } /* * Initialize a RowSet via the populate method specifying a starting row. * Validate it matches the original ResultSet starting for the specofied * offset */ @Test(dataProvider = "rowsetUsingCoffeeHouses") public void commonCachedRowSetTest0062(CachedRowSet rs) throws Exception { Object[] expectedRows = { 32001, 10042, 10024, 10039, 10041, 33005, 33010, 10035, 10037, 10034, 32004 }; int startingRow = 4; try (CachedRowSet crs1 = rsf.createCachedRowSet()) { rs.beforeFirst(); crs1.populate(rs, startingRow); assertEquals(crs1.size(), COFFEE_HOUSES_ROWS - startingRow + 1); assertEquals(getPrimaryKeys(crs1), expectedRows); } rs.close(); } }