Author: struberg
Date: Fri Mar  4 00:02:13 2011
New Revision: 1076897

URL: http://svn.apache.org/viewvc?rev=1076897&view=rev
Log:
OWB-538 allow lazy initialisation of default scoped beans

work in progress. All tests pass, but a few TCK tests are broken atm

Modified:
    
openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java
    
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/component/EjbBeanCreatorImpl.java
    
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.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/component/creation/BeanCreator.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/util/WebBeansAnnotatedTypeUtil.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansUtil.java

Modified: 
openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- 
openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java
 (original)
+++ 
openwebbeans/trunk/samples/ejb-sample/src/main/java/org/apache/webbeans/sample/bean/EchoManaged.java
 Fri Mar  4 00:02:13 2011
@@ -21,6 +21,7 @@ package org.apache.webbeans.sample.bean;
 import javax.ejb.EJB;
 import javax.enterprise.context.RequestScoped;
 import javax.enterprise.inject.Default;
+import javax.enterprise.inject.spi.BeanManager;
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.enterprise.inject.Produces;
@@ -28,8 +29,6 @@ import javax.enterprise.inject.spi.Bean;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.PersistenceUnit;
 
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.sample.ejb.Echo;
 import org.apache.webbeans.sample.injection.InjectionTargetBean;
 
@@ -39,6 +38,8 @@ import org.apache.webbeans.sample.inject
 public class EchoManaged
 {
     private @Inject @Default Echo echo;
+
+    private @Inject BeanManager manager;
     
     private @EJB(name="EchoBean/org.apache.webbeans.sample.ejb.Echo") Echo 
nonContextual;
     
@@ -60,7 +61,6 @@ public class EchoManaged
 
     public String echo()
     {
-        BeanManagerImpl manager = 
WebBeansContext.getInstance().getBeanManagerImpl();
         Bean<?> b = manager.getBeans("injected").iterator().next();
         InjectionTargetBean bean = 
(InjectionTargetBean)manager.getReference(b, InjectionTargetBean.class, 
manager.createCreationalContext(b)); 
         

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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -56,11 +56,11 @@ public class EjbBeanCreatorImpl<T> exten
      * {@inheritDoc}
      */
     @Override
-    public void defineScopeType(String errorMessage) throws 
WebBeansPassivationException
+    public void defineScopeType(String errorMessage, boolean allowLazyInit) 
throws WebBeansPassivationException
     {
         try
         {
-            super.defineScopeType(errorMessage);
+            super.defineScopeType(errorMessage, allowLazyInit);
         }
         catch(WebBeansPassivationException e)
         {

Modified: 
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
 (original)
+++ 
openwebbeans/trunk/webbeans-ejb/src/main/java/org/apache/webbeans/ejb/common/util/EjbUtility.java
 Fri Mar  4 00:02:13 2011
@@ -88,7 +88,7 @@ public final class EjbUtility
         ejbBeanCreator.defineSerializable();
         ejbBeanCreator.defineStereoTypes();
         ejbBeanCreator.defineApiType();
-        ejbBeanCreator.defineScopeType("Session Bean implementation class : " 
+ clazz.getName() + " stereotypes must declare same @ScopeType annotations");
+        ejbBeanCreator.defineScopeType("Session Bean implementation class : " 
+ clazz.getName() + " stereotypes must declare same @ScopeType annotations", 
false);
         ejbBeanCreator.defineQualifier();
         
ejbBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
            
         Set<ProducerMethodBean<?>> producerMethodBeans = 
ejbBeanCreator.defineProducerMethods();        

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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -20,13 +20,16 @@ package org.apache.webbeans.component;
 
 import java.io.Serializable;
 import java.lang.reflect.Constructor;
+import java.lang.annotation.Annotation;
 
 import javassist.util.proxy.ProxyObject;
 
 import javax.enterprise.context.spi.CreationalContext;
+import javax.enterprise.inject.Any;
+import javax.enterprise.inject.Default;
 import javax.enterprise.inject.spi.Decorator;
 
-import org.apache.webbeans.component.creation.AnnotatedTypeBeanCreatorImpl;
+import org.apache.webbeans.component.creation.ManagedBeanCreatorImpl;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.decorator.AbstractDecoratorMethodHandler;
 import org.apache.webbeans.inject.InjectableConstructor;
@@ -83,10 +86,10 @@ public class ManagedBean<T> extends Abst
     {
         if (!fullInit)
         {
-            AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new 
AnnotatedTypeBeanCreatorImpl<T>(this);
+            ManagedBeanCreatorImpl<T> managedBeanCreator = new 
ManagedBeanCreatorImpl<T>(this);
             managedBeanCreator.setAnnotatedType(getAnnotatedType());
 
-            
getWebBeansContext().getWebBeansUtil().initializeManagedBean(getBeanClass(), 
this, managedBeanCreator);
+            
getWebBeansContext().getWebBeansUtil().lazyInitializeManagedBean(getBeanClass(),
 this, managedBeanCreator);
             fullInit = true;
         }
 
@@ -115,6 +118,17 @@ public class ManagedBean<T> extends Abst
         this.fullInit = fullInit;
     }
 
+    @Override
+    public void addQualifier(Annotation qualifier)
+    {
+        if (!(qualifier instanceof Default || qualifier instanceof Any))
+        {
+            // if a bean defines other qualifiers than Default or Any, we need 
to fully initialize it
+            fullInit = true;
+        }
+        super.addQualifier(qualifier);
+    }
+
     /**
      * 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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -130,15 +130,15 @@ public class AbstractBeanCreator<T> impl
      * {@inheritDoc}
      */
     @Override
-    public void defineScopeType(String errorMessage)
+    public void defineScopeType(String errorMessage, boolean allowLazyInit)
     {
         if(isDefaultMetaDataProvider())
         {
-            DefinitionUtil.defineScopeType(this.bean, this.beanAnnotations, 
errorMessage);
+            DefinitionUtil.defineScopeType(this.bean, this.beanAnnotations, 
errorMessage, allowLazyInit);
         }
         else
         {
-            DefinitionUtil.defineScopeType(this.bean, 
AnnotationUtil.getAnnotationsFromSet(this.annotatedType.getAnnotations()), 
errorMessage);
+            DefinitionUtil.defineScopeType(this.bean, 
AnnotationUtil.getAnnotationsFromSet(this.annotatedType.getAnnotations()), 
errorMessage, false);
         }
     }
 

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/BeanCreator.java
 Fri Mar  4 00:02:13 2011
@@ -86,7 +86,7 @@ public interface BeanCreator<T>
      * Check passivation related controls.
      * </p>
      */
-    public void defineScopeType(String errorMessage);
+    public void defineScopeType(String errorMessage, boolean allowLazyInit);
     
     /**
      * Defines qualifier.

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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -856,7 +856,7 @@ public class BeansDeployer
                     logger.debug("Found Managed Bean with class name : [{0}]", 
annotatedType.getJavaClass().getName());
                 }
                 
webBeansContext.getWebBeansUtil().defineManagedBean(managedBeanCreator,
-                                                                    
processInjectionTargetEvent);
+                                                                    
processInjectionTargetEvent, true);
             }
             
             return true;

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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -32,6 +32,8 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
 import javax.enterprise.context.Dependent;
 import javax.enterprise.context.NormalScope;
 import javax.enterprise.event.Observes;
@@ -315,7 +317,8 @@ public final class DefinitionUtil
      * @param component configuring web beans component
      * @param annotations annotations
      */
-    public static <T> void defineScopeType(AbstractOwbBean<T> component, 
Annotation[] annotations, String exceptionMessage)
+    public static <T> void defineScopeType(AbstractOwbBean<T> component, 
Annotation[] annotations,
+                                           String exceptionMessage, boolean 
allowLazyInit)
     {
         boolean found = false;
 
@@ -388,7 +391,7 @@ public final class DefinitionUtil
 
         if (!found)
         {
-            defineDefaultScopeType(component, exceptionMessage);
+            defineDefaultScopeType(component, exceptionMessage, allowLazyInit);
         }
     }
 
@@ -438,7 +441,7 @@ public final class DefinitionUtil
         
     }
 
-    public static void defineDefaultScopeType(OwbBean<?> component, String 
exceptionMessage)
+    public static void defineDefaultScopeType(OwbBean<?> component, String 
exceptionMessage, boolean allowLazyInit)
     {
         // Frist look for inherited scope
         IBeanInheritedMetaData metaData = null;
@@ -463,6 +466,13 @@ public final class DefinitionUtil
             if (stereos.size() == 0)
             {
                 component.setImplScopeType(new DependentScopeLiteral());
+
+                if (allowLazyInit && component instanceof ManagedBean && 
isPurePojoBean(component.getBeanClass()))
+                {
+                    // take the bean as Dependent but we could lazily 
initialize it
+                    // because the bean doesn't contains any CDI feature
+                    ((ManagedBean) component).setFullInit(false);
+                }
             }
             else
             {
@@ -506,12 +516,12 @@ 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 && 
isPurePojoBean(component.getBeanClass()))
+                    if (allowLazyInit && component instanceof ManagedBean && 
isPurePojoBean(component.getBeanClass()))
                     {
+                        // take the bean as Dependent but we could lazily 
initialize it
+                        // because the bean doesn't contains any CDI feature
                         ((ManagedBean) component).setFullInit(false);
                     }
                 }
@@ -570,10 +580,26 @@ public final class DefinitionUtil
             anns = method.getAnnotations();
             for (Annotation ann : anns)
             {
-                if (ann instanceof Produces)
+                if (ann instanceof Produces      ||
+                    ann instanceof Inject        ||
+                    ann instanceof PostConstruct ||
+                    ann instanceof PreDestroy      )
                 {
                     return false;
                 }
+
+            }
+
+            Annotation[][] paramsAnns = method.getParameterAnnotations();
+            for (Annotation[] paramAnns: paramsAnns)
+            {
+                for (Annotation ann: paramAnns)
+                {
+                    if (ann instanceof Observes)
+                    {
+                        return false;
+                    }
+                }
             }
         }
 
@@ -733,7 +759,8 @@ public final class DefinitionUtil
 
     }
 
-    public static <T> ProducerMethodBean<T> createProducerComponent(Class<T> 
returnType, Method method, InjectionTargetBean<?> parent, boolean isSpecializes)
+    public static <T> ProducerMethodBean<T> createProducerComponent(Class<T> 
returnType, Method method, InjectionTargetBean<?> parent,
+                                                                    boolean 
isSpecializes)
     {
         ProducerMethodBean<T> component = new ProducerMethodBean<T>(parent, 
returnType);
         component.setCreatorMethod(method);
@@ -758,7 +785,7 @@ public final class DefinitionUtil
 
         DefinitionUtil.defineProducerMethodApiTypes(component, 
method.getGenericReturnType(), methodAnns);
         DefinitionUtil.defineScopeType(component, methodAnns, "WebBeans 
producer method : " + method.getName() + " in class " + 
parent.getReturnType().getName()
-                                                              + " must declare 
default @Scope annotation");
+                                                              + " must declare 
default @Scope annotation", false);
         webBeansContext.getWebBeansUtil().checkUnproxiableApiType(component, 
component.getScope());
         WebBeansUtil.checkProducerGenericType(component,method);
         DefinitionUtil.defineQualifiers(component, methodAnns);
@@ -815,7 +842,7 @@ public final class DefinitionUtil
 
         DefinitionUtil.defineProducerMethodApiTypes(component, 
field.getGenericType(), fieldAnns);
         DefinitionUtil.defineScopeType(component, fieldAnns, "WebBeans 
producer method : " + field.getName() + " in class " + 
parent.getReturnType().getName()
-                                                             + " must declare 
default @Scope annotation");
+                                                             + " must declare 
default @Scope annotation", false);
         webBeansContext.getWebBeansUtil().checkUnproxiableApiType(component, 
component.getScope());
         WebBeansUtil.checkProducerGenericType(component,field);
         DefinitionUtil.defineQualifiers(component, fieldAnns);
@@ -1321,7 +1348,7 @@ public final class DefinitionUtil
 
         DefinitionUtil.defineProducerMethodApiTypes(bean, 
method.getBaseType(), anns);
         DefinitionUtil.defineScopeType(bean, anns, "Bean producer method : " + 
method.getJavaMember().getName() + " in class "
-                                                   + 
parent.getReturnType().getName() + " must declare default @Scope annotation");
+                                                   + 
parent.getReturnType().getName() + " must declare default @Scope annotation", 
false);
         WebBeansUtil.checkProducerGenericType(bean,method.getJavaMember());    
    
         DefinitionUtil.defineQualifiers(bean, anns);
         DefinitionUtil.defineName(bean, anns, 
WebBeansUtil.getProducerDefaultName(method.getJavaMember().getName()));

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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -142,7 +142,7 @@ 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");
+                                                             + " stereotypes 
must declare same @Scope annotations", false);
         // we fully initialize the bean in this case.
         component.setFullInit(true);
 

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java?rev=1076897&r1=1076896&r2=1076897&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/util/WebBeansAnnotatedTypeUtil.java
 Fri Mar  4 00:02:13 2011
@@ -453,7 +453,7 @@ public final class WebBeansAnnotatedType
                                                                                
                       anns);
                     Set<Type> types = annotatedField.getTypeClosure();
                     producerFieldBean.getTypes().addAll(types);
-                    DefinitionUtil.defineScopeType(producerFieldBean, anns, 
"Annotated producer field: " + annotatedField +  "must declare default @Scope 
annotation");
+                    DefinitionUtil.defineScopeType(producerFieldBean, anns, 
"Annotated producer field: " + annotatedField +  "must declare default @Scope 
annotation", false);
                     
webBeansContext.getWebBeansUtil().checkUnproxiableApiType(producerFieldBean,
                                                                                
              producerFieldBean.getScope());
                     
WebBeansUtil.checkProducerGenericType(producerFieldBean,annotatedField.getJavaMember());
@@ -516,7 +516,8 @@ public final class WebBeansAnnotatedType
                 producerMethodBean.getTypes().addAll(types);
                 DefinitionUtil.defineScopeType(producerMethodBean,
                                                
AnnotationUtil.getAnnotationsFromSet(annotatedMethod.getAnnotations()),
-                                                                               
     "Annotated producer method : " + annotatedMethod +  "must declare default 
@Scope annotation");
+                                                                               
     "Annotated producer method : " + annotatedMethod +  "must declare default 
@Scope annotation",
+                                                                               
     false);
                 
webBeansContext.getWebBeansUtil().checkUnproxiableApiType(producerMethodBean,
                                                                                
          producerMethodBean.getScope());
                 
WebBeansUtil.checkProducerGenericType(producerMethodBean,annotatedMethod.getJavaMember());

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=1076897&r1=1076896&r2=1076897&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
 Fri Mar  4 00:02:13 2011
@@ -2126,7 +2126,7 @@ public final class WebBeansUtil
             ManagedBean<T> component = null;
 
             
webBeansContext.getInterceptorUtil().checkInterceptorConditions(clazz);
-            component = defineManagedBean(managedBeanCreator, 
injectionTargetEvent);
+            component = defineManagedBean(managedBeanCreator, 
injectionTargetEvent, false);
 
             if (component != null)
             {
@@ -2165,7 +2165,7 @@ public final class WebBeansUtil
             }
             else
             {
-                delegate = defineManagedBean(creator, 
processInjectionTargetEvent);
+                delegate = defineManagedBean(creator, 
processInjectionTargetEvent, false);
             }
 
             if (delegate != null)
@@ -2789,7 +2789,7 @@ public final class WebBeansUtil
     public <T> ManagedBean<T> 
defineAbstractDecorator(ManagedBeanCreatorImpl<T> managedBeanCreator, 
ProcessInjectionTarget<T> processInjectionTargetEvent)
     {
 
-        ManagedBean<T> bean = defineManagedBean(managedBeanCreator, 
processInjectionTargetEvent);
+        ManagedBean<T> bean = defineManagedBean(managedBeanCreator, 
processInjectionTargetEvent, false);
         if (bean == null)
         {
             // TODO could probably be a bit more descriptive
@@ -2805,133 +2805,155 @@ public final class WebBeansUtil
     }
 
 
-    public <T> ManagedBean<T> defineManagedBean(ManagedBeanCreatorImpl<T> 
managedBeanCreator, ProcessInjectionTarget<T> processInjectionTargetEvent)
+    public <T> ManagedBean<T> defineManagedBean(ManagedBeanCreatorImpl<T> 
managedBeanCreator, ProcessInjectionTarget<T> processInjectionTargetEvent, 
boolean allowLazyInit)
     {
         BeanManagerImpl manager = webBeansContext.getBeanManagerImpl();
 
         //Annotated type
         AnnotatedType<T> annotatedType = 
processInjectionTargetEvent.getAnnotatedType();
         ManagedBean<T> managedBean = managedBeanCreator.getBean();
+
         Class<T> clazz = annotatedType.getJavaClass();
 
+        managedBeanCreator.defineApiType();
+
         //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);
+                                           
logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE), allowLazyInit);
 
         managedBeanCreator.defineSerializable();
 
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
 
-        managedBeanCreator.defineApiType();
         managedBeanCreator.checkCreateConditions();
         managedBeanCreator.defineQualifier();
         
managedBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
-        managedBeanCreator.defineConstructor();
-        Set<ProducerMethodBean<?>> producerMethods = 
managedBeanCreator.defineProducerMethods();
-        Set<ProducerFieldBean<?>> producerFields = 
managedBeanCreator.defineProducerFields();
-        managedBeanCreator.defineInjectedFields();
-        managedBeanCreator.defineInjectedMethods();
 
-        Set<ObserverMethod<?>> observerMethods = new 
HashSet<ObserverMethod<?>>();
-        if(managedBean.isEnabled())
+        if (managedBean.isFullInit())
         {
-            observerMethods = managedBeanCreator.defineObserverMethods();
-        }
+            managedBeanCreator.defineConstructor();
+            Set<ProducerMethodBean<?>> producerMethods = 
managedBeanCreator.defineProducerMethods();
+            Set<ProducerFieldBean<?>> producerFields = 
managedBeanCreator.defineProducerFields();
+            managedBeanCreator.defineInjectedFields();
+            managedBeanCreator.defineInjectedMethods();
+
+            Set<ObserverMethod<?>> observerMethods = new 
HashSet<ObserverMethod<?>>();
+            if(managedBean.isEnabled())
+            {
+                observerMethods = managedBeanCreator.defineObserverMethods();
+            }
 
-        //Put final InjectionTarget instance
-        manager.putInjectionTargetWrapper(managedBean,
-                new 
InjectionTargetWrapper(processInjectionTargetEvent.getInjectionTarget()));
+            //Put final InjectionTarget instance
+            manager.putInjectionTargetWrapper(managedBean,
+                    new 
InjectionTargetWrapper(processInjectionTargetEvent.getInjectionTarget()));
 
-        Map<ProducerMethodBean<?>,AnnotatedMethod<?>> annotatedMethods =
-                new HashMap<ProducerMethodBean<?>, AnnotatedMethod<?>>();
+            Map<ProducerMethodBean<?>,AnnotatedMethod<?>> annotatedMethods =
+                    new HashMap<ProducerMethodBean<?>, AnnotatedMethod<?>>();
 
-        for(ProducerMethodBean<?> producerMethod : producerMethods)
-        {
-            AnnotatedMethod<?> method = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(producerMethod.getCreatorMethod(),
-                                                                               
    annotatedType);
-            ProcessProducerImpl<?, ?> producerEvent = 
fireProcessProducerEventForMethod(producerMethod,
-                                                                               
                     method);
-            inspectErrorStack("There are errors that are added by 
ProcessProducer event observers for "
-                                           + "ProducerMethods. Look at logs 
for further details");
+            for(ProducerMethodBean<?> producerMethod : producerMethods)
+            {
+                AnnotatedMethod<?> method = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(producerMethod.getCreatorMethod(),
+                                                                               
        annotatedType);
+                ProcessProducerImpl<?, ?> producerEvent = 
fireProcessProducerEventForMethod(producerMethod,
+                                                                               
                         method);
+                inspectErrorStack("There are errors that are added by 
ProcessProducer event observers for "
+                                               + "ProducerMethods. Look at 
logs for further details");
 
-            annotatedMethods.put(producerMethod, method);
-            manager.putInjectionTargetWrapper(producerMethod, new 
InjectionTargetWrapper(producerEvent.getProducer()));
+                annotatedMethods.put(producerMethod, method);
+                manager.putInjectionTargetWrapper(producerMethod, new 
InjectionTargetWrapper(producerEvent.getProducer()));
 
-            producerEvent.setProducerSet(false);
-        }
+                producerEvent.setProducerSet(false);
+            }
 
-        Map<ProducerFieldBean<?>,AnnotatedField<?>> annotatedFields =
-                new HashMap<ProducerFieldBean<?>, AnnotatedField<?>>();
+            Map<ProducerFieldBean<?>,AnnotatedField<?>> annotatedFields =
+                    new HashMap<ProducerFieldBean<?>, AnnotatedField<?>>();
 
-        for(ProducerFieldBean<?> producerField : producerFields)
-        {
-            AnnotatedField<?> field = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedField(producerField.getCreatorField(),
-                                                                               
 annotatedType);
-            ProcessProducerImpl<?, ?> producerEvent = 
fireProcessProducerEventForField(producerField,
-                                                                               
                     field);
-            inspectErrorStack("There are errors that are added by 
ProcessProducer event observers for"
-                                           + " ProducerFields. Look at logs 
for further details");
+            for(ProducerFieldBean<?> producerField : producerFields)
+            {
+                AnnotatedField<?> field = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedField(producerField.getCreatorField(),
+                                                                               
     annotatedType);
+                ProcessProducerImpl<?, ?> producerEvent = 
fireProcessProducerEventForField(producerField,
+                                                                               
                         field);
+                inspectErrorStack("There are errors that are added by 
ProcessProducer event observers for"
+                                               + " ProducerFields. Look at 
logs for further details");
 
-            annotatedFields.put(producerField, field);
-            manager.putInjectionTargetWrapper(producerField, new 
InjectionTargetWrapper(producerEvent.getProducer()));
+                annotatedFields.put(producerField, field);
+                manager.putInjectionTargetWrapper(producerField, new 
InjectionTargetWrapper(producerEvent.getProducer()));
 
-            producerEvent.setProducerSet(false);
-        }
+                producerEvent.setProducerSet(false);
+            }
 
-        Map<ObserverMethod<?>,AnnotatedMethod<?>> observerMethodsMap =
-                new HashMap<ObserverMethod<?>, AnnotatedMethod<?>>();
+            Map<ObserverMethod<?>,AnnotatedMethod<?>> observerMethodsMap =
+                    new HashMap<ObserverMethod<?>, AnnotatedMethod<?>>();
 
-        for(ObserverMethod<?> observerMethod : observerMethods)
-        {
-            ObserverMethodImpl<?> impl = (ObserverMethodImpl<?>)observerMethod;
-            AnnotatedMethod<?> method = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(impl.getObserverMethod(),
-                                                                               
    annotatedType);
+            for(ObserverMethod<?> observerMethod : observerMethods)
+            {
+                ObserverMethodImpl<?> impl = 
(ObserverMethodImpl<?>)observerMethod;
+                AnnotatedMethod<?> method = 
webBeansContext.getAnnotatedElementFactory().newAnnotatedMethod(impl.getObserverMethod(),
+                                                                               
        annotatedType);
 
-            observerMethodsMap.put(observerMethod, method);
-        }
+                observerMethodsMap.put(observerMethod, method);
+            }
 
-        BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+            BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
 
-        //Fires ProcessManagedBean
-        ProcessBeanImpl<T> processBeanEvent = new 
GProcessManagedBean(managedBean,annotatedType);
-        beanManager.fireEvent(processBeanEvent, new Annotation[0]);
-        inspectErrorStack("There are errors that are added by 
ProcessManagedBean event observers for " +
-                "managed beans. Look at logs for further details");
+            //Fires ProcessManagedBean
+            ProcessBeanImpl<T> processBeanEvent = new 
GProcessManagedBean(managedBean, annotatedType);
+            beanManager.fireEvent(processBeanEvent, new Annotation[0]);
+            inspectErrorStack("There are errors that are added by 
ProcessManagedBean event observers for " +
+                    "managed beans. Look at logs for further details");
 
-        //Fires ProcessProducerMethod
-        fireProcessProducerMethodBeanEvent(annotatedMethods, annotatedType);
-        inspectErrorStack("There are errors that are added by 
ProcessProducerMethod event observers for " +
-                "producer method beans. Look at logs for further details");
+            //Fires ProcessProducerMethod
+            fireProcessProducerMethodBeanEvent(annotatedMethods, 
annotatedType);
+            inspectErrorStack("There are errors that are added by 
ProcessProducerMethod event observers for " +
+                    "producer method beans. Look at logs for further details");
 
-        //Fires ProcessProducerField
-        fireProcessProducerFieldBeanEvent(annotatedFields);
-        inspectErrorStack("There are errors that are added by 
ProcessProducerField event observers for " +
-                "producer field beans. Look at logs for further details");
+            //Fires ProcessProducerField
+            fireProcessProducerFieldBeanEvent(annotatedFields);
+            inspectErrorStack("There are errors that are added by 
ProcessProducerField event observers for " +
+                    "producer field beans. Look at logs for further details");
 
-        //Fire ObservableMethods
-        fireProcessObservableMethodBeanEvent(observerMethodsMap);
-        inspectErrorStack("There are errors that are added by 
ProcessObserverMethod event observers for " +
-                "observer methods. Look at logs for further details");
+            //Fire ObservableMethods
+            fireProcessObservableMethodBeanEvent(observerMethodsMap);
+            inspectErrorStack("There are errors that are added by 
ProcessObserverMethod event observers for " +
+                    "observer methods. Look at logs for further details");
 
-        if(!isAnnotatedTypeDecoratorOrInterceptor(annotatedType))
-        {
-            beanManager.addBean(WebBeansUtil.createNewBean(managedBean));
-            beanManager.addBean(managedBean);
-            for (ProducerMethodBean<?> producerMethod : producerMethods)
+            if(!isAnnotatedTypeDecoratorOrInterceptor(annotatedType))
             {
-                // add them one after the other to enable serialization 
handling et al
-                beanManager.addBean(producerMethod);
+                beanManager.addBean(WebBeansUtil.createNewBean(managedBean));
+                beanManager.addBean(managedBean);
+                for (ProducerMethodBean<?> producerMethod : producerMethods)
+                {
+                    // add them one after the other to enable serialization 
handling et al
+                    beanManager.addBean(producerMethod);
+                }
+                managedBeanCreator.defineDisposalMethods();//Define disposal 
method after adding producers
+                for (ProducerFieldBean<?> producerField : producerFields)
+                {
+                    // add them one after the other to enable serialization 
handling et al
+                    beanManager.addBean(producerField);
+                }
             }
-            managedBeanCreator.defineDisposalMethods();//Define disposal 
method after adding producers
-            for (ProducerFieldBean<?> producerField : producerFields)
+        }
+        else
+        {
+            // we still need to fire a ProcessManagedBean event, even for 
lazily initiated beans
+            // (which most probably are no beans at all...)
+
+            BeanManagerImpl beanManager = webBeansContext.getBeanManagerImpl();
+
+            //Fires ProcessManagedBean
+            ProcessBeanImpl<T> processBeanEvent = new 
GProcessManagedBean(managedBean, annotatedType);
+            beanManager.fireEvent(processBeanEvent, new Annotation[0]);
+            inspectErrorStack("There are errors that are added by 
ProcessManagedBean event observers for " +
+                    "managed beans. Look at logs for further details");
+            if(!isAnnotatedTypeDecoratorOrInterceptor(annotatedType))
             {
-                // add them one after the other to enable serialization 
handling et al
-                beanManager.addBean(producerField);
+                beanManager.addBean(WebBeansUtil.createNewBean(managedBean));
+                beanManager.addBean(managedBean);
             }
         }
 
@@ -2947,18 +2969,19 @@ public final class WebBeansUtil
         ManagedBeanCreatorImpl<T> managedBeanCreator = new 
ManagedBeanCreatorImpl<T>(managedBean);
         managedBeanCreator.setAnnotatedType(type);
 
+        managedBeanCreator.defineApiType();
+
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
 
         //Scope type
         
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
 + clazz.getName() +
-                logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));
+                logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE), false);
 
         managedBeanCreator.defineSerializable();
 
         //Check for Enabled via Alternative
         setInjectionTargetBeanEnableFlag(managedBean);
-        managedBeanCreator.defineApiType();
         managedBeanCreator.checkCreateConditions();
         managedBeanCreator.defineQualifier();
         
managedBeanCreator.defineName(WebBeansUtil.getManagedBeanDefaultName(clazz.getSimpleName()));
@@ -3106,28 +3129,19 @@ public final class WebBeansUtil
         AnnotatedTypeBeanCreatorImpl<T> managedBeanCreator = new 
AnnotatedTypeBeanCreatorImpl<T>(managedBean);
         managedBeanCreator.setAnnotatedType(type);
 
+        managedBeanCreator.defineApiType();
+
         //Define meta-data
         managedBeanCreator.defineStereoTypes();
 
         //Scope type
         
managedBeanCreator.defineScopeType(logger.getTokenString(OWBLogConst.TEXT_MB_IMPL)
 + clazz.getName()
-                                           + 
logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE));                            
            
+                                           + 
logger.getTokenString(OWBLogConst.TEXT_SAME_SCOPE), false);
 
-        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();
         managedBeanCreator.checkCreateConditions();
         managedBeanCreator.defineQualifier();
         
managedBeanCreator.defineName(getManagedBeanDefaultName(clazz.getSimpleName()));
@@ -3140,7 +3154,23 @@ public final class WebBeansUtil
         DefinitionUtil.defineDecoratorStack(managedBean);
         DefinitionUtil.defineBeanInterceptorStack(managedBean);
 
-        managedBeanCreator.defineDisposalMethods();//Define disposal method 
after adding producers
+        managedBeanCreator.defineDisposalMethods(); //Define disposal method 
after adding producers
+
+        return managedBean;
+    }
+
+    public void lazyInitializeManagedBean(Class<?> clazz, ManagedBean<?> 
managedBean, ManagedBeanCreatorImpl<?> managedBeanCreator)
+    {
+        managedBeanCreator.defineConstructor();
+        managedBeanCreator.defineProducerMethods();
+        managedBeanCreator.defineProducerFields();
+        managedBeanCreator.defineInjectedFields();
+        managedBeanCreator.defineInjectedMethods();
+        managedBeanCreator.defineObserverMethods();
+        DefinitionUtil.defineDecoratorStack(managedBean);
+        DefinitionUtil.defineBeanInterceptorStack(managedBean);
+
+        managedBeanCreator.defineDisposalMethods(); //Define disposal method 
after adding producers
     }
 
 


Reply via email to