You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by te...@apache.org on 2007/12/05 13:26:14 UTC
svn commit: r601315 [11/11] - in /harmony/enhanced/classlib/branches/java6:
depends/build/ modules/accessibility/src/main/java/javax/accessibility/
modules/accessibility/src/test/api/java/common/javax/accessibility/
modules/awt/src/main/java/common/jav...
Modified: harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetWriter.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetWriter.java?rev=601315&r1=601314&r2=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetWriter.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/CachedRowSetWriter.java Wed Dec 5 04:25:42 2007
@@ -19,248 +19,287 @@
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
import java.sql.SQLException;
-import java.sql.Statement;
import javax.sql.RowSetInternal;
import javax.sql.RowSetWriter;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.spi.SyncProviderException;
-import org.apache.harmony.sql.internal.nls.Messages;
-
public class CachedRowSetWriter implements RowSetWriter {
- private ResultSet primaryKeys;
-
private CachedRowSet originalRowSet;
- private CachedRowSet cachedKeySet;
-
private CachedRowSetImpl currentRowSet;
private Connection originalConnection;
private String tableName;
- private String sql;
+ private String[] colNames;
private int columnCount;
- private int signal = 0;
-
- private Statement statement;
+ public void setConnection(Connection conn) {
+ originalConnection = conn;
+ }
- private String keyColumnName, whereStatementForOriginal,
- whereStatementForCurrent;
+ public Connection getConnection() {
+ return originalConnection;
+ }
+ /**
+ * TODO add transaction
+ */
public boolean writeData(RowSetInternal theRowSet) throws SQLException {
- // use an optimistic concurrency control mechanism
-
initial(theRowSet);
// analyse every row and do responsible task.
- currentRowSet.first();
- originalRowSet.first();
- do {
- // rolling with currentRowSet
- if (originalRowSet.next()) {
- // deal with updated or deleted row which need do conflict check
- if (checkConflictNotExist(originalRowSet)) {
- // If all of the values in the data source are already the
- // values to be persisted,
- // the method acceptChanges does nothing.
- if (!checkConflictNotExist(currentRowSet))
- writeRowData();
- } else {
- cleanEnvironment();
- throw new SyncProviderException(Messages
- .getString("rowset.5"));
+ currentRowSet.beforeFirst();// currentRowSet.first();
+ originalRowSet.beforeFirst();// originalRowSet.first();
+ while (currentRowSet.next()) {
+ if (currentRowSet.rowInserted()) {
+ insertCurrentRow();
+ } else if (currentRowSet.rowDeleted()) {
+ if (isConflictExistForCurrentRow()) {
+ // TODO: conflict exists, should throw SyncProviderException
+ throw new SyncProviderException();
}
- } else {
- // deal with inserted row which was added comparing the
- // originalDataSet
- // the data can be inserted directly
- // FIXME: need pre-check before insert into database?
- writeRowData();
- }
- } while (currentRowSet.next());
- cleanEnvironment();
+ deleteCurrentRow();
+ } else if (currentRowSet.rowUpdated()) {
+ if (isConflictExistForCurrentRow()) {
+ // TODO: conflict exists, should throw SyncProviderException
+ throw new SyncProviderException();
+ }
+
+ updateCurrentRow();
+ }
+ }
+ // TODO release resource
return true;
}
- private void initial(RowSetInternal theRowSet) throws SQLException {
- currentRowSet = (CachedRowSetImpl) theRowSet;
- // initial environment
- originalRowSet = (CachedRowSet) currentRowSet.getOriginal();
- originalConnection = currentRowSet.getConnection();
- cachedKeySet = new CachedRowSetImpl();
- tableName = currentRowSet.getTableName();
- columnCount = currentRowSet.getMetaData().getColumnCount();
- primaryKeys = originalConnection.getMetaData().getPrimaryKeys("",
- currentRowSet.getMetaData().getSchemaName(1), tableName);
- cachedKeySet.populate(primaryKeys);
- }
+ /**
+ * Insert the RowSet's current row to DB
+ *
+ * @throws SQLException
+ */
+ @SuppressWarnings("nls")
+ private void insertCurrentRow() throws SQLException {
+ /*
+ * the first step: generate the insert SQL
+ */
+ StringBuffer insertSQL = new StringBuffer("INSERT INTO " + tableName
+ + "(");
+ StringBuffer insertColNames = new StringBuffer();
+ StringBuffer insertPlaceholder = new StringBuffer();
+ Object[] insertColValues = new Object[columnCount];
- private void writeRowData() throws SQLException {
- try {
- createScriptForWriteBack();
- statement = originalConnection.prepareStatement(sql);
- switch (signal) {
- case 0:
- fillParasOfKeys(currentRowSet, 0);
- break;
- case 1:
- fillParasOfAllColumn();
- break;
- case 2:
- fillParasOfAllColumn();
- fillParasOfKeys(currentRowSet, columnCount);
- break;
- default:
- break;
+ int updateCount = 0;
+ for (int i = 1; i <= columnCount; i++) {
+ boolean isColUpdate = currentRowSet.columnUpdated(i);
+ if (isColUpdate) {
+ insertColNames.append(colNames[i - 1] + ",");
+ insertPlaceholder.append("?,");
+ insertColValues[updateCount] = currentRowSet.getObject(i);
+ updateCount++;
}
- ((PreparedStatement) statement).executeUpdate();
- } catch (SQLException e) {
- e.printStackTrace();
- new SQLException(Messages.getString("rowset.6"));
+ }
+ if (updateCount == 0) {
+ return;
}
+ insertSQL.append(subStringN(insertColNames.toString(), 1));
+ insertSQL.append(") values (");
+ insertSQL.append(subStringN(insertPlaceholder.toString(), 1));
+ insertSQL.append(")");
+
+ /*
+ * the second step: execute SQL
+ */
+ PreparedStatement preSt = getConnection().prepareStatement(
+ insertSQL.toString());
+ for (int i = 0; i < updateCount; i++) {
+ preSt.setObject(i + 1, insertColValues[i]);
+ }
+ try {
+ preSt.executeUpdate();
+ } catch (SQLException e) {
+ // TODO generate SyncProviderException
+ throw new SyncProviderException();
+ } finally {
+ preSt.close();
+ }
}
- private void createScriptForWriteBack() throws SQLException {
- cachedKeySet.first();
- whereStatementForCurrent = "";
- String insertCollector = "", updateCollector = "";
- // FIXME:uses getUpdateMask()
-
- do {
- keyColumnName = cachedKeySet.getString("COLUMN_NAME");
- whereStatementForCurrent = whereStatementForCurrent + keyColumnName
- + " = ? " + " and ";
- } while (cachedKeySet.next());
+ /**
+ * Delete the current row from DB
+ *
+ * @throws SQLException
+ */
+ private void deleteCurrentRow() throws SQLException {
+ /*
+ * the first step: generate the delete SQL
+ */
+ StringBuffer deleteSQL = new StringBuffer("DELETE FROM " + tableName //$NON-NLS-1$
+ + " WHERE "); //$NON-NLS-1$
+ deleteSQL.append(generateQueryCondition());
+
+ /*
+ * the second step: execute SQL
+ */
+ PreparedStatement preSt = getConnection().prepareStatement(
+ deleteSQL.toString());
+ fillParamInPreStatement(preSt, 1);
+ preSt.executeUpdate();
+ }
- whereStatementForCurrent = subStringN(whereStatementForCurrent, 5);
+ /**
+ * Update the current row to DB
+ *
+ * @throws SQLException
+ */
+ @SuppressWarnings("nls")
+ private void updateCurrentRow() throws SQLException {
+ /*
+ * the first step: generate the delete SQL
+ */
+ StringBuffer updateSQL = new StringBuffer("UPDATE " + tableName
+ + " SET ");
+ StringBuffer updateCols = new StringBuffer();
+ Object[] updateColValues = new Object[columnCount];
+ int[] updateColIndexs = new int[columnCount];
- // insertCollector: all column
+ int updateCount = 0;
for (int i = 1; i <= columnCount; i++) {
- insertCollector = insertCollector + " ? " + " , ";
+ boolean isColUpdate = currentRowSet.columnUpdated(i);
+ if (isColUpdate) {
+ updateCols.append(colNames[i - 1] + " = ?, ");
+ updateColValues[updateCount] = currentRowSet.getObject(i);
+ updateColIndexs[updateCount] = i;
+ updateCount++;
+ }
}
- insertCollector = subStringN(insertCollector, 3);
-
- // update: all column
- ResultSetMetaData tempRSMD = currentRowSet.getMetaData();
- for (int i = 1; i <= columnCount; i++) {
- updateCollector = updateCollector + tempRSMD.getColumnName(i)
- + "= ? , ";
+ if (updateCount == 0) {
+ return;
}
- updateCollector = subStringN(updateCollector, 3);
-
- if (currentRowSet.getCurrentRow().isDelete()) {
- // paras of where: pks
- sql = " delete from " + tableName + " where "
- + whereStatementForCurrent;
- signal = 0;
- } else if (currentRowSet.getCurrentRow().isInsert()) {
- // paras of insert : all
- sql = " insert into " + tableName + " values " + " ( "
- + insertCollector + " ) ";
- signal = 1;
- } else {
- // paras of update and where : all + pks
- sql = " update " + tableName + " set " + updateCollector
- + " where " + whereStatementForCurrent;
- signal = 2;
+ updateSQL.append(subStringN(updateCols.toString(), 2));
+ updateSQL.append(" WHERE ");
+ updateSQL.append(generateQueryCondition());
+
+ /*
+ * the second step: execute SQL
+ */
+ PreparedStatement preSt = getConnection().prepareStatement(
+ updateSQL.toString());
+ // the SET part of SQL
+ for (int i = 0; i < updateCount; i++) {
+ if (updateColValues[i] == null) {
+ preSt.setNull(i + 1, currentRowSet.getMetaData().getColumnType(
+ updateColIndexs[i]));
+ } else {
+ preSt.setObject(i + 1, updateColValues[i]);
+ }
+ }
+ // the WHERE part of SQL
+ fillParamInPreStatement(preSt, updateCount + 1);
+ try {
+ preSt.executeUpdate();
+ } catch (SQLException e) {
+ // TODO generate SyncProviderException
+ throw new SyncProviderException();
+ } finally {
+ preSt.close();
}
}
- private String subStringN(String input, int n) {
- input = input.substring(0, input.length() - n);
- return input;
+ private void initial(RowSetInternal theRowSet) throws SQLException {
+ currentRowSet = (CachedRowSetImpl) theRowSet;
+ // initial environment
+ originalRowSet = (CachedRowSet) currentRowSet.getOriginal();
+ // originalConnection = currentRowSet.getConnection();
+ tableName = currentRowSet.getTableName();
+ columnCount = currentRowSet.getMetaData().getColumnCount();
+ colNames = new String[columnCount];
+ for (int i = 1; i <= columnCount; i++) {
+ colNames[i - 1] = currentRowSet.getMetaData().getColumnName(i);
+ }
}
- private void createScriptForCheck() throws SQLException {
- // formulate the Query SQL
- String tempSelector = "";
- whereStatementForOriginal = "";
- cachedKeySet.first();
- for (int i = 1; i <= columnCount; i++)
- tempSelector = tempSelector
- + originalRowSet.getMetaData().getColumnName(i) + ", ";
- tempSelector = tempSelector.substring(0, tempSelector.length() - 2);
- sql = "select " + tempSelector + " from " + tableName + " where ";
- do {
- keyColumnName = cachedKeySet.getString("COLUMN_NAME");
- whereStatementForOriginal = whereStatementForOriginal
- + keyColumnName + " = ? " + " and ";
- whereStatementForOriginal = subStringN(whereStatementForOriginal, 5);
- } while (cachedKeySet.next());
- cachedKeySet.first();
- sql = sql + whereStatementForOriginal;
- }
+ /**
+ * Compare the current row's data between database and CachedRowSet to check
+ * whether it has been changed in database.
+ *
+ * @return if conflict exists, return true; else, return false
+ * @throws SQLException
+ */
+ private boolean isConflictExistForCurrentRow() throws SQLException {
+ boolean isExist = true;
+ originalRowSet.absolute(currentRowSet.getRow()); // the original data
+
+ StringBuffer querySQL = new StringBuffer("SELECT COUNT(*) FROM " //$NON-NLS-1$
+ + tableName + " WHERE "); //$NON-NLS-1$
+ querySQL.append(generateQueryCondition());
+
+ PreparedStatement preSt = getConnection().prepareStatement(
+ querySQL.toString());
+ fillParamInPreStatement(preSt, 1);
+ ResultSet queryRs = preSt.executeQuery();
+ if (queryRs.next()) {
+ if (queryRs.getInt(1) == 1) {
+ isExist = false;
+ }
+ }
+ queryRs.close();
+ preSt.close();
- private void fillParasOfKeys(CachedRowSet inputRS, int from)
- throws SQLException {
- cachedKeySet.first();
- int i = from + 1;
- do {
- keyColumnName = cachedKeySet.getString("COLUMN_NAME");
- ((PreparedStatement) statement).setObject(i++, inputRS
- .getObject(keyColumnName));
- } while (cachedKeySet.next());
+ return isExist;
}
- private void fillParasOfAllColumn() throws SQLException {
- for (int i = 1; i <= columnCount; i++) {
- ResultSetMetaData rsmd = currentRowSet.getMetaData();
- if (currentRowSet.getObject(i) == null) {
- ((PreparedStatement) statement).setNull(i, rsmd
- .getColumnType(i));
+ /**
+ * Generate the query condition after the keyword "WHERE" in SQL. Expression
+ * likes as: COLUMN1 = ? AND COLUMN2 = ?
+ *
+ * @return the SQL query expression
+ */
+ @SuppressWarnings("nls")
+ private String generateQueryCondition() throws SQLException {
+ StringBuffer queryCondtion = new StringBuffer(" ");
+ for (int i = 0; i < colNames.length; i++) {
+ if (originalRowSet.getObject(i + 1) == null) {
+ queryCondtion.append(colNames[i] + " is null ");
} else {
- ((PreparedStatement) statement).setObject(i, currentRowSet
- .getObject(i));
+ queryCondtion.append(colNames[i] + " = ? ");
+ }
+ if (i != colNames.length - 1) {
+ queryCondtion.append(" and ");
}
}
+ return queryCondtion.toString();
}
- private boolean checkConflictNotExist(CachedRowSet crs) {
- try {
- createScriptForCheck();
- statement = originalConnection.prepareStatement(sql);
- fillParasOfKeys(originalRowSet, 0);
- ResultSet dataInDB = ((PreparedStatement) statement).executeQuery();
- sql = "";
- // compare line by line, column by column
- if (dataInDB.next()) {
- for (int i = 1; i <= dataInDB.getMetaData().getColumnCount(); i++) {
- if (dataInDB.getObject(i) == crs.getObject(i)) {
- continue;
- }
- if (!(dataInDB.getObject(i).equals(crs.getObject(i)))) {
- return false;
- }
- }
+ /**
+ * Fill all the parameters in PreparedStatement
+ *
+ * @param preSt
+ * PreparedStatement
+ * @param fromIndex
+ * It must be greater than 0
+ * @throws SQLException
+ */
+ private void fillParamInPreStatement(PreparedStatement preSt, int fromIndex)
+ throws SQLException {
+ int notNullCount = fromIndex;
+ for (int i = 1; i <= columnCount; i++) {
+ if (originalRowSet.getObject(i) != null) {
+ preSt.setObject(notNullCount, originalRowSet.getObject(i));
+ notNullCount++;
}
- } catch (Exception e) {
- e.printStackTrace();
}
- return true;
}
- private void cleanEnvironment() {
- try {
- originalRowSet.close();
- originalConnection.close();
- cachedKeySet.close();
- statement.close();
- currentRowSet.close();
- primaryKeys.close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
+ private String subStringN(String input, int n) {
+ return input.substring(0, input.length() - n);
}
- // end class
-
}
Copied: harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java (from r601283, harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java)
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java?p2=harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java&p1=harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java&r1=601283&r2=601315&rev=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/trunk/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/sql/src/main/java/org/apache/harmony/sql/internal/rowset/SyncResolverImpl.java Wed Dec 5 04:25:42 2007
@@ -24,10 +24,13 @@
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Date;
+import java.sql.NClob;
import java.sql.Ref;
import java.sql.ResultSetMetaData;
+import java.sql.RowId;
import java.sql.SQLException;
import java.sql.SQLWarning;
+import java.sql.SQLXML;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
@@ -714,6 +717,286 @@
public boolean wasNull() throws SQLException {
throw new UnsupportedOperationException();
+ }
+
+ public int getHoldability() throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Reader getNCharacterStream(int columnIndex) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public Reader getNCharacterStream(String columnLabel) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public NClob getNClob(int columnIndex) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public NClob getNClob(String columnLabel) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getNString(int columnIndex) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public String getNString(String columnLabel) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public RowId getRowId(int columnIndex) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public RowId getRowId(String columnLabel) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public SQLXML getSQLXML(int columnIndex) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public SQLXML getSQLXML(String columnLabel) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean isClosed() throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public void updateAsciiStream(int columnIndex, InputStream x, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateAsciiStream(String columnLabel, InputStream x, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateAsciiStream(int columnIndex, InputStream x)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateAsciiStream(String columnLabel, InputStream x)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBinaryStream(int columnIndex, InputStream x, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBinaryStream(String columnLabel, InputStream x,
+ long length) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBinaryStream(int columnIndex, InputStream x)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBinaryStream(String columnLabel, InputStream x)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBlob(int columnIndex, InputStream inputStream, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBlob(String columnLabel, InputStream inputStream,
+ long length) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBlob(int columnIndex, InputStream inputStream)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateBlob(String columnLabel, InputStream inputStream)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateCharacterStream(int columnIndex, Reader x, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateCharacterStream(String columnLabel, Reader reader,
+ long length) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateCharacterStream(int columnIndex, Reader x)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateCharacterStream(String columnLabel, Reader reader)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateClob(int columnIndex, Reader reader, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateClob(String columnLabel, Reader reader, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateClob(int columnIndex, Reader reader) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateClob(String columnLabel, Reader reader)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNCharacterStream(int columnIndex, Reader x, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNCharacterStream(String columnLabel, Reader reader,
+ long length) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNCharacterStream(int columnIndex, Reader x)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNCharacterStream(String columnLabel, Reader reader)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNClob(int columnIndex, NClob clob) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNClob(String columnLabel, NClob clob) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNClob(int columnIndex, Reader reader, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNClob(String columnLabel, Reader reader, long length)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNClob(int columnIndex, Reader reader) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNClob(String columnLabel, Reader reader)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNString(int columnIndex, String string)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateNString(String columnLabel, String string)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateRowId(int columnIndex, RowId x) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateRowId(String columnLabel, RowId x) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateSQLXML(int columnIndex, SQLXML xmlObject)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void updateSQLXML(String columnLabel, SQLXML xmlObject)
+ throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean isWrapperFor(Class<?> iface) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public <T> T unwrap(Class<T> iface) throws SQLException, NotImplementedException {
+ // TODO Auto-generated method stub
+ return null;
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java?rev=601315&r1=601314&r2=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/sql/src/test/java/org/apache/harmony/sql/tests/internal/rowset/CachedRowSetImplTest.java Wed Dec 5 04:25:42 2007
@@ -14,6 +14,7 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
package org.apache.harmony.sql.tests.internal.rowset;
import java.math.BigDecimal;
@@ -22,9 +23,7 @@
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
import java.sql.SQLException;
-import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Arrays;
@@ -36,101 +35,16 @@
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.spi.SyncProviderException;
-import junit.framework.TestCase;
-
-public class CachedRowSetImplTest extends TestCase {
-
- private static final String DERBY_URL_Create = "jdbc:derby:src/test/resources/TESTDB;create=true";
-
- private static final String DERBY_URL = "jdbc:derby:src/test/resources/TESTDB";
-
- private Connection conn = null;
-
- private Statement st;
-
- private ResultSet rs;
-
- private CachedRowSet crset;
-
- private CachedRowSet noInitialCrset;
-
- private final static int DEFAULT_COLUMN_COUNT = 12;
-
- private final static int DEFAULT_ROW_COUNT = 4;
+public class CachedRowSetImplTest extends CachedRowSetTestCase {
+ @Override
public void setUp() throws Exception {
- Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
-
- try {
- conn = DriverManager.getConnection(DERBY_URL);
- } catch (SQLException e) {
- try {
- conn = DriverManager.getConnection(DERBY_URL_Create);
- } catch (SQLException ee) {
- throw new SQLException("Create DB Failure!");
- }
- }
-
- st = conn.createStatement();
- rs = conn.getMetaData().getTables(null, "APP", "USER_INFO", null);
- String createTableSQL = "create table USER_INFO (ID INTEGER NOT NULL,NAME VARCHAR(10) NOT NULL, BIGINT_T BIGINT, "
- + "NUMERIC_T NUMERIC, DECIMAL_T DECIMAL, SMALLINT_T SMALLINT, FLOAT_T FLOAT, REAL_T REAL, DOUBLE_T DOUBLE,"
- + "DATE_T DATE, TIME_T TIME, TIMESTAMP_T TIMESTAMP)";
- String alterTableSQL = "ALTER TABLE USER_INFO ADD CONSTRAINT USER_INFO_PK Primary Key (ID)";
-
- if (!rs.next()) {
- st.execute(createTableSQL);
- st.execute(alterTableSQL);
- }
-
- insertData();
- rs = st.executeQuery("select * from USER_INFO");
- try {
- crset = (CachedRowSet) Class.forName(
- "com.sun.rowset.CachedRowSetImpl").newInstance();
- noInitialCrset = (CachedRowSet) Class.forName(
- "com.sun.rowset.CachedRowSetImpl").newInstance();
- } catch (ClassNotFoundException e) {
-
- crset = (CachedRowSet) Class.forName(
- "org.apache.harmony.sql.internal.rowset.CachedRowSetImpl")
- .newInstance();
- noInitialCrset = (CachedRowSet) Class.forName(
- "org.apache.harmony.sql.internal.rowset.CachedRowSetImpl")
- .newInstance();
-
- System.setProperty("Testing Harmony", "true");
- }
- crset.populate(rs);
- rs = st.executeQuery("select * from USER_INFO");
- crset.setUrl(DERBY_URL);
- }
-
- private void reloadCachedRowSet() throws SQLException {
- rs = st.executeQuery("select * from USER_INFO");
- crset.populate(rs);
- rs = st.executeQuery("select * from USER_INFO");
- crset.setUrl(DERBY_URL);
+ super.setUp();
}
+ @Override
public void tearDown() throws Exception {
- if (rs != null) {
- rs.close();
- }
- if (crset != null) {
- crset.close();
- }
- if (st != null) {
- st.close();
- }
- if (conn != null) {
- /*
- * if doesn't call rollback, ri will throw exception then block
- * java.sql.SQLException: Invalid transaction state.
- */
- conn.rollback();
- conn.close();
- }
+ super.tearDown();
}
public void testGetOriginalRow() throws Exception {
@@ -331,12 +245,12 @@
*/
crset.acceptChanges();
- rs = st.executeQuery("select * from USER_INFO");
- rs.next();
- assertEquals(rs.getString(2), "hermit");
+ rs = st.executeQuery("select * from USER_INFO where NAME = 'hermit'");
rs.next();
+ assertEquals("hermit", rs.getString(2));
+ rs = st.executeQuery("select * from USER_INFO where NAME = 'test4'");
rs.next();
- assertEquals(rs.getString(2), "test4");
+ assertEquals("test4", rs.getString(2));
}
@@ -372,6 +286,63 @@
assertEquals("hermit", crset.getString(2));
}
+ public void testExecute3() throws Exception {
+ // insert 15 more rows for test
+ insertMoreData(15);
+
+ rs = st.executeQuery("select * from USER_INFO");
+ noInitialCrset.setUrl(DERBY_URL);
+ noInitialCrset.setPageSize(5);
+ noInitialCrset.setCommand("select * from USER_INFO");
+ noInitialCrset.execute();
+ rs = st.executeQuery("select * from USER_INFO");
+ int cursorIndex = 0;
+ while (noInitialCrset.next() && rs.next()) {
+ cursorIndex++;
+ for (int i = 1; i <= DEFAULT_COLUMN_COUNT; i++) {
+ assertEquals(rs.getObject(i), noInitialCrset.getObject(i));
+ }
+ }
+ // The pageSize works here. CachedRowSet only get 5 rows from ResultSet.
+ assertEquals(5, cursorIndex);
+
+ // change a command
+ noInitialCrset = newNoInitialInstance();
+ noInitialCrset.setUrl(null);
+ // The pageSize still work here
+ noInitialCrset.setPageSize(5);
+ assertEquals(5, noInitialCrset.getPageSize());
+ noInitialCrset.setCommand("select * from USER_INFO where NAME like ?");
+ noInitialCrset.setString(1, "test%");
+ Connection aConn = DriverManager.getConnection(DERBY_URL);
+ noInitialCrset.execute(aConn);
+ aConn.close();
+ cursorIndex = 1;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ assertEquals(cursorIndex, noInitialCrset.getInt(1));
+ }
+ assertEquals(6, cursorIndex);
+
+ noInitialCrset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+
+ noInitialCrset.setUrl(DERBY_URL);
+ noInitialCrset.setPageSize(5);
+ noInitialCrset.setMaxRows(2);
+ noInitialCrset.setCommand("select * from USER_INFO");
+
+ noInitialCrset.execute();
+
+ rs = st.executeQuery("select * from USER_INFO");
+ cursorIndex = 0;
+ while (noInitialCrset.next() && rs.next()) {
+ cursorIndex++;
+ }
+ // maxRows works here
+ assertEquals(2, cursorIndex);
+ }
+
public void testCreateShared() throws Exception {
crset.setUsername("testUsername");
crset.setPassword("testPassword");
@@ -749,7 +720,8 @@
rs.next();
rs.next();
rs.next();
- assertEquals(rs.getString(2), "copyTest3");
+ // TODO: Uncomment it when Writer is implemented fully.
+ // assertEquals(rs.getString(2), "copyTest3");
reloadCachedRowSet();
crset.absolute(2);
@@ -919,50 +891,6 @@
assertFalse(crset.next());
}
- private void isMetaDataEquals(ResultSetMetaData expected,
- ResultSetMetaData actual) throws SQLException {
- assertEquals(expected.getColumnCount(), actual.getColumnCount());
-
- int columnCount = expected.getColumnCount();
-
- for (int column = 1; column <= columnCount; column++) {
- assertEquals(expected.isAutoIncrement(column), actual
- .isAutoIncrement(column));
- assertEquals(expected.isCaseSensitive(column), actual
- .isCaseSensitive(column));
- assertEquals(expected.isCurrency(column), actual.isCurrency(column));
- assertEquals(expected.isDefinitelyWritable(column), actual
- .isDefinitelyWritable(column));
- assertEquals(expected.isReadOnly(column), actual.isReadOnly(column));
- assertEquals(expected.isSearchable(column), actual
- .isSearchable(column));
- assertEquals(expected.isSigned(column), actual.isSigned(column));
- assertEquals(expected.isWritable(column), actual.isWritable(column));
- assertEquals(expected.isNullable(column), actual.isNullable(column));
- assertEquals(expected.getCatalogName(column), actual
- .getCatalogName(column));
- assertEquals(expected.getColumnClassName(column), actual
- .getColumnClassName(column));
- assertEquals(expected.getColumnDisplaySize(column), actual
- .getColumnDisplaySize(column));
- assertEquals(expected.getColumnLabel(column), actual
- .getColumnLabel(column));
- assertEquals(expected.getColumnName(column), actual
- .getColumnName(column));
- assertEquals(expected.getColumnType(column), actual
- .getColumnType(column));
- assertEquals(expected.getColumnTypeName(column), actual
- .getColumnTypeName(column));
- assertEquals(expected.getPrecision(column), actual
- .getPrecision(column));
- assertEquals(expected.getScale(column), actual.getScale(column));
- assertEquals(expected.getSchemaName(column), actual
- .getSchemaName(column));
- assertEquals(expected.getTableName(column), actual
- .getTableName(column));
- }
- }
-
public void testAfterLast() throws Exception {
try {
rs.afterLast();
@@ -1018,73 +946,199 @@
}
}
- public void testPopulate() throws Exception {
- CachedRowSet cc = crset.createCopy();
+ public void testPopulate_LResultSet() throws Exception {
+ // insert 15 more rows for test
+ insertMoreData(15);
+
+ rs = st.executeQuery("select * from USER_INFO");
+ noInitialCrset.setMaxRows(15);
+ assertEquals(15, noInitialCrset.getMaxRows());
+
+ noInitialCrset.populate(rs);
+
+ assertTrue(noInitialCrset.isBeforeFirst());
+ int cursorIndex = 0;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ }
+ // setMaxRows no effect, we follow ri
+ assertEquals(20, cursorIndex);
+
+ /*
+ * The pageSize won't work when call method populate(ResultSet) without
+ * second parameter
+ */
+ noInitialCrset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+
+ noInitialCrset.setMaxRows(15);
+ assertEquals(15, noInitialCrset.getMaxRows());
+
+ noInitialCrset.setPageSize(5);
+ assertEquals(5, noInitialCrset.getPageSize());
+
+ noInitialCrset.populate(rs);
+
+ assertTrue(noInitialCrset.isBeforeFirst());
+ rs = st.executeQuery("select * from USER_INFO");
+ cursorIndex = 0;
+ while (noInitialCrset.next() && rs.next()) {
+ cursorIndex++;
+ }
+ /*
+ * It's supposed to only get five rows in CachedRowSet as the
+ * CachedRowSet's pageSize is 5. However, the pageSize doesn't work in
+ * RI. The CachedRowSet gets all the data from ResultSet. We follow ri.
+ */
+ assertEquals(20, cursorIndex);
+
+ noInitialCrset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ // cursor move two rows
+ rs.next();
+ rs.next();
+ noInitialCrset.populate(rs);
+ assertTrue(noInitialCrset.isBeforeFirst());
+ cursorIndex = 0;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ }
+ assertEquals(18, cursorIndex);
+ }
+
+ public void testPopulate_LResultSet_I() throws Exception {
+ // insert 15 more rows for test
+ insertMoreData(15);
+
+ rs = st.executeQuery("select * from USER_INFO");
+ noInitialCrset.setPageSize(5);
try {
- crset.populate(rs, 0);
- fail("should throw exception");
- } catch (Exception e) {
+ noInitialCrset.populate(rs, 1);
+ fail("Should throw SQLException");
+ } catch (SQLException e) {
// expected
}
- crset.populate(rs);
- crset.first();
- assertEquals("hermit", crset.getString(2));
- crset.populate(cc, 2);
- crset.first();
- assertEquals("test", crset.getString(2));
+ // create a scrollable and updatable ResultSet
+ st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
+ ResultSet.CONCUR_UPDATABLE);
+ rs = st.executeQuery("select * from USER_INFO");
+
+ noInitialCrset = newNoInitialInstance();
+ noInitialCrset.setPageSize(6);
+ noInitialCrset.populate(rs, 6);
+ int cursorIndex = 5;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ assertEquals(cursorIndex, noInitialCrset.getInt(1));
+ }
+ assertEquals(11, cursorIndex);
+
+ st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
+ ResultSet.CONCUR_UPDATABLE);
+ rs = st.executeQuery("select * from USER_INFO");
+
+ noInitialCrset = newNoInitialInstance();
+
+ noInitialCrset.setPageSize(6);
+ noInitialCrset.setMaxRows(5);
+
+ noInitialCrset.populate(rs, 6);
+ cursorIndex = 0;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ assertEquals(cursorIndex + 5, noInitialCrset.getInt(1));
+ }
+ // only get MaxRows
+ assertEquals(5, cursorIndex);
+
+ st = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
+ ResultSet.CONCUR_UPDATABLE);
+ rs = st.executeQuery("select * from USER_INFO");
+
+ noInitialCrset = newNoInitialInstance();
+
+ noInitialCrset.setMaxRows(5);
+ try {
+ noInitialCrset.setPageSize(6);
+ fail("Should throw SQLException");
+ } catch (SQLException e) {
+ // expected, Page size cannot be greater than maxRows
+ }
- crset.populate(cc, 1);
- crset.first();
- assertEquals("hermit", crset.getString(2));
}
- private void insertData() throws Exception {
+ public void testPopulate_use_copy() throws Exception {
+ // insert 15 more rows for test
+ insertMoreData(15);
- st.executeUpdate("delete from USER_INFO");
+ rs = st.executeQuery("select * from USER_INFO");
+ crset.close();
+ crset.populate(rs);
- // first row
- st.executeUpdate("insert into USER_INFO(ID,NAME) values (1,'hermit')");
- // second row
- st.executeUpdate("insert into USER_INFO(ID,NAME) values (2,'test')");
+ CachedRowSet crsetCopy = crset.createCopy();
+ assertEquals(0, crsetCopy.getPageSize());
+ noInitialCrset.setPageSize(5);
+ // if it doesn't specify the startRow for method populate(), then the
+ // pageSize wouldn't work.
+ assertTrue(crsetCopy.isBeforeFirst());
+ noInitialCrset.populate(crsetCopy);
+ assertTrue(crsetCopy.isAfterLast());
+ int cursorIndex = 0;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ for (int i = 1; i <= DEFAULT_COLUMN_COUNT; i++) {
+ assertEquals(cursorIndex, noInitialCrset.getInt(1));
+ }
+ }
+ assertEquals(20, cursorIndex);
- String insertSQL = "INSERT INTO USER_INFO(ID, NAME, BIGINT_T, NUMERIC_T, DECIMAL_T, SMALLINT_T, "
- + "FLOAT_T, REAL_T, DOUBLE_T, DATE_T, TIME_T, TIMESTAMP_T) VALUES(?, ?, ?, ?, ?, ?,"
- + "?, ?, ?, ?, ?, ? )";
- PreparedStatement preStmt = conn.prepareStatement(insertSQL);
- // third row
- preStmt.setInt(1, 3);
- preStmt.setString(2, "test3");
- preStmt.setLong(3, 3333L);
- preStmt.setBigDecimal(4, new BigDecimal(123));
- preStmt.setBigDecimal(5, new BigDecimal(23));
- preStmt.setInt(6, 13);
- preStmt.setFloat(7, 3.7F);
- preStmt.setFloat(8, 3.888F);
- preStmt.setDouble(9, 3.9999);
- preStmt.setDate(10, new Date(523654123));
- preStmt.setTime(11, new Time(966554221));
- preStmt.setTimestamp(12, new Timestamp(521342100));
- preStmt.executeUpdate();
- // fourth row
- preStmt.setInt(1, 4);
- preStmt.setString(2, "test4");
- preStmt.setLong(3, 444423L);
- preStmt.setBigDecimal(4, new BigDecimal(12));
- preStmt.setBigDecimal(5, new BigDecimal(23));
- preStmt.setInt(6, 41);
- preStmt.setFloat(7, 4.8F);
- preStmt.setFloat(8, 4.888F);
- preStmt.setDouble(9, 4.9999);
- preStmt.setDate(10, new Date(965324512));
- preStmt.setTime(11, new Time(452368512));
- preStmt.setTimestamp(12, new Timestamp(874532105));
- preStmt.executeUpdate();
+ try {
+ noInitialCrset.populate(crsetCopy, 0);
+ fail("Should throw SQLException");
+ } catch (SQLException e) {
+ // invalid cursor position
+ }
- if (preStmt != null) {
- preStmt.close();
+ try {
+ noInitialCrset.populate(crsetCopy, -1);
+ fail("Should throw SQLException");
+ } catch (SQLException e) {
+ // invalid cursor position
+ }
+
+ try {
+ noInitialCrset.populate(crsetCopy, 100);
+ fail("Should throw SQLException");
+ } catch (SQLException e) {
+ // invalid cursor position
}
+
+ // specify the startRow, then the noInitialCrset will get only 5 rows
+ noInitialCrset.populate(crsetCopy, 1);
+ assertEquals(5, noInitialCrset.getPageSize());
+ assertTrue(noInitialCrset.isBeforeFirst());
+ cursorIndex = 0;
+ rs = st.executeQuery("select * from USER_INFO");
+ while (noInitialCrset.next() && rs.next()) {
+ cursorIndex++;
+ for (int i = 1; i <= DEFAULT_COLUMN_COUNT; i++) {
+ assertEquals(cursorIndex, noInitialCrset.getInt(1));
+ assertEquals(rs.getObject(i), noInitialCrset.getObject(i));
+ }
+ }
+ // the pageSize works here
+ assertEquals(5, cursorIndex);
+
+ // the noInitialCrset would fetch data from the eleventh row
+ noInitialCrset.populate(crsetCopy, 11);
+ cursorIndex = 10;
+ while (noInitialCrset.next()) {
+ cursorIndex++;
+ assertEquals(cursorIndex, noInitialCrset.getInt(1));
+ }
+ assertEquals(15, cursorIndex);
}
public void testConstructor() throws Exception {
@@ -1193,7 +1247,7 @@
if ("true".equals(System.getProperty("Testing Harmony"))) {
assertFalse(crset.absolute(0));
}
-
+
assertEquals(ResultSet.TYPE_SCROLL_INSENSITIVE, crset.getType());
assertTrue(crset.absolute(1));
assertEquals(1, crset.getInt(1));
@@ -1319,7 +1373,6 @@
// expected
}
-
try {
crset.first();
fail("should throw SQLException");
@@ -1335,6 +1388,343 @@
}
assertTrue(crset.isFirst());
+ }
+
+ public void testAcceptChanges_Insert() throws Exception {
+ /*
+ * Insert a new row one time
+ */
+ crset.moveToInsertRow();
+ crset.updateInt(1, 5);
+ crset.updateString(2, "test5");
+ crset.updateLong(3, 444423L);
+ crset.updateBigDecimal(4, new BigDecimal(12));
+ crset.updateBigDecimal(5, new BigDecimal(23));
+ crset.updateInt(6, 41);
+ crset.updateFloat(7, 4.8F);
+ crset.updateFloat(8, 4.888F);
+ crset.updateDouble(9, 4.9999);
+ crset.updateDate(10, new Date(965324512));
+ crset.updateTime(11, new Time(452368512));
+ crset.updateTimestamp(12, new Timestamp(874532105));
+ crset.insertRow();
+ crset.moveToCurrentRow();
+ crset.acceptChanges(conn);
+ // check the new row in CachedRowSet
+ crset.beforeFirst();
+ String newRowValue = "";
+ while (crset.next()) {
+ if (crset.getInt(1) == 5) {
+ newRowValue = "test5";
+ }
+ }
+ assertEquals("test5", newRowValue);
+ // check the new row in DB
+ rs = st.executeQuery("select * from USER_INFO where ID = 5");
+ assertTrue(rs.next());
+ assertEquals(5, rs.getInt(1));
+
+ /*
+ * TODO Insert multiple rows one time, uncomment after implemented
+ */
+ // TODO uncomment it after insert methods are implemented
+ // noInitialCrset = newNoInitialInstance();
+ // rs = st.executeQuery("select * from USER_INFO");
+ // noInitialCrset.populate(rs);
+ // noInitialCrset.setReadOnly(false);
+ // noInitialCrset.moveToInsertRow();
+ // for (int i = 6; i <= 20; i++) {
+ // noInitialCrset.updateInt(1, i);
+ // noInitialCrset.updateString(2, "test" + i);
+ // noInitialCrset.insertRow();
+ // }
+ // noInitialCrset.moveToCurrentRow();
+ // noInitialCrset.acceptChanges(conn);
+ // // check the new rows in CachedRowSet
+ // assertEquals(20, noInitialCrset.size());
+ // // check the new rows in DB
+ // rs = st.executeQuery("select * from USER_INFO");
+ // int cursorIndex = 0;
+ // while (rs.next()) {
+ // cursorIndex++;
+ // }
+ // assertEquals(20, cursorIndex);
+ }
+
+ public void testAcceptChanges_InsertException() throws Exception {
+ /*
+ * Insert a new row. One given column's value exceeds the max range.
+ * Therefore, it should throw SyncProviderException.
+ */
+ crset.moveToInsertRow();
+ crset.updateInt(1, 4);
+ crset.updateString(2, "test5");
+ crset.updateLong(3, 555555L);
+ crset.updateInt(4, 200000); // 200000 exceeds the NUMERIC's range
+ crset.updateBigDecimal(5, new BigDecimal(23));
+ crset.updateFloat(8, 4.888F);
+ crset.insertRow();
+ crset.moveToCurrentRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+
+ /*
+ * Insert a new row. The new row's primary key has existed. Therefore,
+ * it should throw SyncProviderException.
+ */
+ crset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ crset.populate(rs);
+ crset.moveToInsertRow();
+ crset.updateInt(1, 4); // The ID valued 4 has existed in db.
+ crset.updateString(2, "test5");
+ crset.updateBigDecimal(4, new BigDecimal(12));
+ crset.updateTimestamp(12, new Timestamp(874532105));
+ crset.insertRow();
+ crset.moveToCurrentRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+
+ /*
+ * Insert a new row. Before inserting the new row, another new row which
+ * has the same data is inserted into the DB. However, the current
+ * CachedRowSet doesn't know it. In this situation, it should throw
+ * SyncProviderException.
+ */
+ crset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ crset.populate(rs);
+ String insertSQL = "INSERT INTO USER_INFO(ID, NAME, BIGINT_T, NUMERIC_T,DECIMAL_T, SMALLINT_T, "
+ + "FLOAT_T, REAL_T, DOUBLE_T, DATE_T, TIME_T, TIMESTAMP_T) VALUES(?, ?, ?, ?, ?, ?,"
+ + "?, ?, ?, ?, ?, ? )";
+ PreparedStatement preStmt = conn.prepareStatement(insertSQL);
+ preStmt.setInt(1, 80);
+ preStmt.setString(2, "test" + 80);
+ preStmt.setLong(3, 444423L);
+ preStmt.setBigDecimal(4, new BigDecimal(12));
+ preStmt.setBigDecimal(5, new BigDecimal(23));
+ preStmt.setInt(6, 41);
+ preStmt.setFloat(7, 4.8F);
+ preStmt.setFloat(8, 4.888F);
+ preStmt.setDouble(9, 4.9999);
+ preStmt.setDate(10, new Date(965324512));
+ preStmt.setTime(11, new Time(452368512));
+ preStmt.setTimestamp(12, new Timestamp(874532105));
+ preStmt.executeUpdate();
+ if (preStmt != null) {
+ preStmt.close();
+ }
+ // check the new row in DB
+ rs = st.executeQuery("select * from USER_INFO where ID = 80");
+ assertTrue(rs.next());
+ assertEquals(80, rs.getInt(1));
+ assertEquals("test80", rs.getString(2));
+
+ // now call CachedRowSet.insertRow()
+ crset.moveToInsertRow();
+ crset.updateInt(1, 80);
+ crset.updateString(2, "test" + 80);
+ crset.updateLong(3, 444423L);
+ crset.updateBigDecimal(4, new BigDecimal(12));
+ crset.updateBigDecimal(5, new BigDecimal(23));
+ crset.updateInt(6, 41);
+ crset.updateFloat(7, 4.8F);
+ crset.updateFloat(8, 4.888F);
+ crset.updateDouble(9, 4.9999);
+ crset.updateDate(10, new Date(965324512));
+ crset.updateTime(11, new Time(452368512));
+ crset.updateTimestamp(12, new Timestamp(874532105));
+ crset.insertRow();
+ crset.moveToCurrentRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+ }
+
+ public void testAcceptChanges_Delete() throws Exception {
+ /*
+ * Delete all the row. On the first and second row, only two columns
+ * have value, all the others are NULL. When run on RI, deleteRow() will
+ * go wrong and throw Exception. According to the spec, deleteRow() is
+ * supposed to ok.
+ */
+ crset.beforeFirst();
+ while (crset.next()) {
+ crset.deleteRow();
+ }
+ if ("true".equals(System.getProperty("Testing Harmony"))) {
+ crset.acceptChanges(conn);
+ } else {
+ try {
+ crset.acceptChanges(conn);
+ } catch (NullPointerException e) {
+ // RI would throw NullPointerException when deleting a row in
+ // which some columns' value are null
+ }
+ }
+ // check DB
+ rs = st.executeQuery("select * from USER_INFO");
+ int rowCount = 0;
+ while (rs.next()) {
+ rowCount++;
+ }
+ if ("true".equals(System.getProperty("Testing Harmony"))) {
+ assertEquals(0, rowCount);
+ } else {
+ assertEquals(4, rowCount);
+ }
+ }
+
+ public void testAcceptChanges_DeleteException() throws Exception {
+ /*
+ * Delete a row which has been deleted from database
+ */
+ int result = st.executeUpdate("delete from USER_INFO where ID = 3");
+ assertEquals(1, result);
+ // move to the third row which doesn't exist in database
+ assertTrue(crset.absolute(3));
+ assertEquals(3, crset.getInt(1));
+ crset.deleteRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+
+ /*
+ * Delete a row which has been updated in database
+ */
+ crset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ crset.populate(rs);
+ result = st
+ .executeUpdate("update USER_INFO set NAME = 'update44' where ID = 4");
+ assertEquals(1, result);
+ // move to the updated row
+ crset.absolute(3);
+ assertEquals(4, crset.getInt(1));
+ assertEquals("test4", crset.getString(2));
+ crset.deleteRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+ }
+
+ public void testAcceptChanges_Update() throws Exception {
+ // update the first row
+ assertTrue(crset.absolute(1));
+ crset.updateInt(1, 11);
+ crset.updateString(2, "test11");
+ crset.updateRow();
+ crset.acceptChanges(conn);
+ // check DB
+ rs = st.executeQuery("select * from USER_INFO where ID = 11");
+ assertTrue(rs.next());
+ assertEquals(11, rs.getInt(1));
+ assertEquals("test11", rs.getString(2));
+
+ // update the third row
+ noInitialCrset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ noInitialCrset.populate(rs);
+ assertTrue(noInitialCrset.absolute(1));
+ noInitialCrset.updateInt(1, 111);
+ noInitialCrset.updateString(2, "update111");
+ noInitialCrset.updateRow();
+ assertTrue(noInitialCrset.absolute(3));
+ noInitialCrset.updateInt(1, 333);
+ noInitialCrset.updateString(2, "update333");
+ noInitialCrset.updateLong(3, 33333L);
+ noInitialCrset.updateRow();
+ noInitialCrset.acceptChanges(conn);
+ // check DB
+ rs = st.executeQuery("select * from USER_INFO where ID = 111");
+ assertTrue(rs.next());
+ assertEquals(111, rs.getInt(1));
+ assertEquals("update111", rs.getString(2));
+ rs = st.executeQuery("select * from USER_INFO where ID = 333");
+ assertTrue(rs.next());
+ assertEquals(333, rs.getInt(1));
+ assertEquals("update333", rs.getString(2));
+ assertEquals(33333L, rs.getLong(3));
+ }
+
+ public void testAcceptChanges_UpdateException() throws Exception {
+ /*
+ * Update a row which has been deleted from database
+ */
+ int result = st.executeUpdate("delete from USER_INFO where ID = 3");
+ assertEquals(1, result);
+ // move to the third row which doesn't exist in database
+ assertTrue(crset.absolute(3));
+ assertEquals(3, crset.getInt(1));
+ crset.updateString(2, "update33");
+ crset.updateRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+
+ /*
+ * Update a row which has been updated in database
+ */
+ crset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ crset.populate(rs);
+ result = st
+ .executeUpdate("update USER_INFO set NAME = 'update44' where ID = 4");
+ assertEquals(1, result);
+ // move to the updated row
+ assertTrue(crset.absolute(3));
+ assertEquals(4, crset.getInt(1));
+ assertEquals("test4", crset.getString(2));
+ crset.updateString(2, "change4");
+ crset.updateRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
+
+ /*
+ * Update a row in which one column's value is out of range
+ */
+ crset = newNoInitialInstance();
+ rs = st.executeQuery("select * from USER_INFO");
+ crset.populate(rs);
+ assertEquals(3, crset.size());
+ assertTrue(crset.absolute(3));
+ assertEquals(4, crset.getInt(1));
+ crset.updateString(2, "update4");
+ crset.updateLong(3, 555555L);
+ crset.updateInt(4, 200000); // 200000 exceeds the NUMERIC's range
+ crset.updateBigDecimal(5, new BigDecimal(23));
+ crset.updateFloat(8, 4.888F);
+ crset.updateRow();
+ try {
+ crset.acceptChanges(conn);
+ fail("should throw SyncProviderException");
+ } catch (SyncProviderException e) {
+ // TODO analysis SyncProviderException
+ }
}
public class Listener implements RowSetListener, Cloneable {
Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/filechooser/FileSystemView.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/filechooser/FileSystemView.java?rev=601315&r1=601314&r2=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/filechooser/FileSystemView.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/filechooser/FileSystemView.java Wed Dec 5 04:25:42 2007
@@ -349,7 +349,7 @@
public boolean isFileSystemRoot(final File dir) {
File[] roots = File.listRoots();
for (int i = 0; i < roots.length; i++) {
- if (roots.equals(dir)) {
+ if (roots[i].equals(dir)) {
return true;
}
}
Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/plaf/basic/BasicComboBoxUI.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/plaf/basic/BasicComboBoxUI.java?rev=601315&r1=601314&r2=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/plaf/basic/BasicComboBoxUI.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/main/java/common/javax/swing/plaf/basic/BasicComboBoxUI.java Wed Dec 5 04:25:42 2007
@@ -407,7 +407,14 @@
}
public void addEditor() {
- editor = comboBox.getEditor().getEditorComponent();
+ ComboBoxEditor cbe = comboBox.getEditor();
+ if (cbe == null)
+ return;
+
+ editor = cbe.getEditorComponent();
+ if (editor == null)
+ return;
+
configureEditor();
comboBox.add(editor);
}
Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/JComboBoxTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/JComboBoxTest.java?rev=601315&r1=601314&r2=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/JComboBoxTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/JComboBoxTest.java Wed Dec 5 04:25:42 2007
@@ -20,6 +20,7 @@
*/
package javax.swing;
+import java.awt.Component;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
@@ -793,6 +794,23 @@
public void testInstallAncestorListener() throws Exception {
assertEquals(1, comboBox.getAncestorListeners().length);
}
+
+ public void testHarmony5223() {
+ ComboBoxEditor editor = new NullComboBoxEditor();
+ comboBox.setEditor(editor);
+ assertEquals(editor, comboBox.getEditor());
+ }
+
+ public class NullComboBoxEditor extends BasicComboBoxEditor {
+ public NullComboBoxEditor() {
+ super();
+ }
+
+ public Component getEditorComponent() {
+ return null;
+ }
+ }
+
private class ActionController implements ActionListener {
private ActionEvent event;
Modified: harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/filechooser/FileSystemViewTest.java
URL: http://svn.apache.org/viewvc/harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/filechooser/FileSystemViewTest.java?rev=601315&r1=601314&r2=601315&view=diff
==============================================================================
--- harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/filechooser/FileSystemViewTest.java (original)
+++ harmony/enhanced/classlib/branches/java6/modules/swing/src/test/api/java.injected/javax/swing/filechooser/FileSystemViewTest.java Wed Dec 5 04:25:42 2007
@@ -144,6 +144,12 @@
dir.delete();
}
}
+
+ public void testHarmony5211() {
+ File []roots = File.listRoots();
+ for (int i = 0; i < roots.length; i++)
+ assertTrue(view.isFileSystemRoot(roots[i]));
+ }
private static void assertNotEmpty(final String name) {
assertNotNull(name);