You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by an...@apache.org on 2012/04/11 15:53:09 UTC

svn commit: r1324764 - in /openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc: BasicDataSource.java BasicManagedDataSource.java DataSourceFactory.java

Author: andygumbrecht
Date: Wed Apr 11 13:53:09 2012
New Revision: 1324764

URL: http://svn.apache.org/viewvc?rev=1324764&view=rev
Log:
Added derby support, but would still one day like to understand why it has to be done this way?
Lock on the inside, as we have no way of ensuring we get locked from the outside.

Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java?rev=1324764&r1=1324763&r2=1324764&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSource.java Wed Apr 11 13:53:09 2012
@@ -16,22 +16,27 @@
  */
 package org.apache.openejb.resource.jdbc;
 
+import org.apache.openejb.loader.SystemInstance;
+
+import javax.sql.DataSource;
 import java.io.File;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Properties;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
 
-import javax.sql.DataSource;
+@SuppressWarnings({"UnusedDeclaration"})
+public class BasicDataSource extends org.apache.commons.dbcp.BasicDataSource {
 
-import org.apache.openejb.loader.SystemInstance;
+    private static final ReentrantLock lock = new ReentrantLock();
+
+    private Logger logger = null;
 
-public class BasicDataSource extends org.apache.commons.dbcp.BasicDataSource {
-    
     /**
      * The password codec to be used to retrieve the plain text password from a
      * ciphered value.
-     * 
+     * <p/>
      * <em>The default is no codec.</em>. In other words, it means password is
      * not ciphered. The {@link PlainTextPasswordCipher} can also be used.
      */
@@ -40,89 +45,151 @@ public class BasicDataSource extends org
     /**
      * Returns the password codec class name to use to retrieve plain text
      * password.
-     * 
+     *
      * @return the password codec class
      */
-    public synchronized String getPasswordCipher() {
-        return this.passwordCipher;
+    public String getPasswordCipher() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return this.passwordCipher;
+        } finally {
+            l.unlock();
+        }
     }
 
     /**
      * <p>
      * Sets the {@link #passwordCipher}.
      * </p>
-     * 
-     * @param passwordCipher
-     *            password codec value
+     *
+     * @param passwordCipher password codec value
      */
-    public synchronized void setPasswordCipher(String passwordCipher) {
-        this.passwordCipher = passwordCipher;
+    public void setPasswordCipher(String passwordCipher) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            this.passwordCipher = passwordCipher;
+        } finally {
+            l.unlock();
+        }
     }
-    
 
-    public synchronized String getUserName() {
-        return super.getUsername();
-    }
 
-    public synchronized void setUserName(String string) {
-        super.setUsername(string);
-    }
-    
-    public synchronized String getJdbcDriver() {
-        return super.getDriverClassName();
+    public String getUserName() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return super.getUsername();
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setJdbcDriver(String string) {
-        super.setDriverClassName(string);
+    public void setUserName(String string) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setUsername(string);
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized String getJdbcUrl() {
-        return super.getUrl();
+    public String getJdbcDriver() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return super.getDriverClassName();
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setJdbcUrl(String string) {
-        super.setUrl(string);
+    public void setJdbcDriver(String string) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setDriverClassName(string);
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setDefaultTransactionIsolation(String s) {
-        if (s == null || s.equals("")) return;
-        int level = IsolationLevels.getIsolationLevel(s);
-        super.setDefaultTransactionIsolation(level);
+    public String getJdbcUrl() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return super.getUrl();
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setMaxWait(final int maxWait) {
-        super.setMaxWait((long)maxWait);
+    public void setJdbcUrl(String string) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setUrl(string);
+        } finally {
+            l.unlock();
+        }
     }
 
-    protected synchronized DataSource createDataSource() throws SQLException {
-        if (dataSource != null) {
-            return dataSource;
+    public void setDefaultTransactionIsolation(String s) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            if (s == null || s.equals("")) return;
+            int level = IsolationLevels.getIsolationLevel(s);
+            super.setDefaultTransactionIsolation(level);
+        } finally {
+            l.unlock();
         }
-        
-        // check password codec if available
-        if (null != passwordCipher) {
-            PasswordCipher cipher = BasicDataSourceUtil.getPasswordCipher(passwordCipher);
-            String plainPwd = cipher.decrypt(password.toCharArray());
+    }
 
-            // override previous password value
-            super.setPassword(plainPwd);
+    public void setMaxWait(final int maxWait) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setMaxWait((long) maxWait);
+        } finally {
+            l.unlock();
         }
+    }
 
-        // get the plugin
-        DataSourcePlugin helper = BasicDataSourceUtil.getDataSourcePlugin(getUrl());
+    protected DataSource createDataSource() throws SQLException {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            if (dataSource != null) {
+                return dataSource;
+            }
 
-        // configure this
-        if (helper != null) {
-            helper.configure(this);
-        }
+            // check password codec if available
+            if (null != passwordCipher) {
+                PasswordCipher cipher = BasicDataSourceUtil.getPasswordCipher(passwordCipher);
+                String plainPwd = cipher.decrypt(password.toCharArray());
+
+                // override previous password value
+                super.setPassword(plainPwd);
+            }
+
+            // get the plugin
+            DataSourcePlugin helper = BasicDataSourceUtil.getDataSourcePlugin(getUrl());
+
+            // configure this
+            if (helper != null) {
+                helper.configure(this);
+            }
+
+            // create the data source
+            if (helper == null || !helper.enableUserDirHack()) {
+                return super.createDataSource();
+            } else {
+                // wrap super call with code that sets user.dir to openejb.base and then resets it
+                Properties systemProperties = System.getProperties();
 
-        // creat the data source
-        if (helper == null || !helper.enableUserDirHack()) {
-            return super.createDataSource();
-        } else {
-            // wrap super call with code that sets user.dir to openejb.base and then resets it
-            Properties systemProperties = System.getProperties();
-            synchronized (systemProperties) {
                 String userDir = systemProperties.getProperty("user.dir");
                 try {
                     File base = SystemInstance.get().getBase().getDirectory();
@@ -131,15 +198,38 @@ public class BasicDataSource extends org
                 } finally {
                     systemProperties.setProperty("user.dir", userDir);
                 }
+
             }
+        } finally {
+            l.unlock();
+        }
+    }
+
+    public void close() throws SQLException {
+        //TODO - Prevent unuathorized call
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.close();
+        } finally {
+            l.unlock();
         }
     }
 
     public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+        final ReentrantLock l = lock;
+        l.lock();
         try {
-            return (Logger) DataSource.class.getDeclaredMethod("getParentLogger").invoke(dataSource);
+
+            if (null == this.logger) {
+                this.logger = (Logger) DataSource.class.getDeclaredMethod("getParentLogger").invoke(dataSource);
+            }
+
+            return this.logger;
         } catch (Throwable e) {
             throw new SQLFeatureNotSupportedException();
+        } finally {
+            l.unlock();
         }
     }
 

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java?rev=1324764&r1=1324763&r2=1324764&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicManagedDataSource.java Wed Apr 11 13:53:09 2012
@@ -23,10 +23,16 @@ import java.io.File;
 import java.sql.SQLException;
 import java.sql.SQLFeatureNotSupportedException;
 import java.util.Properties;
+import java.util.concurrent.locks.ReentrantLock;
 import java.util.logging.Logger;
 
+@SuppressWarnings({"UnusedDeclaration"})
 public class BasicManagedDataSource extends org.apache.commons.dbcp.managed.BasicManagedDataSource {
 
+    private static final ReentrantLock lock = new ReentrantLock();
+
+    private Logger logger = null;
+
     /**
      * The password codec to be used to retrieve the plain text password from a
      * ciphered value.
@@ -42,8 +48,14 @@ public class BasicManagedDataSource exte
      *
      * @return the password codec class
      */
-    public synchronized String getPasswordCipher() {
-        return this.passwordCipher;
+    public String getPasswordCipher() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return this.passwordCipher;
+        } finally {
+            l.unlock();
+        }
     }
 
     /**
@@ -53,74 +65,131 @@ public class BasicManagedDataSource exte
      *
      * @param passwordCipher password codec value
      */
-    public synchronized void setPasswordCipher(String passwordCipher) {
-        this.passwordCipher = passwordCipher;
+    public void setPasswordCipher(String passwordCipher) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            this.passwordCipher = passwordCipher;
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized String getUserName() {
-        return super.getUsername();
+    public String getUserName() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return super.getUsername();
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setUserName(String string) {
-        super.setUsername(string);
+    public void setUserName(String string) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setUsername(string);
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized String getJdbcDriver() {
-        return super.getDriverClassName();
+    public String getJdbcDriver() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return super.getDriverClassName();
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setJdbcDriver(String string) {
-        super.setDriverClassName(string);
+    public void setJdbcDriver(String string) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setDriverClassName(string);
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized String getJdbcUrl() {
-        return super.getUrl();
+    public String getJdbcUrl() {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            return super.getUrl();
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setJdbcUrl(String string) {
-        super.setUrl(string);
+    public void setJdbcUrl(String string) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setUrl(string);
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setDefaultTransactionIsolation(String s) {
-        if (s == null || s.equals("")) return;
-        int level = IsolationLevels.getIsolationLevel(s);
-        super.setDefaultTransactionIsolation(level);
+    public void setDefaultTransactionIsolation(String s) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            if (s == null || s.equals("")) return;
+            int level = IsolationLevels.getIsolationLevel(s);
+            super.setDefaultTransactionIsolation(level);
+        } finally {
+            l.unlock();
+        }
     }
 
-    public synchronized void setMaxWait(final int maxWait) {
-        super.setMaxWait((long)maxWait);
+    public void setMaxWait(final int maxWait) {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.setMaxWait((long) maxWait);
+        } finally {
+            l.unlock();
+        }
     }
 
-    protected synchronized DataSource createDataSource() throws SQLException {
-        if (dataSource != null) {
-            return dataSource;
-        }
+    protected DataSource createDataSource() throws SQLException {
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            if (dataSource != null) {
+                return dataSource;
+            }
 
-        // check password codec if available
-        if (null != passwordCipher) {
-            PasswordCipher cipher = BasicDataSourceUtil.getPasswordCipher(passwordCipher);
-            String plainPwd = cipher.decrypt(password.toCharArray());
+            // check password codec if available
+            if (null != passwordCipher) {
+                PasswordCipher cipher = BasicDataSourceUtil.getPasswordCipher(passwordCipher);
+                String plainPwd = cipher.decrypt(password.toCharArray());
 
-            // override previous password value
-            super.setPassword(plainPwd);
-        }
+                // override previous password value
+                super.setPassword(plainPwd);
+            }
 
-        // get the plugin
-        DataSourcePlugin helper = BasicDataSourceUtil.getDataSourcePlugin(getUrl());
+            // get the plugin
+            DataSourcePlugin helper = BasicDataSourceUtil.getDataSourcePlugin(getUrl());
 
-        // configure this
-        if (helper != null) {
-            helper.configure(this);
-        }
+            // configure this
+            if (helper != null) {
+                helper.configure(this);
+            }
+
+            wrapTransactionManager();
+            // create the data source
+            if (helper == null || !helper.enableUserDirHack()) {
+                return super.createDataSource();
+            } else {
+                // wrap super call with code that sets user.dir to openejb.base and then resets it
+                Properties systemProperties = System.getProperties();
 
-        wrapTransactionManager();
-        // create the data source
-        if (helper == null || !helper.enableUserDirHack()) {
-            return super.createDataSource();
-        } else {
-            // wrap super call with code that sets user.dir to openejb.base and then resets it
-            Properties systemProperties = System.getProperties();
-            synchronized (systemProperties) {
                 String userDir = systemProperties.getProperty("user.dir");
                 try {
                     File base = SystemInstance.get().getBase().getDirectory();
@@ -129,23 +198,42 @@ public class BasicManagedDataSource exte
                 } finally {
                     systemProperties.setProperty("user.dir", userDir);
                 }
+
             }
+        } finally {
+            l.unlock();
         }
     }
 
     protected void wrapTransactionManager() {
+        //TODO?
     }
 
-    public synchronized void close() throws SQLException {
+    public void close() throws SQLException {
         //TODO - Prevent unuathorized call
-        super.close();
+        final ReentrantLock l = lock;
+        l.lock();
+        try {
+            super.close();
+        } finally {
+            l.unlock();
+        }
     }
 
     public Logger getParentLogger() throws SQLFeatureNotSupportedException {
+        final ReentrantLock l = lock;
+        l.lock();
         try {
-            return (Logger) DataSource.class.getDeclaredMethod("getParentLogger").invoke(dataSource);
+
+            if (null == this.logger) {
+                this.logger = (Logger) DataSource.class.getDeclaredMethod("getParentLogger").invoke(dataSource);
+            }
+
+            return this.logger;
         } catch (Throwable e) {
             throw new SQLFeatureNotSupportedException();
+        } finally {
+            l.unlock();
         }
     }
 }

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java?rev=1324764&r1=1324763&r2=1324764&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/DataSourceFactory.java Wed Apr 11 13:53:09 2012
@@ -96,6 +96,14 @@ public class DataSourceFactory {
         return ds;
     }
 
+    private static void setUrl(final DataSource dataSource, final String url, final ClassLoader classLoader, final String clazz, final String method) throws Exception {
+
+        final Class<?> hsql = classLoader.loadClass(clazz);
+        final Method setDatabase = hsql.getMethod(method, String.class);
+        setDatabase.setAccessible(true);
+        setDatabase.invoke(dataSource, url);
+    }
+
     public static class DbcpDataSource extends BasicDataSource {
 
         private final DataSource dataSource;
@@ -113,12 +121,14 @@ public class DataSourceFactory {
         public void setJdbcUrl(String url) {
             // TODO This is a big whole and we will need to rework this
             try {
-                // only works if hsql is available and datasource is an HSQL jdbcDataSource
-                final Class<?> hsql = this.getClass().getClassLoader().loadClass("org.hsqldb.jdbc.JDBCDataSource");
-                final Method setDatabase = hsql.getMethod("setDatabase", String.class);
-                setDatabase.setAccessible(true);
-                setDatabase.invoke(dataSource, url);
-            } catch (Throwable e) {
+
+                if (url.contains("jdbc:derby:")) {
+                    DataSourceFactory.setUrl(this.dataSource, url.replace("jdbc:derby:", ""), this.getClass().getClassLoader(), "org.apache.derby.jdbc.EmbeddedDataSource", "setDatabaseName");
+                } else {
+                    DataSourceFactory.setUrl(this.dataSource, url, this.getClass().getClassLoader(), "org.hsqldb.jdbc.JDBCDataSource", "setDatabase");
+                }
+
+            } catch (Throwable e1) {
                 super.setUrl(url);
             }
         }
@@ -136,12 +146,14 @@ public class DataSourceFactory {
         public void setJdbcUrl(String url) {
             // TODO This is a big whole and we will need to rework this
             try {
-                // only works if hsql is available and datasource is an HSQL jdbcDataSource
-                final Class<?> hsql = this.getClass().getClassLoader().loadClass("org.hsqldb.jdbc.JDBCDataSource");
-                final Method setDatabase = hsql.getMethod("setDatabase", String.class);
-                setDatabase.setAccessible(true);
-                setDatabase.invoke(dataSource, url);
-            } catch (Throwable e) {
+
+                if (url.contains("jdbc:derby:")) {
+                    DataSourceFactory.setUrl(this.dataSource, url.replace("jdbc:derby:", ""), this.getClass().getClassLoader(), "org.apache.derby.jdbc.EmbeddedDataSource", "setDatabaseName");
+                } else {
+                    DataSourceFactory.setUrl(this.dataSource, url, this.getClass().getClassLoader(), "org.hsqldb.jdbc.JDBCDataSource", "setDatabase");
+                }
+
+            } catch (Throwable e1) {
                 super.setUrl(url);
             }
         }