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 2014/05/30 16:20:16 UTC

svn commit: r1598612 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document: DocumentNodeStoreService.java rdb/RDBDataSourceFactory.java

Author: reschke
Date: Fri May 30 14:20:16 2014
New Revision: 1598612

URL: http://svn.apache.org/r1598612
Log:
OAK-1708 - default the JDBC driver class name from the JDBC URI, when needed

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDataSourceFactory.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java?rev=1598612&r1=1598611&r2=1598612&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/DocumentNodeStoreService.java Fri May 30 14:20:16 2014
@@ -214,29 +214,10 @@ public class DocumentNodeStoreService {
             String bsdriver = System.getProperty("oakbs.jdbc.driver.class", "");
 
             // document store
-            if (dsdriver.length() > 0) {
-                log.info("trying to load {}", dsdriver);
-
-                try {
-                    Class.forName(dsdriver);
-                } catch (ClassNotFoundException ex) {
-                    log.error("driver " + dsdriver +  " not loaded", ex);
-                }
-            } else {
+            if (dsdriver.length() == 0) {
                 log.info("System property oak.jdbc.driver.class not set.");
             }
 
-            // blob store
-            if (bsdriver.length() > 0) {
-                log.info("trying to load {}", bsdriver);
-
-                try {
-                    Class.forName(bsdriver);
-                } catch (ClassNotFoundException ex) {
-                    log.error("driver " + bsdriver +  " not loaded", ex);
-                }
-            }
-
             if (log.isInfoEnabled()) {
                 String type = useMK ? "MK" : "NodeStore";
                 log.info(
@@ -244,14 +225,14 @@ public class DocumentNodeStoreService {
                         type, jdbcuri, bsjdbcuri, cacheSize, offHeapCache, changesSize);
             }
 
-            DataSource ds = RDBDataSourceFactory.forJdbcUrl(jdbcuri, dsusername, dspasswd);
+            DataSource ds = RDBDataSourceFactory.forJdbcUrl(jdbcuri, dsusername, dspasswd, dsdriver);
             if (bsjdbcuri.length() == 0) {
                 mkBuilder.setRDBConnection(ds);
                 log.info("Connected to datasource {}", ds);
             } else {
-                DataSource dsbs = RDBDataSourceFactory.forJdbcUrl(bsjdbcuri, bsusername, bspasswd);
+                DataSource dsbs = RDBDataSourceFactory.forJdbcUrl(bsjdbcuri, bsusername, bspasswd, bsdriver);
                 mkBuilder.setRDBConnection(ds, dsbs);
-                log.info("Connected to datasources {}{}", ds, dsbs);
+                log.info("Connected to datasources {} {}", ds, dsbs);
             }
         } else {
             MongoClientOptions.Builder builder = MongoConnection.getDefaultBuilder();

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=1598612&r1=1598611&r2=1598612&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 Fri May 30 14:20:16 2014
@@ -24,6 +24,7 @@ import java.sql.Driver;
 import java.sql.DriverManager;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
+import java.util.Locale;
 import java.util.logging.Logger;
 
 import javax.sql.DataSource;
@@ -39,7 +40,31 @@ public class RDBDataSourceFactory {
 
     private static final org.slf4j.Logger LOG = LoggerFactory.getLogger(RDBDataSourceFactory.class);
 
-    public static DataSource forJdbcUrl(String url, String username, String passwd) {
+    public static DataSource forJdbcUrl(String url, String username, String passwd, String driverName) {
+
+        // load driver class when specified
+        if (driverName != null && !driverName.isEmpty()) {
+            LOG.info("trying to load {}", driverName);
+
+            try {
+                Class.forName(driverName);
+            } catch (ClassNotFoundException ex) {
+                LOG.error("driver " + driverName + " not loaded", ex);
+            }
+        } else {
+            // try to determine driver from JDBC URL
+            String defaultDriver = driverForDBType(jdbctype(url));
+            if (defaultDriver != null) {
+                LOG.info("trying to load {}", defaultDriver);
+
+                try {
+                    Class.forName(defaultDriver);
+                } catch (ClassNotFoundException ex) {
+                    LOG.error("driver " + defaultDriver + " not loaded", ex);
+                }
+            }
+        }
+
         try {
             BasicDataSource bds = new BasicDataSource();
             LOG.debug("Getting Dricer for " + url);
@@ -56,8 +81,44 @@ public class RDBDataSourceFactory {
         }
     }
 
+    public static DataSource forJdbcUrl(String url, String username, String passwd) {
+        return forJdbcUrl(url, username, passwd, null);
+    }
+
+    private static String jdbctype(String jdbcurl) {
+        if (jdbcurl == null) {
+            return null;
+        } else {
+            String t = jdbcurl.toLowerCase(Locale.ENGLISH);
+            if (!t.startsWith("jdbc:")) {
+                return null;
+            } else {
+                t = t.substring("jbdc:".length());
+                int p = t.indexOf(":");
+                if (p <= 0) {
+                    return null;
+                } else {
+                    return t.substring(0, p);
+                }
+            }
+        }
+    }
+
+    private static String driverForDBType(String type) {
+        if ("h2".equals(type)) {
+            return "org.h2.Driver";
+        } else if ("postgresql".equals(type)) {
+            return "org.postgresql.Driver";
+        } else if ("db2".equals(type)) {
+            return "com.ibm.db2.jcc.DB2Driver";
+        } else {
+            return "";
+        }
+    }
+
     /**
-     * A {@link Closeable} {@link DataSource} based on a {@link BasicDataSource}. 
+     * A {@link Closeable} {@link DataSource} based on a {@link BasicDataSource}
+     * .
      */
     private static class CloseableDataSource implements DataSource, Closeable {