Author: reschke
Date: Thu Dec 3 15:53:08 2015
New Revision: 1717784
URL: http://svn.apache.org/viewvc?rev=1717784&view=rev
Log:
OAK-3722: RDBDataSourceFactory: restore ability to close the connection pool
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreFixture.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java?rev=1717784&r1=1717783&r2=1717784&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java
Thu Dec 3 15:53:08 2015
@@ -16,9 +16,17 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
+import java.sql.SQLFeatureNotSupportedException;
+import java.util.logging.Logger;
import javax.sql.DataSource;
@@ -64,14 +72,13 @@ public class RDBDataSourceFactory {
String classname = "org.apache.tomcat.jdbc.pool.DataSource";
try {
Class<?> dsclazz = Class.forName(classname);
- DataSource ds = (DataSource)dsclazz.newInstance();
- dsclazz.getMethod("setDriverClassName",
String.class).invoke(ds, d.getClass().getName());
- dsclazz.getMethod("setUsername", String.class).invoke(ds,
username);
- dsclazz.getMethod("setPassword", String.class).invoke(ds,
passwd);
- dsclazz.getMethod("setUrl", String.class).invoke(ds, url);
- return ds;
- }
- catch (Exception ex) {
+ DataSource ds = (DataSource) dsclazz.newInstance();
+ dsclazz.getMethod("setDriverClassName",
String.class).invoke(ds, d.getClass().getName());
+ dsclazz.getMethod("setUsername", String.class).invoke(ds,
username);
+ dsclazz.getMethod("setPassword", String.class).invoke(ds,
passwd);
+ dsclazz.getMethod("setUrl", String.class).invoke(ds, url);
+ return new CloseableDataSource(ds);
+ } catch (Exception ex) {
String message = "trying to create datasource " + classname;
LOG.info(message, ex);
throw new DocumentStoreException(message, ex);
@@ -86,4 +93,85 @@ public class RDBDataSourceFactory {
public static DataSource forJdbcUrl(String url, String username, String
passwd) {
return forJdbcUrl(url, username, passwd, null);
}
+
+ /**
+ * A {@link Closeable} {@link DataSource} based on a generic {@link Source}
+ * .
+ */
+ private static class CloseableDataSource implements DataSource, Closeable {
+
+ private DataSource ds;
+
+ public CloseableDataSource(DataSource ds) {
+ this.ds = ds;
+ }
+
+ @Override
+ public PrintWriter getLogWriter() throws SQLException {
+ return this.ds.getLogWriter();
+ }
+
+ @Override
+ public int getLoginTimeout() throws SQLException {
+ return this.ds.getLoginTimeout();
+ }
+
+ @Override
+ public void setLogWriter(PrintWriter pw) throws SQLException {
+ this.ds.setLogWriter(pw);
+ }
+
+ @Override
+ public void setLoginTimeout(int t) throws SQLException {
+ this.ds.setLoginTimeout(t);
+ }
+
+ @Override
+ public boolean isWrapperFor(Class<?> c) throws SQLException {
+ return this.ds.isWrapperFor(c);
+ }
+
+ @Override
+ public <T> T unwrap(Class<T> c) throws SQLException {
+ return this.ds.unwrap(c);
+ }
+
+ @Override
+ public void close() throws IOException {
+ Class<?> dsclazz = ds.getClass();
+ try {
+ Method clmethod = dsclazz.getMethod("close");
+ clmethod.invoke(ds);
+ } catch (NoSuchMethodException e) {
+ LOG.debug("Class " + dsclazz + " does not have close()
method");
+ } catch (IllegalArgumentException e) {
+ LOG.debug("Class " + dsclazz + " does not have close()
method");
+ } catch (InvocationTargetException e) {
+ throw new IOException("trying to close datasource", e);
+ } catch (IllegalAccessException e) {
+ throw new IOException("trying to close datasource", e);
+ }
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ return this.ds.getConnection();
+ }
+
+ @Override
+ public Connection getConnection(String user, String passwd) throws
SQLException {
+ return this.ds.getConnection(user, passwd);
+ }
+
+ // needed in Java 7...
+ @SuppressWarnings("unused")
+ public Logger getParentLogger() throws SQLFeatureNotSupportedException
{
+ throw new SQLFeatureNotSupportedException();
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getName() + " wrapping a " +
this.ds.toString();
+ }
+ }
}
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreFixture.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreFixture.java?rev=1717784&r1=1717783&r2=1717784&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreFixture.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/DocumentStoreFixture.java
Thu Dec 3 15:53:08 2015
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.oak.plugins.document;
+import java.io.Closeable;
+import java.io.IOException;
import java.util.List;
import javax.sql.DataSource;
@@ -160,6 +162,17 @@ public abstract class DocumentStoreFixtu
public DataSource getRDBDataSource() {
return dataSource;
}
+
+ @Override
+ public void dispose() {
+ if (dataSource instanceof Closeable) {
+ try {
+ ((Closeable)dataSource).close();
+ }
+ catch (IOException ignored) {
+ }
+ }
+ }
}
public static class MongoFixture extends DocumentStoreFixture {
Modified:
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java?rev=1717784&r1=1717783&r2=1717784&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceWrapper.java
Thu Dec 3 15:53:08 2015
@@ -16,6 +16,8 @@
*/
package org.apache.jackrabbit.oak.plugins.document.rdb;
+import java.io.Closeable;
+import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
@@ -133,4 +135,11 @@ public class RDBDataSourceWrapper implem
public <T> T unwrap(Class<T> iface) throws SQLException {
return ds.unwrap(iface);
}
+
+ @Override
+ public void close() throws IOException {
+ if (ds instanceof Closeable) {
+ ((Closeable) ds).close();
+ }
+ }
}