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>>();
Show replies by date