You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jl...@apache.org on 2009/10/09 23:52:07 UTC

svn commit: r823709 - in /openejb/trunk/openejb3/container/openejb-core/src: main/java/org/apache/openejb/resource/jdbc/ main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/ test/java/org/apache/openejb/resource/jdbc/

Author: jlmonteiro
Date: Fri Oct  9 21:52:06 2009
New Revision: 823709

URL: http://svn.apache.org/viewvc?rev=823709&view=rev
Log:
OPENEJB-1076 Allow end users to use ciphered passwords in datasource configuration (openejb.xml).
Enhanced password codec usage thanks to an SPI like locator. It assumes that all codecs provide a file under META-INF/org.apache.openejb.resource.jdbc.PasswordCodec with the password codec implementation.

Added:
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/PlainText
    openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/Static3DES
Modified:
    openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java
    openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/PasswordCodecTest.java

Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java?rev=823709&r1=823708&r2=823709&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/BasicDataSourceUtil.java Fri Oct  9 21:52:06 2009
@@ -96,17 +96,36 @@
     public static PasswordCodec getPasswordCodec(String passwordCodecClass) throws SQLException {
         // Load the password codec class
         Class pwdCodec = null;
-        try {
-            try {
-                pwdCodec = Class.forName(passwordCodecClass);
 
-            } catch (ClassNotFoundException cnfe) {
-                pwdCodec = Thread.currentThread().getContextClassLoader().loadClass(passwordCodecClass);
-            }
+        // try looking for implementation in /META-INF/org.apache.openejb.resource.jdbc.PasswordCodec
+        ResourceFinder finder = new ResourceFinder("META-INF/");
+        Map<String, Class> impls;
+        try {
+            impls = finder.mapAllImplementations(PasswordCodec.class);
+            
         } catch (Throwable t) {
-            String message = "Cannot load password codec class '" + passwordCodecClass + "'";
+            String message = 
+                "Password codec '" + passwordCodecClass + 
+                "' not found in META-INF/org.apache.openejb.resource.jdbc.PasswordCodec.";
             throw new SQLNestedException(message, t);
         }
+        pwdCodec = impls.get(passwordCodecClass);
+
+        // if not found in META-INF/org.apache.openejb.resource.jdbc.PasswordCodec
+        // we can try to load the class.
+        if (null == pwdCodec) {
+            try {
+                try {
+                    pwdCodec = Class.forName(passwordCodecClass);
+                    
+                } catch (ClassNotFoundException cnfe) {
+                    pwdCodec = Thread.currentThread().getContextClassLoader().loadClass(passwordCodecClass);
+                }
+            } catch (Throwable t) {
+                String message = "Cannot load password codec class '" + passwordCodecClass + "'";
+                throw new SQLNestedException(message, t);
+            }
+        }
 
         // Create an instance
         PasswordCodec codec = null;

Added: openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/PlainText
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/PlainText?rev=823709&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/PlainText (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/PlainText Fri Oct  9 21:52:06 2009
@@ -0,0 +1 @@
+org.apache.openejb.resource.jdbc.PlainTextPasswordCodec

Added: openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/Static3DES
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/Static3DES?rev=823709&view=auto
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/Static3DES (added)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.resource.jdbc.PasswordCodec/Static3DES Fri Oct  9 21:52:06 2009
@@ -0,0 +1 @@
+org.apache.openejb.resource.jdbc.StaticDESPasswordCodec

Modified: openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/PasswordCodecTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/PasswordCodecTest.java?rev=823709&r1=823708&r2=823709&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/PasswordCodecTest.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/resource/jdbc/PasswordCodecTest.java Fri Oct  9 21:52:06 2009
@@ -17,6 +17,10 @@
  */
 package org.apache.openejb.resource.jdbc;
 
+import java.sql.SQLException;
+
+import javax.persistence.Basic;
+
 import junit.framework.TestCase;
 
 public class PasswordCodecTest extends TestCase {
@@ -34,5 +38,36 @@
 		char[] tmp = codec.encode(PLAIN_PWD);
 		assertEquals(PLAIN_PWD, codec.decode(tmp));
     }
+	
+	public void testGetDataSourcePlugin() throws Exception {
+        // all current known plugins
+        assertPluginClass("PlainText", PlainTextPasswordCodec.class);
+        assertPluginClass("Static3DES", StaticDESPasswordCodec.class);
+
+        // null
+        try {
+            BasicDataSourceUtil.getPasswordCodec(null);
+            fail("Should throw an exception when no codec is found.");
+        } catch (Exception e) {
+            // OK
+        }
+
+        // empty string
+        try {
+            BasicDataSourceUtil.getPasswordCodec("");
+            fail("Should throw an exception when no codec is found.");
+        } catch (Exception e) {
+            // OK
+        }
+        
+        // try the FQN of the target codec
+        assertNotNull(BasicDataSourceUtil.getPasswordCodec(PlainTextPasswordCodec.class.getName()));
+    }
+
+    private void assertPluginClass(String pluginName, Class<? extends PasswordCodec> pluginClass) throws SQLException {
+        PasswordCodec plugin = BasicDataSourceUtil.getPasswordCodec(pluginName);
+        assertNotNull(plugin);
+        assertSame(pluginClass, plugin.getClass());
+    }
     
 }
\ No newline at end of file