[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