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)
{