You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2015/12/03 16:53:09 UTC

svn commit: r1717784 - in /jackrabbit/oak/trunk/oak-core/src: main/java/org/apache/jackrabbit/oak/plugins/document/rdb/ test/java/org/apache/jackrabbit/oak/plugins/document/ test/java/org/apache/jackrabbit/oak/plugins/document/rdb/

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();
+        }
+    }
 }