[weld-commits] Weld SVN: r6004 - extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/annotated.
weld-commits at lists.jboss.org
weld-commits at lists.jboss.org
Thu Mar 4 20:55:33 EST 2010
Author: swd847
Date: 2010-03-04 20:55:32 -0500 (Thu, 04 Mar 2010)
New Revision: 6004
Modified:
extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/annotated/NewAnnotatedTypeBuilder.java
Log:
Added the ability to merge annotations from another AnnotatedType to NewAnnotatedTypeBuilder
Modified: extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/annotated/NewAnnotatedTypeBuilder.java
===================================================================
--- extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/annotated/NewAnnotatedTypeBuilder.java 2010-03-05 01:08:34 UTC (rev 6003)
+++ extensions/trunk/core/src/main/java/org/jboss/weld/extensions/util/annotated/NewAnnotatedTypeBuilder.java 2010-03-05 01:55:32 UTC (rev 6004)
@@ -8,6 +8,7 @@
import java.util.Map;
import java.util.Map.Entry;
+import javax.enterprise.inject.spi.Annotated;
import javax.enterprise.inject.spi.AnnotatedConstructor;
import javax.enterprise.inject.spi.AnnotatedField;
import javax.enterprise.inject.spi.AnnotatedMethod;
@@ -391,6 +392,100 @@
}
}
+ /**
+ * merges the annotations from an existing AnnoatedType. If they both have the same annotation
+ * on an element overwriteExisting determines which one to keep
+ * @param type
+ * @param overwriteExisting
+ * @return
+ */
+ public NewAnnotatedTypeBuilder<X> mergeAnnotations(AnnotatedType<X> type, boolean overwriteExisting)
+ {
+ mergeAnnotationsOnElement(type, overwriteExisting, typeAnnotations);
+ for (AnnotatedField<? super X> field : type.getFields())
+ {
+ AnnotationBuilder ans = fields.get(field.getJavaMember());
+ if (ans == null)
+ {
+ ans = new AnnotationBuilder();
+ fields.put(field.getJavaMember(), ans);
+ }
+ mergeAnnotationsOnElement(field, overwriteExisting, ans);
+ }
+ for (AnnotatedMethod<? super X> method : type.getMethods())
+ {
+ AnnotationBuilder ans = methods.get(method.getJavaMember());
+ if (ans == null)
+ {
+ ans = new AnnotationBuilder();
+ methods.put(method.getJavaMember(), ans);
+ }
+ mergeAnnotationsOnElement(method, overwriteExisting, ans);
+ for (AnnotatedParameter<? super X> p : method.getParameters())
+ {
+ Map<Integer, AnnotationBuilder> params = methodParameters.get(method.getJavaMember());
+ if (params == null)
+ {
+ params = new HashMap<Integer, AnnotationBuilder>();
+ methodParameters.put(method.getJavaMember(), params);
+ }
+ AnnotationBuilder builder = params.get(p.getPosition());
+ if(builder == null)
+ {
+ builder = new AnnotationBuilder();
+ params.put(p.getPosition(), builder);
+ }
+ mergeAnnotationsOnElement(p, overwriteExisting, builder);
+ }
+ }
+ for (AnnotatedConstructor<? super X> constructor : type.getConstructors())
+ {
+ AnnotationBuilder ans = constructors.get(constructor.getJavaMember());
+ if (ans == null)
+ {
+ ans = new AnnotationBuilder();
+ constructors.put((Constructor) constructor.getJavaMember(), ans);
+ }
+ mergeAnnotationsOnElement(constructor, overwriteExisting, ans);
+ for (AnnotatedParameter<? super X> p : constructor.getParameters())
+ {
+ Map<Integer, AnnotationBuilder> params = constructorParameters.get(constructor.getJavaMember());
+ if (params == null)
+ {
+ params = new HashMap<Integer, AnnotationBuilder>();
+ constructorParameters.put((Constructor) constructor.getJavaMember(), params);
+ }
+ AnnotationBuilder builder = params.get(p.getPosition());
+ if (builder == null)
+ {
+ builder = new AnnotationBuilder();
+ params.put(p.getPosition(), builder);
+ }
+ mergeAnnotationsOnElement(p, overwriteExisting, builder);
+ }
+ }
+ return this;
+ }
+
+ protected void mergeAnnotationsOnElement(Annotated annotated, boolean overwriteExisting, AnnotationBuilder typeAnnotations)
+ {
+ for (Annotation a : annotated.getAnnotations())
+ {
+ if (typeAnnotations.getAnnotation(a.annotationType()) != null)
+ {
+ if (overwriteExisting)
+ {
+ typeAnnotations.remove(a.annotationType());
+ typeAnnotations.add(a);
+ }
+ }
+ else
+ {
+ typeAnnotations.add(a);
+ }
+ }
+ }
+
public AnnotatedType<X> create()
{
Map<Constructor<X>, Map<Integer, AnnotationStore>> constructorParameterAnnnotations = new HashMap<Constructor<X>, Map<Integer,AnnotationStore>>();
More information about the weld-commits
mailing list