[weld-commits] Weld SVN: r6801 - extensions/trunk/impl/src/main/java/org/jboss/weld/extensions/bean/generic.

weld-commits at lists.jboss.org weld-commits at lists.jboss.org
Sat Jul 24 10:40:47 EDT 2010


Author: pete.muir at jboss.org
Date: 2010-07-24 10:40:47 -0400 (Sat, 24 Jul 2010)
New Revision: 6801

Modified:
   extensions/trunk/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java
Log:
reuse generic configuration beans

Modified: extensions/trunk/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java
===================================================================
--- extensions/trunk/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java	2010-07-24 14:17:57 UTC (rev 6800)
+++ extensions/trunk/impl/src/main/java/org/jboss/weld/extensions/bean/generic/GenericBeanExtension.java	2010-07-24 14:40:47 UTC (rev 6801)
@@ -65,18 +65,21 @@
 class GenericBeanExtension implements Extension
 {
 
-   private final Map<Class<?>, Set<AnnotatedType<?>>> genericBeans;
+   private final Map<Class<?>, Set<AnnotatedType<?>>> genericTypes;
 
    private final Map<Class<?>, Map<Member, Annotation>> producers;
 
    // A map of a generic annotation type to all instances of that type found on beans
    private final Map<Class<?>, Set<Annotation>> concreteGenerics;
+   
+   private final Map<Annotation, Bean<?>> genericConfigurationBeans;
 
    private final Synthetic.Provider syntheticProvider;
 
    GenericBeanExtension()
    {
-      this.genericBeans = new HashMap<Class<?>, Set<AnnotatedType<?>>>();
+      this.genericTypes = new HashMap<Class<?>, Set<AnnotatedType<?>>>();
+      this.genericConfigurationBeans = new HashMap<Annotation, Bean<?>>();
       this.producers = new HashMap<Class<?>, Map<Member, Annotation>>();
       this.concreteGenerics = new HashMap<Class<?>, Set<Annotation>>();
       this.syntheticProvider = new Synthetic.Provider("org.jboss.weld.extensions.bean.generic");
@@ -94,11 +97,11 @@
       if (type.isAnnotationPresent(Generic.class))
       {
          Generic generic = type.getAnnotation(Generic.class);
-         if (!genericBeans.containsKey(generic.value()))
+         if (!genericTypes.containsKey(generic.value()))
          {
-            genericBeans.put(generic.value(), new HashSet<AnnotatedType<?>>());
+            genericTypes.put(generic.value(), new HashSet<AnnotatedType<?>>());
          }
-         genericBeans.get(generic.value()).add(type);
+         genericTypes.get(generic.value()).add(type);
          // we will install (multiple copies of) this bean later
          event.veto();
 
@@ -180,7 +183,7 @@
     */
    void afterBeanDiscovery(@Observes AfterBeanDiscovery event, BeanManager beanManager)
    {
-      for (Entry<Class<?>, Set<AnnotatedType<?>>> entry : genericBeans.entrySet())
+      for (Entry<Class<?>, Set<AnnotatedType<?>>> entry : genericTypes.entrySet())
       {
          Set<Annotation> concretes = concreteGenerics.get(entry.getKey());
          if (concretes != null)
@@ -189,14 +192,19 @@
             {
                for (Annotation concrete : concretes)
                {
-                  event.addBean(redefineType(type, concrete, beanManager, event));
+                  event.addBean(createGenericBean(type, concrete, beanManager));
                }
             }
          }
       }
+      // Add all the generic configuration beans, which were created above
+      for (Bean<?> bean : genericConfigurationBeans.values())
+      {
+         event.addBean(bean);
+      }
    }
 
-   private <X> Bean<X> redefineType(AnnotatedType<X> annotatedType, Annotation concrete, BeanManager beanManager, AfterBeanDiscovery event)
+   private <X> Bean<X> createGenericBean(AnnotatedType<X> annotatedType, Annotation concrete, BeanManager beanManager)
    {
       Synthetic genericBeanQualifier = syntheticProvider.get(concrete);
 
@@ -212,9 +220,7 @@
             // if this is a configuration injection point
             if (concrete.annotationType().isAssignableFrom(getRawType(field.getBaseType())))
             {
-               Synthetic genericConfigurationQualifier = syntheticProvider.get();
-               builder.addToField(field, genericConfigurationQualifier);
-               event.addBean(createConfigurationBean(beanManager, concrete, genericConfigurationQualifier));
+               builder.addToField(field, getGenericConfigurationQualifier(beanManager, concrete));
             }
             // if this is a generic bean injection point
             else if (field.isAnnotationPresent(Inject.class) && field.isAnnotationPresent(GenericBean.class))
@@ -233,9 +239,7 @@
                // if this is a configuration injection point
                if (concrete.annotationType().isAssignableFrom(getRawType(parameter.getBaseType())))
                {
-                  Synthetic genericConfigurationQualifier = syntheticProvider.get();
-                  builder.addToParameter(parameter, genericConfigurationQualifier);
-                  event.addBean(createConfigurationBean(beanManager, concrete, genericConfigurationQualifier));
+                  builder.addToParameter(parameter, getGenericConfigurationQualifier(beanManager, concrete));
                }
                // if this is a generic bean injection point
                if (parameter.isAnnotationPresent(GenericBean.class))
@@ -256,9 +260,7 @@
                // if this is a configuration injection point
                if (concrete.annotationType().isAssignableFrom(getRawType(parameter.getBaseType())))
                {
-                  Synthetic genericConfigurationQualifier = syntheticProvider.get();
-                  builder.addToParameter(parameter, genericConfigurationQualifier);
-                  event.addBean(createConfigurationBean(beanManager, concrete, genericConfigurationQualifier));
+                  builder.addToParameter(parameter, getGenericConfigurationQualifier(beanManager, concrete));
                }
                // if this is a generic bean injection point
                if (parameter.isAnnotationPresent(GenericBean.class))
@@ -273,24 +275,34 @@
       return beanBuilder.create();
    }
 
-   private Bean<Annotation> createConfigurationBean(BeanManager beanManager, final Annotation genericConfiguration, Annotation syntheticQualifier)
+   private Synthetic getGenericConfigurationQualifier(BeanManager beanManager, final Annotation genericConfiguration)
    {
-      // TODO make this passivation capable?
-      BeanBuilder<Annotation> builder = new BeanBuilder<Annotation>(beanManager).setJavaClass(genericConfiguration.annotationType()).setTypes(Arrays2.<Type> asSet(genericConfiguration.annotationType(), Object.class)).setScope(Dependent.class).setQualifiers(Arrays2.asSet(syntheticQualifier)).setBeanLifecycle(new BeanLifecycle<Annotation>()
+      if (!genericConfigurationBeans.containsKey(genericConfiguration))
       {
-
-         public void destroy(Bean<Annotation> bean, Annotation arg0, CreationalContext<Annotation> arg1)
+         // We don't have a bean created for this generic configuration annotation. Create it, store it to be added later
+         Synthetic syntheticQualifier = syntheticProvider.get(genericConfiguration);
+         // TODO make this passivation capable?
+         BeanBuilder<Annotation> builder = new BeanBuilder<Annotation>(beanManager).setJavaClass(genericConfiguration.annotationType()).setTypes(Arrays2.<Type> asSet(genericConfiguration.annotationType(), Object.class)).setScope(Dependent.class).setQualifiers(Arrays2.<Annotation>asSet(syntheticQualifier)).setBeanLifecycle(new BeanLifecycle<Annotation>()
          {
-            // No-op
-         }
-
-         public Annotation create(Bean<Annotation> bean, CreationalContext<Annotation> arg0)
-         {
-            return genericConfiguration;
-         }
-      });
-
-      return builder.create();
+   
+            public void destroy(Bean<Annotation> bean, Annotation arg0, CreationalContext<Annotation> arg1)
+            {
+               // No-op
+            }
+   
+            public Annotation create(Bean<Annotation> bean, CreationalContext<Annotation> arg0)
+            {
+               return genericConfiguration;
+            }
+         });
+         genericConfigurationBeans.put(genericConfiguration, builder.create());
+         return syntheticQualifier;
+      }
+      else
+      {
+         // The bean already exists, just return the qualifier
+         return syntheticProvider.get(genericConfiguration);
+      }
    }
 
 }



More information about the weld-commits mailing list