You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by st...@apache.org on 2010/07/09 01:05:57 UTC

svn commit: r961974 - in /myfaces/extensions/cdi/trunk/core: api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/manager/ api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/util/ impl/src/main/java/org/apache/myfaces/extensions/cdi/c...

Author: struberg
Date: Thu Jul  8 23:05:57 2010
New Revision: 961974

URL: http://svn.apache.org/viewvc?rev=961974&view=rev
Log:
EXTCDI-30 BeanManagerProvider fixes for shared ClassLoader scenarios

Modified:
    myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/manager/BeanManagerProvider.java
    myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/util/ClassUtils.java
    myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/utils/CodiUtils.java

Modified: myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/manager/BeanManagerProvider.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/manager/BeanManagerProvider.java?rev=961974&r1=961973&r2=961974&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/manager/BeanManagerProvider.java (original)
+++ myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/manager/BeanManagerProvider.java Thu Jul  8 23:05:57 2010
@@ -18,10 +18,14 @@
  */
 package org.apache.myfaces.extensions.cdi.core.api.manager;
 
+import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
+
 import javax.enterprise.event.Observes;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.enterprise.inject.spi.Extension;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 /**
  * <p>This class provides access to the BeanManager
@@ -40,7 +44,7 @@ public class BeanManagerProvider impleme
 
     private static BeanManagerProvider bmp = null;
 
-    private volatile BeanManager bm = null;
+    private volatile Map<ClassLoader, BeanManager> bms = new ConcurrentHashMap<ClassLoader, BeanManager>();
 
 
     /**
@@ -58,7 +62,9 @@ public class BeanManagerProvider impleme
      */
     public BeanManager getBeanManager()
     {
-        return bm;
+        ClassLoader cl = ClassUtils.getClassLoader(null);
+
+        return bms.get(cl);
     }
 
     /**
@@ -69,16 +75,24 @@ public class BeanManagerProvider impleme
      */
     public void setBeanManager(@Observes AfterBeanDiscovery abd, BeanManager beanManager)
     {
-        bm = beanManager;
-        setBeanManagerProvider(this);
+        BeanManagerProvider bmpFirst = setBeanManagerProvider(this);
+
+        ClassLoader cl = ClassUtils.getClassLoader(null);
+        bmpFirst.bms.put(cl, beanManager);
     }
 
     /**
      * This function exists to prevent findbugs to complain about
      * setting a static member from a non-static function.
+     * @return the first BeanManagerProvider 
      */
-    private static void setBeanManagerProvider(BeanManagerProvider bmpIn)
+    private static BeanManagerProvider setBeanManagerProvider(BeanManagerProvider bmpIn)
     {
-        bmp = bmpIn;
+        if (bmp == null)
+        {
+            bmp = bmpIn;
+        }
+
+        return bmp;
     }
 }

Modified: myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/util/ClassUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/util/ClassUtils.java?rev=961974&r1=961973&r2=961974&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/util/ClassUtils.java (original)
+++ myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/util/ClassUtils.java Thu Jul  8 23:05:57 2010
@@ -18,6 +18,8 @@
  */
 package org.apache.myfaces.extensions.cdi.core.api.util;
 
+import java.security.AccessController;
+import java.security.PrivilegedAction;
 import java.util.jar.Manifest;
 import java.util.jar.Attributes;
 import java.net.URL;
@@ -27,6 +29,49 @@ import java.net.URL;
  */
 public class ClassUtils
 {
+        /**
+     * Detect the right ClassLoader.
+     * The lookup order is determined by:
+     * <ol>
+     *  <li>ContextClassLoader of the current Thread</li>
+     *  <li>ClassLoader of the given Object 'o'</li>
+     *  <li>ClassLoader of this very CodiUtils class</li>
+     * </ol>
+     *
+     * @param o if not <code>null</code> it may get used to detect the classloader.
+     * @return The {@link ClassLoader} which should get used to create new instances
+     */
+    public static ClassLoader getClassLoader(Object o)
+    {
+        ClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
+            {
+                public ClassLoader run()
+                {
+                    try
+                    {
+                        return Thread.currentThread().getContextClassLoader();
+                    }
+                    catch (Exception e)
+                    {
+                        return null;
+                    }
+                }
+            }
+        );
+
+        if (loader == null && o != null)
+        {
+            loader = o.getClass().getClassLoader();
+        }
+
+        if (loader == null)
+        {
+            loader = ClassUtils.class.getClassLoader();
+        }
+
+        return loader;
+    }
+
     public static Class tryToLoadClassForName(String name)
     {
         try
@@ -46,7 +91,7 @@ public class ClassUtils
         {
             // Try WebApp ClassLoader first
             return Class.forName(name, false, // do not initialize for faster startup
-                Thread.currentThread().getContextClassLoader());
+               getClassLoader(null));
         }
         catch (ClassNotFoundException ignore)
         {

Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/utils/CodiUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/utils/CodiUtils.java?rev=961974&r1=961973&r2=961974&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/utils/CodiUtils.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/utils/CodiUtils.java Thu Jul  8 23:05:57 2010
@@ -18,10 +18,10 @@
  */
 package org.apache.myfaces.extensions.cdi.core.impl.utils;
 
+import org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils;
+
 import java.io.IOException;
 import java.io.InputStream;
-import java.security.AccessController;
-import java.security.PrivilegedAction;
 import java.util.Properties;
 
 /**
@@ -35,49 +35,6 @@ public class CodiUtils
     public static final String CODI_PROPERTIES = "/META-INF/extcdi/extcdi.properties";
 
     /**
-     * Detect the right ClassLoader.
-     * The lookup order is determined by:
-     * <ol>
-     *  <li>ContextClassLoader of the current Thread</li>
-     *  <li>ClassLoader of the given Object 'o'</li>
-     *  <li>ClassLoader of this very CodiUtils class</li>
-     * </ol>
-     *
-     * @param o if not <code>null</code> it may get used to detect the classloader.
-     * @return The {@link ClassLoader} which should get used to create new instances
-     */
-    public static ClassLoader getClassLoader(Object o)
-    {
-        ClassLoader loader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>()
-            {
-                public ClassLoader run()
-                {
-                    try
-                    {
-                        return Thread.currentThread().getContextClassLoader();
-                    }
-                    catch (Exception e)
-                    {
-                        return null;
-                    }
-                }
-            }
-        );
-
-        if (loader == null && o != null)
-        {
-            loader = o.getClass().getClassLoader();
-        }
-
-        if (loader == null)
-        {
-            loader = CodiUtils.class.getClassLoader();
-        }
-
-        return loader;
-    }
-
-    /**
      * Load Properties from a configuration file with the given resourceName.
      *
      * @param resourceName
@@ -87,7 +44,7 @@ public class CodiUtils
     public static Properties getProperties(String resourceName) throws IOException
     {
         Properties props = null;
-        ClassLoader cl = getClassLoader(resourceName);
+        ClassLoader cl = ClassUtils.getClassLoader(resourceName);
         InputStream is = cl.getResourceAsStream(resourceName);
         if (is != null)
         {