This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-dbcp.git
The following commit(s) were added to refs/heads/master by this push:
new f84bf38 [DBCP-552]
org.apache.commons.dbcp2.DelegatingConnection.passivate() should close ALL of
its resources even when an exception occurs.
f84bf38 is described below
commit f84bf38c0170f6b6b723293306a3a11df16d2d36
Author: Gary Gregory <[email protected]>
AuthorDate: Tue Jul 30 18:24:08 2019 -0400
[DBCP-552] org.apache.commons.dbcp2.DelegatingConnection.passivate()
should close ALL of its resources even when an exception occurs.
Also remove trailing whitespace.
---
src/changes/changes.xml | 5 +-
.../org/apache/commons/dbcp2/AbandonedTrace.java | 2 +-
.../org/apache/commons/dbcp2/BasicDataSource.java | 4 +-
.../commons/dbcp2/ConnectionFactoryFactory.java | 4 +-
.../apache/commons/dbcp2/DelegatingConnection.java | 32 ++-
.../apache/commons/dbcp2/DelegatingStatement.java | 10 +-
.../org/apache/commons/dbcp2/DriverFactory.java | 2 +-
.../org/apache/commons/dbcp2/SQLExceptionList.java | 14 +-
.../dbcp2/datasources/InstanceKeyDataSource.java | 2 +-
.../commons/dbcp2/managed/ManagedDataSource.java | 2 +-
.../commons/dbcp2/TestDelegatingConnection.java | 120 +++++---
.../commons/dbcp2/TestDelegatingStatement.java | 2 +-
.../org/apache/commons/dbcp2/TesterConnection.java | 315 +++++++++++----------
.../commons/dbcp2/TesterConnectionFactory.java | 2 +-
.../commons/dbcp2/TesterPreparedStatement.java | 2 +-
.../org/apache/commons/dbcp2/TesterResultSet.java | 8 +-
.../org/apache/commons/dbcp2/TesterStatement.java | 16 +-
.../dbcp2/cpdsadapter/TestDriverAdapterCPDS.java | 2 +-
18 files changed, 310 insertions(+), 234 deletions(-)
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index b69108a..13e1356 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -125,7 +125,10 @@ The <action> type attribute can be add,update,fix,remove.
Update tests from org.mockito:mockito-core 2.28.2 to 3.0.0.
</action>
<action dev="ggregory" type="update" issue="DBCP-551" due-to="Gary
Gregory">
- org.apache.commons.dbcp2.DelegatingStatement.close() should try to
close ALL of its result sets.
+ org.apache.commons.dbcp2.DelegatingStatement.close() should try to
close ALL of its result sets even when an exception occurs.
+ </action>
+ <action dev="ggregory" type="update" issue="DBCP-552" due-to="Gary
Gregory">
+ org.apache.commons.dbcp2.DelegatingConnection.passivate() should close
ALL of its resources even when an exception occurs.
</action>
</release>
<release version="2.6.0" date="2019-02-14" description="This is a minor
release, including bug fixes and enhancements.">
diff --git a/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java
b/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java
index aa55882..a00593c 100644
--- a/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java
+++ b/src/main/java/org/apache/commons/dbcp2/AbandonedTrace.java
@@ -168,7 +168,7 @@ public class AbandonedTrace implements TrackedUse {
/**
* Removes this object the source object is tracing.
- *
+ *
* @param source The object tracing
* @since 2.7.0
*/
diff --git a/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
b/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
index 243a29f..337c40d 100644
--- a/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
+++ b/src/main/java/org/apache/commons/dbcp2/BasicDataSource.java
@@ -1541,14 +1541,14 @@ public class BasicDataSource implements DataSource,
BasicDataSourceMXBean, MBean
* Logs the given throwable.
* @param message TODO
* @param throwable the throwable.
- *
+ *
* @since 2.7.0
*/
protected void log(String message, Throwable throwable) {
if (logWriter != null) {
logWriter.println(message);
throwable.printStackTrace(logWriter);
- }
+ }
}
@Override
diff --git
a/src/main/java/org/apache/commons/dbcp2/ConnectionFactoryFactory.java
b/src/main/java/org/apache/commons/dbcp2/ConnectionFactoryFactory.java
index 394549c..d50aa74 100644
--- a/src/main/java/org/apache/commons/dbcp2/ConnectionFactoryFactory.java
+++ b/src/main/java/org/apache/commons/dbcp2/ConnectionFactoryFactory.java
@@ -23,7 +23,7 @@ import java.util.Properties;
/*
* Creates {@link ConnectionFactory} instances.
- *
+ *
* @since 2.7.0
*/
class ConnectionFactoryFactory {
@@ -31,7 +31,7 @@ class ConnectionFactoryFactory {
/**
* Creates a new {@link DriverConnectionFactory} allowing for an override
through
* {@link BasicDataSource#getDriverClassName()}.
- *
+ *
* @param basicDataSource Configures creation.
* @param driver The JDBC driver.
* @return a new {@link DriverConnectionFactory} allowing for a {@link
BasicDataSource#getDriverClassName()}
diff --git a/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java
b/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java
index 2b8853f..02b5ac1 100644
--- a/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java
+++ b/src/main/java/org/apache/commons/dbcp2/DelegatingConnection.java
@@ -34,6 +34,7 @@ import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
@@ -246,22 +247,17 @@ public class DelegatingConnection<C extends Connection>
extends AbandonedTrace i
}
protected void handleException(final SQLException e) throws SQLException {
- handleException(e, true);
+ throw e;
}
/**
- * Rethrows the given {@code SQLException} if {@code rethrow} is true.
- *
+ * Handles the given {@code SQLException}.
+ *
* @param e The SQLException
- * @param rethrow Wether or not to rethrow
* @return the given {@code SQLException}
- * @throws SQLException the given {@code SQLException}
* @since 2.7.0
*/
- protected SQLException handleException(final SQLException e, final boolean
rethrow) throws SQLException {
- if (rethrow) {
- throw e;
- }
+ protected <T extends Throwable> T handleExceptionNoThrow(final T e) {
return e;
}
@@ -620,23 +616,35 @@ public class DelegatingConnection<C extends Connection>
extends AbandonedTrace i
}
protected void passivate() throws SQLException {
- // The JDBC spec requires that a Connection close any open
+ // The JDBC specification requires that a Connection close any open
// Statement's when it is closed.
// DBCP-288. Not all the traced objects will be statements
final List<AbandonedTrace> traces = getTrace();
if (traces != null && !traces.isEmpty()) {
+ final List<Exception> thrown = new ArrayList<>();
final Iterator<AbandonedTrace> traceIter = traces.iterator();
while (traceIter.hasNext()) {
final Object trace = traceIter.next();
if (trace instanceof Statement) {
- ((Statement) trace).close();
+ try {
+ ((Statement) trace).close();
+ } catch (Exception e) {
+ thrown.add(e);
+ }
} else if (trace instanceof ResultSet) {
// DBCP-265: Need to close the result sets that are
// generated via DatabaseMetaData
- ((ResultSet) trace).close();
+ try {
+ ((ResultSet) trace).close();
+ } catch (Exception e) {
+ thrown.add(e);
+ }
}
}
clearTrace();
+ if (!thrown.isEmpty()) {
+ throw new SQLExceptionList(thrown);
+ }
}
setLastUsed(0);
}
diff --git a/src/main/java/org/apache/commons/dbcp2/DelegatingStatement.java
b/src/main/java/org/apache/commons/dbcp2/DelegatingStatement.java
index 88f01e5..e806fab 100644
--- a/src/main/java/org/apache/commons/dbcp2/DelegatingStatement.java
+++ b/src/main/java/org/apache/commons/dbcp2/DelegatingStatement.java
@@ -126,7 +126,7 @@ public class DelegatingStatement extends AbandonedTrace
implements Statement {
if (isClosed()) {
return;
}
- final List<SQLException> thrown = new ArrayList<>();
+ final List<Exception> thrown = new ArrayList<>();
try {
if (connection != null) {
connection.removeTrace(this);
@@ -145,10 +145,10 @@ public class DelegatingStatement extends AbandonedTrace
implements Statement {
if (resultSet != null) {
try {
resultSet.close();
- } catch (SQLException e) {
+ } catch (Exception e) {
if (connection != null) {
// Does not rethrow e.
- connection.handleException(e, false);
+ connection.handleExceptionNoThrow(e);
}
thrown.add(e);
}
@@ -159,10 +159,10 @@ public class DelegatingStatement extends AbandonedTrace
implements Statement {
if (statement != null) {
try {
statement.close();
- } catch (SQLException e) {
+ } catch (Exception e) {
if (connection != null) {
// Does not rethrow e.
- connection.handleException(e, false);
+ connection.handleExceptionNoThrow(e);
}
thrown.add(e);
}
diff --git a/src/main/java/org/apache/commons/dbcp2/DriverFactory.java
b/src/main/java/org/apache/commons/dbcp2/DriverFactory.java
index 2a05453..0b1e92f 100644
--- a/src/main/java/org/apache/commons/dbcp2/DriverFactory.java
+++ b/src/main/java/org/apache/commons/dbcp2/DriverFactory.java
@@ -23,7 +23,7 @@ import java.sql.SQLException;
/*
* Creates {@link Driver} instances.
- *
+ *
* @since 2.7.0
*/
class DriverFactory {
diff --git a/src/main/java/org/apache/commons/dbcp2/SQLExceptionList.java
b/src/main/java/org/apache/commons/dbcp2/SQLExceptionList.java
index 1df9356..8a35dc6 100644
--- a/src/main/java/org/apache/commons/dbcp2/SQLExceptionList.java
+++ b/src/main/java/org/apache/commons/dbcp2/SQLExceptionList.java
@@ -21,30 +21,30 @@ import java.sql.SQLException;
import java.util.List;
/**
- * A SQLException based on a list of SQLException causes.
+ * A SQLException based on a list of Throwable causes.
* <p>
* The first exception in the list is used as this exception's cause and is
accessible with the usual
* {@link #getCause()} while the complete list is accessible with {@link
#getCauseList()}.
* </p>
- *
+ *
* @since 2.7.0
*/
public class SQLExceptionList extends SQLException {
private static final long serialVersionUID = 1L;
- private final List<? extends SQLException> causeList;
+ private final List<? extends Throwable> causeList;
/**
* Creates a new exception caused by a list of exceptions.
- *
+ *
* @param causeList a list of cause exceptions.
*/
- public SQLExceptionList(List<? extends SQLException> causeList) {
- super(String.format("%,d SQLExceptions: %s", causeList.size(),
causeList), causeList.get(0));
+ public SQLExceptionList(List<? extends Throwable> causeList) {
+ super(String.format("%,d exceptions: %s", causeList.size(),
causeList), causeList.get(0));
this.causeList = causeList;
}
- public List<? extends SQLException> getCauseList() {
+ public List<? extends Throwable> getCauseList() {
return causeList;
}
diff --git
a/src/main/java/org/apache/commons/dbcp2/datasources/InstanceKeyDataSource.java
b/src/main/java/org/apache/commons/dbcp2/datasources/InstanceKeyDataSource.java
index 52ef8b3..9c1cb9f 100644
---
a/src/main/java/org/apache/commons/dbcp2/datasources/InstanceKeyDataSource.java
+++
b/src/main/java/org/apache/commons/dbcp2/datasources/InstanceKeyDataSource.java
@@ -146,7 +146,7 @@ public abstract class InstanceKeyDataSource implements
DataSource, Referenceable
/**
* Throws an IllegalStateException, if a PooledConnection has already been
requested.
- *
+ *
* @throws IllegalStateException Thrown if a PooledConnection has already
been requested.
*/
protected void assertInitializationAllowed() throws IllegalStateException {
diff --git
a/src/main/java/org/apache/commons/dbcp2/managed/ManagedDataSource.java
b/src/main/java/org/apache/commons/dbcp2/managed/ManagedDataSource.java
index 791e384..280bdeb 100644
--- a/src/main/java/org/apache/commons/dbcp2/managed/ManagedDataSource.java
+++ b/src/main/java/org/apache/commons/dbcp2/managed/ManagedDataSource.java
@@ -66,7 +66,7 @@ public class ManagedDataSource<C extends Connection> extends
PoolingDataSource<C
/**
* Gets the transaction registry.
- *
+ *
* @return The transaction registry.
* @see #setTransactionRegistry(TransactionRegistry)
* @since 2.6.0
diff --git
a/src/test/java/org/apache/commons/dbcp2/TestDelegatingConnection.java
b/src/test/java/org/apache/commons/dbcp2/TestDelegatingConnection.java
index fe3aa57..56bb998 100644
--- a/src/test/java/org/apache/commons/dbcp2/TestDelegatingConnection.java
+++ b/src/test/java/org/apache/commons/dbcp2/TestDelegatingConnection.java
@@ -18,8 +18,8 @@
package org.apache.commons.dbcp2;
import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@@ -28,6 +28,7 @@ import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.apache.commons.pool2.impl.GenericKeyedObjectPool;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -40,32 +41,39 @@ public class TestDelegatingConnection {
* Used to validate fix for DBCP-241
*/
static class RTEGeneratingConnection extends TesterConnection {
+
public RTEGeneratingConnection() {
super("","");
}
+
@Override
public String toString() {
throw new RuntimeException("bang!");
}
}
- private DelegatingConnection<? extends Connection> conn = null;
- private Connection delegateConn = null;
- private Connection delegateConn2 = null;
+
+ private DelegatingConnection<? extends Connection> delegatingConnection;
+ private Connection connection;
+ private Connection connection2;
+ private TesterStatement testerStatement;
+ private TesterResultSet testerResultSet;
@BeforeEach
public void setUp() throws Exception {
- delegateConn = new TesterConnection("test", "test");
- delegateConn2 = new TesterConnection("test", "test");
- conn = new DelegatingConnection<>(delegateConn);
+ connection = new TesterConnection("test", "test");
+ connection2 = new TesterConnection("test", "test");
+ delegatingConnection = new DelegatingConnection<>(connection);
+ testerStatement = new TesterStatement(delegatingConnection);
+ testerResultSet = new TesterResultSet(testerStatement);
}
@Test
public void testCheckOpen() throws Exception {
- conn.checkOpen();
- conn.close();
+ delegatingConnection.checkOpen();
+ delegatingConnection.close();
try {
- conn.checkOpen();
+ delegatingConnection.checkOpen();
fail("Expecting SQLException");
} catch (final SQLException ex) {
// expected
@@ -78,38 +86,38 @@ public class TestDelegatingConnection {
@Test
public void testCheckOpenNull() throws Exception {
try {
- conn.close();
- conn.checkOpen();
+ delegatingConnection.close();
+ delegatingConnection.checkOpen();
fail("Expecting SQLException");
} catch (final SQLException ex) {
assertTrue(ex.getMessage().endsWith("is closed."));
}
try {
- conn = new DelegatingConnection<>(null);
- conn.setClosedInternal(true);
- conn.checkOpen();
+ delegatingConnection = new DelegatingConnection<>(null);
+ delegatingConnection.setClosedInternal(true);
+ delegatingConnection.checkOpen();
fail("Expecting SQLException");
} catch (final SQLException ex) {
assertTrue(ex.getMessage().endsWith("is null."));
}
try {
- final PoolingConnection pc = new PoolingConnection(delegateConn2);
+ final PoolingConnection pc = new PoolingConnection(connection2);
pc.setStatementPool(new GenericKeyedObjectPool<>(pc));
- conn = new DelegatingConnection<>(pc);
+ delegatingConnection = new DelegatingConnection<>(pc);
pc.close();
- conn.close();
- try (PreparedStatement ps = conn.prepareStatement("")){}
+ delegatingConnection.close();
+ try (PreparedStatement ps =
delegatingConnection.prepareStatement("")){}
fail("Expecting SQLException");
} catch (final SQLException ex) {
assertTrue(ex.getMessage().endsWith("is closed."));
}
try {
- conn = new DelegatingConnection<>(new RTEGeneratingConnection());
- conn.close();
- conn.checkOpen();
+ delegatingConnection = new DelegatingConnection<>(new
RTEGeneratingConnection());
+ delegatingConnection.close();
+ delegatingConnection.checkOpen();
fail("Expecting SQLException");
} catch (final SQLException ex) {
assertTrue(ex.getMessage().endsWith("is closed."));
@@ -118,30 +126,78 @@ public class TestDelegatingConnection {
@Test
public void testConnectionToString() throws Exception {
- final String s = conn.toString();
+ final String s = delegatingConnection.toString();
assertNotNull(s);
assertTrue(s.length() > 0);
}
@Test
public void testGetDelegate() throws Exception {
- assertEquals(delegateConn,conn.getDelegate());
+ assertEquals(connection,delegatingConnection.getDelegate());
}
@Test
public void testIsClosed() throws Exception {
- conn.checkOpen();
- assertFalse(conn.isClosed());
- conn.close();
- assertTrue(conn.isClosed());
+ delegatingConnection.checkOpen();
+ assertFalse(delegatingConnection.isClosed());
+ delegatingConnection.close();
+ assertTrue(delegatingConnection.isClosed());
}
@Test
public void testIsClosedNullDelegate() throws Exception {
- conn.checkOpen();
- assertFalse(conn.isClosed());
- conn.setDelegate(null);
- assertTrue(conn.isClosed());
+ delegatingConnection.checkOpen();
+ assertFalse(delegatingConnection.isClosed());
+ delegatingConnection.setDelegate(null);
+ assertTrue(delegatingConnection.isClosed());
+ }
+
+ @Test
+ public void testPassivateWithResultSetCloseException() {
+ try {
+ testerResultSet.setSqlExceptionOnClose(true);
+ delegatingConnection.addTrace(testerResultSet);
+ delegatingConnection.passivate();
+ Assertions.fail("Expected SQLExceptionList");
+ } catch (SQLException e) {
+ Assertions.assertTrue(e instanceof SQLExceptionList);
+ Assertions.assertEquals(1, ((SQLExceptionList)
e).getCauseList().size());
+ } finally {
+ testerResultSet.setSqlExceptionOnClose(false);
+ }
+ }
+
+ @Test
+ public void
testPassivateWithResultSetCloseExceptionAndStatementCloseException() {
+ try {
+ testerStatement.setSqlExceptionOnClose(true);
+ testerResultSet.setSqlExceptionOnClose(true);
+ delegatingConnection.addTrace(testerStatement);
+ delegatingConnection.addTrace(testerResultSet);
+ delegatingConnection.passivate();
+ Assertions.fail("Expected SQLExceptionList");
+ } catch (SQLException e) {
+ Assertions.assertTrue(e instanceof SQLExceptionList);
+ Assertions.assertEquals(2, ((SQLExceptionList)
e).getCauseList().size());
+ } finally {
+ testerStatement.setSqlExceptionOnClose(false);
+ testerResultSet.setSqlExceptionOnClose(false);
+ }
+ }
+
+ @Test
+ public void testPassivateWithStatementCloseException() {
+ try {
+ testerStatement.setSqlExceptionOnClose(true);
+ delegatingConnection.addTrace(testerStatement);
+ delegatingConnection.passivate();
+ Assertions.fail("Expected SQLExceptionList");
+ } catch (SQLException e) {
+ Assertions.assertTrue(e instanceof SQLExceptionList);
+ Assertions.assertEquals(1, ((SQLExceptionList)
e).getCauseList().size());
+ } finally {
+ testerStatement.setSqlExceptionOnClose(false);
+ }
}
}
diff --git
a/src/test/java/org/apache/commons/dbcp2/TestDelegatingStatement.java
b/src/test/java/org/apache/commons/dbcp2/TestDelegatingStatement.java
index f187cbf..e44505b 100644
--- a/src/test/java/org/apache/commons/dbcp2/TestDelegatingStatement.java
+++ b/src/test/java/org/apache/commons/dbcp2/TestDelegatingStatement.java
@@ -49,7 +49,7 @@ public class TestDelegatingStatement {
return false;
}
}
-
+
private DelegatingConnection<Connection> delegatingConnection;
private TesterConnection testerConnection;
private Statement mockedStatement;
diff --git a/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
b/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
index dae4380..2180b1a 100644
--- a/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
+++ b/src/test/java/org/apache/commons/dbcp2/TesterConnection.java
@@ -39,30 +39,44 @@ import java.util.concurrent.Executor;
* A dummy {@link Connection}, for testing purposes.
*/
public class TesterConnection extends AbandonedTrace implements Connection {
-
+
protected boolean _open = true;
protected boolean _autoCommit = true;
protected int _transactionIsolation = 1;
protected DatabaseMetaData _metaData = new TesterDatabaseMetaData();
- protected String _catalog = null;
+ protected String _catalog;
protected String schema;
- protected Map<String,Class<?>> _typeMap = null;
- protected boolean _readOnly = false;
- protected SQLWarning warnings = null;
- protected String userName = null;
+ protected Map<String,Class<?>> _typeMap;
+ protected boolean _readOnly;
+ protected SQLWarning warnings;
+ protected String userName;
protected Exception failure;
+ protected boolean sqlExceptionOnClose;
- public TesterConnection(final String userName,
+ TesterConnection(final String userName,
@SuppressWarnings("unused") final String password) {
this.userName = userName;
}
- public String getUserName() {
- return this.userName;
+ @Override
+ public void abort(final Executor executor) throws SQLException {
+ throw new SQLException("Not implemented.");
}
- public void setWarnings(final SQLWarning warning) {
- this.warnings = warning;
+ protected void checkFailure() throws SQLException {
+ if (failure != null) {
+ if(failure instanceof SQLException) {
+ throw (SQLException)failure;
+ }
+ throw new SQLException("TesterConnection failure", failure);
+ }
+ }
+
+ protected void checkOpen() throws SQLException {
+ if(!_open) {
+ throw new SQLException("Connection is closed.");
+ }
+ checkFailure();
}
@Override
@@ -86,208 +100,166 @@ public class TesterConnection extends AbandonedTrace
implements Connection {
}
@Override
- public Statement createStatement() throws SQLException {
- checkOpen();
- return new TesterStatement(this);
+ public Array createArrayOf(final String typeName, final Object[] elements)
throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public Statement createStatement(final int resultSetType, final int
resultSetConcurrency) throws SQLException {
- checkOpen();
- return new TesterStatement(this);
+ public Blob createBlob() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public boolean getAutoCommit() throws SQLException {
- checkOpen();
- return _autoCommit;
+ public Clob createClob() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public String getCatalog() throws SQLException {
- checkOpen();
- return _catalog;
+ public NClob createNClob() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public DatabaseMetaData getMetaData() throws SQLException {
- checkOpen();
- return _metaData;
+ public SQLXML createSQLXML() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public int getTransactionIsolation() throws SQLException {
+ public Statement createStatement() throws SQLException {
checkOpen();
- return _transactionIsolation;
+ return new TesterStatement(this);
}
@Override
- public Map<String,Class<?>> getTypeMap() throws SQLException {
+ public Statement createStatement(final int resultSetType, final int
resultSetConcurrency) throws SQLException {
checkOpen();
- return _typeMap;
+ return new TesterStatement(this);
}
@Override
- public SQLWarning getWarnings() throws SQLException {
- checkOpen();
- return warnings;
+ public Statement createStatement(final int resultSetType,
+ final int resultSetConcurrency,
+ final int resultSetHoldability)
+ throws SQLException {
+ return createStatement();
}
@Override
- public boolean isClosed() throws SQLException {
- checkFailure();
- return !_open;
+ public Struct createStruct(final String typeName, final Object[]
attributes) throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public boolean isReadOnly() throws SQLException {
+ public boolean getAutoCommit() throws SQLException {
checkOpen();
- return _readOnly;
+ return _autoCommit;
}
@Override
- public String nativeSQL(final String sql) throws SQLException {
+ public String getCatalog() throws SQLException {
checkOpen();
- return sql;
+ return _catalog;
}
@Override
- public CallableStatement prepareCall(final String sql) throws SQLException
{
- checkOpen();
- if ("warning".equals(sql)) {
- setWarnings(new SQLWarning("warning in prepareCall"));
- }
- return new TesterCallableStatement(this, sql);
+ public Properties getClientInfo() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public CallableStatement prepareCall(final String sql, final int
resultSetType, final int resultSetConcurrency) throws SQLException {
- checkOpen();
- return new TesterCallableStatement(this, sql, resultSetType,
resultSetConcurrency);
+ public String getClientInfo(final String name) throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public PreparedStatement prepareStatement(final String sql) throws
SQLException {
- checkOpen();
- if("null".equals(sql)) {
- return null;
- } if("invalid".equals(sql)) {
- throw new SQLException("invalid query");
- } if ("broken".equals(sql)) {
- throw new SQLException("broken connection");
- }
- return new TesterPreparedStatement(this, sql);
+ public int getHoldability() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public PreparedStatement prepareStatement(final String sql, final int
resultSetType, final int resultSetConcurrency) throws SQLException {
+ public DatabaseMetaData getMetaData() throws SQLException {
checkOpen();
- return new TesterPreparedStatement(this, sql, resultSetType,
resultSetConcurrency);
+ return _metaData;
}
@Override
- public void rollback() throws SQLException {
- checkOpen();
- if (isReadOnly()) {
- throw new SQLException("Cannot rollback a readonly connection");
- }
+ public int getNetworkTimeout() throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public void setAutoCommit(final boolean autoCommit) throws SQLException {
+ public String getSchema() throws SQLException {
checkOpen();
- _autoCommit = autoCommit;
+ return schema;
}
@Override
- public void setCatalog(final String catalog) throws SQLException {
+ public int getTransactionIsolation() throws SQLException {
checkOpen();
- _catalog = catalog;
+ return _transactionIsolation;
}
@Override
- public void setReadOnly(final boolean readOnly) throws SQLException {
+ public Map<String,Class<?>> getTypeMap() throws SQLException {
checkOpen();
- _readOnly = readOnly;
+ return _typeMap;
}
- @Override
- public void setTransactionIsolation(final int level) throws SQLException {
- checkOpen();
- _transactionIsolation = level;
+ public String getUserName() {
+ return this.userName;
}
@Override
- public void setTypeMap(final Map<String,Class<?>> map) throws SQLException
{
+ public SQLWarning getWarnings() throws SQLException {
checkOpen();
- _typeMap = map;
- }
-
- protected void checkOpen() throws SQLException {
- if(!_open) {
- throw new SQLException("Connection is closed.");
- }
- checkFailure();
- }
-
- protected void checkFailure() throws SQLException {
- if (failure != null) {
- if(failure instanceof SQLException) {
- throw (SQLException)failure;
- }
- throw new SQLException("TesterConnection failure", failure);
- }
- }
-
- public void setFailure(final Exception failure) {
- this.failure = failure;
+ return warnings;
}
@Override
- public int getHoldability() throws SQLException {
- throw new SQLException("Not implemented.");
+ public boolean isClosed() throws SQLException {
+ checkFailure();
+ return !_open;
}
@Override
- public void setHoldability(final int holdability) throws SQLException {
- throw new SQLException("Not implemented.");
+ public boolean isReadOnly() throws SQLException {
+ checkOpen();
+ return _readOnly;
}
- @Override
- public java.sql.Savepoint setSavepoint() throws SQLException {
- throw new SQLException("Not implemented.");
+ public boolean isSqlExceptionOnClose() {
+ return sqlExceptionOnClose;
}
@Override
- public java.sql.Savepoint setSavepoint(final String name) throws
SQLException {
- throw new SQLException("Not implemented.");
+ public boolean isValid(final int timeout) throws SQLException {
+ return _open;
}
@Override
- public void rollback(final java.sql.Savepoint savepoint) throws
SQLException {
+ public boolean isWrapperFor(final Class<?> iface) throws SQLException {
throw new SQLException("Not implemented.");
}
@Override
- public void releaseSavepoint(final java.sql.Savepoint savepoint) throws
SQLException {
- throw new SQLException("Not implemented.");
+ public String nativeSQL(final String sql) throws SQLException {
+ checkOpen();
+ return sql;
}
@Override
- public Statement createStatement(final int resultSetType,
- final int resultSetConcurrency,
- final int resultSetHoldability)
- throws SQLException {
- return createStatement();
+ public CallableStatement prepareCall(final String sql) throws SQLException
{
+ checkOpen();
+ if ("warning".equals(sql)) {
+ setWarnings(new SQLWarning("warning in prepareCall"));
+ }
+ return new TesterCallableStatement(this, sql);
}
@Override
- public PreparedStatement prepareStatement(final String sql, final int
resultSetType,
- final int resultSetConcurrency,
- final int resultSetHoldability)
- throws SQLException {
+ public CallableStatement prepareCall(final String sql, final int
resultSetType, final int resultSetConcurrency) throws SQLException {
checkOpen();
- return new TesterPreparedStatement(this, sql, resultSetType,
resultSetConcurrency, resultSetHoldability);
+ return new TesterCallableStatement(this, sql, resultSetType,
resultSetConcurrency);
}
@Override
@@ -300,6 +272,19 @@ public class TesterConnection extends AbandonedTrace
implements Connection {
}
@Override
+ public PreparedStatement prepareStatement(final String sql) throws
SQLException {
+ checkOpen();
+ if("null".equals(sql)) {
+ return null;
+ } if("invalid".equals(sql)) {
+ throw new SQLException("invalid query");
+ } if ("broken".equals(sql)) {
+ throw new SQLException("broken connection");
+ }
+ return new TesterPreparedStatement(this, sql);
+ }
+
+ @Override
public PreparedStatement prepareStatement(final String sql, final int
autoGeneratedKeys)
throws SQLException {
checkOpen();
@@ -313,74 +298,95 @@ public class TesterConnection extends AbandonedTrace
implements Connection {
}
@Override
- public PreparedStatement prepareStatement(final String sql, final String
columnNames[])
+ public PreparedStatement prepareStatement(final String sql, final int
resultSetType, final int resultSetConcurrency) throws SQLException {
+ checkOpen();
+ return new TesterPreparedStatement(this, sql, resultSetType,
resultSetConcurrency);
+ }
+
+ @Override
+ public PreparedStatement prepareStatement(final String sql, final int
resultSetType,
+ final int resultSetConcurrency,
+ final int resultSetHoldability)
throws SQLException {
- return new TesterPreparedStatement(this, sql, columnNames);
+ checkOpen();
+ return new TesterPreparedStatement(this, sql, resultSetType,
resultSetConcurrency, resultSetHoldability);
}
@Override
- public boolean isWrapperFor(final Class<?> iface) throws SQLException {
- throw new SQLException("Not implemented.");
+ public PreparedStatement prepareStatement(final String sql, final String
columnNames[])
+ throws SQLException {
+ return new TesterPreparedStatement(this, sql, columnNames);
}
@Override
- public <T> T unwrap(final Class<T> iface) throws SQLException {
+ public void releaseSavepoint(final java.sql.Savepoint savepoint) throws
SQLException {
throw new SQLException("Not implemented.");
}
@Override
- public Array createArrayOf(final String typeName, final Object[] elements)
throws SQLException {
- throw new SQLException("Not implemented.");
+ public void rollback() throws SQLException {
+ checkOpen();
+ if (isReadOnly()) {
+ throw new SQLException("Cannot rollback a readonly connection");
+ }
}
@Override
- public Blob createBlob() throws SQLException {
+ public void rollback(final java.sql.Savepoint savepoint) throws
SQLException {
throw new SQLException("Not implemented.");
}
@Override
- public Clob createClob() throws SQLException {
- throw new SQLException("Not implemented.");
+ public void setAutoCommit(final boolean autoCommit) throws SQLException {
+ checkOpen();
+ _autoCommit = autoCommit;
}
@Override
- public NClob createNClob() throws SQLException {
- throw new SQLException("Not implemented.");
+ public void setCatalog(final String catalog) throws SQLException {
+ checkOpen();
+ _catalog = catalog;
}
@Override
- public SQLXML createSQLXML() throws SQLException {
- throw new SQLException("Not implemented.");
+ public void setClientInfo(final Properties properties) throws
SQLClientInfoException {
+ throw new SQLClientInfoException();
}
@Override
- public Struct createStruct(final String typeName, final Object[]
attributes) throws SQLException {
- throw new SQLException("Not implemented.");
+ public void setClientInfo(final String name, final String value) throws
SQLClientInfoException {
+ throw new SQLClientInfoException();
+ }
+
+ public void setFailure(final Exception failure) {
+ this.failure = failure;
}
@Override
- public boolean isValid(final int timeout) throws SQLException {
- return _open;
+ public void setHoldability(final int holdability) throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public void setClientInfo(final String name, final String value) throws
SQLClientInfoException {
- throw new SQLClientInfoException();
+ public void setNetworkTimeout(final Executor executor, final int
milliseconds)
+ throws SQLException {
+ throw new SQLException("Not implemented.");
}
@Override
- public void setClientInfo(final Properties properties) throws
SQLClientInfoException {
- throw new SQLClientInfoException();
+ public void setReadOnly(final boolean readOnly) throws SQLException {
+ checkOpen();
+ _readOnly = readOnly;
}
@Override
- public Properties getClientInfo() throws SQLException {
+ public java.sql.Savepoint setSavepoint() throws SQLException {
throw new SQLException("Not implemented.");
}
@Override
- public String getClientInfo(final String name) throws SQLException {
+ public java.sql.Savepoint setSavepoint(final String name) throws
SQLException {
throw new SQLException("Not implemented.");
}
@@ -390,25 +396,28 @@ public class TesterConnection extends AbandonedTrace
implements Connection {
this.schema= schema;
}
+ public void setSqlExceptionOnClose(boolean sqlExceptionOnClose) {
+ this.sqlExceptionOnClose = sqlExceptionOnClose;
+ }
+
@Override
- public String getSchema() throws SQLException {
+ public void setTransactionIsolation(final int level) throws SQLException {
checkOpen();
- return schema;
+ _transactionIsolation = level;
}
@Override
- public void abort(final Executor executor) throws SQLException {
- throw new SQLException("Not implemented.");
+ public void setTypeMap(final Map<String,Class<?>> map) throws SQLException
{
+ checkOpen();
+ _typeMap = map;
}
- @Override
- public void setNetworkTimeout(final Executor executor, final int
milliseconds)
- throws SQLException {
- throw new SQLException("Not implemented.");
+ public void setWarnings(final SQLWarning warning) {
+ this.warnings = warning;
}
@Override
- public int getNetworkTimeout() throws SQLException {
+ public <T> T unwrap(final Class<T> iface) throws SQLException {
throw new SQLException("Not implemented.");
}
}
diff --git
a/src/test/java/org/apache/commons/dbcp2/TesterConnectionFactory.java
b/src/test/java/org/apache/commons/dbcp2/TesterConnectionFactory.java
index 7718e02..f21da7a 100644
--- a/src/test/java/org/apache/commons/dbcp2/TesterConnectionFactory.java
+++ b/src/test/java/org/apache/commons/dbcp2/TesterConnectionFactory.java
@@ -26,7 +26,7 @@ import java.util.Properties;
* Dummy {@link ConnectionFactory} for testing purpose.
*/
public class TesterConnectionFactory implements ConnectionFactory {
-
+
private final String connectionString;
private final Driver driver;
private final Properties properties;
diff --git
a/src/test/java/org/apache/commons/dbcp2/TesterPreparedStatement.java
b/src/test/java/org/apache/commons/dbcp2/TesterPreparedStatement.java
index 5ee864d..be671b2 100644
--- a/src/test/java/org/apache/commons/dbcp2/TesterPreparedStatement.java
+++ b/src/test/java/org/apache/commons/dbcp2/TesterPreparedStatement.java
@@ -39,7 +39,7 @@ import java.sql.SQLXML;
* A dummy {@link PreparedStatement}, for testing purposes.
*/
public class TesterPreparedStatement extends TesterStatement implements
PreparedStatement {
-
+
private final ResultSetMetaData _resultSetMetaData = null;
private String _sql = null;
private String _catalog = null;
diff --git a/src/test/java/org/apache/commons/dbcp2/TesterResultSet.java
b/src/test/java/org/apache/commons/dbcp2/TesterResultSet.java
index 0d37499..3d90277 100644
--- a/src/test/java/org/apache/commons/dbcp2/TesterResultSet.java
+++ b/src/test/java/org/apache/commons/dbcp2/TesterResultSet.java
@@ -41,7 +41,7 @@ import java.sql.SQLXML;
* A dummy {@link ResultSet}, for testing purposes.
*/
public class TesterResultSet extends AbandonedTrace implements ResultSet {
-
+
protected int _type = ResultSet.TYPE_FORWARD_ONLY;
protected int _concurrency = ResultSet.CONCUR_READ_ONLY;
protected Object[][] _data = null;
@@ -102,7 +102,7 @@ public class TesterResultSet extends AbandonedTrace
implements ResultSet {
if (_sqlExceptionOnClose) {
throw new SQLException("TestSQLExceptionOnClose");
}
-
+
if (!_open) {
return;
}
@@ -1185,13 +1185,13 @@ public java.sql.Date getDate(final int columnIndex,
final Calendar cal) throws S
public void updateTimestamp(final int columnIndex, final
java.sql.Timestamp x) throws SQLException {
checkOpen();
}
-
+
@Override
public void updateTimestamp(final String columnName, final
java.sql.Timestamp x)
throws SQLException {
checkOpen();
}
-
+
@Override
public boolean wasNull() throws SQLException {
checkOpen();
diff --git a/src/test/java/org/apache/commons/dbcp2/TesterStatement.java
b/src/test/java/org/apache/commons/dbcp2/TesterStatement.java
index 5a70f64..3032396 100644
--- a/src/test/java/org/apache/commons/dbcp2/TesterStatement.java
+++ b/src/test/java/org/apache/commons/dbcp2/TesterStatement.java
@@ -27,34 +27,34 @@ import java.sql.Statement;
* A dummy {@link Statement}, for testing purposes.
*/
public class TesterStatement extends AbandonedTrace implements Statement {
-
- protected Connection _connection = null;
+
+ protected Connection _connection;
protected boolean _open = true;
protected long _rowsUpdated = 1;
protected boolean _executeResponse = true;
protected int _maxFieldSize = 1024;
protected long _maxRows = 1024;
- protected boolean _escapeProcessing = false;
+ protected boolean _escapeProcessing;
protected int _queryTimeout = 1000;
- protected String _cursorName = null;
+ protected String _cursorName;
protected int _fetchDirection = 1;
protected int _fetchSize = 1;
protected int _resultSetConcurrency = 1;
protected int _resultSetType = 1;
private int _resultSetHoldability = 1;
- protected ResultSet _resultSet = null;
- protected boolean _sqlExceptionOnClose = false;
+ protected ResultSet _resultSet;
+ protected boolean _sqlExceptionOnClose;
public TesterStatement(final Connection conn) {
_connection = conn;
}
-
+
public TesterStatement(final Connection conn, final int resultSetType,
final int resultSetConcurrency) {
_connection = conn;
_resultSetType = resultSetType;
_resultSetConcurrency = resultSetConcurrency;
}
-
+
public TesterStatement(final Connection conn, final int resultSetType,
final int resultSetConcurrency,
final int resultSetHoldability) {
_connection = conn;
diff --git
a/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
b/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
index ab0a4dd..60b05ec 100644
---
a/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
+++
b/src/test/java/org/apache/commons/dbcp2/cpdsadapter/TestDriverAdapterCPDS.java
@@ -367,7 +367,7 @@ public class TestDriverAdapterCPDS {
final Object o = pcds.getObjectInstance(ref, null, null, null);
assertEquals(pcds.getDescription(), ((DriverAdapterCPDS)
o).getDescription());
}
-
+
@Test
public void testToStringWithoutConnectionProperties() throws
ClassNotFoundException
{