Author: arne
Date: Sun Jan  6 17:18:10 2013
New Revision: 1429557

URL: http://svn.apache.org/viewvc?rev=1429557&view=rev
Log:
OWB-745: Delayed setting of stereotypes

Modified:
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.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/OwbBean.java
    
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/creation/AbstractBeanCreator.java

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java?rev=1429557&r1=1429556&r2=1429557&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/annotation/AnnotationManager.java
 Sun Jan  6 17:18:10 2013
@@ -19,7 +19,6 @@
 package org.apache.webbeans.annotation;
 
 import org.apache.webbeans.component.AbstractOwbBean;
-import org.apache.webbeans.component.OwbBean;
 import org.apache.webbeans.config.WebBeansContext;
 import org.apache.webbeans.container.BeanManagerImpl;
 import org.apache.webbeans.exception.WebBeansConfigurationException;
@@ -52,6 +51,7 @@ import java.lang.reflect.Method;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -119,7 +119,7 @@ public final class AnnotationManager
         }
 
         // check for stereotypes _explicitly_ declared on the bean class (not 
inherited)
-        Annotation[] stereoTypes = 
annotationManager.getStereotypeMetaAnnotations(typeAnns);
+        Annotation[] stereoTypes = 
annotationManager.getStereotypeMetaAnnotations(typeAnns.toArray(new 
Annotation[typeAnns.size()]));
         for (Annotation stereoType : stereoTypes)
         {
             if 
(annotationManager.hasInterceptorBindingMetaAnnotation(stereoType.annotationType().getDeclaredAnnotations()))
@@ -408,6 +408,21 @@ public final class AnnotationManager
         return clazz.isAnnotationPresent(Stereotype.class);
     }
 
+    public boolean hasStereoTypeMetaAnnotation(Set<Class<? extends 
Annotation>> anns)
+    {
+        Asserts.assertNotNull(anns, "anns parameter can not be null");
+
+        for (Class<? extends Annotation> ann : anns)
+        {
+            if (isStereoTypeAnnotation(ann))
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
     public boolean hasStereoTypeMetaAnnotation(Annotation[] anns)
     {
         Asserts.assertNotNull(anns, "anns parameter can not be null");
@@ -423,7 +438,7 @@ public final class AnnotationManager
         return false;
     }
 
-    public Annotation[] getStereotypeMetaAnnotations(Set<Annotation> anns)
+    public Annotation[] getStereotypeMetaAnnotations(Annotation[] anns)
     {
         Asserts.assertNotNull(anns, "anns parameter can not be null");
         List<Annotation> interAnns = new ArrayList<Annotation>();
@@ -453,31 +468,27 @@ public final class AnnotationManager
     /**
      * Same like {@link #getStereotypeMetaAnnotations(java.util.Set)} but with 
an array
      */
-    public Annotation[] getStereotypeMetaAnnotations(Annotation[] anns)
+    public Set<Class<? extends Annotation>> 
getStereotypeMetaAnnotations(Set<Class<? extends Annotation>> stereotypes)
     {
-        Asserts.assertNotNull(anns, "anns parameter can not be null");
-        List<Annotation> interAnns = new ArrayList<Annotation>();
+        Asserts.assertNotNull(stereotypes, "anns parameter can not be null");
+        Set<Class<? extends Annotation>> interAnns = new HashSet<Class<? 
extends Annotation>>();
 
-        for (Annotation ann : anns)
+        for (Class<? extends Annotation> ann : stereotypes)
         {
-            if (isStereoTypeAnnotation(ann.annotationType()))
+            if (isStereoTypeAnnotation(ann))
             {
                 interAnns.add(ann);
 
                 //check for transitive
-                Annotation[] transitives = 
getTransitiveStereoTypes(ann.annotationType().getDeclaredAnnotations());
+                Annotation[] transitives = 
getTransitiveStereoTypes(ann.getDeclaredAnnotations());
 
                 for(Annotation transitive : transitives)
                 {
-                    interAnns.add(transitive);
+                    interAnns.add(transitive.annotationType());
                 }
             }
         }
-
-        Annotation[] ret = new Annotation[interAnns.size()];
-        ret = interAnns.toArray(ret);
-
-        return ret;
+        return interAnns;
     }
 
     private Annotation[] getTransitiveStereoTypes(Annotation[] anns)
@@ -486,38 +497,19 @@ public final class AnnotationManager
     }
 
     /**
-     * Returns true if array contains the StereoType meta annotation
-     *
-     * @return true if array contains the StereoType meta annotation
-     */
-    public boolean isComponentHasStereoType(OwbBean<?> component)
-    {
-        Asserts.assertNotNull(component, "component parameter can not be 
null");
-
-        Set<Annotation> set = component.getOwbStereotypes();
-        Annotation[] anns = new Annotation[set.size()];
-        anns = set.toArray(anns);
-        return hasStereoTypeMetaAnnotation(anns);
-    }
-
-    /**
      * Returns bean stereotypes.
      * @param bean bean instance
      * @return bean stereotypes
      */
-    public Annotation[] getComponentStereoTypes(OwbBean<?> bean)
+    public Set<Class<? extends Annotation>> getStereotypes(Set<Class<? extends 
Annotation>> anns)
     {
-        Asserts.assertNotNull(bean, "bean parameter can not be null");
-        if (isComponentHasStereoType(bean))
+        Asserts.assertNotNull(anns, "bean parameter can not be null");
+        if (hasStereoTypeMetaAnnotation(anns))
         {
-            Set<Annotation> set = bean.getOwbStereotypes();
-            Annotation[] anns = new Annotation[set.size()];
-            anns = set.toArray(anns);
-
             return getStereotypeMetaAnnotations(anns);
         }
 
-        return new Annotation[] {};
+        return Collections.<Class<? extends Annotation>>emptySet();
     }
 
     /**
@@ -525,13 +517,13 @@ public final class AnnotationManager
      * @param bean bean instance
      * @return true if name exists
      */
-    public boolean hasNamedOnStereoTypes(OwbBean<?> bean)
+    public boolean hasNamedOnStereoTypes(Set<Class<? extends Annotation>> 
stereotypes)
     {
-        Annotation[] types = getComponentStereoTypes(bean);
+        Set<Class<? extends Annotation>> types = getStereotypes(stereotypes);
 
-        for (Annotation ann : types)
+        for (Class<? extends Annotation> ann : types)
         {
-            if (AnnotationUtil.hasClassAnnotation(ann.annotationType(), 
Named.class))
+            if (AnnotationUtil.hasClassAnnotation(ann, Named.class))
             {
                 return true;
             }

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=1429557&r1=1429556&r2=1429557&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
 Sun Jan  6 17:18:10 2013
@@ -75,11 +75,8 @@ public abstract class AbstractOwbBean<T>
     /** Return type of the bean */
     protected Class<T> returnType;
 
-    /** Stereotypes of the bean */
-    protected Set<Annotation> stereoTypes = new HashSet<Annotation>();
-
     /** this is only for public access and will be built from {@link 
#stereoTypes} on demand */
-    protected Set<Class<? extends Annotation>> stereoTypeClasses = null;
+    protected Set<Class<? extends Annotation>> stereoTypeClasses = new 
HashSet<Class<? extends Annotation>>();
 
     /**This bean is specialized or not*/
     protected boolean specializedBean;
@@ -393,9 +390,7 @@ public abstract class AbstractOwbBean<T>
      */
     public void addStereoType(Annotation stereoType)
     {
-        stereoTypeClasses = null; // will get rebuilt on the next request
-
-        stereoTypes.add(stereoType);
+        stereoTypeClasses.add(stereoType.annotationType());
         cachedHashCode = 0;
     }
 
@@ -411,16 +406,6 @@ public abstract class AbstractOwbBean<T>
     }
 
     /**
-     * Gets the stereotypes.
-     *
-     * @return stereotypes of the bean
-     */
-    public Set<Annotation> getOwbStereotypes()
-    {
-        return stereoTypes;
-    }
-
-    /**
      * Add new qualifier.
      *
      * @param qualifier new qualifier
@@ -584,17 +569,6 @@ public abstract class AbstractOwbBean<T>
      */    
     public Set<Class<? extends Annotation>> getStereotypes()
     {
-        if (stereoTypeClasses == null)
-        {
-            Set<Class<? extends Annotation>> set = new HashSet<Class<? extends 
Annotation>>();
-
-            for(Annotation ann : stereoTypes)
-            {
-                set.add(ann.annotationType());
-            }
-            stereoTypeClasses = set;
-        }
-
         return stereoTypeClasses;
     }
     
@@ -737,7 +711,6 @@ public abstract class AbstractOwbBean<T>
         result = prime * result + (serializable ? 1231 : 1237);
         result = prime * result + (specializedBean ? 1231 : 1237);
         result = prime * result + ((stereoTypeClasses == null) ? 0 : 
stereoTypeClasses.hashCode());
-        result = prime * result + ((stereoTypes == null) ? 0 : 
stereoTypes.hashCode());
         result = prime * result + ((webBeansType == null) ? 0 : 
webBeansType.hashCode());
         cachedHashCode = result;
         return result;
@@ -856,14 +829,14 @@ public abstract class AbstractOwbBean<T>
         {
             return false;
         }
-        if (stereoTypes == null)
+        if (stereoTypeClasses == null)
         {
-            if (other.stereoTypes != null)
+            if (other.stereoTypeClasses != null)
             {
                 return false;
             }
         }
-        else if (!stereoTypes.equals(other.stereoTypes))
+        else if (!stereoTypeClasses.equals(other.stereoTypeClasses))
         {
             return false;
         }

Modified: 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/OwbBean.java
URL: 
http://svn.apache.org/viewvc/openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/OwbBean.java?rev=1429557&r1=1429556&r2=1429557&view=diff
==============================================================================
--- 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/OwbBean.java
 (original)
+++ 
openwebbeans/trunk/webbeans-impl/src/main/java/org/apache/webbeans/component/OwbBean.java
 Sun Jan  6 17:18:10 2013
@@ -21,7 +21,6 @@ package org.apache.webbeans.component;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Member;
 import java.util.List;
-import java.util.Set;
 
 import javax.enterprise.context.spi.CreationalContext;
 import javax.enterprise.inject.spi.*;
@@ -110,11 +109,6 @@ public interface OwbBean<T> extends Bean
     public void addInjectionPoint(InjectionPoint injectionPoint);
 
     /**
-     * Gets stereotypes annotations.
-     */
-    public Set<Annotation> getOwbStereotypes();
-
-    /**
      * Sets name of the bean.
      * 
      * @param name bean name

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=1429557&r1=1429556&r2=1429557&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
 Sun Jan  6 17:18:10 2013
@@ -74,6 +74,8 @@ public class AbstractBeanCreator<T>
 
     private Set<Annotation> qualifiers = new HashSet<Annotation>();
     
+    private Set<Class<? extends Annotation>> stereotypes = new HashSet<Class<? 
extends Annotation>>();
+    
     /**
      * Creates a bean instance.
      * 
@@ -135,7 +137,7 @@ public class AbstractBeanCreator<T>
         if (nameAnnot == null) // no @Named
         {
             // Check for stereottype
-            if 
(webBeansContext.getAnnotationManager().hasNamedOnStereoTypes(getBean()))
+            if 
(webBeansContext.getAnnotationManager().hasNamedOnStereoTypes(stereotypes))
             {
                 isDefault = true;
             }
@@ -341,12 +343,12 @@ public class AbstractBeanCreator<T>
 
         if (!found)
         {
-            Set<Class<? extends Annotation>> stereos = 
getBean().getStereotypes();
+            Set<Class<? extends Annotation>> stereos = stereotypes;
             if (stereos.size() == 0)
             {
                 getBean().setImplScopeType(new DependentScopeLiteral());
 
-                if (allowLazyInit && getBean() instanceof ManagedBean && 
isPurePojoBean(getBean().getWebBeansContext(), getBean().getBeanClass()))
+                if (allowLazyInit && getBean() instanceof ManagedBean && 
isPurePojoBean(webBeansContext, getBean().getBeanClass()))
                 {
                     // take the bean as Dependent but we could lazily 
initialize it
                     // because the bean doesn't contains any CDI feature
@@ -356,7 +358,7 @@ public class AbstractBeanCreator<T>
             else
             {
                 Annotation defined = null;
-                Set<Class<? extends Annotation>> anns = 
getBean().getStereotypes();
+                Set<Class<? extends Annotation>> anns = stereotypes;
                 for (Class<? extends Annotation> stero : anns)
                 {
                     boolean containsNormal = 
AnnotationUtil.hasMetaAnnotation(stero.getDeclaredAnnotations(), 
NormalScope.class);
@@ -460,7 +462,7 @@ public class AbstractBeanCreator<T>
     public void defineStereoTypes()
     {
         Annotation[] anns = AnnotationUtil.asSet(annotated.getAnnotations());
-        final AnnotationManager annotationManager = 
getBean().getWebBeansContext().getAnnotationManager();
+        final AnnotationManager annotationManager = 
webBeansContext.getAnnotationManager();
         if (annotationManager.hasStereoTypeMetaAnnotation(anns))
         {
             Annotation[] steroAnns =
@@ -468,7 +470,7 @@ public class AbstractBeanCreator<T>
 
             for (Annotation stereo : steroAnns)
             {
-                getBean().addStereoType(stereo);
+                stereotypes.add(stereo.annotationType());
             }
         }
         
@@ -485,7 +487,7 @@ public class AbstractBeanCreator<T>
             Set<Annotation> inheritedTypes = 
inheritedMetaData.getInheritedStereoTypes();        
             for (Annotation inherited : inheritedTypes)
             {
-                Set<Class<? extends Annotation>> qualifiers = 
getBean().getStereotypes();
+                Set<Class<? extends Annotation>> qualifiers = stereotypes;
                 boolean found = false;
                 for (Class<? extends Annotation> existQualifier : qualifiers)
                 {
@@ -497,7 +499,7 @@ public class AbstractBeanCreator<T>
                 }
                 if (!found)
                 {
-                    getBean().addStereoType(inherited);
+                    stereotypes.add(inherited.annotationType());
                 }
             }
         }
@@ -528,6 +530,7 @@ public class AbstractBeanCreator<T>
     {
         bean.setName(beanName);
         bean.getQualifiers().addAll(qualifiers);
+        bean.getStereotypes().addAll(stereotypes);
         return bean;
     }
 


Reply via email to