[jboss-cvs] JBossAS SVN: r111815 - in projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc: extensions/mysql and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Jul 22 10:25:06 EDT 2011


Author: jesper.pedersen
Date: 2011-07-22 10:25:06 -0400 (Fri, 22 Jul 2011)
New Revision: 111815

Modified:
   projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnectionFactory.java
   projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReauthPlugin.java
   projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReplicationValidConnectionChecker.java
   projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLValidConnectionChecker.java
   projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/oracle/OracleValidConnectionChecker.java
   projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/xa/XAManagedConnectionFactory.java
Log:
[JBJCA-635] Wrong classloader used for plugins

Modified: projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnectionFactory.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnectionFactory.java	2011-07-22 14:22:30 UTC (rev 111814)
+++ projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/BaseWrapperManagedConnectionFactory.java	2011-07-22 14:25:06 UTC (rev 111815)
@@ -741,10 +741,45 @@
 
       if (reauthPluginClassName == null || reauthPluginClassName.trim().equals(""))
          throw new IllegalStateException("ReauthPlugin class name not defined");
+      
+      Class<?> clz = null;
 
       try
       {
-         Class<?> clz = Class.forName(reauthPluginClassName, true, Thread.currentThread().getContextClassLoader());
+         clz = Class.forName(reauthPluginClassName, true, getClassLoaderPlugin().getClassLoader());
+      }
+      catch (ClassNotFoundException cnfe)
+      {
+         // Not found
+      }
+
+      if (clz == null)
+      {
+         try
+         {
+            clz = Class.forName(reauthPluginClassName, true, new TCClassLoaderPlugin().getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            // Not found
+         }
+      }
+
+      if (clz == null)
+      {
+         try
+         {
+            clz = Class.forName(reauthPluginClassName, true, 
+                                BaseWrapperManagedConnectionFactory.class.getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            throw new ResourceException("Error during loading reauth plugin", cnfe);
+         }
+      }
+
+      try
+      {
          reauthPlugin = (ReauthPlugin)clz.newInstance();
 
          if (reauthPluginProperties != null)
@@ -771,7 +806,7 @@
             }
          }
 
-         reauthPlugin.initialize(Thread.currentThread().getContextClassLoader());
+         reauthPlugin.initialize(BaseWrapperManagedConnectionFactory.class.getClassLoader());
       }
       catch (Throwable t)
       {
@@ -834,33 +869,57 @@
    public Object loadClass(String className, Object constructorParameter)
    {
       Object result = null;
+
+      if (className == null || className.trim().equals(""))
+      {
+         log.error("Unable to load undefined URLSelectStrategy");
+         return null;
+      }
+
+      Class<?> clz = null;
       try
       {
-         Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(className);
-         Class<?> param[] = {java.util.List.class};
-         Constructor<?> cnstructor = clazz.getDeclaredConstructor(param);
-         Object consParameter[] = {constructorParameter};
-         result = cnstructor.newInstance(consParameter);
+         clz = Class.forName(className, true, getClassLoaderPlugin().getClassLoader());
       }
       catch (ClassNotFoundException cnfe)
       {
-         log.error("Class not found for URLSelectStrategy :" + className);
+         // Not found
       }
-      catch (InstantiationException ie)
+
+      if (clz == null)
       {
-         log.error("Could not instantiate URLSelectorStrategy type :" + className);
+         try
+         {
+            clz = Class.forName(className, true, new TCClassLoaderPlugin().getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            // Not found
+         }
       }
-      catch (IllegalAccessException iae)
+
+      if (clz == null)
       {
-         log.error("Check for the constructor with List parameter for URLSelectStrategy class as " + className);
+         try
+         {
+            clz = Class.forName(className, true, BaseWrapperManagedConnectionFactory.class.getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            log.error("Unable to load: " + className);
+         }
       }
-      catch (InvocationTargetException ite)
+
+      try
       {
-         log.error("Constructor Invocation failing for URLSelectorStrategy " + className);
+         Class<?> param[] = {java.util.List.class};
+         Constructor<?> constructor = clz.getDeclaredConstructor(param);
+         Object consParameter[] = {constructorParameter};
+         result = constructor.newInstance(consParameter);
       }
-      catch (NoSuchMethodException nsme)
+      catch (Throwable t)
       {
-         log.error("Constructor or Method mismatch in URLSelectorStrategy :" + className);
+         log.error("URLSelectStrategy:" + t.getMessage(), t);
       }
 
       return result;
@@ -975,6 +1034,69 @@
    }
 
    /**
+    * Load plugin class
+    * @param plugin The plugin class name
+    * @param props Optional properties that should be injected
+    * @return The configured object
+    * @exception Exception Thrown if the plugin couldn't be loaded
+    */
+   Object loadPlugin(String plugin, Properties props) throws Exception
+   {
+      if (plugin == null)
+         throw new Exception("Plugin is null");
+
+      if (plugin.trim().equals(""))
+         throw new Exception("Plugin isn't defined");
+
+      Class<?> clz = null;
+      try
+      {
+         clz = Class.forName(plugin, true, getClassLoaderPlugin().getClassLoader());
+      }
+      catch (ClassNotFoundException cnfe)
+      {
+         // Not found
+      }
+
+      if (clz == null)
+      {
+         try
+         {
+            clz = Class.forName(plugin, true, new TCClassLoaderPlugin().getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            // Not found
+         }
+      }
+
+      if (clz == null)
+      {
+         try
+         {
+            clz = Class.forName(plugin, true, BaseWrapperManagedConnectionFactory.class.getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            throw new Exception("Unable to load: " + plugin);
+         }
+      }
+
+      Object result = clz.newInstance();
+
+      if (props != null)
+      {
+         Injection injection = new Injection();
+         for (Entry<Object, Object> prop : props.entrySet())
+         {
+            injection.inject(result, (String)prop.getKey(), (String)prop.getValue());
+         }
+      }
+
+      return result;
+   }
+
+   /**
     * Is the exception fatal
     * @param e The exception
     * @return True if fatal; otherwise false
@@ -990,15 +1112,18 @@
          {
             try
             {
-               ClassLoader cl = Thread.currentThread().getContextClassLoader();
-               Class<?> clazz = cl.loadClass(exceptionSorterClassName);
-               exceptionSorter = (ExceptionSorter)clazz.newInstance();
-               Injection injection = new Injection();
-               for (Entry<Object, Object> prop : exceptionSorterProps.entrySet())
+               Object o = loadPlugin(exceptionSorterClassName, exceptionSorterProps);
+
+               if (o != null && o instanceof ExceptionSorter)
                {
-                  injection.inject(exceptionSorter, (String)prop.getKey(), (String)prop.getValue());
+                  exceptionSorter = (ExceptionSorter)o;
+                  return exceptionSorter.isExceptionFatal(e);
                }
-               return exceptionSorter.isExceptionFatal(e);
+               else
+               {
+                  log.warn("Disabling exception sorter");
+                  exceptionSorter = new NullExceptionSorter();
+               }
             }
             catch (Exception e2)
             {
@@ -1030,19 +1155,22 @@
       {
          try
          {
-            ClassLoader cl = Thread.currentThread().getContextClassLoader();
-            Class<?> clazz = cl.loadClass(validConnectionCheckerClassName);
-            connectionChecker = (ValidConnectionChecker) clazz.newInstance();
-            Injection injection = new Injection();
-            for (Entry<Object, Object> prop : validConnectionCheckerProps.entrySet())
+            Object o = loadPlugin(validConnectionCheckerClassName, validConnectionCheckerProps);
+
+            if (o != null && o instanceof ValidConnectionChecker)
             {
-               injection.inject(connectionChecker, (String)prop.getKey(), (String)prop.getValue());
+               connectionChecker = (ValidConnectionChecker)o;
+               return connectionChecker.isValidConnection(c);
             }
-            return connectionChecker.isValidConnection(c);
+            else
+            {
+               log.warn("Disabling valid connection checker");
+               connectionChecker = new NullValidConnectionChecker();
+            }
          }
          catch (Exception e)
          {
-            log.warn("Exception trying to create connection checker (disabling):", e);
+            log.warn("Exception trying to create valid connection checker (disabling):", e);
             connectionChecker = new NullValidConnectionChecker();
          }
       }
@@ -1073,19 +1201,22 @@
       {
          try
          {
-            ClassLoader cl = Thread.currentThread().getContextClassLoader();
-            Class<?> clazz = cl.loadClass(staleConnectionCheckerClassName);
-            staleConnectionChecker = (StaleConnectionChecker)clazz.newInstance();
-            Injection injection = new Injection();
-            for (Entry<Object, Object> prop : staleConnectionCheckerProps.entrySet())
+            Object o = loadPlugin(staleConnectionCheckerClassName, staleConnectionCheckerProps);
+
+            if (o != null && o instanceof StaleConnectionChecker)
             {
-               injection.inject(staleConnectionChecker, (String)prop.getKey(), (String)prop.getValue());
+               staleConnectionChecker = (StaleConnectionChecker)o;
+               return staleConnectionChecker.isStaleConnection(e);
             }
-            return staleConnectionChecker.isStaleConnection(e);
+            else
+            {
+               log.warn("Disabling stale connection checker");
+               staleConnectionChecker = new NullStaleConnectionChecker();
+            }
          }
          catch (Exception ex2)
          {
-            log.warn("exception trying to create stale connection checker (disabling) " +
+            log.warn("Exception trying to create stale connection checker (disabling) " +
                      staleConnectionCheckerClassName, ex2);
 
             staleConnectionChecker = new NullStaleConnectionChecker();

Modified: projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReauthPlugin.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReauthPlugin.java	2011-07-22 14:22:30 UTC (rev 111814)
+++ projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReauthPlugin.java	2011-07-22 14:25:06 UTC (rev 111815)
@@ -51,12 +51,35 @@
     */
    public synchronized void initialize(ClassLoader cl) throws SQLException
    {
+      Class<?> mysqlConnection = null;
+
       try
       {
-         Class<?> mysqlConnection = cl.loadClass("com.mysql.jdbc.Connection");
+         ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+         mysqlConnection = Class.forName("com.mysql.jdbc.Connection", true, tccl);
+      }
+      catch (ClassNotFoundException cnfe) 
+      {
+         // Ignore
+      }
+
+      if (mysqlConnection == null)
+      {
+         try
+         {
+            mysqlConnection = Class.forName("com.mysql.jdbc.Connection", true, cl);
+         }
+         catch (Throwable t) 
+         {
+            throw new SQLException("Cannot resolve com.mysq.jdbc.Connection changeUser method", t);
+         }
+      }
+
+      try
+      {
          changeUser = mysqlConnection.getMethod("changeUser", new Class[] {String.class, String.class});
-      } 
-      catch (Throwable t) 
+      }
+      catch (Throwable t)
       {
          throw new SQLException("Cannot resolve com.mysq.jdbc.Connection changeUser method", t);
       }

Modified: projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReplicationValidConnectionChecker.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReplicationValidConnectionChecker.java	2011-07-22 14:22:30 UTC (rev 111814)
+++ projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLReplicationValidConnectionChecker.java	2011-07-22 14:25:06 UTC (rev 111815)
@@ -205,7 +205,7 @@
       log = Logger.getLogger(MySQLReplicationValidConnectionChecker.class);
 
       // Load connection class
-      Class<?> mysqlConnection = Thread.currentThread().getContextClassLoader().loadClass(CONNECTION_CLASS);
+      Class<?> mysqlConnection = Class.forName(CONNECTION_CLASS, true, getClass().getClassLoader());
 
       // Check for Java 6 compatibility and use isValid on the connection
       try

Modified: projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLValidConnectionChecker.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLValidConnectionChecker.java	2011-07-22 14:22:30 UTC (rev 111814)
+++ projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/mysql/MySQLValidConnectionChecker.java	2011-07-22 14:25:06 UTC (rev 111815)
@@ -155,8 +155,7 @@
       log = Logger.getLogger(MySQLValidConnectionChecker.class);
       driverHasPingMethod = false;
 
-      Class<?> mysqlConnection =
-         Thread.currentThread().getContextClassLoader().loadClass("com.mysql.jdbc.Connection");
+      Class<?> mysqlConnection = Class.forName("com.mysql.jdbc.Connection", true, getClass().getClassLoader());
 
       ping = mysqlConnection.getMethod("ping", new Class<?>[] {});
 

Modified: projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/oracle/OracleValidConnectionChecker.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/oracle/OracleValidConnectionChecker.java	2011-07-22 14:22:30 UTC (rev 111814)
+++ projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/extensions/oracle/OracleValidConnectionChecker.java	2011-07-22 14:25:06 UTC (rev 111815)
@@ -98,7 +98,7 @@
       log = Logger.getLogger(OracleValidConnectionChecker.class);
 
       Class<?> oracleConnection =
-         Thread.currentThread().getContextClassLoader().loadClass("oracle.jdbc.driver.OracleConnection");
+         Class.forName("oracle.jdbc.driver.OracleConnection", true, getClass().getClassLoader());
       ping = oracleConnection.getMethod("pingDatabase", new Class<?>[] {Integer.TYPE});
    }
 

Modified: projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/xa/XAManagedConnectionFactory.java
===================================================================
--- projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/xa/XAManagedConnectionFactory.java	2011-07-22 14:22:30 UTC (rev 111814)
+++ projects/jboss-jca/branches/Branch_1_0/adapters/src/main/java/org/jboss/jca/adapters/jdbc/xa/XAManagedConnectionFactory.java	2011-07-22 14:25:06 UTC (rev 111815)
@@ -23,6 +23,7 @@
 package org.jboss.jca.adapters.jdbc.xa;
 
 import org.jboss.jca.adapters.jdbc.BaseWrapperManagedConnectionFactory;
+import org.jboss.jca.adapters.jdbc.classloading.TCClassLoaderPlugin;
 import org.jboss.jca.adapters.jdbc.spi.URLSelectorStrategy;
 
 import java.beans.PropertyEditor;
@@ -251,9 +252,44 @@
       }
 
       XADataSource xads = null;
+      Class<?> clazz = null;
+
       try
       {
-         Class<?> clazz = getClassLoaderPlugin().getClassLoader().loadClass(getXADataSourceClass());
+         clazz = Class.forName(getXADataSourceClass(), true, getClassLoaderPlugin().getClassLoader());
+      }
+      catch (ClassNotFoundException cnfe)
+      {
+         // Ignore
+      }
+
+      if (clazz == null)
+      {
+         try
+         {
+            clazz = Class.forName(getXADataSourceClass(), true, new TCClassLoaderPlugin().getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            // Ignore
+         }
+      }
+
+      if (clazz == null)
+      {
+         try
+         {
+            clazz = Class.forName(getXADataSourceClass(), true, XAManagedConnectionFactory.class.getClassLoader());
+         }
+         catch (ClassNotFoundException cnfe)
+         {
+            throw new ResourceException("Class not found for XADataSource " + getXADataSourceClass(), cnfe);
+         }
+      }
+
+
+      try
+      {
          xads = (XADataSource)clazz.newInstance();
          final Class<?>[] noClasses = new Class<?>[]{};
          for (Iterator<?> i = xaProps.keySet().iterator(); i.hasNext();)
@@ -306,10 +342,6 @@
 
          }
       }
-      catch (ClassNotFoundException cnfe)
-      {
-         throw new ResourceException("Class not found for XADataSource " + getXADataSourceClass(), cnfe);
-      }
       catch (InstantiationException ie)
       {
          throw new ResourceException("Could not create an XADataSource: ", ie);



More information about the jboss-cvs-commits mailing list