This is an automated email from the ASF dual-hosted git repository.

jamesbognar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/juneau.git


The following commit(s) were added to refs/heads/master by this push:
     new 0015190  Fix other locations that aren't search for all annotations.
0015190 is described below

commit 0015190a16d0ed612e18073967d78068145dc8d8
Author: JamesBognar <[email protected]>
AuthorDate: Thu Mar 12 14:30:47 2020 -0400

    Fix other locations that aren't search for all annotations.
---
 .../java/org/apache/juneau/jena/RdfClassMeta.java  | 27 +++++++--------
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  4 +--
 .../src/main/java/org/apache/juneau/ClassMeta.java | 16 ++-------
 .../java/org/apache/juneau/csv/CsvClassMeta.java   | 14 ++++----
 .../java/org/apache/juneau/html/HtmlClassMeta.java | 39 +++++++++++++---------
 .../org/apache/juneau/html/HtmlParserSession.java  | 12 +++++--
 .../apache/juneau/html/HtmlSerializerSession.java  | 13 ++++++--
 .../juneau/httppart/bean/RequestBeanMeta.java      |  2 +-
 .../java/org/apache/juneau/jso/JsoClassMeta.java   | 14 ++++----
 .../java/org/apache/juneau/json/JsonClassMeta.java | 25 +++++++-------
 .../juneau/jsonschema/JsonSchemaClassMeta.java     |  6 ++--
 .../jsonschema/JsonSchemaGeneratorSession.java     |  2 +-
 .../apache/juneau/msgpack/MsgPackClassMeta.java    | 14 ++++----
 .../org/apache/juneau/oapi/OpenApiClassMeta.java   | 14 ++++----
 .../juneau/plaintext/PlainTextClassMeta.java       | 14 ++++----
 .../org/apache/juneau/soap/SoapXmlClassMeta.java   | 14 ++++----
 .../java/org/apache/juneau/uon/UonClassMeta.java   | 14 ++++----
 .../juneau/urlencoding/UrlEncodingClassMeta.java   | 26 +++++++++------
 .../java/org/apache/juneau/xml/XmlClassMeta.java   | 34 +++++++++----------
 .../org/apache/juneau/rest/client/RestCall.java    |  2 +-
 20 files changed, 168 insertions(+), 138 deletions(-)

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 5565c5d..fb57c7a 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
@@ -24,7 +24,7 @@ import org.apache.juneau.xml.*;
  */
 public class RdfClassMeta extends ExtendedClassMeta {
 
-       private final Rdf rdf;
+       private final List<Rdf> rdfs;
        private final RdfCollectionFormat collectionFormat;
        private final Namespace namespace;
 
@@ -36,24 +36,25 @@ public class RdfClassMeta extends ExtendedClassMeta {
         */
        public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider mp) {
                super(cm);
-               this.rdf = cm.getAnnotation(Rdf.class);
-               if (rdf != null) {
-                       collectionFormat = rdf.collectionFormat();
-               } else {
-                       collectionFormat = RdfCollectionFormat.DEFAULT;
-               }
-               List<Rdf> rdfs = cm.getAnnotationsParentFirst(Rdf.class);
-               List<RdfSchema> schemas = 
cm.getAnnotationsParentFirst(RdfSchema.class);
+               this.rdfs = cm.getAnnotations(Rdf.class);
+
+               RdfCollectionFormat _collectionFormat = 
RdfCollectionFormat.DEFAULT;
+               for (Rdf a : rdfs)
+                       if (a.collectionFormat() != RdfCollectionFormat.DEFAULT)
+                               _collectionFormat = a.collectionFormat();
+               this.collectionFormat = _collectionFormat;
+               
+               List<RdfSchema> schemas = cm.getAnnotations(RdfSchema.class);
                this.namespace = RdfUtils.findNamespace(rdfs, schemas);
        }
 
        /**
-        * Returns the {@link Rdf @Rdf} annotation defined on the class.
+        * Returns the {@link Rdf @Rdf} annotations defined on the class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if annotation 
is not specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Rdf getAnnotation() {
-               return rdf;
+       protected List<Rdf> getAnnotations() {
+               return rdfs;
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
index f24f082..fb2d70b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMeta.java
@@ -180,14 +180,14 @@ public class BeanMeta<T> {
                                        
bdClasses.addAll(Arrays.asList(beanFilter.getBeanDictionary()));
 
                                boolean hasTypeName = false;
-                               for (Bean b : 
classMeta.getAnnotationsParentFirst(Bean.class))
+                               for (Bean b : 
classMeta.getAnnotations(Bean.class))
                                        if (! b.typeName().isEmpty())
                                                hasTypeName = true;
                                if (hasTypeName)
                                        bdClasses.add(classMeta.innerClass);
                                this.beanRegistry = new BeanRegistry(ctx, null, 
bdClasses.toArray(new Class<?>[bdClasses.size()]));
 
-                               for (Bean b : 
classMeta.getAnnotationsParentFirst(Bean.class))
+                               for (Bean b : 
classMeta.getAnnotations(Bean.class))
                                        if (! b.typePropertyName().isEmpty())
                                                typePropertyName = 
b.typePropertyName();
                                if (typePropertyName == null)
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 2e68f3d..99b139d 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -2040,7 +2040,7 @@ public final class ClassMeta<T> implements Type {
         * @return <jk>true</jk> if the inner class has the annotation.
         */
        public boolean hasAnnotation(Class<? extends Annotation> a) {
-               return getAnnotation(a) != null;
+               return getLastAnnotation(a) != null;
        }
 
        /**
@@ -2049,21 +2049,11 @@ public final class ClassMeta<T> implements Type {
         * @param a The annotation to retrieve.
         * @return The specified annotation, or <jk>null</jk> if the class does 
not have the specified annotation.
         */
-       public <A extends Annotation> A getAnnotation(Class<A> a) {
+       public <A extends Annotation> A getLastAnnotation(Class<A> a) {
                return info.getLastAnnotation(a, beanContext == null ? 
BeanContext.DEFAULT : beanContext);
        }
 
        /**
-        * Returns the declared annotation defined on this class.
-        *
-        * @param a The annotation to retrieve.
-        * @return The specified annotation, or <jk>null</jk> if the class does 
not have the specified annotation.
-        */
-//     public <A extends Annotation> A getDeclaredAnnotation(Class<A> a) {
-//             return info.getDeclaredAnnotation(a, beanContext == null ? 
BeanContext.DEFAULT : beanContext);
-//     }
-
-       /**
         * Returns all annotations of the specified type defined on the 
specified class or parent classes/interfaces in parent-to-child order.
         *
         * @param a
@@ -2071,7 +2061,7 @@ public final class ClassMeta<T> implements Type {
         * @return
         *      A list of all matching annotations found or an empty list if 
none found.
         */
-       public <A extends Annotation> List<A> 
getAnnotationsParentFirst(Class<A> a) {
+       public <A extends Annotation> List<A> getAnnotations(Class<A> a) {
                return info.getAnnotations(a, beanContext == null ? 
BeanContext.DEFAULT : beanContext);
        }
 
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 8ca7f3a..bcb1c31 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.csv;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.csv.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.csv.annotation.*;
  */
 public class CsvClassMeta extends ExtendedClassMeta {
 
-       private final Csv csv;
+       private final List<Csv> csvs;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class CsvClassMeta extends ExtendedClassMeta {
         */
        public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider mp) {
                super(cm);
-               this.csv = cm.getAnnotation(Csv.class);
+               this.csvs = cm.getAnnotations(Csv.class);
        }
 
        /**
-        * Returns the {@link Csv @Csv} annotation defined on the class.
+        * Returns the {@link Csv @Csv} annotations defined on the class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Csv getAnnotation() {
-               return csv;
+       protected List<Csv> getAnnotation() {
+               return csvs;
        }
 }
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 260c3b6..411fcc3 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
@@ -14,6 +14,8 @@ package org.apache.juneau.html;
 
 import static org.apache.juneau.internal.ClassUtils.*;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.html.annotation.*;
 
@@ -23,7 +25,7 @@ import org.apache.juneau.html.annotation.*;
  */
 public class HtmlClassMeta extends ExtendedClassMeta {
 
-       private final Html html;
+       private final List<Html> htmls;
        private final boolean noTables, noTableHeaders;
        private final HtmlFormat format;
        private final HtmlRender<?> render;
@@ -36,27 +38,32 @@ public class HtmlClassMeta extends ExtendedClassMeta {
         */
        public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider mp) {
                super(cm);
-               this.html = cm.getAnnotation(Html.class);
-               if (html != null) {
-                       format = html.format();
-                       noTables = html.noTables();
-                       noTableHeaders = html.noTableHeaders();
-                       render = castOrCreate(HtmlRender.class, html.render());
-               } else {
-                       format = HtmlFormat.HTML;
-                       noTables = false;
-                       noTableHeaders = false;
-                       render = null;
+               this.htmls = cm.getAnnotations(Html.class);
+
+               boolean _noTables = false, _noTableHeaders = false;
+               HtmlRender<?> _render = null;
+               HtmlFormat _format = HtmlFormat.HTML;
+
+               for (Html a : this.htmls) {
+                       _format = a.format();
+                       _noTables = a.noTables();
+                       _noTableHeaders = a.noTableHeaders();
+                       _render = castOrCreate(HtmlRender.class, a.render());
                }
+
+               this.noTables = _noTables;
+               this.noTableHeaders = _noTableHeaders;
+               this.render = _render;
+               this.format = _format;
        }
 
        /**
-        * Returns the {@link Html @Html} annotation defined on the class.
+        * Returns the {@link Html @Html} annotations defined on the class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Html getAnnotation() {
-               return html;
+       protected List<Html> getAnnotations() {
+               return htmls;
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
index 6ab799b..dc00be3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlParserSession.java
@@ -317,10 +317,16 @@ public final class HtmlParserSession extends 
XmlParserSession {
                String href = r.getAttributeValue(null, "href");
                String name = getElementText(r);
                if (beanType.hasAnnotation(HtmlLink.class)) {
-                       HtmlLink h = beanType.getAnnotation(HtmlLink.class);
+                       String uriProperty = "", nameProperty = "";
+                       for (HtmlLink a : 
beanType.getAnnotations(HtmlLink.class)) {
+                               if (! a.uriProperty().isEmpty())
+                                       uriProperty = a.uriProperty();
+                               if (! a.nameProperty().isEmpty())
+                                       nameProperty = a.nameProperty();
+                       }
                        BeanMap<T> m = newBeanMap(beanType.getInnerClass());
-                       m.put(h.uriProperty(), href);
-                       m.put(h.nameProperty(), name);
+                       m.put(uriProperty, href);
+                       m.put(nameProperty, name);
                        return m.getBean();
                }
                return convertToType(href, beanType);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index be185ca..72dac32 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
@@ -347,9 +347,16 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                        } else if (sType.isBean()) {
                                BeanMap m = toBeanMap(o);
                                if (aType.hasAnnotation(HtmlLink.class)) {
-                                       HtmlLink h = 
aType.getAnnotation(HtmlLink.class);
-                                       Object urlProp = m.get(h.uriProperty());
-                                       Object nameProp = 
m.get(h.nameProperty());
+                                       String uriProperty = "", nameProperty = 
"";
+                                       for (HtmlLink a : 
aType.getAnnotations(HtmlLink.class)) {
+                                               if (! a.uriProperty().isEmpty())
+                                                       uriProperty = 
a.uriProperty();
+                                               if (! 
a.nameProperty().isEmpty())
+                                                       nameProperty = 
a.nameProperty();
+                                       }
+                                       Object urlProp = m.get(uriProperty);
+                                       Object nameProp = m.get(nameProperty);
+
                                        out.oTag("a").attrUri("href", 
urlProp).append('>').text(nameProp).eTag("a");
                                        cr = CR_MIXED;
                                } else {
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
index dfc6c5c..395724d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
@@ -96,7 +96,7 @@ public class RequestBeanMeta {
 
                Builder apply(Class<?> c) {
                        this.cm = BeanContext.DEFAULT.getClassMeta(c);
-                       apply(cm.getAnnotation(Request.class));
+                       apply(cm.getLastAnnotation(Request.class));
                        for (MethodInfo m : cm.getInfo().getAllMethods()) {
 
                                if (m.isPublic()) {
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 d43432d..82e8ffb 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.jso;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.jso.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.jso.annotation.*;
  */
 public class JsoClassMeta extends ExtendedClassMeta {
 
-       private final Jso jso;
+       private final List<Jso> jsos;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class JsoClassMeta extends ExtendedClassMeta {
         */
        public JsoClassMeta(ClassMeta<?> cm, JsoMetaProvider mp) {
                super(cm);
-               this.jso = cm.getAnnotation(Jso.class);
+               this.jsos = cm.getAnnotations(Jso.class);
        }
 
        /**
-        * Returns the {@link Jso @Jso} annotation defined on the class.
+        * Returns the {@link Jso @Jso} annotations defined on the class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Jso getAnnotation() {
-               return jso;
+       protected List<Jso> getAnnotations() {
+               return jsos;
        }
 }
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 69dcdeb..362924a 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
@@ -12,7 +12,7 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.json;
 
-import static org.apache.juneau.internal.StringUtils.*;
+import java.util.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.json.annotation.*;
@@ -23,7 +23,7 @@ import org.apache.juneau.json.annotation.*;
  */
 public class JsonClassMeta extends ExtendedClassMeta {
 
-       private final Json json;
+       private final List<Json> jsons;
        private final String wrapperAttr;
 
        /**
@@ -34,21 +34,22 @@ public class JsonClassMeta extends ExtendedClassMeta {
         */
        public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider mp) {
                super(cm);
-               this.json = cm.getAnnotation(Json.class);
-               if (json != null) {
-                       wrapperAttr = nullIfEmpty(json.wrapperAttr());
-               } else {
-                       wrapperAttr = null;
-               }
+               this.jsons = cm.getAnnotations(Json.class);
+               
+               String _wrapperAttr = null;
+               for (Json a : this.jsons)
+                       if (! a.wrapperAttr().isEmpty())
+                               _wrapperAttr = a.wrapperAttr();
+               this.wrapperAttr = _wrapperAttr;
        }
 
        /**
-        * Returns the {@link Json @Json} annotation defined on the class.
+        * Returns the {@link Json @Json} annotations defined on the class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Json getAnnotation() {
-               return json;
+       protected List<Json> getAnnotations() {
+               return jsons;
        }
 
        /**
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 5016ecb..66ed5e4 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
@@ -22,7 +22,7 @@ import org.apache.juneau.parser.*;
  */
 public class JsonSchemaClassMeta extends ExtendedClassMeta {
 
-       private final ObjectMap schema;
+       private final ObjectMap schema = new ObjectMap();
 
        /**
         * Constructor.
@@ -33,8 +33,8 @@ public class JsonSchemaClassMeta extends ExtendedClassMeta {
        public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider mp) {
                super(cm);
                try {
-                       Schema s = cm.getAnnotation(Schema.class);
-                       schema = s == null ? ObjectMap.EMPTY_MAP : 
SchemaUtils.asMap(s);
+                       for (Schema a : cm.getAnnotations(Schema.class))
+                               schema.appendAll(SchemaUtils.asMap(a));
                } catch (ParseException e) {
                        throw new RuntimeException(e);
                }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index 016a427..e3fc56b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -140,7 +140,7 @@ public class JsonSchemaGeneratorSession extends 
BeanTraverseSession {
 
                JsonSchemaClassMeta jscm = null;
                ClassMeta pojoSwapCM = pojoSwap == null ? null : 
getClassMeta(pojoSwap.getClass());
-               if (pojoSwapCM != null && 
pojoSwapCM.getAnnotation(Schema.class) != null)
+               if (pojoSwapCM != null && 
pojoSwapCM.hasAnnotation(Schema.class))
                        jscm = getJsonSchemaClassMeta(pojoSwapCM);
                if (jscm == null)
                        jscm = getJsonSchemaClassMeta(sType);
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 662db82..7f6532b 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.msgpack;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.msgpack.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.msgpack.annotation.*;
  */
 public class MsgPackClassMeta extends ExtendedClassMeta {
 
-       private final MsgPack msgPack;
+       private final List<MsgPack> msgPacks;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class MsgPackClassMeta extends ExtendedClassMeta {
         */
        public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider mp) {
                super(cm);
-               this.msgPack = cm.getAnnotation(MsgPack.class);
+               this.msgPacks = cm.getAnnotations(MsgPack.class);
        }
 
        /**
-        * Returns the {@link MsgPack @MsgPack} annotation defined on the class.
+        * Returns the {@link MsgPack @MsgPack} annotations defined on the 
class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected MsgPack getAnnotation() {
-               return msgPack;
+       protected List<MsgPack> getAnnotations() {
+               return msgPacks;
        }
 }
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 0cba4ba..86d5dd9 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.oapi;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.oapi.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.oapi.annotation.*;
  */
 public class OpenApiClassMeta extends ExtendedClassMeta {
 
-       private final OpenApi openApi;
+       private final List<OpenApi> openApis;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class OpenApiClassMeta extends ExtendedClassMeta {
         */
        public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider mp) {
                super(cm);
-               this.openApi = cm.getAnnotation(OpenApi.class);
+               this.openApis = cm.getAnnotations(OpenApi.class);
        }
 
        /**
-        * Returns the {@link OpenApi @OpenApi} annotation defined on the class.
+        * Returns the {@link OpenApi @OpenApi} annotations defined on the 
class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected OpenApi getAnnotation() {
-               return openApi;
+       protected List<OpenApi> getAnnotations() {
+               return openApis;
        }
 }
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 fda5b6d..fef29ca 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.plaintext;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.plaintext.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.plaintext.annotation.*;
  */
 public class PlainTextClassMeta extends ExtendedClassMeta {
 
-       private final PlainText plainText;
+       private final List<PlainText> plainTexts;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class PlainTextClassMeta extends ExtendedClassMeta {
         */
        public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider mp) {
                super(cm);
-               this.plainText = cm.getAnnotation(PlainText.class);
+               this.plainTexts = cm.getAnnotations(PlainText.class);
        }
 
        /**
-        * Returns the {@link PlainText @PlainText} annotation defined on the 
class.
+        * Returns the {@link PlainText @PlainText} annotations defined on the 
class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected PlainText getAnnotation() {
-               return plainText;
+       protected List<PlainText> getAnnotations() {
+               return plainTexts;
        }
 }
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 e542343..c239d19 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.soap;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.soap.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.soap.annotation.*;
  */
 public class SoapXmlClassMeta extends ExtendedClassMeta {
 
-       private final SoapXml soapXml;
+       private final List<SoapXml> soapXmls;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class SoapXmlClassMeta extends ExtendedClassMeta {
         */
        public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider mp) {
                super(cm);
-               this.soapXml = cm.getAnnotation(SoapXml.class);
+               this.soapXmls = cm.getAnnotations(SoapXml.class);
        }
 
        /**
-        * Returns the {@link SoapXml @SoapXml} annotation defined on the class.
+        * Returns the {@link SoapXml @SoapXml} annotations defined on the 
class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected SoapXml getAnnotation() {
-               return soapXml;
+       protected List<SoapXml> getAnnotations() {
+               return soapXmls;
        }
 }
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 3da35da..734d0247 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.uon;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.uon.annotation.*;
 
@@ -21,7 +23,7 @@ import org.apache.juneau.uon.annotation.*;
  */
 public class UonClassMeta extends ExtendedClassMeta {
 
-       private final Uon uon;
+       private final List<Uon> uons;
 
        /**
         * Constructor.
@@ -31,15 +33,15 @@ public class UonClassMeta extends ExtendedClassMeta {
         */
        public UonClassMeta(ClassMeta<?> cm, UonMetaProvider mp) {
                super(cm);
-               this.uon = cm.getAnnotation(Uon.class);
+               this.uons = cm.getAnnotations(Uon.class);
        }
 
        /**
-        * Returns the {@link Uon @Uon} annotation defined on the class.
+        * Returns the {@link Uon @Uon} annotations defined on the class.
         *
-        * @return The value of the annotation, or <jk>null</jk> if not 
specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Uon getAnnotation() {
-               return uon;
+       protected List<Uon> getAnnotations() {
+               return uons;
        }
 }
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 c50ec0e..6be519d 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
@@ -12,6 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.urlencoding;
 
+import java.util.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.urlencoding.annotation.*;
 
@@ -20,7 +22,7 @@ import org.apache.juneau.urlencoding.annotation.*;
  */
 public class UrlEncodingClassMeta extends ExtendedClassMeta {
 
-       private final UrlEncoding urlEncoding;
+       private final List<UrlEncoding> urlEncodings;
        private final boolean expandedParams;
 
        /**
@@ -31,21 +33,23 @@ public class UrlEncodingClassMeta extends ExtendedClassMeta 
{
         */
        public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider 
mp) {
                super(cm);
-               this.urlEncoding = cm.getAnnotation(UrlEncoding.class);
-               if (urlEncoding != null) {
-                       expandedParams = urlEncoding.expandedParams();
-               } else {
-                       expandedParams = false;
-               }
+               this.urlEncodings = cm.getAnnotations(UrlEncoding.class);
+
+               boolean _expandedParams = false;
+               for (UrlEncoding a : urlEncodings)
+                       if (a.expandedParams())
+                               _expandedParams = true;
+
+               this.expandedParams = _expandedParams;
        }
 
        /**
-        * Returns the {@link UrlEncoding} annotation defined on the class.
+        * Returns the {@link UrlEncoding} annotations defined on the class.
         *
-        * @return The value of the {@link UrlEncoding} annotation, or 
<jk>null</jk> if annotation is not specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected UrlEncoding getAnnotation() {
-               return urlEncoding;
+       protected List<UrlEncoding> getAnnotations() {
+               return urlEncodings;
        }
 
        /**
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 bf1e0af..2ada7dc 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
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.xml;
 
-import static org.apache.juneau.internal.StringUtils.*;
-
 import java.util.*;
 
 import org.apache.juneau.*;
@@ -26,7 +24,7 @@ import org.apache.juneau.xml.annotation.*;
 public class XmlClassMeta extends ExtendedClassMeta {
 
        private final Namespace namespace;
-       private final Xml xml;
+       private final List<Xml> xmls;
        private final XmlFormat format;
        private final String childName;
 
@@ -39,25 +37,27 @@ public class XmlClassMeta extends ExtendedClassMeta {
        public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider mp) {
                super(cm);
                this.namespace = findNamespace(cm, mp);
-               this.xml = cm.getAnnotation(Xml.class);
-               if (xml != null) {
-                       this.format = xml.format();
-                       this.childName = nullIfEmpty(xml.childName());
+               this.xmls = cm.getAnnotations(Xml.class);
 
-               } else {
-                       this.format = XmlFormat.DEFAULT;
-                       this.childName = null;
+               String _childName = null;
+               XmlFormat _format = XmlFormat.DEFAULT;
+               for (Xml a : xmls) {
+                       if (a.format() != XmlFormat.DEFAULT)
+                               _format = a.format();
+                       if (! a.childName().isEmpty())
+                               _childName = a.childName();
                }
+               this.format = _format;
+               this.childName = _childName;
        }
 
        /**
-        * Returns the {@link Xml @Xml} annotation defined on the class.
+        * Returns the {@link Xml @Xml} annotations defined on the class.
         *
-        * @return
-        *      The value of the annotation defined on the class, or 
<jk>null</jk> if annotation is not specified.
+        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
         */
-       protected Xml getAnnotation() {
-               return xml;
+       protected List<Xml> getAnnotations() {
+               return xmls;
        }
 
        /**
@@ -101,8 +101,8 @@ public class XmlClassMeta extends ExtendedClassMeta {
        private static Namespace findNamespace(ClassMeta<?> cm, MetaProvider 
mp) {
                if (cm == null)
                        return null;
-               List<Xml> xmls = cm.getAnnotationsParentFirst(Xml.class);
-               List<XmlSchema> schemas = 
cm.getAnnotationsParentFirst(XmlSchema.class);
+               List<Xml> xmls = cm.getAnnotations(Xml.class);
+               List<XmlSchema> schemas = cm.getAnnotations(XmlSchema.class);
                return XmlUtils.findNamespace(xmls, schemas);
        }
 }
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
index 358fe1f..164b6a1 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestCall.java
@@ -1688,7 +1688,7 @@ public final class RestCall extends BeanSession 
implements Closeable {
 
                        int[] expected = new int[0];
                        if (bodyType != null && 
bodyType.hasAnnotation(Response.class))
-                               expected = 
bodyType.getAnnotation(Response.class).code();
+                               expected = 
bodyType.getLastAnnotation(Response.class).code();
 
                        if (sc >= 400 && ! ignoreErrors && ! 
ArrayUtils.contains(sc, expected)) {
                                throw new RestCallException(sc, 
sl.getReasonPhrase(), method, request.getURI(), getResponseAsString())

Reply via email to