Author: struberg
Date: Wed Mar  2 22:02:21 2011
New Revision: 1076423

URL: http://svn.apache.org/viewvc?rev=1076423&view=rev
Log:
OWB-538 lazily initialize auto @Dependent beans with no CDI usage

we can lazy init pojos with no CDI annotation at all

Modified:
    
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
    
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java

Modified: 
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
 Wed Mar  2 22:02:21 2011
@@ -60,7 +60,7 @@ public class EjbBeanCreatorImpl<T> exten
     {
         try
         {
-            super.defineScopeType(errorMessage);   
+            super.defineScopeType(errorMessage);
         }
         catch(WebBeansPassivationException e)
         {

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/AbstractOwbBean.java
 Wed Mar  2 22:02:21 2011
@@ -94,7 +94,8 @@ public abstract class AbstractOwbBean<T>
     
     /**Beans injection points*/
     protected Set<InjectionPoint> injectionPoints = new 
HashSet<InjectionPoint>();
-    
+
+
     /**
      * This string will be used for passivating the Bean.
      * It will be created on the first use.
@@ -104,7 +105,6 @@ public abstract class AbstractOwbBean<T>
     
     private final WebBeansContext webBeansContext;
 
-
     /**
      * Constructor definiton. Each subclass redefines its own constructor with
      * calling this.

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/ManagedBean.java
 Wed Mar  2 22:02:21 2011
@@ -26,6 +26,7 @@ import javassist.util.proxy.ProxyObject;
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.Decorator;
 
+import org.apache.webbeans.component.creation.AnnotatedTypeBeanCreatorImpl;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.decorator.AbstractDecoratorMethodHandler;
 import org.apache.webbeans.inject.InjectableConstructor;
@@ -43,6 +44,17 @@ public class ManagedBean<T> extends Abst
     
     protected boolean isAbstractDecorator;
 
+    /**
+     * Whether the bean is fully initialized or not yet.
+     * Only beans scanned from the classpath can be lazily initialized,
+     * and only if they do _NOT_ contain any javax.inject or javax.enterprise
+     * annotation! In other words: we can skip eager initialisation for
+     * beans which only could picked up as auto-&#0064;Dependent beans which
+     * do not register/ any other beans (e.g. via &#0064;Produces)
+     */
+    private boolean fullInit = true;
+
+
     public ManagedBean(Class<T> returnType, WebBeansContext webBeansContext)
     {
         this(returnType, WebBeansType.MANAGED, webBeansContext);
@@ -69,6 +81,16 @@ public class ManagedBean<T> extends Abst
     @Override
     protected T createComponentInstance(CreationalContext<T> creationalContext)
     {
+        if (!fullInit)
+        {
+            AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new 
AnnotatedTypeBeanCreatorImpl<T>(this);
+            managedBeanCreator.setAnnotatedType(getAnnotatedType());
+
+            
getWebBeansContext().getWebBeansUtil().initializeManagedBean(getBeanClass(), 
this, managedBeanCreator);
+            fullInit = true;
+        }
+
+
         Constructor<T> con = getConstructor();
         InjectableConstructor<T> ic = new InjectableConstructor<T>(con, 
this,creationalContext);
 
@@ -83,7 +105,16 @@ public class ManagedBean<T> extends Abst
         return instance;
     }
 
- 
+    public boolean isFullInit()
+    {
+        return fullInit;
+    }
+
+    public void setFullInit(boolean fullInit)
+    {
+        this.fullInit = fullInit;
+    }
+
     /**
      * Get constructor.
      * 

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java
 Wed Mar  2 22:02:21 2011
@@ -47,8 +47,9 @@ public class AbstractBeanCreator<T> impl
     /**Bean annotations*/
     private final Annotation[] beanAnnotations;
     
-    /**If annotated type is set by ProcessAnnotatedType event, used this 
annotated type
-     * to define bean instance intead of using class artifacts.
+    /**
+     * If annotated type is set by ProcessAnnotatedType event, used this 
annotated type
+     * to define bean instance instead of using class artifacts.
      */
     private AnnotatedType<T> annotatedType;
     

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/BeansDeployer.java
 Wed Mar  2 22:02:21 2011
@@ -823,7 +823,7 @@ public class BeansDeployer
                 else
                 {
                     
webBeansContext.getWebBeansUtil().defineDecorator(managedBeanCreator,
-                                                                               
      processInjectionTargetEvent);
+                                                                      
processInjectionTargetEvent);
                 }
             }
             //Interceptor
@@ -840,7 +840,7 @@ public class BeansDeployer
                 else
                 {
                     
webBeansContext.getWebBeansUtil().defineInterceptor(managedBeanCreator,
-                                                                               
        processInjectionTargetEvent);
+                                                                        
processInjectionTargetEvent);
                 }
             }
             else
@@ -856,14 +856,14 @@ public class BeansDeployer
                     logger.debug("Found Managed Bean with class name : [{0}]", 
annotatedType.getJavaClass().getName());
                 }
                 
webBeansContext.getWebBeansUtil().defineManagedBean(managedBeanCreator,
-                                                                               
    processInjectionTargetEvent);
+                                                                    
processInjectionTargetEvent);
             }
             
             return true;
         }
-        //Not a managed bean
         else
         {
+            //Not a managed bean
             return false;
         }
                                 

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/DefinitionUtil.java
 Wed Mar  2 22:02:21 2011
@@ -58,6 +58,7 @@ import org.apache.webbeans.component.Abs
 import org.apache.webbeans.component.AbstractInjectionTargetBean;
 import org.apache.webbeans.component.AbstractProducerBean;
 import org.apache.webbeans.component.EnterpriseBeanMarker;
+import org.apache.webbeans.component.ManagedBean;
 import org.apache.webbeans.component.OwbBean;
 import org.apache.webbeans.component.InjectionTargetBean;
 import org.apache.webbeans.component.ProducerFieldBean;
@@ -503,11 +504,80 @@ public final class DefinitionUtil
                 }
                 else
                 {
+                    // take the bean as Dependent if
+                    // the bean contains at least one CDI feature
                     component.setImplScopeType(new DependentScopeLiteral());
+
+                    if (component instanceof ManagedBean && 
!useCdiAnnotations(component.getBeanClass()))
+                    {
+                        ((ManagedBean) component).setFullInit(false);
+                    }
+                }
+            }
+        }
+
+    }
+
+    /**
+     * Check if the bean uses CDI features
+     * @param cls the Class to check
+     * @return <code>true</code> if the bean uses CDI annotations somewhere
+     */
+    private static boolean useCdiAnnotations(Class<?> cls)
+    {
+        Class superClass = cls.getSuperclass();
+        if ( superClass != Object.class && useCdiAnnotations(superClass))
+        {
+            return true;
+        }
+
+        if (containsCdiAnnotation(cls.getAnnotations()))
+        {
+            return true;
+        }
+
+        Field[] fields = cls.getDeclaredFields();
+        for (Field field : fields)
+        {
+            if (containsCdiAnnotation(field.getAnnotations()))
+            {
+                return true;
+            }
+        }
+
+        Method[] methods = cls.getDeclaredMethods();
+        for (Method method : methods)
+        {
+            if (containsCdiAnnotation(method.getAnnotations()))
+            {
+                return true;
+            }
+        }
+
+        //X TODO also check method parameters?
+
+        return false;
+    }
+
+    /**
+     * A CDI annotation must either start with 'javax.inject.' or 
'javax.enterprise'
+     * @return true if at least one of the given annotations is a CDI 
annotation
+     */
+    private static boolean containsCdiAnnotation(Annotation[] annotations)
+    {
+        if (annotations != null && annotations.length > 0)
+        {
+            for (Annotation ann : annotations)
+            {
+                String annName = ann.toString();
+                if (annName.startsWith("@javax.inject") || 
annName.startsWith("@javax.enterprise"))
+                {
+                    return true;
                 }
             }
         }
 
+        return false;
     }
 
     /**

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/config/ManagedBeanConfigurator.java
 Wed Mar  2 22:02:21 2011
@@ -143,6 +143,8 @@ public final class ManagedBeanConfigurat
         DefinitionUtil.defineApiTypes(component, clazz);
         DefinitionUtil.defineScopeType(component, clazzAnns, "Simple WebBean 
Component implementation class : " + clazz.getName()
                                                              + " stereotypes 
must declare same @Scope annotations");
+        // we fully initialize the bean in this case.
+        component.setFullInit(true);
 
         WebBeansUtil.checkGenericType(component);
         DefinitionUtil.defineQualifiers(component, clazzAnns);

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/container/BeanManagerImpl.java
 Wed Mar  2 22:02:21 2011
@@ -183,6 +183,7 @@ public class BeanManagerImpl implements 
      */
     private boolean inUse = false;
 
+
     /**
      * Creates a new {@link BeanManager} instance.
      * Called by the system. Do not use outside of the
@@ -1097,6 +1098,11 @@ public class BeanManagerImpl implements 
     {
         InjectionTargetBean<T> bean = 
webBeansContext.getWebBeansUtil().defineManagedBean(type);
 
+        if (bean == null)
+        {
+            throw new DefinitionException("Could not create 
InjectionTargetBean for type " + type.getJavaClass());
+        }
+
         return new InjectionTargetProducer<T>(bean);
     }
 

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java
 Wed Mar  2 22:02:21 2011
@@ -138,6 +138,7 @@ import org.apache.webbeans.exception.Web
 import org.apache.webbeans.exception.WebBeansException;
 import org.apache.webbeans.exception.helper.ViolationMessageBuilder;
 import org.apache.webbeans.exception.inject.DefinitionException;
+import org.apache.webbeans.exception.inject.DeploymentException;
 import 
org.apache.webbeans.exception.inject.InconsistentSpecializationException;
 import org.apache.webbeans.exception.inject.NullableDependencyException;
 import org.apache.webbeans.inject.AlternativesManager;
@@ -2133,6 +2134,11 @@ public final class WebBeansUtil
                                                                     
webBeansContext.getAnnotationManager().getInterceptorBindingMetaAnnotations(
                                                                         
clazz.getDeclaredAnnotations()));
             }
+            else
+            {
+                // TODO could probably be a bit more descriptive
+                throw new DeploymentException("Cannot create Interceptor for 
class" + injectionTargetEvent.getAnnotatedType());
+            }
         }
 
     }
@@ -2168,7 +2174,8 @@ public final class WebBeansUtil
             }
             else
             {
-                logger.trace("Unable to configure decorator with class : 
[{0}]", clazz);
+                // TODO could probably be a bit more descriptive
+                throw new DeploymentException("Cannot create Decorator for 
class" + processInjectionTargetEvent.getAnnotatedType());
             }
         }
     }
@@ -2783,6 +2790,11 @@ public final class WebBeansUtil
     {
 
         ManagedBean<T> bean = defineManagedBean(managedBeanCreator, 
processInjectionTargetEvent);
+        if (bean == null)
+        {
+            // TODO could probably be a bit more descriptive
+            throw new DeploymentException("Cannot create ManagedBean for 
class" + processInjectionTargetEvent.getAnnotatedType());
+        }
 
         //X TODO move proxy instance creation into JavassistProxyFactory!
         Class clazz = 
webBeansContext.getJavassistProxyFactory().createAbstractDecoratorProxyClass(bean);
@@ -2802,13 +2814,16 @@ public final class WebBeansUtil
         ManagedBean<T> managedBean = managedBeanCreator.getBean();
         Class<T> clazz = annotatedType.getJavaClass();
 
-        managedBeanCreator.defineSerializable();
-
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
         //Scope type
         
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
 + clazz.getName() +
                 logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
+
+        managedBean.setFullInit(true);
+
+        managedBeanCreator.defineSerializable();
+
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
 
@@ -2932,14 +2947,15 @@ public final class WebBeansUtil
         ManagedBeanCreatorImpl<T> managedBeanCreator = new 
ManagedBeanCreatorImpl<T>(managedBean);
         managedBeanCreator.setAnnotatedType(type);
 
-        managedBeanCreator.defineSerializable();
-
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
 
         //Scope type
         
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
 + clazz.getName() +
                 logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
+
+        managedBeanCreator.defineSerializable();
+
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
         managedBeanCreator.defineApiType();
@@ -3090,14 +3106,25 @@ public final class WebBeansUtil
         AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new 
AnnotatedTypeBeanCreatorImpl<T>(managedBean);
         managedBeanCreator.setAnnotatedType(type);
 
-        managedBeanCreator.defineSerializable();
-
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
 
         //Scope type
         
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
 + clazz.getName()
                                            + 
logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));                            
            
+
+        if (managedBean.isFullInit())
+        {
+            initializeManagedBean(clazz, managedBean, managedBeanCreator);
+        }
+
+        return managedBean;
+    }
+
+    public void initializeManagedBean(Class<?> clazz, ManagedBean<?> 
managedBean, AnnotatedTypeBeanCreatorImpl<?> managedBeanCreator)
+    {
+        managedBeanCreator.defineSerializable();
+
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
         managedBeanCreator.defineApiType();
@@ -3114,10 +3141,9 @@ public final class WebBeansUtil
         DefinitionUtil.defineBeanInterceptorStack(managedBean);
 
         managedBeanCreator.defineDisposalMethods();//Define disposal method 
after adding producers
-
-        return managedBean;
     }
 
+
     @SuppressWarnings("unchecked")
     public <T> ManagedBean<T> defineAbstractDecorator(AnnotatedType<T> type)
     {

Modified: 
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java?rev=1076423&r1=1076422&r2=1076423&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-jsf/src/main/java/org/apache/webbeans/jsf/JSFUtil.java
 Wed Mar  2 22:02:21 2011
@@ -187,7 +187,9 @@ public final class JSFUtil
         String cid = getJSFRequestParameter("cid");
         return cid;
     }
-    
+
+    /** use {@link org.apache.webbeans.container.BeanManagerImpl#isInUse()} 
instead */
+    @Deprecated
     public static boolean isOwbApplication()
     {
         ServletContext context = null;


Reply via email to