JUNEAU-169 Dynamic annotations.
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
index 4c2b721..daeb25e 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanMeta.java
@@ -28,14 +28,14 @@
* Constructor.
*
* @param beanMeta The metadata on the bean that this metadata applies to.
- * @param rdfMetaProvider RDF metadata provider (for finding information about other artifacts).
+ * @param mp RDF metadata provider (for finding information about other artifacts).
*/
- public RdfBeanMeta(BeanMeta<?> beanMeta, RdfMetaProvider rdfMetaProvider) {
+ public RdfBeanMeta(BeanMeta<?> beanMeta, RdfMetaProvider mp) {
super(beanMeta);
BeanPropertyMeta t_beanUriProperty = null;
for (BeanPropertyMeta p : beanMeta.getPropertyMetas()) {
- RdfBeanPropertyMeta bpm = rdfMetaProvider.getRdfBeanPropertyMeta(p);
+ RdfBeanPropertyMeta bpm = mp.getRdfBeanPropertyMeta(p);
if (bpm.isBeanUri())
t_beanUriProperty = p;
}
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
index ec1eaff..108b339 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfBeanPropertyMeta.java
@@ -38,13 +38,13 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param rdfMetaProvider RDF metadata provider (for finding information about other artifacts).
+ * @param mp RDF metadata provider (for finding information about other artifacts).
*/
- public RdfBeanPropertyMeta(BeanPropertyMeta bpm, RdfMetaProvider rdfMetaProvider) {
+ public RdfBeanPropertyMeta(BeanPropertyMeta bpm, RdfMetaProvider mp) {
super(bpm);
- List<Rdf> rdfs = bpm.findAnnotations(Rdf.class);
- List<RdfSchema> schemas = bpm.findAnnotations(RdfSchema.class);
+ List<Rdf> rdfs = bpm.findAnnotations(Rdf.class, mp);
+ List<RdfSchema> schemas = bpm.findAnnotations(RdfSchema.class, mp);
for (Rdf rdf : rdfs) {
if (collectionFormat == RdfCollectionFormat.DEFAULT)
diff --git a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
index ac1fe64..8161a74 100644
--- a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
+++ b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfClassMeta.java
@@ -33,19 +33,19 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param rdfMetaProvider RDF metadata provider (for finding information about other artifacts).
+ * @param mp RDF metadata provider (for finding information about other artifacts).
*/
- public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider rdfMetaProvider) {
+ public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider mp) {
super(cm);
ClassInfo ci = cm.getInfo();
- this.rdf = ci.getAnnotation(Rdf.class);
+ this.rdf = mp.getAnnotation(Rdf.class, cm.getInnerClass());
if (rdf != null) {
collectionFormat = rdf.collectionFormat();
} else {
collectionFormat = RdfCollectionFormat.DEFAULT;
}
- List<Rdf> rdfs = ci.getAnnotations(Rdf.class);
- List<RdfSchema> schemas = ci.getAnnotations(RdfSchema.class);
+ List<Rdf> rdfs = ci.getAnnotations(Rdf.class, mp);
+ List<RdfSchema> schemas = ci.getAnnotations(RdfSchema.class, mp);
this.namespace = RdfUtils.findNamespace(rdfs, schemas);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index ca2da56..f174f09 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -52,7 +52,6 @@
private final Field field; // The bean property field (if it has one).
private final Field innerField; // The bean property field (if it has one).
private final Method getter, setter, extraKeys; // The bean property getter and setter.
- private final MethodInfo getterInfo, setterInfo, extraKeysInfo; // The bean property getter and setter.
private final boolean isUri; // True if this is a URL/URI or annotated with @URI.
private final boolean isDyna, isDynaGetterMap; // This is a dyna property (i.e. name="*")
@@ -416,11 +415,8 @@
this.field = b.field;
this.innerField = b.innerField;
this.getter = b.getter;
- this.getterInfo = MethodInfo.of(b.getter);
this.setter = b.setter;
- this.setterInfo = MethodInfo.of(b.setter);
this.extraKeys = b.extraKeys;
- this.extraKeysInfo = MethodInfo.of(b.extraKeys);
this.isUri = b.isUri;
this.beanMeta = b.beanMeta;
this.beanContext = b.beanContext;
@@ -1127,57 +1123,59 @@
* Searches through the class hierarchy (e.g. superclasses, interfaces, packages) for all instances of the
* specified annotation.
*
+ * @param <A> The class to find annotations for.
* @param a The class to find annotations for.
+ * @param mp The metadata provider for finding annotations.
* @return A list of annotations ordered in child-to-parent order. Never <jk>null</jk>.
*/
- public <A extends Annotation> List<A> findAnnotations(Class<A> a) {
+ public <A extends Annotation> List<A> findAnnotations(Class<A> a, MetaProvider mp) {
List<A> l = new LinkedList<>();
if (field != null) {
- addIfNotNull(l, field.getAnnotation(a));
- ClassInfo.of(field.getType()).appendAnnotations(l, a);
+ addIfNotNull(l, mp.getAnnotation(a, field));
+ ClassInfo.of(field.getType()).appendAnnotations(l, a, mp);
}
if (getter != null) {
- addIfNotNull(l, MethodInfo.of(getter).getAnnotation(a));
- ClassInfo.of(getter.getReturnType()).appendAnnotations(l, a);
+ addIfNotNull(l, mp.getAnnotation(a, getter));
+ ClassInfo.of(getter.getReturnType()).appendAnnotations(l, a, mp);
}
if (setter != null) {
- addIfNotNull(l, MethodInfo.of(setter).getAnnotation(a));
- ClassInfo.of(setter.getReturnType()).appendAnnotations(l, a);
+ addIfNotNull(l, mp.getAnnotation(a, setter));
+ ClassInfo.of(setter.getReturnType()).appendAnnotations(l, a, mp);
}
if (extraKeys != null) {
- addIfNotNull(l, MethodInfo.of(extraKeys).getAnnotation(a));
- ClassInfo.of(extraKeys.getReturnType()).appendAnnotations(l, a);
+ addIfNotNull(l, mp.getAnnotation(a, extraKeys));
+ ClassInfo.of(extraKeys.getReturnType()).appendAnnotations(l, a, mp);
}
- getBeanMeta().getClassMeta().getInfo().appendAnnotations(l, a);
+ getBeanMeta().getClassMeta().getInfo().appendAnnotations(l, a, mp);
return l;
}
- /**
- * Returns the specified annotation on the field or methods that define this property.
- *
- * <p>
- * This method will search up the parent class/interface hierarchy chain to search for the annotation on
- * overridden getters and setters.
- *
- * @param a The annotation to search for.
- * @return The annotation, or <jk>null</jk> if it wasn't found.
- */
- public <A extends Annotation> A findAnnotation(Class<A> a) {
- A t = null;
- if (field != null)
- t = field.getAnnotation(a);
- if (t == null && getter != null)
- t = getterInfo.getAnnotation(a);
- if (t == null && setter != null)
- t = setterInfo.getAnnotation(a);
- if (t == null && extraKeys != null)
- t = extraKeysInfo.getAnnotation(a);
- if (t == null)
- t = typeMeta.getInfo().getAnnotation(a);
- return t;
- }
-
+// /**
+// * Returns the specified annotation on the field or methods that define this property.
+// *
+// * <p>
+// * This method will search up the parent class/interface hierarchy chain to search for the annotation on
+// * overridden getters and setters.
+// *
+// * @param a The annotation to search for.
+// * @return The annotation, or <jk>null</jk> if it wasn't found.
+// */
+// public <A extends Annotation> A findAnnotation(Class<A> a) {
+// A t = null;
+// if (field != null)
+// t = field.getAnnotation(a);
+// if (t == null && getter != null)
+// t = getterInfo.getAnnotation(a);
+// if (t == null && setter != null)
+// t = setterInfo.getAnnotation(a);
+// if (t == null && extraKeys != null)
+// t = extraKeysInfo.getAnnotation(a);
+// if (t == null)
+// t = typeMeta.getInfo().getAnnotation(a);
+// return t;
+// }
+//
private Object transform(BeanSession session, Object o) throws SerializeException {
try {
// First use swap defined via @Beanp.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index 27c1176..afbd32e 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -13,11 +13,13 @@
package org.apache.juneau;
import java.lang.annotation.*;
+import java.lang.reflect.*;
import java.util.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
+import org.apache.juneau.utils.*;
/**
* A reusable stateless thread-safe read-only configuration, typically used for creating one-time use {@link Session}
@@ -40,7 +42,7 @@
*
* @see PropertyStore
*/
-public abstract class Context {
+public abstract class Context implements MetaProvider {
static final String PREFIX = "Context";
@@ -66,7 +68,7 @@
* Allows you to dynamically apply Juneau annotations typically applied directly to classes and methods.
* Useful in cases where you want to use the functionality of the annotation on beans and bean properties but
* do not have access to the code to do so.
- *
+ *
* <p>
* As a rule, any Juneau annotation with an <c>on()</c> method can be used with this property.
*
@@ -95,6 +97,7 @@
private final PropertyStore propertyStore;
private final int identityCode;
+ private final ReflectionMap<Annotation> annotations;
/**
* Constructor for this class.
@@ -108,6 +111,18 @@
public Context(PropertyStore ps, boolean allowReuse) {
this.propertyStore = ps == null ? PropertyStore.DEFAULT : ps;
this.identityCode = allowReuse ? new HashCode().add(getClass().getName()).add(ps).get() : System.identityHashCode(this);
+
+ ReflectionMap.Builder<Annotation> rmb = ReflectionMap.create(Annotation.class);
+ for (Annotation a : propertyStore.getListProperty(CONTEXT_annotations, Annotation.class)) {
+ try {
+ Method m = a.getClass().getMethod("on");
+ String on = (String)m.invoke(a);
+ rmb.append(on, a);
+ } catch (Exception e) {
+ throw new ConfigException("Invalid annotation @{0} used in CONTEXT_annotations property. Annotation must define an on() method.", a.getClass().getSimpleName());
+ }
+ }
+ this.annotations = rmb.build();
}
/**
@@ -585,6 +600,40 @@
}
//-----------------------------------------------------------------------------------------------------------------
+ // MetaProvider methods
+ //-----------------------------------------------------------------------------------------------------------------
+
+ @SuppressWarnings("unchecked")
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c) {
+ return (A)annotations.findFirst(c, a).orElse(c.getAnnotation(a));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getDeclaredAnnotation(Class<A> a, Class<?> c) {
+ return (A)annotations.findFirst(c, a).orElse(c.getAnnotation(a));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Method m) {
+ return (A)annotations.findFirst(m, a).orElse(m.getAnnotation(a));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Field f) {
+ return (A)annotations.findFirst(f, a).orElse(f.getAnnotation(a));
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Constructor<?> c) {
+ return (A)annotations.findFirst(c, a).orElse(c.getAnnotation(a));
+ }
+
+ //-----------------------------------------------------------------------------------------------------------------
// Other methods
//-----------------------------------------------------------------------------------------------------------------
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
index 6bdd5e2..1791e63 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/MetaProvider.java
@@ -12,7 +12,92 @@
// ***************************************************************************************************************************
package org.apache.juneau;
+import java.lang.annotation.*;
+import java.lang.reflect.*;
+
/**
* Parent interface for all class/method language-specific metadata providers.
*/
-public interface MetaProvider {}
+public interface MetaProvider {
+
+ /**
+ * Default metadata provider.
+ */
+ public static MetaProvider DEFAULT = new MetaProvider() {
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c) {
+ return c.getAnnotation(a);
+ }
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getDeclaredAnnotation(Class<A> a, Class<?> c) {
+ return c.getDeclaredAnnotation(a);
+ }
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Method m) {
+ return m.getAnnotation(a);
+ }
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Field f) {
+ return f.getAnnotation(a);
+ }
+
+ @Override /* MetaProvider */
+ public <A extends Annotation> A getAnnotation(Class<A> a, Constructor<?> c) {
+ return c.getAnnotation(a);
+ }
+ };
+
+ /**
+ * Finds the specified annotation on the specified class.
+ *
+ * @param <A> The annotation type to find.
+ * @param a The annotation type to find.
+ * @param c The class to search on.
+ * @return The annotation, or <jk>null</jk> if not found.
+ */
+ <A extends Annotation> A getAnnotation(Class<A> a, Class<?> c);
+
+ /**
+ * Finds the specified declared annotation on the specified class.
+ *
+ * @param <A> The annotation type to find.
+ * @param a The annotation type to find.
+ * @param c The class to search on.
+ * @return The annotation, or <jk>null</jk> if not found.
+ */
+ <A extends Annotation> A getDeclaredAnnotation(Class<A> a, Class<?> c);
+
+ /**
+ * Finds the specified annotation on the specified method.
+ *
+ * @param <A> The annotation type to find.
+ * @param a The annotation type to find.
+ * @param m The method to search on.
+ * @return The annotation, or <jk>null</jk> if not found.
+ */
+ <A extends Annotation> A getAnnotation(Class<A> a, Method m);
+
+ /**
+ * Finds the specified annotation on the specified field.
+ *
+ * @param <A> The annotation type to find.
+ * @param a The annotation type to find.
+ * @param f The field to search on.
+ * @return The annotation, or <jk>null</jk> if not found.
+ */
+ <A extends Annotation> A getAnnotation(Class<A> a, Field f);
+
+ /**
+ * Finds the specified annotation on the specified constructor.
+ *
+ * @param <A> The annotation type to find.
+ * @param a The annotation type to find.
+ * @param c The constructor to search on.
+ * @return The annotation, or <jk>null</jk> if not found.
+ */
+ <A extends Annotation> A getAnnotation(Class<A> a, Constructor<?> c);
+}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
index 2dca01b..a640212 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param csvMetaProvider CSV metadata provider (for finding information about other artifacts).
+ * @param mp CSV metadata provider (for finding information about other artifacts).
*/
- public CsvBeanPropertyMeta(BeanPropertyMeta bpm, CsvMetaProvider csvMetaProvider) {
+ public CsvBeanPropertyMeta(BeanPropertyMeta bpm, CsvMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
index ebbcdee..279a500 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param csvMetaProvider CSV metadata provider (for finding information about other artifacts).
+ * @param mp CSV metadata provider (for finding information about other artifacts).
*/
- public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider csvMetaProvider) {
+ public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider mp) {
super(cm);
- this.csv = cm.getInfo().getAnnotation(Csv.class);
+ this.csv = mp.getAnnotation(Csv.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
index 5fea34b..b6f142c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
@@ -38,17 +38,18 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param htmlMetaProvider HTML metadata provider (for finding information about other artifacts).
+ * @param mp HTML metadata provider (for finding information about other artifacts).
*/
- public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, HtmlMetaProvider htmlMetaProvider) {
+ public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, HtmlMetaProvider mp) {
super(bpm);
+
Builder b = new Builder();
if (bpm.getInnerField() != null)
- b.findHtmlInfo(bpm.getInnerField().getAnnotation(Html.class));
+ b.findHtmlInfo(mp.getAnnotation(Html.class, bpm.getInnerField()));
if (bpm.getGetter() != null)
- b.findHtmlInfo(bpm.getGetter().getAnnotation(Html.class));
+ b.findHtmlInfo(mp.getAnnotation(Html.class, bpm.getGetter()));
if (bpm.getSetter() != null)
- b.findHtmlInfo(bpm.getSetter().getAnnotation(Html.class));
+ b.findHtmlInfo(mp.getAnnotation(Html.class, bpm.getSetter()));
this.format = b.format;
this.noTables = b.noTables;
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
index 86890b7..5f9ce95 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
@@ -32,11 +32,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param htmlMetaProvider HTML metadata provider (for finding information about other artifacts).
+ * @param mp HTML metadata provider (for finding information about other artifacts).
*/
- public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider htmlMetaProvider) {
+ public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider mp) {
super(cm);
- this.html = cm.getInfo().getAnnotation(Html.class);
+ this.html = mp.getAnnotation(Html.class, cm.getInnerClass());
if (html != null) {
format = html.format();
noTables = html.noTables();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
index 006338e..1324dcf 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param jsoMetaProvider JSO metadata provider (for finding information about other artifacts).
+ * @param mp JSO metadata provider (for finding information about other artifacts).
*/
- public JsoBeanPropertyMeta(BeanPropertyMeta bpm, JsoMetaProvider jsoMetaProvider) {
+ public JsoBeanPropertyMeta(BeanPropertyMeta bpm, JsoMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
index 0d984d5..7227a2b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jso/JsoClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param jsoMetaProvider JSO metadata provider (for finding information about other artifacts).
+ * @param mp JSO metadata provider (for finding information about other artifacts).
*/
- public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider jsoMetaProvider) {
+ public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider mp) {
super(cm);
- this.jso = cm.getInfo().getAnnotation(Jso.class);
+ this.jso = mp.getAnnotation(Jso.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
index 5237126..42e8d4c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param jsonMetaProvider JSON metadata provider (for finding information about other artifacts).
+ * @param mp JSON metadata provider (for finding information about other artifacts).
*/
- public JsonBeanPropertyMeta(BeanPropertyMeta bpm, JsonMetaProvider jsonMetaProvider) {
+ public JsonBeanPropertyMeta(BeanPropertyMeta bpm, JsonMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
index 11d6aa2..0179b62 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/json/JsonClassMeta.java
@@ -30,11 +30,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param jsonMetaProvider JSON metadata provider (for finding information about other artifacts).
+ * @param mp JSON metadata provider (for finding information about other artifacts).
*/
- public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider jsonMetaProvider) {
+ public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider mp) {
super(cm);
- this.json = cm.getInfo().getAnnotation(Json.class);
+ this.json = mp.getAnnotation(Json.class, cm.getInnerClass());
if (json != null) {
wrapperAttr = nullIfEmpty(json.wrapperAttr());
} else {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
index b3ebb91..6a2de0a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaBeanPropertyMeta.java
@@ -35,9 +35,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param jsonSchemaMetaProvider JSON-schema metadata provider (for finding information about other artifacts).
+ * @param mp JSON-schema metadata provider (for finding information about other artifacts).
*/
- public JsonSchemaBeanPropertyMeta(BeanPropertyMeta bpm, JsonSchemaMetaProvider jsonSchemaMetaProvider) {
+ public JsonSchemaBeanPropertyMeta(BeanPropertyMeta bpm, JsonSchemaMetaProvider mp) {
super(bpm);
this.schema = new ObjectMap();
@@ -47,11 +47,11 @@
try {
if (field != null)
- schema.appendAll(SchemaUtils.asMap(field.getAnnotation(Schema.class)));
+ schema.appendAll(SchemaUtils.asMap(mp.getAnnotation(Schema.class, field)));
if (getter != null)
- schema.appendAll(SchemaUtils.asMap(getter.getAnnotation(Schema.class)));
+ schema.appendAll(SchemaUtils.asMap(mp.getAnnotation(Schema.class, getter)));
if (setter != null)
- schema.appendAll(SchemaUtils.asMap(setter.getAnnotation(Schema.class)));
+ schema.appendAll(SchemaUtils.asMap(mp.getAnnotation(Schema.class, setter)));
} catch (ParseException e) {
throw new RuntimeException(e);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
index 2f7b9c8..8caa931 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaClassMeta.java
@@ -28,12 +28,12 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param jsonSchemaMetaProvider JSON-schema metadata provider (for finding information about other artifacts).
+ * @param mp JSON-schema metadata provider (for finding information about other artifacts).
*/
- public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider jsonSchemaMetaProvider) {
+ public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider mp) {
super(cm);
try {
- Schema s = cm.getInfo().getAnnotation(Schema.class);
+ Schema s = mp.getAnnotation(Schema.class, cm.getInnerClass());
schema = s == null ? ObjectMap.EMPTY_MAP : SchemaUtils.asMap(s);
} catch (ParseException e) {
throw new RuntimeException(e);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
deleted file mode 100644
index 37db694..0000000
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchema.java
+++ /dev/null
@@ -1,55 +0,0 @@
-// ***************************************************************************************************************************
-// * Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file *
-// * distributed with this work for additional information regarding copyright ownership. The ASF licenses this file *
-// * to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance *
-// * with the License. You may obtain a copy of the License at *
-// * *
-// * http://www.apache.org/licenses/LICENSE-2.0 *
-// * *
-// * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an *
-// * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the *
-// * specific language governing permissions and limitations under the License. *
-// ***************************************************************************************************************************
-package org.apache.juneau.jsonschema.annotation;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-import java.lang.annotation.*;
-
-import org.apache.juneau.jsonschema.*;
-
-/**
- * Annotation that can be applied to classes, fields, and methods to tweak how they are handled by {@link JsonSchemaGenerator}.
- *
- * <ul class='seealso'>
- * </ul>
- */
-@Documented
-@Target({TYPE,FIELD,METHOD})
-@Retention(RUNTIME)
-@Inherited
-public @interface JsonSchema {
-
- /**
- * Defines which classes/methods this annotation applies to.
- *
- * <p>
- * Used in conjunction with the {@link JsonSchemaConfig#annotateJsonSchema()}.
- * It is ignored when the annotation is applied directly to classes and methods.
- *
- * The format can be any of the following:
- * <ul>
- * <li>Full class name (e.g. <js>"com.foo.MyClass"</js>).
- * <li>Simple class name (e.g. <js>"MyClass"</js>).
- * <li>Full method name (e.g. <js>"com.foo.MyClass.myMethod"</js>).
- * <li>Simple method name (e.g. <js>"MyClass.myMethod"</js>).
- * <li>A comma-delimited list of anything on this list.
- * </ul>
- *
- * <ul class='seealso'>
- * <li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
- * </ul>
- */
- String on() default "";
-}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
index 4e10a24..6877c2d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfig.java
@@ -171,17 +171,17 @@
String allowNestedExamples() default "";
/**
- * Indirectly applies {@link JsonSchema @JsonSchema} annotations to classes/methods.
+ * Indirectly applies {@link Schema @Schema} annotations to classes/methods.
*
* <p>
- * Provides an alternate approach for applying annotations to classes/methods annotations using the {@link JsonSchema#on() @JsonSchema.on}
+ * Provides an alternate approach for applying annotations to classes/methods annotations using the {@link Schema#on() @Schema.on}
* annotation to specify the class/method names to apply the annotation to.
*
* <ul class='seealso'>
* <li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
* </ul>
*/
- JsonSchema[] annotateJsonSchema() default {};
+ Schema[] annotateSchema() default {};
/**
* Configuration property: Bean schema definition mapper.
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java
index 20db787..64949c4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/JsonSchemaConfigApply.java
@@ -55,7 +55,7 @@
if (! a.useBeanDefs().isEmpty())
psb.set(JSONSCHEMA_useBeanDefs, bool(a.useBeanDefs()));
- if (a.annotateJsonSchema().length > 0)
- psb.addTo(CONTEXT_annotations, a.annotateJsonSchema());
+ if (a.annotateSchema().length > 0)
+ psb.addTo(CONTEXT_annotations, a.annotateSchema());
}
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
index e5944f8..9afcbda 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/annotation/Schema.java
@@ -719,4 +719,26 @@
* </ul>
*/
String[] value() default {};
+
+ /**
+ * Defines which classes/methods this annotation applies to.
+ *
+ * <p>
+ * Used in conjunction with the {@link JsonSchemaConfig#annotateSchema()}.
+ * It is ignored when the annotation is applied directly to classes and methods.
+ *
+ * The format can be any of the following:
+ * <ul>
+ * <li>Full class name (e.g. <js>"com.foo.MyClass"</js>).
+ * <li>Simple class name (e.g. <js>"MyClass"</js>).
+ * <li>Full method name (e.g. <js>"com.foo.MyClass.myMethod"</js>).
+ * <li>Simple method name (e.g. <js>"MyClass.myMethod"</js>).
+ * <li>A comma-delimited list of anything on this list.
+ * </ul>
+ *
+ * <ul class='seealso'>
+ * <li class='link'>{@doc juneau-marshall.ClassMethodAnnotations}
+ * </ul>
+ */
+ String on() default "";
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
index 84782af..eea4d56 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param msgPackMetaProvider MessagePack metadata provider (for finding information about other artifacts).
+ * @param mp MessagePack metadata provider (for finding information about other artifacts).
*/
- public MsgPackBeanPropertyMeta(BeanPropertyMeta bpm, MsgPackMetaProvider msgPackMetaProvider) {
+ public MsgPackBeanPropertyMeta(BeanPropertyMeta bpm, MsgPackMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
index 7298470..88b0f86 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param msgPackMetaProvider MessagePack metadata provider (for finding information about other artifacts).
+ * @param mp MessagePack metadata provider (for finding information about other artifacts).
*/
- public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider msgPackMetaProvider) {
+ public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider mp) {
super(cm);
- this.msgPack = cm.getInfo().getAnnotation(MsgPack.class);
+ this.msgPack = mp.getAnnotation(MsgPack.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
index 416e081..3c35430 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param openApiMetaProvider OpenApi metadata provider (for finding information about other artifacts).
+ * @param mp OpenApi metadata provider (for finding information about other artifacts).
*/
- public OpenApiBeanPropertyMeta(BeanPropertyMeta bpm, OpenApiMetaProvider openApiMetaProvider) {
+ public OpenApiBeanPropertyMeta(BeanPropertyMeta bpm, OpenApiMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
index e65596b..f786453 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param openApiMetaProvider OpenApi metadata provider (for finding information about other artifacts).
+ * @param mp OpenApi metadata provider (for finding information about other artifacts).
*/
- public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider openApiMetaProvider) {
+ public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider mp) {
super(cm);
- this.openApi = cm.getInfo().getAnnotation(OpenApi.class);
+ this.openApi = mp.getAnnotation(OpenApi.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
index 812c67f..7267d8d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param plainTextMetaProvider PlainText metadata provider (for finding information about other artifacts).
+ * @param mp PlainText metadata provider (for finding information about other artifacts).
*/
- public PlainTextBeanPropertyMeta(BeanPropertyMeta bpm, PlainTextMetaProvider plainTextMetaProvider) {
+ public PlainTextBeanPropertyMeta(BeanPropertyMeta bpm, PlainTextMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
index 6c51b02..11234e3 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param plainTextMetaProvider PlainText metadata provider (for finding information about other artifacts).
+ * @param mp PlainText metadata provider (for finding information about other artifacts).
*/
- public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider plainTextMetaProvider) {
+ public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider mp) {
super(cm);
- this.plainText = cm.getInfo().getAnnotation(PlainText.class);
+ this.plainText = mp.getAnnotation(PlainText.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index 55c8a15..b7e0963 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -1028,6 +1028,19 @@
}
/**
+ * Returns all annotations of the specified type defined on the specified class or parent classes/interfaces.
+ *
+ * @param <T> The annotation to search for.
+ * @param a The annotation to search for.
+ * @param mp The metadata provider for finding annotations.
+ * @return
+ * A list of all matching annotations found in child-to-parent order, or an empty list if none found.
+ */
+ public <T extends Annotation> List<T> getAnnotations(Class<T> a, MetaProvider mp) {
+ return appendAnnotations(new ArrayList<>(), a, mp);
+ }
+
+ /**
* Identical to {@link #getAnnotations(Class)} but optionally returns the list in reverse (parent-to-child) order.
*
* @param a
@@ -1127,10 +1140,33 @@
* @return The same list.
*/
public <T extends Annotation> List<T> appendAnnotations(List<T> l, Class<T> a) {
+ return appendAnnotations(l, a, MetaProvider.DEFAULT);
+ }
+
+ /**
+ * Finds and appends the specified annotation on the specified class and superclasses/interfaces to the specified
+ * list.
+ *
+ * <p>
+ * Annotations are appended in the following orders:
+ * <ol>
+ * <li>On this class.
+ * <li>On parent classes ordered child-to-parent.
+ * <li>On interfaces ordered child-to-parent.
+ * <li>On the package of this class.
+ * </ol>
+ *
+ * @param <T> The annotation to search for.
+ * @param l The list of annotations.
+ * @param a The annotation to search for.
+ * @param mp The metadata provider for finding annotations on classes and methods.
+ * @return The same list.
+ */
+ public <T extends Annotation> List<T> appendAnnotations(List<T> l, Class<T> a, MetaProvider mp) {
for (ClassInfo ci : getParents())
- addIfNotNull(l, ci.getDeclaredAnnotation(a));
+ addIfNotNull(l, mp.getDeclaredAnnotation(a, ci.inner()));
for (ClassInfo ci : getInterfaces())
- addIfNotNull(l, ci.getDeclaredAnnotation(a));
+ addIfNotNull(l, mp.getDeclaredAnnotation(a, ci.inner()));
addIfNotNull(l, getPackageAnnotation(a));
return l;
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
index 776c7b9..61b478c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param soapXmlMetaProvider SOAP/XML metadata provider (for finding information about other artifacts).
+ * @param mp SOAP/XML metadata provider (for finding information about other artifacts).
*/
- public SoapXmlBeanPropertyMeta(BeanPropertyMeta bpm, SoapXmlMetaProvider soapXmlMetaProvider) {
+ public SoapXmlBeanPropertyMeta(BeanPropertyMeta bpm, SoapXmlMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
index 3c47da9..0d38b50 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param soapXmlMetaProvider SOAP/XML metadata provider (for finding information about other artifacts).
+ * @param mp SOAP/XML metadata provider (for finding information about other artifacts).
*/
- public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider soapXmlMetaProvider) {
+ public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider mp) {
super(cm);
- this.soapXml = cm.getInfo().getAnnotation(SoapXml.class);
+ this.soapXml = mp.getAnnotation(SoapXml.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
index f07afb9..4693650 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param uonMetaProvider UON metadata provider (for finding information about other artifacts).
+ * @param mp UON metadata provider (for finding information about other artifacts).
*/
- public UonBeanPropertyMeta(BeanPropertyMeta bpm, UonMetaProvider uonMetaProvider) {
+ public UonBeanPropertyMeta(BeanPropertyMeta bpm, UonMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
index 9ee9da7..48267b6 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param uonMetaProvider Uon metadata provider (for finding information about other artifacts).
+ * @param mp Uon metadata provider (for finding information about other artifacts).
*/
- public UonClassMeta(ClassMeta<?> cm, UonMetaProvider uonMetaProvider) {
+ public UonClassMeta(ClassMeta<?> cm, UonMetaProvider mp) {
super(cm);
- this.uon = cm.getInfo().getAnnotation(Uon.class);
+ this.uon = mp.getAnnotation(Uon.class, cm.getInnerClass());
}
/**
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
index 324dbd6..b5de5d4 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingBeanPropertyMeta.java
@@ -30,9 +30,9 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param urlEncodingMetaProvider URL-Encoding metadata provider (for finding information about other artifacts).
+ * @param mp URL-Encoding metadata provider (for finding information about other artifacts).
*/
- public UrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm, UrlEncodingMetaProvider urlEncodingMetaProvider) {
+ public UrlEncodingBeanPropertyMeta(BeanPropertyMeta bpm, UrlEncodingMetaProvider mp) {
super(bpm);
}
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
index 0b4de2d..aeefe69 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
@@ -27,11 +27,11 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param urlEncodingMetaProvider URL-encoding metadata provider (for finding information about other artifacts).
+ * @param mp URL-encoding metadata provider (for finding information about other artifacts).
*/
- public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider urlEncodingMetaProvider) {
+ public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider mp) {
super(cm);
- this.urlEncoding = cm.getInfo().getAnnotation(UrlEncoding.class);
+ this.urlEncoding = mp.getAnnotation(UrlEncoding.class, cm.getInnerClass());
if (urlEncoding != null) {
expandedParams = urlEncoding.expandedParams();
} else {
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
index d6602d3..7031e12 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/utils/ReflectionMap.java
@@ -26,7 +26,8 @@
public class ReflectionMap<V> {
private final List<ClassEntry<V>> classEntries;
- private final List<MethodEntry<V>> methodEntries;
+ private final List<MemberEntry<V>> memberEntries;
+ private final boolean noClassEntries, noMemberEntries;
/**
* Constructor.
@@ -35,7 +36,9 @@
*/
ReflectionMap(Builder<V> b) {
this.classEntries = Collections.unmodifiableList(new ArrayList<>(b.classEntries));
- this.methodEntries = Collections.unmodifiableList(new ArrayList<>(b.methodEntries));
+ this.memberEntries = Collections.unmodifiableList(new ArrayList<>(b.memberEntries));
+ this.noClassEntries = classEntries.isEmpty();
+ this.noMemberEntries = memberEntries.isEmpty();
}
/**
@@ -56,7 +59,7 @@
*/
public static class Builder<V> {
List<ClassEntry<V>> classEntries = new ArrayList<>();
- List<MethodEntry<V>> methodEntries = new ArrayList<>();
+ List<MemberEntry<V>> memberEntries = new ArrayList<>();
/**
* Adds a mapping to this builder.
@@ -88,7 +91,7 @@
if (Character.isUpperCase(s2.charAt(0))) {
classEntries.add(new ClassEntry<>(s, value));
} else {
- methodEntries.add(new MethodEntry<>(s1, s2, value));
+ memberEntries.add(new MemberEntry<>(s1, s2, value));
}
}
}
@@ -113,7 +116,7 @@
* @return All matching objects. Never <jk>null</jk>.
*/
public List<V> find(Class<?> c) {
- return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).collect(Collectors.toList());
+ return noClassEntries ? Collections.emptyList() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).collect(Collectors.toList());
}
/**
@@ -123,7 +126,7 @@
* @return The matching object. Never <jk>null</jk>.
*/
public Optional<V> findFirst(Class<?> c) {
- return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).findFirst();
+ return noClassEntries ? Optional.empty() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).findFirst();
}
/**
@@ -134,7 +137,7 @@
* @return All matching objects. Never <jk>null</jk>.
*/
public List<V> find(Class<?> c, Class<? extends V> ofType) {
- return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
+ return noClassEntries ? Collections.emptyList() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
}
/**
@@ -145,7 +148,7 @@
* @return The matching object. Never <jk>null</jk>.
*/
public Optional<V> findFirst(Class<?> c, Class<? extends V> ofType) {
- return classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
+ return noClassEntries ? Optional.empty() : classEntries.stream().filter(x -> x.matches(c)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
}
/**
@@ -154,8 +157,8 @@
* @param m The method to test for.
* @return All matching objects. Never <jk>null</jk>.
*/
- public List<V> find(Method m) {
- return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).collect(Collectors.toList());
+ public List<V> find(Member m) {
+ return noMemberEntries ? Collections.emptyList() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).collect(Collectors.toList());
}
/**
@@ -164,8 +167,8 @@
* @param m The method to test for.
* @return The matching object. Never <jk>null</jk>.
*/
- public Optional<V> findFirst(Method m) {
- return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).findFirst();
+ public Optional<V> findFirst(Member m) {
+ return noMemberEntries ? Optional.empty() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).findFirst();
}
/**
@@ -175,8 +178,8 @@
* @param ofType Only return objects of the specified type.
* @return All matching objects. Never <jk>null</jk>.
*/
- public List<V> find(Method m, Class<? extends V> ofType) {
- return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
+ public List<V> find(Member m, Class<? extends V> ofType) {
+ return noMemberEntries ? Collections.emptyList() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).collect(Collectors.toList());
}
/**
@@ -186,8 +189,8 @@
* @param ofType Only return objects of the specified type.
* @return The matching object. Never <jk>null</jk>.
*/
- public Optional<V> findFirst(Method m, Class<? extends V> ofType) {
- return methodEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
+ public Optional<V> findFirst(Member m, Class<? extends V> ofType) {
+ return noMemberEntries ? Optional.empty() : memberEntries.stream().filter(x -> x.matches(m)).map(x -> x.value).filter(x -> ofType.isInstance(x)).findFirst();
}
static class ClassEntry<V> {
@@ -204,17 +207,17 @@
}
}
- static class MethodEntry<V> {
+ static class MemberEntry<V> {
String className, methodName;
V value;
- MethodEntry(String className, String methodName, V value) {
+ MemberEntry(String className, String methodName, V value) {
this.className = className;
this.methodName = methodName;
this.value = value;
}
- public boolean matches(Method m) {
+ public boolean matches(Member m) {
if (m == null)
return false;
Class<?> c = m.getDeclaringClass();
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
index 9924b2e..e92da24 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
@@ -38,13 +38,13 @@
* Constructor.
*
* @param beanMeta The metadata on the bean that this metadata applies to.
- * @param xmlMetaProvider XML metadata provider (for finding information about other artifacts).
+ * @param mp XML metadata provider (for finding information about other artifacts).
*/
- public XmlBeanMeta(BeanMeta<?> beanMeta, XmlMetaProvider xmlMetaProvider) {
+ public XmlBeanMeta(BeanMeta<?> beanMeta, XmlMetaProvider mp) {
super(beanMeta);
Class<?> c = beanMeta.getClassMeta().getInnerClass();
- XmlBeanMetaBuilder b = new XmlBeanMetaBuilder(beanMeta, xmlMetaProvider);
+ XmlBeanMetaBuilder b = new XmlBeanMetaBuilder(beanMeta, mp);
attrs = unmodifiableMap(b.attrs);
elements = unmodifiableMap(b.elements);
@@ -77,9 +77,9 @@
contentProperty;
XmlFormat contentFormat = DEFAULT;
- XmlBeanMetaBuilder(BeanMeta<?> beanMeta, XmlMetaProvider xmlMetaProvider) {
+ XmlBeanMetaBuilder(BeanMeta<?> beanMeta, XmlMetaProvider mp) {
Class<?> c = beanMeta.getClassMeta().getInnerClass();
- Xml xml = c.getAnnotation(Xml.class);
+ Xml xml = mp.getAnnotation(Xml.class, c);
XmlFormat defaultFormat = null;
if (xml != null) {
@@ -97,7 +97,7 @@
}
for (BeanPropertyMeta p : beanMeta.getPropertyMetas()) {
- XmlFormat xf = xmlMetaProvider.getXmlBeanPropertyMeta(p).getXmlFormat();
+ XmlFormat xf = mp.getXmlBeanPropertyMeta(p).getXmlFormat();
ClassMeta<?> pcm = p.getClassMeta();
if (xf == ATTR) {
attrs.put(p.getName(), p);
@@ -128,7 +128,7 @@
contentFormat = xf;
}
// Look for any properties that are collections with @Xml.childName specified.
- String n = xmlMetaProvider.getXmlBeanPropertyMeta(p).getChildName();
+ String n = mp.getXmlBeanPropertyMeta(p).getChildName();
if (n != null) {
if (collapsedProperties.containsKey(n) && collapsedProperties.get(n) != p)
throw new BeanRuntimeException(c, "Multiple properties found with the child name ''{0}''.", n);
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
index 1a979c4..87185bc 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanPropertyMeta.java
@@ -37,21 +37,21 @@
* Constructor.
*
* @param bpm The metadata of the bean property of this additional metadata.
- * @param xmlMetaProvider XML metadata provider (for finding information about other artifacts).
+ * @param mp XML metadata provider (for finding information about other artifacts).
*/
- public XmlBeanPropertyMeta(BeanPropertyMeta bpm, XmlMetaProvider xmlMetaProvider) {
+ public XmlBeanPropertyMeta(BeanPropertyMeta bpm, XmlMetaProvider mp) {
super(bpm);
- this.xmlMetaProvider = xmlMetaProvider;
+ this.xmlMetaProvider = mp;
if (bpm.getInnerField() != null)
- findXmlInfo(bpm.getInnerField().getAnnotation(Xml.class));
+ findXmlInfo(mp.getAnnotation(Xml.class, bpm.getInnerField()), mp);
if (bpm.getGetter() != null)
- findXmlInfo(bpm.getGetter().getAnnotation(Xml.class));
+ findXmlInfo(mp.getAnnotation(Xml.class, bpm.getGetter()), mp);
if (bpm.getSetter() != null)
- findXmlInfo(bpm.getSetter().getAnnotation(Xml.class));
+ findXmlInfo(mp.getAnnotation(Xml.class, bpm.getSetter()), mp);
if (namespace == null)
- namespace = xmlMetaProvider.getXmlClassMeta(bpm.getBeanMeta().getClassMeta()).getNamespace();
+ namespace = mp.getXmlClassMeta(bpm.getBeanMeta().getClassMeta()).getNamespace();
}
private XmlBeanPropertyMeta() {
@@ -100,7 +100,7 @@
return childName;
}
- private void findXmlInfo(Xml xml) {
+ private void findXmlInfo(Xml xml, MetaProvider mp) {
if (xml == null)
return;
BeanPropertyMeta bpm = getBeanPropertyMeta();
@@ -108,8 +108,8 @@
ClassMeta<?> cmBean = bpm.getBeanMeta().getClassMeta();
String name = bpm.getName();
- List<Xml> xmls = bpm.findAnnotations(Xml.class);
- List<XmlSchema> schemas = bpm.findAnnotations(XmlSchema.class);
+ List<Xml> xmls = bpm.findAnnotations(Xml.class, mp);
+ List<XmlSchema> schemas = bpm.findAnnotations(XmlSchema.class, mp);
namespace = XmlUtils.findNamespace(xmls, schemas);
if (xmlFormat == XmlFormat.DEFAULT)
diff --git a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
index 3d111ee..9cf999d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlClassMeta.java
@@ -35,12 +35,12 @@
* Constructor.
*
* @param cm The class that this annotation is defined on.
- * @param xmlMetaProvider XML metadata provider (for finding information about other artifacts).
+ * @param mp XML metadata provider (for finding information about other artifacts).
*/
- public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider xmlMetaProvider) {
+ public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider mp) {
super(cm);
- this.namespace = findNamespace(cm);
- this.xml = cm.getInfo().getAnnotation(Xml.class);
+ this.namespace = findNamespace(cm, mp);
+ this.xml = mp.getAnnotation(Xml.class, cm.getInnerClass());
if (xml != null) {
this.format = xml.format();
this.childName = nullIfEmpty(xml.childName());
@@ -99,12 +99,12 @@
return namespace;
}
- private static Namespace findNamespace(ClassMeta<?> cm) {
+ private static Namespace findNamespace(ClassMeta<?> cm, MetaProvider mp) {
if (cm == null)
return null;
ClassInfo ci = cm.getInfo();
- List<Xml> xmls = ci.getAnnotations(Xml.class);
- List<XmlSchema> schemas = ci.getAnnotations(XmlSchema.class);
+ List<Xml> xmls = ci.getAnnotations(Xml.class, mp);
+ List<XmlSchema> schemas = ci.getAnnotations(XmlSchema.class, mp);
return XmlUtils.findNamespace(xmls, schemas);
}
}