[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