[seam-commits] Seam SVN: r12481 - in modules/xml/trunk/impl/src: main/java/org/jboss/seam/xml/core and 4 other directories.

seam-commits at lists.jboss.org seam-commits at lists.jboss.org
Tue Apr 13 16:31:41 EDT 2010


Author: swd847
Date: 2010-04-13 16:31:39 -0400 (Tue, 13 Apr 2010)
New Revision: 12481

Added:
   modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/
   modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericBeanTest.java
   modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericDependant.java
   modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericMain.java
   modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/HighGenericQualifier.java
   modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/LowGenericQualifier.java
   modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/generic/
   modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/generic/generic-beans.xml
Modified:
   modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java
   modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/GenericBeanResult.java
Log:
initial implementation of generic beans



Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java	2010-04-13 20:08:10 UTC (rev 12480)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/bootstrap/XmlExtension.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -5,6 +5,9 @@
 package org.jboss.seam.xml.bootstrap;
 
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Enumeration;
@@ -16,6 +19,8 @@
 import java.util.Map.Entry;
 
 import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Disposes;
+import javax.enterprise.inject.Produces;
 import javax.enterprise.inject.spi.AfterBeanDiscovery;
 import javax.enterprise.inject.spi.AnnotatedType;
 import javax.enterprise.inject.spi.BeanManager;
@@ -24,8 +29,10 @@
 import javax.enterprise.inject.spi.ProcessAnnotatedType;
 import javax.enterprise.inject.spi.ProcessInjectionTarget;
 import javax.enterprise.util.AnnotationLiteral;
+import javax.inject.Inject;
 
 import org.jboss.seam.xml.core.BeanResult;
+import org.jboss.seam.xml.core.GenericBeanResult;
 import org.jboss.seam.xml.core.XmlConfiguredBean;
 import org.jboss.seam.xml.core.XmlId;
 import org.jboss.seam.xml.core.XmlResult;
@@ -36,6 +43,7 @@
 import org.jboss.seam.xml.parser.SaxNode;
 import org.jboss.seam.xml.util.FileDataReader;
 import org.jboss.weld.extensions.util.AnnotationInstanceProvider;
+import org.jboss.weld.extensions.util.ReflectionUtils;
 import org.jboss.weld.extensions.util.annotated.NewAnnotatedTypeBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,12 +70,12 @@
 
    List<Exception> errors = new ArrayList<Exception>();
 
-   Set<XmlProcessAnnotatedType> queuedEvents = new HashSet<XmlProcessAnnotatedType>();
+   Map<Class, GenericBeanResult> genericBeans = new HashMap<Class, GenericBeanResult>();
 
    /**
     * This is the entry point for the extension
     */
-   public void beforeBeanDiscovery(@Observes BeforeBeanDiscovery event)
+   public void beforeBeanDiscovery(@Observes BeforeBeanDiscovery event, BeanManager beanManager)
    {
       log.info("Seam XML Bean Config Starting");
       List<Class<? extends XmlDocumentProvider>> providers = getDocumentProviders();
@@ -92,12 +100,27 @@
             errors.add(e);
          }
       }
+      // build the generic bean data
+      for (XmlResult r : results)
+      {
+         for (GenericBeanResult b : r.getGenericBeans())
+         {
+            genericBeans.put(b.getGenericBean(), b);
+         }
 
+         // add the qualifiers as we need them before we process the generic
+         // bean info
+         for (Class<? extends Annotation> b : r.getQualifiers())
+         {
+            log.info("Adding XML Defined Qualifier: " + b.getName());
+            event.addQualifier(b);
+         }
+      }
+
       for (XmlResult r : results)
       {
          if (!r.getProblems().isEmpty())
          {
-
             for (String i : r.getProblems())
             {
                errors.add(new RuntimeException(i));
@@ -113,11 +136,6 @@
             b.getBuilder().addToClass(a);
          }
 
-         for (Class<? extends Annotation> b : r.getQualifiers())
-         {
-            log.info("Adding XML Defined Qualifier: " + b.getName());
-            event.addQualifier(b);
-         }
          for (Class<? extends Annotation> b : r.getInterceptorBindings())
          {
             log.info("Adding XML Defined Interceptor Binding: " + b.getName());
@@ -130,13 +148,22 @@
          }
          for (BeanResult<?> bb : r.getBeans())
          {
+            if (genericBeans.containsKey(bb.getType()))
+            {
+               List<AnnotatedType<?>> types = processGenericBeans(bb, genericBeans.get(bb.getType()), beanManager);
+               for (AnnotatedType<?> i : types)
+               {
+                  event.addAnnotatedType(i);
+               }
+            }
+
             bb.getBuilder().addToClass(new AnnotationLiteral<XmlConfiguredBean>()
             {
             });
             AnnotatedType<?> tp = bb.getBuilder().create();
             log.info("Adding XML definied bean: " + tp.getJavaClass().getName());
-            queuedEvents.add(new XmlProcessAnnotatedType(tp));
             event.addAnnotatedType(tp);
+
          }
 
          veto.addAll(r.getVeto());
@@ -150,16 +177,6 @@
       {
          return;
       }
-      // first see if we should fire queued events
-      if (!queuedEvents.isEmpty())
-      {
-         for (XmlProcessAnnotatedType i : queuedEvents)
-         {
-            manager.fireEvent(i);
-         }
-         queuedEvents.clear();
-      }
-
       // veto implementation
       if (veto.contains(event.getAnnotatedType().getJavaClass()))
       {
@@ -258,4 +275,131 @@
       }
       return ret;
    }
+
+   public List<AnnotatedType<?>> processGenericBeans(BeanResult<?> bean, GenericBeanResult genericBeans, BeanManager beanManager)
+   {
+      List<AnnotatedType<?>> ret = new ArrayList<AnnotatedType<?>>();
+      AnnotatedType<?> rootType = bean.getBuilder().create();
+      // ret.add(rootType);
+      Set<Annotation> qualifiers = new HashSet<Annotation>();
+
+      Set<Class> allBeans = new HashSet<Class>();
+      allBeans.add(genericBeans.getGenericBean());
+      allBeans.addAll(genericBeans.getSecondaryBeans());
+
+      for (Annotation i : rootType.getAnnotations())
+      {
+         if (beanManager.isQualifier(i.annotationType()))
+         {
+            qualifiers.add(i);
+         }
+      }
+
+      for (Class<?> c : genericBeans.getSecondaryBeans())
+      {
+         NewAnnotatedTypeBuilder<?> gb = new NewAnnotatedTypeBuilder(c, true);
+         for (Annotation a : qualifiers)
+         {
+            gb.addToClass(a);
+         }
+         for (Field f : ReflectionUtils.getFields(c))
+         {
+
+            if (allBeans.contains(f.getType()))
+            {
+               if (f.isAnnotationPresent(Produces.class) || f.isAnnotationPresent(Inject.class))
+               {
+                  for (Annotation a : qualifiers)
+                  {
+                     gb.addToField(f, a);
+                  }
+               }
+            }
+         }
+         // now deal with the methods
+         for (Method m : ReflectionUtils.getMethods(c))
+         {
+            // if this method is eligable for injection we need to check the
+            // parameters
+            boolean inject = false;
+            if (m.isAnnotationPresent(Produces.class))
+            {
+               inject = true;
+               // if it is a producer add qualifiers
+               if (allBeans.contains(m.getReturnType()))
+               {
+                  for (Annotation a : qualifiers)
+                  {
+                     gb.addToMethod(m, a);
+                  }
+               }
+            }
+            // even if it is not a producer it may be a disposer or an observer
+            if (!inject)
+            {
+               for (int i = 0; i < m.getParameterTypes().length; ++i)
+               {
+                  Annotation[] an = m.getParameterAnnotations()[i];
+                  for (Annotation a : an)
+                  {
+                     if (a.annotationType() == Disposes.class || a.annotationType() == Observes.class)
+                     {
+                        inject = true;
+                        break;
+                     }
+                  }
+                  if (inject)
+                  {
+                     break;
+                  }
+               }
+            }
+            // if we need to apply qualifiers to the parameters
+            if (inject)
+            {
+               for (int i = 0; i < m.getParameterTypes().length; ++i)
+               {
+                  Class<?> type = m.getParameterTypes()[i];
+                  if (allBeans.contains(type))
+                  {
+                     for (Annotation a : qualifiers)
+                     {
+                        gb.addToMethodParameter(m, i, a);
+                     }
+                  }
+               }
+            }
+         }
+         // now deal with constructors
+         for (Constructor<?> con : c.getDeclaredConstructors())
+         {
+            // if this constructor is eligible for injection we need to check
+            // the
+            // parameters
+            boolean inject = false;
+            if (con.isAnnotationPresent(Inject.class))
+            {
+               inject = true;
+
+            }
+            // if we need to apply qualifiers to the parameters
+            if (inject)
+            {
+               for (int i = 0; i < con.getParameterTypes().length; ++i)
+               {
+                  Class<?> type = con.getParameterTypes()[i];
+                  if (allBeans.contains(type))
+                  {
+                     for (Annotation a : qualifiers)
+                     {
+                        gb.addToConstructorParameter((Constructor) con, i, a);
+                     }
+                  }
+               }
+            }
+         }
+         ret.add(gb.create());
+      }
+      return ret;
+   }
 }

Modified: modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/GenericBeanResult.java
===================================================================
--- modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/GenericBeanResult.java	2010-04-13 20:08:10 UTC (rev 12480)
+++ modules/xml/trunk/impl/src/main/java/org/jboss/seam/xml/core/GenericBeanResult.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -9,7 +9,7 @@
 
    final Set<Class> secondaryBeans;
 
-   public GenericBeanResult(Class genericBean, Set<Class> secondaryBeans)
+   public GenericBeanResult(Class<?> genericBean, Set<Class> secondaryBeans)
    {
       this.genericBean = genericBean;
       this.secondaryBeans = new HashSet<Class>(secondaryBeans);

Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericBeanTest.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericBeanTest.java	                        (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericBeanTest.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -0,0 +1,35 @@
+/*
+ * Distributed under the LGPL License
+ * 
+ */
+package org.jboss.seam.xml.test.generic;
+
+import javax.enterprise.util.AnnotationLiteral;
+
+import org.jboss.seam.xml.test.AbstractXMLTest;
+import org.testng.annotations.Test;
+
+public class GenericBeanTest extends AbstractXMLTest
+{
+
+   @Override
+   protected String getXmlFileName()
+   {
+      return "generic-beans.xml";
+   }
+
+   @Test
+   public void genericBeansTest()
+   {
+      GenericDependant dep = getReference(GenericDependant.class, new AnnotationLiteral<HighGenericQualifier>()
+      {
+      });
+      // assert dep.getValue() == 101 : " actual " + dep.getValue();
+      dep = getReference(GenericDependant.class, new AnnotationLiteral<LowGenericQualifier>()
+      {
+      });
+      assert dep.getValue() == 11 : " actual " + dep.getValue();
+      ;
+   }
+
+}

Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericDependant.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericDependant.java	                        (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericDependant.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -0,0 +1,14 @@
+package org.jboss.seam.xml.test.generic;
+
+import javax.inject.Inject;
+
+public class GenericDependant
+{
+   @Inject
+   GenericMain instance;
+
+   public int getValue()
+   {
+      return instance.getConfiguredValue() + 1;
+   }
+}

Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericMain.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericMain.java	                        (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/GenericMain.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -0,0 +1,17 @@
+package org.jboss.seam.xml.test.generic;
+
+public class GenericMain
+{
+   int configuredValue;
+
+   public int getConfiguredValue()
+   {
+      return configuredValue;
+   }
+
+   public void setConfiguredValue(int configuredValue)
+   {
+      this.configuredValue = configuredValue;
+   }
+
+}

Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/HighGenericQualifier.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/HighGenericQualifier.java	                        (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/HighGenericQualifier.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -0,0 +1,17 @@
+/*
+ * Distributed under the LGPL License
+ * 
+ */
+package org.jboss.seam.xml.test.generic;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+ at Qualifier
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface HighGenericQualifier
+{
+  
+}

Added: modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/LowGenericQualifier.java
===================================================================
--- modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/LowGenericQualifier.java	                        (rev 0)
+++ modules/xml/trunk/impl/src/test/java/org/jboss/seam/xml/test/generic/LowGenericQualifier.java	2010-04-13 20:31:39 UTC (rev 12481)
@@ -0,0 +1,17 @@
+/*
+ * Distributed under the LGPL License
+ * 
+ */
+package org.jboss.seam.xml.test.generic;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+import javax.inject.Qualifier;
+
+ at Qualifier
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface LowGenericQualifier
+{
+  
+}

Added: modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/generic/generic-beans.xml
===================================================================
--- modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/generic/generic-beans.xml	                        (rev 0)
+++ modules/xml/trunk/impl/src/test/resources/org/jboss/seam/xml/test/generic/generic-beans.xml	2010-04-13 20:31:39 UTC (rev 12481)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="urn:java:seam:core"
+          xmlns:test="urn:java:org.jboss.seam.xml.test.generic">
+
+	<genericBean class="org.jboss.seam.xml.test.generic.GenericMain" >
+		<test:GenericDependant/>
+	</genericBean>
+	
+	<test:GenericMain>
+		<test:HighGenericQualifier/>
+		<test:configuredValue><value>100</value></test:configuredValue>
+	</test:GenericMain>
+	
+	<test:GenericMain>
+		<test:LowGenericQualifier/>
+		<test:configuredValue><value>10</value></test:configuredValue>
+	</test:GenericMain>
+	
+</beans>
\ No newline at end of file



More information about the seam-commits mailing list