You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by st...@apache.org on 2011/03/07 19:10:20 UTC

svn commit: r1078876 - in /openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans: inject/AbstractInjectable.java intercept/InterceptorHandler.java intercept/InterceptorUtil.java util/ClassUtil.java

Author: struberg
Date: Mon Mar  7 18:10:20 2011
New Revision: 1078876

URL: http://svn.apache.org/viewvc?rev=1078876&view=rev
Log:
OWB-541 drop WeakHashMap and cleanup code

This seriously improves our interceptor performance (~40%)

Modified:
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorUtil.java
    openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java?rev=1078876&r1=1078875&r2=1078876&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/inject/AbstractInjectable.java Mon Mar  7 18:10:20 2011
@@ -39,7 +39,6 @@ import org.apache.webbeans.component.Owb
 import org.apache.webbeans.container.InjectionResolver;
 import org.apache.webbeans.context.creational.CreationalContextImpl;
 import org.apache.webbeans.context.creational.DependentCreationalContext;
-import org.apache.webbeans.logger.WebBeansLogger;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.WebBeansUtil;
 
@@ -56,8 +55,6 @@ import org.apache.webbeans.util.WebBeans
  */
 public abstract class AbstractInjectable implements Injectable
 {
-    private final static WebBeansLogger logger = WebBeansLogger.getLogger(AbstractInjectable.class);
-    
     /** Owner bean of the injection point*/
     protected OwbBean<?> injectionOwnerBean;
     
@@ -93,12 +90,7 @@ public abstract class AbstractInjectable
      */
     public <T> Object inject(InjectionPoint injectionPoint)
     {
-        if (logger.wblWillLogDebug())
-        {
-            logger.debug("Injected into bean : [{0}] with injection point : [{1}]", this.injectionOwnerBean, injectionPoint);
-        }
-
-        Object injected = null;               
+        Object injected = null;
 
         //Injected contextual beam
         InjectionResolver instance = injectionOwnerBean.getWebBeansContext().getBeanManagerImpl().getInjectionResolver();

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java?rev=1078876&r1=1078875&r2=1078876&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorHandler.java Mon Mar  7 18:10:20 2011
@@ -27,7 +27,7 @@ import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
-import java.util.WeakHashMap;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javassist.util.proxy.MethodHandler;
 import javassist.util.proxy.ProxyFactory;
@@ -45,7 +45,6 @@ import org.apache.webbeans.decorator.Web
 import org.apache.webbeans.logger.WebBeansLogger;
 import org.apache.webbeans.util.ClassUtil;
 import org.apache.webbeans.util.SecurityUtil;
-import org.apache.webbeans.util.WebBeansUtil;
 
 /**
  * Logic for how interceptors & decorators work in OWB.
@@ -57,8 +56,10 @@ import org.apache.webbeans.util.WebBeans
  * class via methods <code>defineManagedBean(class)</code> and Those methods further call
  * <code>defineInterceptor(interceptor class)</code> and <code>defineDecorator(decorator class)</code>
  * methods. Those methods finally call
- * {@link WebBeansUtil#defineInterceptor(org.apache.webbeans.component.creation.ManagedBeanCreatorImpl, javax.enterprise.inject.spi.ProcessInjectionTarget)} and
- * {@link WebBeansUtil#defineDecorator(org.apache.webbeans.component.creation.ManagedBeanCreatorImpl, javax.enterprise.inject.spi.ProcessInjectionTarget)}
+ * {@link org.apache.webbeans.util.WebBeansUtil#defineInterceptor(org.apache.webbeans.component.creation.ManagedBeanCreatorImpl,
+ *        javax.enterprise.inject.spi.ProcessInjectionTarget)} and
+ * {@link org.apache.webbeans.util.WebBeansUtil#defineDecorator(org.apache.webbeans.component.creation.ManagedBeanCreatorImpl,
+ *        javax.enterprise.inject.spi.ProcessInjectionTarget)}
  * methods for actual configuration.
  * <p>
  * Let's look at the "WebBeansUtil's" methods; 
@@ -92,8 +93,9 @@ import org.apache.webbeans.util.WebBeans
  * instantiated by the container first time. This method can be found in the
  * AbstractInjectionTargetBean" class "afterConstructor()" method. Actual
  * configuration is done by the
- * {@link DefinitionUtil#defineBeanInterceptorStack(AbstractOwbBean)} and
- * {@link DefinitionUtil#defineDecoratorStack}. In
+ * {@link org.apache.webbeans.config.DefinitionUtil#defineBeanInterceptorStack
+ *        (org.apache.webbeans.component.AbstractInjectionTargetBean)} and
+ * {@link org.apache.webbeans.config.DefinitionUtil#defineDecoratorStack}. In
  * "DefinitionUtil.defineBeanInterceptorStack", firstly it configures
  * "EJB spec. interceptors" after that configures "JSR-299 spec. interceptors."
  * In "DefinitionUtil.defineDecoratorStack", it configures
@@ -148,7 +150,8 @@ public abstract class InterceptorHandler
     protected OwbBean<?> bean = null;
     
     /**Intercepted methods*/
-    protected transient Map<Method, List<InterceptorData>> interceptedMethodMap = null;
+    protected transient volatile Map<Method, List<InterceptorData>> interceptedMethodMap = null;
+
     private WebBeansContext webBeansContext;
 
     /**
@@ -187,16 +190,7 @@ public abstract class InterceptorHandler
             //Calling method name on Proxy
             String methodName = method.getName();
             
-            if(ClassUtil.isObjectMethod(methodName) && !methodName.equals("toString"))
-            {
-                // we must not log in this place because this almost takes away half of the performance!
-                // if(logger.wblWillLogTrace())
-                // {
-                //    logger.trace("Calling method on proxy is restricted except Object.toString(), but current method is Object. [{0}]", methodName);
-                // }
-            }
-            
-            else if (bean instanceof InjectionTargetBean<?>)
+            if (!ClassUtil.isObjectMethod(methodName) && bean instanceof InjectionTargetBean<?>)
             {
                 InjectionTargetBean<?> injectionTarget = (InjectionTargetBean<?>) this.bean;
                 DelegateHandler delegateHandler = null;
@@ -206,7 +200,7 @@ public abstract class InterceptorHandler
                 if (webBeansContext.getInterceptorUtil().isWebBeansBusinessMethod(method))
                 {
                     List<Object> decorators = null;
-                    if (injectionTarget.getDecoratorStack().size() > 0)
+                    if (!injectionTarget.getDecoratorStack().isEmpty())
                     {
                         Class<?> proxyClass = webBeansContext.getJavassistProxyFactory().getInterceptorProxyClasses().get(bean);
                         if (proxyClass == null)
@@ -227,12 +221,12 @@ public abstract class InterceptorHandler
 
                     // Run around invoke chain
                     List<InterceptorData> interceptorStack = injectionTarget.getInterceptorStack();
-                    if (interceptorStack.size() > 0)
+                    if (!interceptorStack.isEmpty())
                     {
                         if (this.interceptedMethodMap == null)
                         {
                             // lazy initialisation, because creating a WeakHashMap is expensive!
-                            this.interceptedMethodMap = new WeakHashMap<Method, List<InterceptorData>>();
+                            this.interceptedMethodMap = new ConcurrentHashMap<Method, List<InterceptorData>>();
                         }
                         
                         if (decorators != null)
@@ -243,29 +237,38 @@ public abstract class InterceptorHandler
                             decoratorInterceptorDataImpl.setDefinedInInterceptorClass(true);
                             decoratorInterceptorDataImpl.setAroundInvoke(SecurityUtil.doPrivilegedGetDeclaredMethods(lastInterceptor.getClass())[0]);
                         }
-                        if (this.interceptedMethodMap.get(method) == null)
+
+                        List<InterceptorData> interceptorMethods = this.interceptedMethodMap.get(method);
+                        if (interceptorMethods == null)
                         {
                             //Holds filtered interceptor stack
-                            List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(interceptorStack);
+                            List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>();
+                            for (InterceptorData interceptData : interceptorStack)
+                            {
+                                if (interceptData.getAroundInvoke() !=null)
+                                {
+                                    filteredInterceptorStack.add(interceptData);
+                                }
+                            }
         
                             // Filter both EJB and WebBeans interceptors
                             InterceptorUtil.filterCommonInterceptorStackList(filteredInterceptorStack, method);
                             InterceptorUtil.filterOverridenAroundInvokeInterceptor(bean.getBeanClass(), filteredInterceptorStack);
                             this.interceptedMethodMap.put(method, filteredInterceptorStack);
+                            interceptorMethods = filteredInterceptorStack;
                         }
                         
-                        List<InterceptorData> filteredInterceptorStack = new ArrayList<InterceptorData>(this.interceptedMethodMap.get(method));
                         if (decoratorInterceptorDataImpl != null)
                         {
                             // created an intereceptor to run our decorators, add it to the calculated stack
-                            filteredInterceptorStack.add(decoratorInterceptorDataImpl);
+                            interceptorMethods = new ArrayList<InterceptorData>(interceptorMethods);
+                            interceptorMethods.add(decoratorInterceptorDataImpl);
                         }
 
                         // Call Around Invokes
-                        if (WebBeansUtil.isContainsInterceptorMethod(filteredInterceptorStack, InterceptorType.AROUND_INVOKE))
+                        if (!interceptorMethods.isEmpty())
                         {
-                            return callAroundInvokes(method, arguments, InterceptorUtil.getInterceptorMethods(filteredInterceptorStack,
-                                                                                                              InterceptorType.AROUND_INVOKE));
+                            return callAroundInvokes(method, arguments, interceptorMethods);
                         }
                     }
                     
@@ -282,7 +285,10 @@ public abstract class InterceptorHandler
             //If not interceptor or decorator calls
             //Do normal calling
             boolean access = method.isAccessible();
-            SecurityUtil.doPrivilegedSetAccessible(method, true);
+            if (!access)
+            {
+                SecurityUtil.doPrivilegedSetAccessible(method, true);
+            }
             try
             {
                 result = method.invoke(instance, arguments);
@@ -290,7 +296,10 @@ public abstract class InterceptorHandler
             }
             finally
             {
-                SecurityUtil.doPrivilegedSetAccessible(method, access);
+                if (!access)
+                {
+                    SecurityUtil.doPrivilegedSetAccessible(method, access);
+                }
             }
             
         }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorUtil.java?rev=1078876&r1=1078875&r2=1078876&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/intercept/InterceptorUtil.java Mon Mar  7 18:10:20 2011
@@ -22,8 +22,8 @@ import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Target;
 import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -63,6 +63,11 @@ public final class InterceptorUtil
     private final Class<? extends Annotation> prePassivateClass;
     private final Class<? extends Annotation> postActivateClass;
 
+    /**
+     * all the bit flags of private static and final modifiers
+     */
+    private final int MODIFIER_STATIC_FINAL_PRIVATE = Modifier.STATIC | Modifier.FINAL | Modifier.PRIVATE;
+
     private final WebBeansContext webBeansContext;
 
     public InterceptorUtil(WebBeansContext webBeansContext)
@@ -93,8 +98,9 @@ public final class InterceptorUtil
 
         int modifiers = method.getModifiers();
 
-        if (ClassUtil.isStatic(modifiers) || ClassUtil.isPrivate(modifiers) || ClassUtil.isFinal(modifiers))
+        if ((modifiers & MODIFIER_STATIC_FINAL_PRIVATE) != 0)
         {
+            // static, final and private methods are NO business methods!
             return false;
         }
 
@@ -466,12 +472,7 @@ public final class InterceptorUtil
     @SuppressWarnings("unchecked")
     public static List<InterceptorData> getInterceptorMethods(List<InterceptorData> stack, InterceptorType type)
     {
-        List<InterceptorData> ai = new ArrayList<InterceptorData>();  // AroundInvoke
-        List<InterceptorData> at = new ArrayList<InterceptorData>();  // AroundTimeout
-        List<InterceptorData> pa = new ArrayList<InterceptorData>();  // PostActivate
-        List<InterceptorData> pc = new ArrayList<InterceptorData>();  // PostConstruct
-        List<InterceptorData> pd = new ArrayList<InterceptorData>();  // PreDestroy
-        List<InterceptorData> pp = new ArrayList<InterceptorData>();  // PrePassivate
+        List<InterceptorData> interceptors = new ArrayList<InterceptorData>();
 
         Iterator<InterceptorData> it = stack.iterator();
         while (it.hasNext())
@@ -482,85 +483,34 @@ public final class InterceptorUtil
             if (type.equals(InterceptorType.AROUND_INVOKE))
             {
                 m = data.getAroundInvoke();
-                if (m != null)
-                {
-                    ai.add(data);
-                }
-
             }
             else if (type.equals(InterceptorType.AROUND_TIMEOUT))
             {
                 m = data.getAroundTimeout();
-                if (m != null)
-                {
-                    at.add(data);
-                }
-
             }
             else if (type.equals(InterceptorType.POST_ACTIVATE))
             {
                 m = data.getPostActivate();
-                if (m != null)
-                {
-                    pa.add(data);
-                }
-
             }
             else if (type.equals(InterceptorType.POST_CONSTRUCT))
             {
                 m = data.getPostConstruct();
-                if (m != null)
-                {
-                    pc.add(data);
-                }
-
             }
             else if (type.equals(InterceptorType.PRE_DESTROY))
             {
                 m = data.getPreDestroy();
-                if (m != null)
-                {
-                    pd.add(data);
-                }
-
             }
             else if (type.equals(InterceptorType.PRE_PASSIVATE))
             {
                 m = data.getPrePassivate();
-                if (m != null)
-                {
-                    pp.add(data);
-                }
-
+            }
+            if (m != null)
+            {
+                interceptors.add(data);
             }
         }
 
-        if (type.equals(InterceptorType.AROUND_INVOKE))
-        {
-            return ai;
-        }
-        else if (type.equals(InterceptorType.AROUND_TIMEOUT))
-        {
-            return at;
-        }
-        else if (type.equals(InterceptorType.POST_ACTIVATE))
-        {
-            return pa;
-        }
-        else if (type.equals(InterceptorType.POST_CONSTRUCT))
-        {
-            return pc;
-        }
-        else if (type.equals(InterceptorType.PRE_DESTROY))
-        {
-            return pd;
-        }
-        else if (type.equals(InterceptorType.PRE_PASSIVATE))
-        {
-            return pp;
-        }
-
-        return Collections.EMPTY_LIST;
+        return interceptors;
     }
 
     /**
@@ -709,16 +659,20 @@ public final class InterceptorUtil
     public static void filterOverridenAroundInvokeInterceptor(Class<?> beanClass, List<InterceptorData> stack)
     {
 
-        List<InterceptorData> overridenInterceptors = new ArrayList<InterceptorData>();
+        List<InterceptorData> overridenInterceptors = null;
         Iterator<InterceptorData> it = stack.iterator();
         while (it.hasNext())
         {
             InterceptorData interceptorData = it.next();
-            if (false == interceptorData.isLifecycleInterceptor())
+            if (interceptorData.getAroundInvoke() != null)
             {
                 InterceptorData overridenInterceptor = getOverridenInterceptor(beanClass, interceptorData, stack);
                 if (null != overridenInterceptor)
                 {
+                    if (overridenInterceptors == null)
+                    {
+                        overridenInterceptors = new ArrayList<InterceptorData>();
+                    }
                     overridenInterceptors.add(overridenInterceptor);
                     if (logger.wblWillLogDebug())
                     {
@@ -729,7 +683,10 @@ public final class InterceptorUtil
             }
         }
 
-        stack.removeAll(overridenInterceptors);
+        if (overridenInterceptors != null)
+        {
+            stack.removeAll(overridenInterceptors);
+        }
     }
 
     /**
@@ -765,10 +722,6 @@ public final class InterceptorUtil
 
                 if (null != childInterceptorMethod && ClassUtil.isOverriden(childInterceptorMethod, superInterceptorMethod))
                 {
-                    if (logger.wblWillLogDebug())
-                    {
-                        logger.debug("KEEPING child " + interceptorData);
-                    }
                     return superInterceptorData;
                 }
             }

Modified: openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java
URL: http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java?rev=1078876&r1=1078875&r2=1078876&view=diff
==============================================================================
--- openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java (original)
+++ openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/ClassUtil.java Mon Mar  7 18:10:20 2011
@@ -298,7 +298,7 @@ public final class ClassUtil
     /**
      * Check the class is inner or not
      * 
-     * @param modifier modifier
+     * @param clazz to check
      * @return true or false
      */
     public static boolean isInnerClazz(Class<?> clazz)
@@ -561,12 +561,12 @@ public final class ClassUtil
         return method.getParameterTypes();
     }
 
-    public static List<String> getObjectMethodNames()
+    private static Set<String> getObjectMethodNames()
     {
         if (objectMethodNames == null)
         {
             // not much syncronisation needed...
-            List<String> list = new ArrayList<String>();
+            Set<String> list = new HashSet<String>();
             Class<?> clazz = Object.class;
 
             Method[] methods = SecurityUtil.doPrivilegedGetDeclaredMethods(clazz);
@@ -579,7 +579,7 @@ public final class ClassUtil
 
         return objectMethodNames;
     }
-    private static volatile List objectMethodNames= null;
+    private static volatile Set<String> objectMethodNames= null;