You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by rm...@apache.org on 2012/12/05 09:29:42 UTC

svn commit: r1417310 - in /openwebbeans/branches/owb_1.1.x: webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/proxy/ webbeans-impl/src/main/java/org/apache/webbeans/container/ webbeans-impl/src/main/java/org/apache/webbeans/util/

Author: rmannibucau
Date: Wed Dec  5 08:29:41 2012
New Revision: 1417310

URL: http://svn.apache.org/viewvc?rev=1417310&view=rev
Log:
OWB-732 ClassLoader leak in WebBeansUtil.isScopeTypeNormalCache. Thanks chunlinyao for the report! Moving the cache + method over the bean manager to ensure it is done by app.

Modified:
    openwebbeans/branches/owb_1.1.x/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/proxy/EjbBeanProxyHandler.java
    openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java

Modified: openwebbeans/branches/owb_1.1.x/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/proxy/EjbBeanProxyHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/proxy/EjbBeanProxyHandler.java?rev=1417310&r1=1417309&r2=1417310&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/proxy/EjbBeanProxyHandler.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/proxy/EjbBeanProxyHandler.java Wed Dec  5 08:29:41 2012
@@ -88,7 +88,7 @@ public class EjbBeanProxyHandler impleme
         this.ejbBean = ejbBean;
         this.webBeansContext = ejbBean.getWebBeansContext();
         
-        if(this.webBeansContext.getWebBeansUtil().isScopeTypeNormal(ejbBean.getScope()))
+        if(this.webBeansContext.getBeanManagerImpl().isScopeTypeNormal(ejbBean.getScope()))
         {
             initiateBeanBag((OwbBean<Object>)ejbBean, (CreationalContext<Object>)creationalContext);
         }

Modified: openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1417310&r1=1417309&r2=1417310&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java Wed Dec  5 08:29:41 2012
@@ -203,6 +203,15 @@ public class BeanManagerImpl implements 
 
 
     /**
+     * we cache results of calls to {@link #isScopeTypeNormalCache} because
+     * this doesn't change at runtime.
+     * We don't need to take special care about classloader
+     * hierarchies, because each cl has other classes.
+     */
+    private static Map<Class<? extends Annotation>, Boolean> isScopeTypeNormalCache =
+            new ConcurrentHashMap<Class<? extends Annotation>, Boolean>();
+
+    /**
      * Creates a new {@link BeanManager} instance.
      * Called by the system. Do not use outside of the
      * system.
@@ -824,7 +833,7 @@ public class BeanManagerImpl implements 
         
                 
         //Scope is normal
-        if (webBeansContext.getWebBeansUtil().isScopeTypeNormal(bean.getScope()))
+        if (isScopeTypeNormal(bean.getScope()))
         {
             instance = getEjbOrJmsProxyReference(bean, beanType,creationalContext);
             
@@ -871,7 +880,7 @@ public class BeanManagerImpl implements 
         //Create session bean proxy
         if(bean instanceof EnterpriseBeanMarker)
         {
-            if(webBeansContext.getWebBeansUtil().isScopeTypeNormal(bean.getScope()))
+            if(isScopeTypeNormal(bean.getScope()))
             {
                 //Maybe it is cached
                 if(cacheProxies.containsKey(bean))
@@ -1127,4 +1136,50 @@ public class BeanManagerImpl implements 
         return inUse;
     }
 
+    /**
+     * The result of this invocation get's cached
+     * @see #isScopeTypeNormalCache
+     * @param scopeType
+     * @return <code>true</code> if the given scopeType represents a
+     *         {@link javax.enterprise.context.NormalScope}d bean
+     */
+    public boolean isScopeTypeNormal(Class<? extends Annotation> scopeType)
+    {
+        Asserts.assertNotNull(scopeType, "scopeType argument can not be null");
+
+        Boolean isNormal = isScopeTypeNormalCache.get(scopeType);
+
+        if (isNormal != null)
+        {
+            return isNormal;
+        }
+
+
+        if (scopeType.isAnnotationPresent(NormalScope.class))
+        {
+            isScopeTypeNormalCache.put(scopeType, Boolean.TRUE);
+            return true;
+        }
+
+        if(scopeType.isAnnotationPresent(Scope.class))
+        {
+            isScopeTypeNormalCache.put(scopeType, Boolean.FALSE);
+            return false;
+        }
+
+        List<ExternalScope> additionalScopes = webBeansContext.getBeanManagerImpl().getAdditionalScopes();
+        for (ExternalScope additionalScope : additionalScopes)
+        {
+            if (additionalScope.getScope().equals(scopeType))
+            {
+                isNormal = additionalScope.isNormal();
+                isScopeTypeNormalCache.put(scopeType, isNormal);
+                return isNormal;
+            }
+        }
+
+        // no scopetype found so far -> kawumms
+        throw new IllegalArgumentException("scopeType argument must be annotated with @Scope or @NormalScope");
+    }
+
 }

Modified: openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1417310&r1=1417309&r2=1417310&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java Wed Dec  5 08:29:41 2012
@@ -38,15 +38,12 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
 
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.decorator.Decorator;
 import javax.enterprise.context.Conversation;
 import javax.enterprise.context.Dependent;
-import javax.enterprise.context.NormalScope;
 import javax.enterprise.context.spi.Contextual;
 import javax.enterprise.event.Event;
 import javax.enterprise.event.Observes;
@@ -85,7 +82,6 @@ import javax.enterprise.util.TypeLiteral
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Provider;
-import javax.inject.Scope;
 import javax.interceptor.AroundInvoke;
 import javax.interceptor.AroundTimeout;
 import javax.interceptor.InvocationContext;
@@ -125,7 +121,6 @@ import org.apache.webbeans.config.OWBLog
 import org.apache.webbeans.config.OpenWebBeansConfiguration;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
-import org.apache.webbeans.container.ExternalScope;
 import org.apache.webbeans.container.InjectionResolver;
 import org.apache.webbeans.conversation.ConversationImpl;
 import org.apache.webbeans.decorator.DecoratorUtil;
@@ -1769,7 +1764,7 @@ public final class WebBeansUtil
         Asserts.assertNotNull(scopeType, "scopeType parameter can not be null");
 
         //Unproxiable test for NormalScoped beans
-        if (isScopeTypeNormal(scopeType))
+        if (webBeansContext.getBeanManagerImpl().isScopeTypeNormal(scopeType))
         {
             ViolationMessageBuilder violationMessage = ViolationMessageBuilder.newViolation();
 
@@ -2018,61 +2013,6 @@ public final class WebBeansUtil
             }
         }
     }
-
-    /**
-     * The result of this invocation get's cached
-     * @see #isScopeTypeNormalCache
-     * @param scopeType
-     * @return <code>true</code> if the given scopeType represents a
-     *         {@link javax.enterprise.context.NormalScope}d bean
-     */
-    public boolean isScopeTypeNormal(Class<? extends Annotation> scopeType)
-    {
-        Asserts.assertNotNull(scopeType, "scopeType argument can not be null");
-
-        Boolean isNormal = isScopeTypeNormalCache.get(scopeType);
-
-        if (isNormal != null)
-        {
-            return isNormal.booleanValue();
-        }
-
-
-        if (scopeType.isAnnotationPresent(NormalScope.class))
-        {
-            isScopeTypeNormalCache.put(scopeType, Boolean.TRUE);
-            return true;
-        }
-
-        if(scopeType.isAnnotationPresent(Scope.class))
-        {
-            isScopeTypeNormalCache.put(scopeType, Boolean.FALSE);
-            return false;
-        }
-
-        List<ExternalScope> additionalScopes = webBeansContext.getBeanManagerImpl().getAdditionalScopes();
-        for (ExternalScope additionalScope : additionalScopes)
-        {
-            if (additionalScope.getScope().equals(scopeType))
-            {
-                isNormal = additionalScope.isNormal() ? Boolean.TRUE : Boolean.FALSE;
-                isScopeTypeNormalCache.put(scopeType, isNormal);
-                return isNormal.booleanValue();
-            }
-        }
-
-        // no scopetype found so far -> kawumms
-        throw new IllegalArgumentException("scopeType argument must be annotated with @Scope or @NormalScope");
-    }
-
-    /**
-     * we cache results of calls to {@link #isScopeTypeNormalCache} because
-     * this doesn't change at runtime.
-     * We don't need to take special care about classloader
-     * hierarchies, because each cl has other classes.
-     */
-    private static Map<Class<? extends Annotation>, Boolean> isScopeTypeNormalCache =
-            new ConcurrentHashMap<Class<? extends Annotation>, Boolean>();
     
     public static void checkNullInstance(Object instance, Class<? > scopeType, String errorMessage, 
             Object... errorMessageArgs)