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 5847ffe  ClassInfo refactoring.
5847ffe is described below

commit 5847ffe065506a81bd3f310bb180fc3170e874b8
Author: JamesBognar <[email protected]>
AuthorDate: Sat Jan 29 16:08:09 2022 -0500

    ClassInfo refactoring.
---
 .../java/org/apache/juneau/jena/RdfClassMeta.java  |   4 +-
 .../src/main/java/org/apache/juneau/BeanMeta.java  |   5 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |  13 +-
 .../src/main/java/org/apache/juneau/Value.java     |  16 ---
 .../main/java/org/apache/juneau/cp/BeanStore.java  |  13 --
 .../main/java/org/apache/juneau/cp/Messages.java   |  11 ++
 .../java/org/apache/juneau/html/HtmlClassMeta.java |  11 +-
 .../org/apache/juneau/html/HtmlParserSession.java  |   4 +-
 .../apache/juneau/html/HtmlSerializerSession.java  |   4 +-
 .../java/org/apache/juneau/http/HttpParts.java     |  17 ++-
 .../juneau/http/annotation/FormDataAnnotation.java |  10 +-
 .../juneau/http/annotation/HeaderAnnotation.java   |   9 +-
 .../juneau/http/annotation/PathAnnotation.java     |  10 +-
 .../juneau/http/annotation/QueryAnnotation.java    |  10 +-
 .../juneau/http/remote/RrpcInterfaceMeta.java      |   2 +-
 .../org/apache/juneau/httppart/HttpPartSchema.java |   2 +-
 .../juneau/httppart/bean/ResponseBeanMeta.java     |   4 +-
 .../java/org/apache/juneau/json/JsonClassMeta.java |   5 +-
 .../juneau/jsonschema/JsonSchemaClassMeta.java     |   2 +-
 .../org/apache/juneau/reflect/AnnotationInfo.java  |  24 ++++
 .../java/org/apache/juneau/reflect/ClassInfo.java  | 149 ++++++++++++---------
 .../org/apache/juneau/reflect/ConstructorInfo.java |  17 ++-
 .../java/org/apache/juneau/reflect/FieldInfo.java  |  24 ++++
 .../java/org/apache/juneau/reflect/MethodInfo.java |  91 +++++++++----
 .../java/org/apache/juneau/reflect/Mutaters.java   |   2 +-
 .../java/org/apache/juneau/reflect/ParamInfo.java  |  60 ++++++---
 .../java/org/apache/juneau/swap/DefaultSwaps.java  |   2 +-
 .../juneau/urlencoding/UrlEncodingClassMeta.java   |   2 +-
 .../java/org/apache/juneau/xml/XmlClassMeta.java   |   4 +-
 .../java/org/apache/juneau/rest/RestContext.java   |  10 +-
 .../juneau/rest/annotation/RestAnnotation.java     |   3 +-
 .../org/apache/juneau/rest/arg/AttributeArg.java   |  11 +-
 .../apache/juneau/rest/servlet/RestServlet.java    |   2 +-
 .../rest/swagger/BasicSwaggerProviderSession.java  |  60 ++++-----
 .../apache/juneau/reflection/ClassInfoTest.java    |  22 ---
 .../apache/juneau/reflection/MethodInfoTest.java   |   9 --
 .../juneau/rest/annotation/Rest_Messages_Test.java |  14 --
 37 files changed, 355 insertions(+), 303 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 bf39ee2..e4e70b9 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
@@ -42,8 +42,8 @@ public class RdfClassMeta extends ExtendedClassMeta {
                super(cm);
                List<Rdf> rdfs = new ArrayList<>();
                List<RdfSchema> schemas = new ArrayList<>();
-               cm.getAnnotations(Rdf.class, x -> rdfs.add(x));
-               cm.getAnnotations(RdfSchema.class, x -> schemas.add(x));
+               cm.getAnnotations(Rdf.class, x -> true, x -> rdfs.add(x));
+               cm.getAnnotations(RdfSchema.class, x -> true, x -> 
schemas.add(x));
 
                RdfCollectionFormat _collectionFormat = 
RdfCollectionFormat.DEFAULT;
                for (Rdf a : 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 f7f712e..a86c540 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
@@ -24,7 +24,6 @@ import java.lang.reflect.*;
 import java.util.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 
 /**
@@ -180,13 +179,13 @@ public class BeanMeta<T> {
                                        
bdClasses.a(beanFilter.getBeanDictionary());
 
                                Value<String> typeName = Value.empty();
-                               classMeta.getAnnotations(Bean.class, x -> 
typeName.setIf(x.typeName(), StringUtils::isNotEmpty));
+                               classMeta.getAnnotations(Bean.class, x -> 
isNotEmpty(x.typeName()), x -> typeName.set(x.typeName()));
                                if (typeName.isPresent())
                                        bdClasses.add(classMeta.innerClass);
                                this.beanRegistry = new BeanRegistry(ctx, null, 
bdClasses.toArray(new Class<?>[bdClasses.size()]));
 
                                Value<String> typePropertyName = Value.empty();
-                               classMeta.getAnnotations(Bean.class, x -> 
typePropertyName.setIf(x.typePropertyName(), StringUtils::isNotEmpty));
+                               classMeta.getAnnotations(Bean.class, x -> 
isNotEmpty(x.typePropertyName()), x -> 
typePropertyName.set(x.typePropertyName()));
                                this.typePropertyName = 
typePropertyName.orElseGet(()->ctx.getBeanTypePropertyName());
 
                                fluentSetters = (ctx.isFindFluentSetters() || 
(beanFilter != null && beanFilter.isFluentSetters()));
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 25217d8..278b499 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
@@ -2091,19 +2091,19 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
-        * Consumes all annotations of the specified type defined on the 
specified class or parent classes/interfaces in parent-to-child order.
+        * Consumes all matching annotations of the specified type defined on 
the specified class or parent classes/interfaces in parent-to-child order.
         *
-        * @param a
-        *      The annotation to search for.
+        * @param a The annotation to search for.
+        * @param predicate The predicate.
         * @param consumer The consumer of the annotations.
         * @return This object.
         */
        @SuppressWarnings("unchecked")
-       public <A extends Annotation> ClassMeta<T> getAnnotations(Class<A> a, 
Consumer<A> consumer) {
+       public <A extends Annotation> ClassMeta<T> getAnnotations(Class<A> a, 
Predicate<A> predicate, Consumer<A> consumer) {
                A[] array = (A[])annotationArrayMap.get(a);
                if (array == null) {
                        if (beanContext == null) {
-                               info.getAnnotations(BeanContext.DEFAULT, a, x-> 
true, consumer);
+                               info.getAnnotations(BeanContext.DEFAULT, a, 
predicate, consumer);
                                return this;
                        }
                        List<A> l = new ArrayList<>();
@@ -2114,7 +2114,8 @@ public final class ClassMeta<T> implements Type {
                        annotationArrayMap.put(a, array);
                }
                for (A aa : array)
-                       consumer.accept(aa);
+                       if (predicate.test(aa))
+                               consumer.accept(aa);
                return this;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
index e5f9d0c..0d9e51c 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Value.java
@@ -152,22 +152,6 @@ public class Value<T> {
        }
 
        /**
-        * Sets the value if the specified predicate test passes.
-        *
-        * @param t The new value.
-        * @param p The predicate to test the value against.
-        * @return This object.
-        */
-       public Value<T> setIf(T t, Predicate<T> p) {
-               if (p.test(t)) {
-                       this.t = t;
-                       if (listener != null)
-                               listener.onSet(t);
-               }
-               return this;
-       }
-
-       /**
         * Returns the value.
         *
         * @return The value, or <jk>null</jk> if it is not set.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
index f2dd201..550ca09 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
@@ -267,19 +267,6 @@ public class BeanStore {
                        this.type = value;
                        return this;
                }
-
-               /**
-                * Overrides the bean store type if the predicate test passes.
-                *
-                * @param value The bean store type.
-                * @param predicate The predicate to test against.
-                * @return This object.
-                */
-               public Builder typeIf(Class<? extends BeanStore> value, 
Predicate<Class<? extends BeanStore>> predicate) {
-                       if (predicate.test(value))
-                               this.type = value;
-                       return this;
-               }
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
index ac4edcd..763ed3f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/Messages.java
@@ -301,6 +301,17 @@ public class Messages extends ResourceBundle {
                        return this;
                }
 
+               /**
+                * Specifies a location of where to look for messages.
+                *
+                * @param bundlePath The bundle path.
+                * @return This object.
+                */
+               public Builder location(String bundlePath) {
+                       this.locations.add(0, Tuple2.of(forClass, bundlePath));
+                       return this;
+               }
+
                // <FluentSetters>
 
                @Override /* GENERATED - org.apache.juneau.BeanBuilder */
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 b654fdb..1c262c6 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
@@ -48,9 +48,12 @@ public class HtmlClassMeta extends ExtendedClassMeta {
                Value<HtmlRender<?>> render = Value.empty();
 
                Consumer<Html> c = x -> {
-                       noTables.setIf(x.noTables(), y -> y != false);
-                       noTableHeaders.setIf(x.noTableHeaders(), y -> y != 
false);
-                       format.setIf(x.format(), y -> y != HtmlFormat.HTML);
+                       if (x.noTables())
+                               noTables.set(true);
+                       if (x.noTableHeaders())
+                               noTableHeaders.set(true);
+                       if (x.format() != HtmlFormat.HTML)
+                               format.set(x.format());
                        if (x.render() != HtmlRender.class) {
                                try {
                                        render.set(x.render().newInstance());
@@ -59,7 +62,7 @@ public class HtmlClassMeta extends ExtendedClassMeta {
                                }
                        }
                };
-               cm.getAnnotations(Html.class, c);
+               cm.getAnnotations(Html.class, x -> true, c);
 
                this.noTables = noTables.orElse(false);
                this.noTableHeaders = noTableHeaders.orElse(false);
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 c40464e..2fe8544 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
@@ -476,8 +476,8 @@ public final class HtmlParserSession extends 
XmlParserSession {
                String name = getElementText(r);
                if (beanType.hasAnnotation(HtmlLink.class)) {
                        Value<String> uriProperty = Value.empty(), nameProperty 
= Value.empty();
-                       beanType.getAnnotations(HtmlLink.class, x -> 
uriProperty.setIf(x.uriProperty(), StringUtils::isNotEmpty));
-                       beanType.getAnnotations(HtmlLink.class, x -> 
nameProperty.setIf(x.nameProperty(), StringUtils::isNotEmpty));
+                       beanType.getAnnotations(HtmlLink.class, x -> 
isNotEmpty(x.uriProperty()), x -> uriProperty.set(x.uriProperty()));
+                       beanType.getAnnotations(HtmlLink.class, x -> 
isNotEmpty(x.nameProperty()), x -> nameProperty.set(x.nameProperty()));
                        BeanMap<T> m = newBeanMap(beanType.getInnerClass());
                        m.put(uriProperty.orElse(""), href);
                        m.put(nameProperty.orElse(""), name);
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 4ac4f4c..a4911cc 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
@@ -519,8 +519,8 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                                BeanMap m = toBeanMap(o);
                                if (aType.hasAnnotation(HtmlLink.class)) {
                                        Value<String> uriProperty = 
Value.empty(), nameProperty = Value.empty();
-                                       aType.getAnnotations(HtmlLink.class, x 
-> uriProperty.setIf(x.uriProperty(), StringUtils::isNotEmpty));
-                                       aType.getAnnotations(HtmlLink.class, x 
-> nameProperty.setIf(x.nameProperty(), StringUtils::isNotEmpty));
+                                       aType.getAnnotations(HtmlLink.class, x 
-> isNotEmpty(x.uriProperty()), x -> uriProperty.set(x.uriProperty()));
+                                       aType.getAnnotations(HtmlLink.class, x 
-> isNotEmpty(x.nameProperty()), x -> nameProperty.set(x.nameProperty()));
                                        Object urlProp = 
m.get(uriProperty.orElse(""));
                                        Object nameProp = 
m.get(nameProperty.orElse(""));
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
index c7006cd..1760e0d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/HttpParts.java
@@ -24,7 +24,6 @@ import org.apache.juneau.*;
 import org.apache.juneau.http.header.*;
 import org.apache.juneau.http.part.*;
 import org.apache.juneau.httppart.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 
 /**
@@ -421,29 +420,29 @@ public class HttpParts {
 
        private static final Function<ClassMeta<?>,String> HEADER_NAME_FUNCTION 
= x -> {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               
x.getAnnotations(org.apache.juneau.http.annotation.Header.class, y -> 
n.setIf(y.value(), t).setIf(y.name(), t));
+               
x.getAnnotations(org.apache.juneau.http.annotation.Header.class, y -> 
isNotEmpty(y.value()), y -> n.set(y.value()));
+               
x.getAnnotations(org.apache.juneau.http.annotation.Header.class, y -> 
isNotEmpty(y.name()), y -> n.set(y.name()));
                return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,String> QUERY_NAME_FUNCTION 
= x -> {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               x.getAnnotations(org.apache.juneau.http.annotation.Query.class, 
y -> n.setIf(y.value(), t).setIf(y.name(), t));
+               x.getAnnotations(org.apache.juneau.http.annotation.Query.class, 
y -> isNotEmpty(y.value()), y -> n.set(y.value()));
+               x.getAnnotations(org.apache.juneau.http.annotation.Query.class, 
y -> isNotEmpty(y.name()), y -> n.set(y.name()));
                return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,String> 
FORMDATA_NAME_FUNCTION = x -> {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               
x.getAnnotations(org.apache.juneau.http.annotation.FormData.class, y -> 
n.setIf(y.value(), t).setIf(y.name(), t));
+               
x.getAnnotations(org.apache.juneau.http.annotation.FormData.class, y -> 
isNotEmpty(y.value()), y -> n.set(y.value()));
+               
x.getAnnotations(org.apache.juneau.http.annotation.FormData.class, y -> 
isNotEmpty(y.name()), y -> n.set(y.name()));
                return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,String> PATH_NAME_FUNCTION = 
x -> {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               x.getAnnotations(org.apache.juneau.http.annotation.Path.class, 
y -> n.setIf(y.value(), t).setIf(y.name(), t));
+               x.getAnnotations(org.apache.juneau.http.annotation.Path.class, 
y -> isNotEmpty(y.value()), y -> n.set(y.value()));
+               x.getAnnotations(org.apache.juneau.http.annotation.Path.class, 
y -> isNotEmpty(y.name()), y -> n.set(y.name()));
                return n.orElse(null);
        };
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
index 898b944..f979f80 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
@@ -12,16 +12,15 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.http.annotation;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
-import java.util.function.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.svl.*;
 
@@ -91,9 +90,8 @@ public class FormDataAnnotation {
         */
        public static Value<String> findName(ParamInfo pi) {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               pi.getAnnotations(FormData.class, x -> n.setIf(x.value(), 
t).setIf(x.name(), t));
-               pi.getParameterType().getAnnotations(FormData.class, x -> 
n.setIf(x.value(), t).setIf(x.name(), t));
+               pi.getAnnotations(FormData.class, x -> isNotEmpty(x.value()), x 
-> n.set(x.value()));
+               pi.getAnnotations(FormData.class, x -> isNotEmpty(x.name()), x 
-> n.set(x.name()));
                return n;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
index b7413e7..ca3b62c 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
@@ -14,14 +14,14 @@ package org.apache.juneau.http.annotation;
 
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
+import static org.apache.juneau.internal.StringUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
-import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.svl.*;
 
@@ -91,9 +91,8 @@ public class HeaderAnnotation {
         */
        public static Value<String> findName(ParamInfo pi) {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               pi.getAnnotations(Header.class, x -> n.setIf(x.value(), 
t).setIf(x.name(), t));
-               pi.getParameterType().getAnnotations(Header.class, x -> 
n.setIf(x.value(), t).setIf(x.name(), t));
+               pi.getAnnotations(Header.class, x -> isNotEmpty(x.value()), x 
-> n.set(x.value()));
+               pi.getAnnotations(Header.class, x -> isNotEmpty(x.name()), x -> 
n.set(x.name()));
                return n;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
index 5f22375..d501d15 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
@@ -14,14 +14,13 @@ package org.apache.juneau.http.annotation;
 
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
+import static org.apache.juneau.internal.StringUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
-import java.util.function.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.svl.*;
 
@@ -91,9 +90,8 @@ public class PathAnnotation {
         */
        public static Value<String> findName(ParamInfo pi) {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               pi.getAnnotations(Path.class, x -> n.setIf(x.value(), 
t).setIf(x.name(), t));
-               pi.getParameterType().getAnnotations(Path.class, x -> 
n.setIf(x.value(), t).setIf(x.name(), t));
+               pi.getAnnotations(Path.class, x -> isNotEmpty(x.value()) , x -> 
n.set(x.value()));
+               pi.getAnnotations(Path.class, x -> isNotEmpty(x.name()) , x -> 
n.set(x.name()));
                return n;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
index 603f804..7d6f181 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
@@ -14,14 +14,13 @@ package org.apache.juneau.http.annotation;
 
 import static java.lang.annotation.ElementType.*;
 import static java.lang.annotation.RetentionPolicy.*;
+import static org.apache.juneau.internal.StringUtils.*;
+
 import java.lang.annotation.*;
 import java.lang.reflect.*;
-import java.util.function.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.httppart.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.svl.*;
 
@@ -91,9 +90,8 @@ public class QueryAnnotation {
         */
        public static Value<String> findName(ParamInfo pi) {
                Value<String> n = Value.empty();
-               Predicate<String> t = StringUtils::isNotEmpty;
-               pi.getAnnotations(Query.class, x -> n.setIf(x.value(), 
t).setIf(x.name(), t));
-               pi.getParameterType().getAnnotations(Query.class, x -> 
n.setIf(x.value(), t).setIf(x.name(), t));
+               pi.getAnnotations(Query.class, x -> isNotEmpty(x.value()), x -> 
n.set(x.value()));
+               pi.getAnnotations(Query.class, x -> isNotEmpty(x.name()), x -> 
n.set(x.name()));
                return n;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
index 38b9781..c98691d 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
@@ -53,7 +53,7 @@ public class RrpcInterfaceMeta {
                Value<String> path = Value.of("");
                ClassInfo ci = ClassInfo.of(c);
 
-               ci.getAnnotations(Remote.class, x -> { if (! 
x.path().isEmpty()) path.set(trimSlashes(x.path()));});
+               ci.getAnnotations(Remote.class, x -> isNotEmpty(x.path()), x -> 
path.set(trimSlashes(x.path())));
 
                AMap<Method,RrpcInterfaceMethodMeta> methods = AMap.create();
                ci.getPublicMethods(
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index c9860db..7ebf180 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -686,7 +686,7 @@ public class HttpPartSchema {
 
                Builder apply(Class<? extends Annotation> c, 
java.lang.reflect.Type t) {
                        if (t instanceof Class<?>) {
-                               ClassInfo.of((Class<?>)t).getAnnotations(c, x 
-> apply(x));
+                               ClassInfo.of((Class<?>)t).getAnnotations(c, x 
-> true, x -> apply(x));
                        } else if (Value.isType(t)) {
                                apply(c, Value.getParameterType(t));
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
index 2859c21..4e3758f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
@@ -55,8 +55,8 @@ public class ResponseBeanMeta {
                        return null;
                Builder b = new Builder(annotations);
                b.apply(ci.innerType());
-               ci.getAnnotations(Response.class, x -> b.apply(x));
-               ci.getAnnotations(StatusCode.class, x -> b.apply(x));
+               ci.getAnnotations(Response.class, x -> true, x -> b.apply(x));
+               ci.getAnnotations(StatusCode.class, x -> true, x -> b.apply(x));
                return b.build();
        }
 
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 ae3714f..3e0f601 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,8 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.json;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.json.annotation.*;
 
 /**
@@ -39,7 +40,7 @@ public class JsonClassMeta extends ExtendedClassMeta {
                super(cm);
 
                Value<String> wrapperAttr = Value.empty();
-               cm.getAnnotations(Json.class, x -> 
wrapperAttr.setIf(x.wrapperAttr(), StringUtils::isNotEmpty));
+               cm.getAnnotations(Json.class, x -> isNotEmpty(x.wrapperAttr()), 
x -> wrapperAttr.set(x.wrapperAttr()));
                this.wrapperAttr = wrapperAttr.orElse(null);
        }
 
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 6afe157..d4e6c19 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
@@ -49,7 +49,7 @@ public class JsonSchemaClassMeta extends ExtendedClassMeta {
                                throw runtimeException(e);
                        }
                };
-               cm.getAnnotations(Schema.class, c);
+               cm.getAnnotations(Schema.class, x -> true, c);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
index 042f2e0..c5a6152 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/AnnotationInfo.java
@@ -15,6 +15,7 @@ package org.apache.juneau.reflect;
 import java.lang.annotation.*;
 import java.lang.reflect.*;
 import java.util.*;
+import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.annotation.*;
@@ -245,6 +246,29 @@ public class AnnotationInfo<T extends Annotation> {
                return (x != null && x.value().equals(group));
        }
 
+       /**
+        * Returns <jk>true</jk> if this object passes the specified predicate 
test.
+        *
+        * @param predicate The predicate.
+        * @return <jk>true</jk> if this object passes the specified predicate 
test.
+        */
+       public boolean matches(Predicate<AnnotationInfo<?>> predicate) {
+               return predicate.test(this);
+       }
+
+       /**
+        * Consumes this object if the specified predicate test passes.
+        *
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public AnnotationInfo<?> accept(Predicate<AnnotationInfo<?>> predicate, 
Consumer<AnnotationInfo<?>> consumer) {
+               if (matches(predicate))
+                       consumer.accept(this);
+               return this;
+       }
+
        @Override
        public String toString() {
                return SimpleJson.DEFAULT_READABLE.toString(toOMap());
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 b2b50b4..7723f16 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
@@ -284,6 +284,9 @@ public final class ClassInfo {
         * <p>
         * Does not include interfaces declared on parent classes.
         *
+        * <p>
+        * Results are in the same order as Class.getInterfaces().
+        *
         * @return
         *      An unmodifiable list of interfaces declared on this class.
         *      <br>Results are in the same order as {@link 
Class#getInterfaces()}.
@@ -295,6 +298,9 @@ public final class ClassInfo {
        /**
         * Returns a list of interfaces defined on this class and superclasses.
         *
+        * <p>
+        * Results are in child-to-parent order.
+        *
         * @return
         *      An unmodifiable list of interfaces defined on this class and 
superclasses.
         *      <br>Results are in child-to-parent order.
@@ -309,6 +315,9 @@ public final class ClassInfo {
         * <p>
         * Does not include interfaces.
         *
+        * <p>
+        * Results are in child-to-parent order.
+        *
         * @return An unmodifiable list including this class and all parent 
classes.
         *      <br>Results are in child-to-parent order.
         */
@@ -319,6 +328,9 @@ public final class ClassInfo {
        /**
         * Returns a list including this class and all parent classes and 
interfaces.
         *
+        * <p>
+        * Results are classes-before-interfaces, then child-to-parent order.
+        *
         * @return An unmodifiable list including this class and all parent 
classes.
         *      <br>Results are ordered child-to-parent order with classes 
listed before interfaces.
         */
@@ -329,16 +341,20 @@ public final class ClassInfo {
        /**
         * Returns the parent class or interface that matches the specified 
predicate.
         *
+        * <p>
+        * Results are classes-before-interfaces, then child-to-parent order.
+        *
         * @param predicate The predicate to test for.
         * @return The parent class or interface that matches the specified 
predicate.
         */
-       public ClassInfo getAllParent(Predicate<ClassInfo> predicate) {
+       public ClassInfo getAnyParent(Predicate<ClassInfo> predicate) {
                for (ClassInfo ci : _getAllParents())
                        if (predicate.test(ci))
                                return ci;
                return null;
        }
 
+       /** Results are in child-to-parent order. */
        ClassInfo[] _getInterfaces() {
                if (interfaces == null) {
                        Set<ClassInfo> s = new LinkedHashSet<>();
@@ -353,6 +369,7 @@ public final class ClassInfo {
                return interfaces;
        }
 
+       /** Results are in the same order as Class.getInterfaces(). */
        private ClassInfo[] _getDeclaredInterfaces() {
                if (declaredInterfaces == null) {
                        Class<?>[] ii = c == null ? new Class[0] : 
c.getInterfaces();
@@ -364,6 +381,7 @@ public final class ClassInfo {
                return declaredInterfaces;
        }
 
+       /** Results are in child-to-parent order. */
        ClassInfo[] _getParents() {
                if (parents == null) {
                        List<ClassInfo> l = new ArrayList<>();
@@ -377,6 +395,7 @@ public final class ClassInfo {
                return parents;
        }
 
+       /** Results are classes-before-interfaces, then child-to-parent order. 
*/
        private ClassInfo[] _getAllParents() {
                if (allParents == null) {
                        ClassInfo[] a1 = _getParents(), a2 = _getInterfaces();
@@ -882,12 +901,40 @@ public final class ClassInfo {
         *      A list of all matching annotations found or an empty list if 
none found.
         */
        public <T extends Annotation> List<T> getAnnotations(Class<T> a) {
+               return getAnnotations(AnnotationProvider.DEFAULT, a);
+       }
+
+       /**
+        * Returns all annotations of the specified type defined on this or 
parent classes/interfaces.
+        *
+        * <p>
+        * Returns the list in reverse (parent-to-child) order.
+        * @param ap The meta provider for looking up annotations on reflection 
objects (classes, methods, fields, constructors).
+        * @param a
+        *      The annotation to search for.
+        *
+        * @return
+        *      A list of all matching annotations found or an empty list if 
none found.
+        */
+       public <T extends Annotation> List<T> getAnnotations(AnnotationProvider 
ap, Class<T> a) {
                List<T> l = new ArrayList<>();
-               getAnnotations(a, x -> l.add(x));
+               getAnnotations(ap, a, x-> true, x -> l.add(x));
                return l;
        }
 
        /**
+        * Consumes all matching annotations of the specified type defined on 
this or parent classes/interfaces.
+        *
+        * @param a The annotation to look for.
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public <T extends Annotation> ClassInfo getAnnotations(Class<T> a, 
Predicate<T> predicate, Consumer<T> consumer) {
+               return getAnnotations(AnnotationProvider.DEFAULT, a, predicate, 
consumer);
+       }
+
+       /**
         * Finds and consumes the specified annotation on the specified class 
and superclasses/interfaces to the specified consumer.
         *
         * <p>
@@ -921,27 +968,6 @@ public final class ClassInfo {
        }
 
        /**
-        * Finds and appends the specified annotation on the specified class 
and superclasses/interfaces to the specified
-        * consumer.
-        *
-        * <p>
-        * Annotations are appended in the following orders:
-        * <ol>
-        *      <li>On the package of this class.
-        *      <li>On interfaces ordered child-to-parent.
-        *      <li>On parent classes ordered child-to-parent.
-        *      <li>On this class.
-        * </ol>
-        *
-        * @param consumer The consumer of the annotations.
-        * @param a The annotation to search for.
-        * @return The same list.
-        */
-       public <T extends Annotation> ClassInfo getAnnotations(Class<T> a, 
Consumer<T> consumer) {
-               return getAnnotations(AnnotationProvider.DEFAULT, a, x-> true, 
consumer);
-       }
-
-       /**
         * Finds the annotation of the specified type defined on this class or 
parent class/interface.
         *
         * <p>
@@ -993,20 +1019,6 @@ public final class ClassInfo {
        }
 
        /**
-        * Returns the specified annotation only if it's been declared on this 
class.
-        *
-        * <p>
-        * More efficient than calling {@link Class#getAnnotation(Class)} since 
it doesn't recursively look for the class up the parent chain.
-        *
-        * @param <T> The annotation class type.
-        * @param a The annotation class.
-        * @return The annotation, or <jk>null</jk> if not found.
-        */
-       public <T extends Annotation> T getDeclaredAnnotation(Class<T> a) {
-               return a == null ? null : c.getDeclaredAnnotation(a);
-       }
-
-       /**
         * Returns the specified annotation only if it's been declared on the 
package of this class.
         *
         * @param <T> The annotation class type.
@@ -1026,25 +1038,7 @@ public final class ClassInfo {
         * @return This object.
         */
        public <T extends Annotation> T getAnnotation(Class<T> a, Predicate<T> 
predicate) {
-               return getAnnotation(predicate, a, AnnotationProvider.DEFAULT);
-       }
-
-       /**
-        * Returns all annotations of the specified type defined on the 
specified class or parent classes/interfaces.
-        *
-        * <p>
-        * Returns the list in reverse (parent-to-child) order.
-        * @param ap The meta provider for looking up annotations on reflection 
objects (classes, methods, fields, constructors).
-        * @param a
-        *      The annotation to search for.
-        *
-        * @return
-        *      A list of all matching annotations found or an empty list if 
none found.
-        */
-       public <T extends Annotation> List<T> getAnnotations(AnnotationProvider 
ap, Class<T> a) {
-               List<T> l = new ArrayList<>();
-               getAnnotations(ap, a, x-> true, x -> l.add(x));
-               return l;
+               return getAnnotation(AnnotationProvider.DEFAULT, a, predicate);
        }
 
        /**
@@ -1062,7 +1056,7 @@ public final class ClassInfo {
         * @return A new {@link AnnotationList} object on every call.
         */
        public AnnotationList getAnnotationList() {
-               return getAnnotationList(null);
+               return getAnnotationList(x -> true);
        }
 
        /**
@@ -1095,7 +1089,7 @@ public final class ClassInfo {
         */
        public AnnotationList getAnnotationList(Predicate<AnnotationInfo<?>> 
filter) {
                AnnotationList l = new AnnotationList(filter);
-               getAnnotationInfos(x -> l.add(x));
+               getAnnotationInfos(filter, x -> l.add(x));
                return l;
        }
 
@@ -1137,41 +1131,41 @@ public final class ClassInfo {
                return null;
        }
 
-       private <T extends Annotation> T getAnnotation(Predicate<T> p, Class<T> 
a, AnnotationProvider mp) {
+       private <T extends Annotation> T getAnnotation(AnnotationProvider ap, 
Class<T> a, Predicate<T> p) {
                T t2 = getPackageAnnotation(a);
                if (t2 != null && p.test(t2))
                        return t2;
                ClassInfo[] interfaces = _getInterfaces();
                for (int i = interfaces.length-1; i >= 0; i--) {
-                       T o = mp.getDeclaredAnnotation(a, 
interfaces[i].inner(), p);
+                       T o = ap.getDeclaredAnnotation(a, 
interfaces[i].inner(), p);
                        if (o != null)
                                return o;
                }
                ClassInfo[] parents = _getParents();
                for (int i = parents.length-1; i >= 0; i--) {
-                       T o = mp.getDeclaredAnnotation(a, parents[i].inner(), 
p);
+                       T o = ap.getDeclaredAnnotation(a, parents[i].inner(), 
p);
                        if (o != null)
                                return o;
                }
                return null;
        }
 
-       private void getAnnotationInfos(Consumer<AnnotationInfo<?>> consumer) {
+       private void getAnnotationInfos(Predicate<AnnotationInfo<?>> predicate, 
Consumer<AnnotationInfo<?>> consumer) {
                Package p = c.getPackage();
                if (p != null)
                        for (Annotation a : p.getDeclaredAnnotations())
                                for (Annotation a2 : splitRepeated(a))
-                                       consumer.accept(AnnotationInfo.of(p, 
a2));
+                                       AnnotationInfo.of(p, 
a2).accept(predicate, consumer);
                ClassInfo[] interfaces = _getInterfaces();
                for (int i = interfaces.length-1; i >= 0; i--)
                        for (Annotation a : 
interfaces[i].c.getDeclaredAnnotations())
                                for (Annotation a2 : splitRepeated(a))
-                                       
consumer.accept(AnnotationInfo.of(interfaces[i], a2));
+                                       AnnotationInfo.of(interfaces[i], 
a2).accept(predicate, consumer);
                ClassInfo[] parents = _getParents();
                for (int i = parents.length-1; i >= 0; i--)
                        for (Annotation a : 
parents[i].c.getDeclaredAnnotations())
                                for (Annotation a2 : splitRepeated(a))
-                                       
consumer.accept(AnnotationInfo.of(parents[i], a2));
+                                       AnnotationInfo.of(parents[i], 
a2).accept(predicate, consumer);
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
@@ -2256,9 +2250,32 @@ public final class ClassInfo {
        }
 
        
//-----------------------------------------------------------------------------------------------------------------
-       // Other
+       // Other methods
        
//-----------------------------------------------------------------------------------------------------------------
 
+       /**
+        * Returns <jk>true</jk> if this object passes the specified predicate 
test.
+        *
+        * @param predicate The predicate.
+        * @return <jk>true</jk> if this object passes the specified predicate 
test.
+        */
+       public boolean matches(Predicate<ClassInfo> predicate) {
+               return predicate.test(this);
+       }
+
+       /**
+        * Consumes this object if the specified predicate test passes.
+        *
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public ClassInfo accept(Predicate<ClassInfo> predicate, 
Consumer<ClassInfo> consumer) {
+               if (matches(predicate))
+                       consumer.accept(this);
+               return this;
+       }
+
        @Override
        public String toString() {
                return t.toString();
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
index cfa7c64..4558a2e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ConstructorInfo.java
@@ -135,16 +135,29 @@ public final class ConstructorInfo extends ExecutableInfo 
implements Comparable<
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * Returns <jk>true</jk> if this constructor passes the specified 
predicate.
+        * Returns <jk>true</jk> if this object passes the specified predicate 
test.
         *
         * @param predicate The predicate.
-        * @return <jk>true</jk> if this constructor passes the specified 
predicate.
+        * @return <jk>true</jk> if this object passes the specified predicate 
test.
         */
        public boolean matches(Predicate<ConstructorInfo> predicate) {
                return predicate.test(this);
        }
 
        /**
+        * Consumes this object if the specified predicate test passes.
+        *
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public ConstructorInfo accept(Predicate<ConstructorInfo> predicate, 
Consumer<ConstructorInfo> consumer) {
+               if (matches(predicate))
+                       consumer.accept(this);
+               return this;
+       }
+
+       /**
         * Returns <jk>true</jk> if this constructor can accept the specified 
arguments in the specified order.
         *
         * @param args The arguments to check.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
index 81b87d0..f789423 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
@@ -16,6 +16,7 @@ import static org.apache.juneau.internal.ThrowableUtils.*;
 
 import java.lang.annotation.*;
 import java.lang.reflect.*;
+import java.util.function.*;
 
 import org.apache.juneau.*;
 
@@ -396,6 +397,29 @@ public final class FieldInfo implements 
Comparable<FieldInfo> {
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
+        * Returns <jk>true</jk> if this object passes the specified predicate 
test.
+        *
+        * @param predicate The predicate.
+        * @return <jk>true</jk> if this object passes the specified predicate 
test.
+        */
+       public boolean matches(Predicate<FieldInfo> predicate) {
+               return predicate.test(this);
+       }
+
+       /**
+        * Consumes this object if the specified predicate test passes.
+        *
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public FieldInfo accept(Predicate<FieldInfo> predicate, 
Consumer<FieldInfo> consumer) {
+               if (matches(predicate))
+                       consumer.accept(this);
+               return this;
+       }
+
+       /**
         * Returns the type of this field.
         *
         * @return The type of this field.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
index 262b90c..33dc392 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/MethodInfo.java
@@ -103,16 +103,6 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
-        * Returns <jk>true</jk> if this method passes the specified predicate.
-        *
-        * @param predicate The predicate.
-        * @return <jk>true</jk> if this method passes the specified predicate.
-        */
-       public boolean matches(Predicate<MethodInfo> predicate) {
-               return predicate.test(this);
-       }
-
-       /**
         * Returns <jk>true</jk> if this constructor can accept the specified 
arguments in the specified order.
         *
         * @param args The arguments to check.
@@ -259,7 +249,7 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
         * @return <jk>true</jk> if the specified annotation is present on this 
method.
         */
        public final boolean hasAnnotation(AnnotationProvider ap, Class<? 
extends Annotation> a) {
-               for (Method m2 : _getMatching()) 
+               for (Method m2 : _getMatching())
                        if (ap.getAnnotation(a, m2, x -> true) != null)
                                return true;
                return false;
@@ -297,30 +287,33 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
         * and the return type on the method.
         * <br>Results are parent-to-child ordered.
         *
-        * @param a
-        *      The annotation to search for.
-        * @return
-        *      A list of all matching annotations found or an empty list if 
none found.
+        * @param a The annotation to search for.
+        * @return A list of all matching annotations found or an empty list if 
none found.
         */
        public <T extends Annotation> List<T> getAnnotations(Class<T> a) {
-               return appendAnnotations(new ArrayList<>(), a);
+               return getAnnotations(AnnotationProvider.DEFAULT, a);
        }
 
        /**
-        * Finds and appends the specified annotation on the specified class 
and superclasses/interfaces to the specified
-        * list.
+        * Returns all annotations of the specified type defined on the 
specified method.
         *
-        * @param l The list of annotations.
-        * @param a The annotation.
-        * @return The same list.
+        * <p>
+        * Searches all methods with the same signature on the parent classes 
or interfaces
+        * and the return type on the method.
+        * <br>Results are parent-to-child ordered.
+        *
+        * @param ap The annotation provider.
+        * @param a The annotation to search for.
+        * @return      A list of all matching annotations found or an empty 
list if none found.
         */
-       public <T extends Annotation> List<T> appendAnnotations(List<T> l, 
Class<T> a) {
-               getAnnotations(a, x -> l.add(x));
+       public <T extends Annotation> List<T> getAnnotations(AnnotationProvider 
ap, Class<T> a) {
+               List<T> l = new ArrayList<>();
+               getAnnotations(ap, a, x -> true, x -> l.add(x));
                return l;
        }
 
        /**
-        * Consumes all annotations of the specified type defined on the 
specified method.
+        * Consumes all matching annotations of the specified type defined on 
this method.
         *
         * <p>
         * Searches all methods with the same signature on the parent classes 
or interfaces
@@ -328,17 +321,36 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
         * <br>Results are parent-to-child ordered.
         *
         * @param a The annotation to search for.
+        * @param predicate The predicate.
         * @param consumer The consumer of the annotation.
         * @return This object.
         */
+       public <T extends Annotation> MethodInfo getAnnotations(Class<T> a, 
Predicate<T> predicate, Consumer<T> consumer) {
+               return getAnnotations(AnnotationProvider.DEFAULT, a, predicate, 
consumer);
+       }
+
+       /**
+        * Consumes all annotations of the specified type defined on this 
method.
+        *
+        * <p>
+        * Searches all methods with the same signature on the parent classes 
or interfaces
+        * and the return type on the method.
+        * <br>Results are parent-to-child ordered.
+        *
+        * @param ap The annotation provider.
+        * @param a The annotation.
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
        @SuppressWarnings("unchecked")
-       public <T extends Annotation> MethodInfo getAnnotations(Class<T> a, 
Consumer<T> consumer) {
-               declaringClass.getAnnotations(a, consumer);
+       public <T extends Annotation> MethodInfo 
getAnnotations(AnnotationProvider ap, Class<T> a, Predicate<T> predicate, 
Consumer<T> consumer) {
+               declaringClass.getAnnotations(ap, a, predicate, consumer);
                for (Method m2 : getMatchingParentFirst())
                        for (Annotation a2 : m2.getDeclaredAnnotations())
-                               if (a.isInstance(a2))
+                               if (a.isInstance(a2) && predicate.test((T)a2))
                                        consumer.accept((T)a2);
-               
getReturnType().unwrap(Value.class,Optional.class).getAnnotations(a, consumer);
+               
getReturnType().unwrap(Value.class,Optional.class).getAnnotations(ap, a, 
predicate, consumer);
                return this;
        }
 
@@ -541,6 +553,29 @@ public final class MethodInfo extends ExecutableInfo 
implements Comparable<Metho
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
+        * Returns <jk>true</jk> if this object passes the specified predicate 
test.
+        *
+        * @param predicate The predicate.
+        * @return <jk>true</jk> if this object passes the specified predicate 
test.
+        */
+       public boolean matches(Predicate<MethodInfo> predicate) {
+               return predicate.test(this);
+       }
+
+       /**
+        * Consumes this object if the specified predicate test passes.
+        *
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public MethodInfo accept(Predicate<MethodInfo> predicate, 
Consumer<MethodInfo> consumer) {
+               if (matches(predicate))
+                       consumer.accept(this);
+               return this;
+       }
+
+       /**
         * Shortcut for calling the invoke method on the underlying method.
         *
         * @param obj the object the underlying method is invoked from.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
index 578ba7f..6939922 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
@@ -151,7 +151,7 @@ public class Mutaters {
 
                ClassInfo ici = ClassInfo.of(ic), oci = ClassInfo.of(oc);
 
-               ClassInfo pic = ici.getAllParent(x -> m.get(x.inner()) != null);
+               ClassInfo pic = ici.getAnyParent(x -> m.get(x.inner()) != null);
                if (pic != null)
                        return m.get(pic.inner());
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
index add7ed2..205462b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ParamInfo.java
@@ -186,11 +186,13 @@ public final class ParamInfo {
         * @return A list of all matching annotations found or an empty list if 
none found.
         */
        public <T extends Annotation> List<T> getAnnotations(Class<T> a) {
-               return appendAnnotations(new ArrayList<>(), a, true);
+               List<T> l = new ArrayList<>();
+               getAnnotations(AnnotationProvider.DEFAULT, a, true, x -> true, 
x -> l.add(x));
+               return l;
        }
 
        /**
-        * Consumes all annotations of the specified type defined on this 
method parameter.
+        * Consumes all matching annotations of the specified type defined on 
this parameter.
         *
         * <p>
         * Searches all methods with the same signature on the parent classes 
or interfaces
@@ -199,11 +201,12 @@ public final class ParamInfo {
         * Results are in parent-to-child order.
         *
         * @param a The annotation to search for.
+        * @param predicate The predicate.
         * @param consumer The consumer for the annotations.
         * @return This object.
         */
-       public <T extends Annotation> ParamInfo getAnnotations(Class<T> a, 
Consumer<T> consumer) {
-               return getAnnotations(a, true, consumer);
+       public <T extends Annotation> ParamInfo getAnnotations(Class<T> a, 
Predicate<T> predicate, Consumer<T> consumer) {
+               return getAnnotations(AnnotationProvider.DEFAULT, a, true, 
predicate, consumer);
        }
 
        /**
@@ -223,42 +226,42 @@ public final class ParamInfo {
                return getAnnotation(a, true, predicate);
        }
 
-       private <T extends Annotation> List<T> appendAnnotations(List<T> l, 
Class<T> a, boolean parentFirst) {
-               getAnnotations(a, parentFirst, x -> l.add(x));
-               return l;
-       }
+//     private <T extends Annotation> List<T> appendAnnotations(List<T> l, 
Class<T> a, boolean parentFirst) {
+//             getAnnotations(AnnotationProvider.DEFAULT, a, parentFirst, x -> 
true, x -> l.add(x));
+//             return l;
+//     }
 
        @SuppressWarnings("unchecked")
-       private <T extends Annotation> ParamInfo getAnnotations(Class<T> a, 
boolean parentFirst, Consumer<T> consumer) {
+       private <T extends Annotation> ParamInfo 
getAnnotations(AnnotationProvider ap, Class<T> a, boolean parentFirst, 
Predicate<T> predicate, Consumer<T> consumer) {
                if (eInfo.isConstructor) {
                        ClassInfo ci = 
eInfo.getParamType(index).unwrap(Value.class,Optional.class);
                        Annotation[] annotations = 
eInfo.getParameterAnnotations(index);
                        if (parentFirst) {
-                               ci.getAnnotations(a, consumer);
+                               ci.getAnnotations(ap, a, predicate, consumer);
                                for (Annotation a2 : annotations)
-                                       if (a.isInstance(a2))
+                                       if (a.isInstance(a2) && 
predicate.test((T)a2))
                                                consumer.accept((T)a2);
                        } else {
                                for (Annotation a2 : annotations)
-                                       if (a.isInstance(a2))
+                                       if (a.isInstance(a2) && 
predicate.test((T)a2))
                                                consumer.accept((T)a2);
-                               ci.getAnnotations(a, consumer);
+                               ci.getAnnotations(ap, a, predicate, consumer);
                        }
                } else {
                        MethodInfo mi = (MethodInfo)eInfo;
                        ClassInfo ci = 
eInfo.getParamType(index).unwrap(Value.class,Optional.class);
                        if (parentFirst) {
-                               ci.getAnnotations(a, consumer);
+                               ci.getAnnotations(ap, a, predicate, consumer);
                                for (Method m2 : mi.getMatchingParentFirst())
                                        for (Annotation a2 :  
m2.getParameterAnnotations()[index])
-                                               if (a.isInstance(a2))
+                                               if (a.isInstance(a2) && 
predicate.test((T)a2))
                                                        consumer.accept((T)a2);
                        } else {
                                for (Method m2 : mi.getMatching())
                                        for (Annotation a2 :  
m2.getParameterAnnotations()[index])
-                                               if (a.isInstance(a2))
+                                               if (a.isInstance(a2) && 
predicate.test((T)a2))
                                                        consumer.accept((T)a2);
-                               ci.getAnnotations(a, consumer);
+                               ci.getAnnotations(ap, a, predicate, consumer);
                        }
                }
                return this;
@@ -319,6 +322,29 @@ public final class ParamInfo {
        
//-----------------------------------------------------------------------------------------------------------------
 
        /**
+        * Returns <jk>true</jk> if this object passes the specified predicate 
test.
+        *
+        * @param predicate The predicate.
+        * @return <jk>true</jk> if this object passes the specified predicate 
test.
+        */
+       public boolean matches(Predicate<ParamInfo> predicate) {
+               return predicate.test(this);
+       }
+
+       /**
+        * Consumes this object if the specified predicate test passes.
+        *
+        * @param predicate The predicate.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public ParamInfo accept(Predicate<ParamInfo> predicate, 
Consumer<ParamInfo> consumer) {
+               if (matches(predicate))
+                       consumer.accept(this);
+               return this;
+       }
+
+       /**
         * Returns <jk>true</jk> if the parameter type is an exact match for 
the specified class.
         *
         * @param c The type to check.
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
index ce112ee..a4d30e3 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
@@ -65,7 +65,7 @@ public class DefaultSwaps {
         * @return The matched swap, or <jk>null</jk> if it couldn't be found.
         */
        public static ObjectSwap<?,?> find(ClassInfo ci) {
-               ClassInfo ci2 = ci.getAllParent(x -> SWAPS.get(x.inner()) != 
null);
+               ClassInfo ci2 = ci.getAnyParent(x -> SWAPS.get(x.inner()) != 
null);
                return ci2 == null ? null : SWAPS.get(ci2.inner());
        }
 }
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 0f19f5f..782dbcd 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
@@ -37,7 +37,7 @@ public class UrlEncodingClassMeta extends ExtendedClassMeta {
                super(cm);
 
                Value<Boolean> expandedParams = Value.empty();
-               cm.getAnnotations(UrlEncoding.class, x -> 
expandedParams.setIf(x.expandedParams(), y -> y == true));
+               cm.getAnnotations(UrlEncoding.class, x -> x.expandedParams(), x 
-> expandedParams.set(true));
                this.expandedParams = expandedParams.orElse(false);
        }
 
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 52b24a8..f283775 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
@@ -43,8 +43,8 @@ public class XmlClassMeta extends ExtendedClassMeta {
                List<Xml> xmls = new ArrayList<>();
                List<XmlSchema> schemas = new ArrayList<>();
                if (cm != null) {
-                       cm.getAnnotations(Xml.class, x -> xmls.add(x));
-                       cm.getAnnotations(XmlSchema.class, x -> schemas.add(x));
+                       cm.getAnnotations(Xml.class, x -> true, x -> 
xmls.add(x));
+                       cm.getAnnotations(XmlSchema.class, x -> true, x -> 
schemas.add(x));
                }
                this.namespace = XmlUtils.findNamespace(xmls, schemas);
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index c2d4881..f536171 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
@@ -172,7 +172,7 @@ public class RestContext extends Context {
        public static Builder create(Class<?> resourceClass, RestContext 
parentContext, ServletConfig servletConfig) throws ServletException {
 
                Value<Class<? extends Builder>> v = Value.of(Builder.class);
-               ClassInfo.ofc(resourceClass).getAnnotations(Rest.class, x -> 
v.setIf(x.builder(), x2 -> x2 != Builder.Null.class));
+               ClassInfo.ofc(resourceClass).getAnnotations(Rest.class, x -> 
x.builder() != Builder.Null.class, x -> v.set(x.builder()));
 
                if (v.get() == Builder.class)
                        return new Builder(resourceClass, parentContext, 
servletConfig);
@@ -583,7 +583,7 @@ public class RestContext extends Context {
                        );
 
                        // Apply @Rest(beanStore).
-                       ClassInfo.of(resourceClass).getAnnotations(Rest.class, 
x -> v.get().typeIf(x.beanStore(), y -> y != BeanStore.Null.class));
+                       ClassInfo.of(resourceClass).getAnnotations(Rest.class, 
x -> x.beanStore() != BeanStore.Null.class, x -> v.get().type(x.beanStore()));
 
                        // Replace with builder from:  public [static] 
BeanStore.Builder createBeanStore(<args>)
                        v.get().build()
@@ -864,11 +864,7 @@ public class RestContext extends Context {
                        // Find our config file.  It's the last non-empty 
@RestResource(config).
                        VarResolver vr = 
beanStore.getBean(VarResolver.class).orElseThrow(()->runtimeException("VarResolver
 not found."));
                        Value<String> cfv = Value.empty();
-                       Consumer<Rest> consumer = x -> {
-                               if (! x.config().isEmpty())
-                                       cfv.set(vr.resolve(x.config()));
-                       };
-                       ClassInfo.of(resourceClass).getAnnotations(Rest.class, 
consumer);
+                       ClassInfo.of(resourceClass).getAnnotations(Rest.class, 
x -> isNotEmpty(x.config()), x -> cfv.set(vr.resolve(x.config())));
                        String cf = cfv.orElse("");
 
                        // If not specified or value is set to SYSTEM_DEFAULT, 
use system default config.
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
index d6307b6..fd16ec2 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/annotation/RestAnnotation.java
@@ -1073,7 +1073,6 @@ public class RestAnnotation {
                @Override
                public void apply(AnnotationInfo<Rest> ai, RestContext.Builder 
b) {
                        Rest a = ai.getAnnotation();
-                       ClassInfo c = ai.getClassOn();
 
                        classes(a.serializers()).ifPresent(x -> 
b.serializers().add(x));
                        classes(a.parsers()).ifPresent(x -> b.parsers().add(x));
@@ -1095,7 +1094,7 @@ public class RestAnnotation {
                        string(a.uriAuthority()).ifPresent(x -> 
b.uriAuthority(x));
                        
string(a.uriRelativity()).map(UriRelativity::valueOf).ifPresent(x -> 
b.uriRelativity(x));
                        
string(a.uriResolution()).map(UriResolution::valueOf).ifPresent(x -> 
b.uriResolution(x));
-                       b.messages().location(c.inner(), 
string(a.messages()).orElse(null));
+                       
b.messages().location(string(a.messages()).orElse(null));
                        type(a.fileFinder()).ifPresent(x -> 
b.fileFinder().type(x));
                        type(a.staticFiles()).ifPresent(x -> 
b.staticFiles().type(x));
                        string(a.path()).ifPresent(x -> b.path(x));
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
index 927f4d7..ceca71c 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
@@ -12,8 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.rest.arg;
 
+import static org.apache.juneau.internal.StringUtils.*;
+
 import org.apache.juneau.*;
-import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 import org.apache.juneau.rest.*;
 import org.apache.juneau.rest.annotation.*;
@@ -66,12 +67,8 @@ public class AttributeArg implements RestOpArg {
 
        private String getName(ParamInfo paramInfo) {
                Value<String> n = Value.empty();
-               for (Attr h : paramInfo.getAnnotations(Attr.class))
-                       n.setIf(h.name(), 
StringUtils::isNotEmpty).setIf(h.value(), StringUtils::isNotEmpty);
-               paramInfo.getParameterType().getAnnotations(Attr.class, x -> {
-                       n.setIf(x.name(), StringUtils::isNotEmpty);
-                       n.setIf(x.value(), StringUtils::isNotEmpty);
-               });
+               paramInfo.getAnnotations(Attr.class, x -> isNotEmpty(x.name()), 
x -> n.set(x.name()));
+               paramInfo.getAnnotations(Attr.class, x -> 
isNotEmpty(x.value()), x -> n.set(x.value()));
                if (n.isEmpty())
                        throw new ArgException(paramInfo, "@Attr used without 
name or value");
                return n.get();
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
index 62e7137..f362543 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
@@ -130,7 +130,7 @@ public abstract class RestServlet extends HttpServlet {
                        return context.getFullPath();
                ClassInfo ci = ClassInfo.of(getClass());
                Value<String> path = Value.empty();
-               ci.getAnnotations(Rest.class, x -> 
path.setIf(trimSlashes(x.path()), StringUtils::isNotEmpty));
+               ci.getAnnotations(Rest.class, x -> isNotEmpty(x.path()), x -> 
path.set(trimSlashes(x.path())));
                return path.orElse("");
        }
 
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
index a0018b9..8f11259 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
@@ -101,7 +101,7 @@ public class BasicSwaggerProviderSession {
                        omSwagger = new OMap();
 
                // Combine it with @Rest(swagger)
-               for (Rest rr : rci.getAnnotations(Rest.class)) {
+               for (Rest rr : rci.getAnnotations(context, Rest.class)) {
 
                        OMap sInfo = omSwagger.getMap("info", true);
 
@@ -320,10 +320,8 @@ public class BasicSwaggerProviderSession {
                                if (mpi.hasAnnotation(Body.class) || 
pt.hasAnnotation(Body.class)) {
                                        OMap param = paramMap.getMap(BODY + 
".body", true).a("in", BODY);
                                        OMap schema = 
getSchema(param.getMap("schema"), type, bs);
-                                       pt.getAnnotations(Schema.class, x -> 
merge(schema, x));
-                                       mpi.getAnnotations(Schema.class, x -> 
merge(schema, x));
-                                       pt.getAnnotations(Body.class, x -> 
merge(schema, x.schema()));
-                                       mpi.getAnnotations(Body.class, x -> 
merge(schema, x.schema()));
+                                       mpi.getAnnotations(Schema.class, x -> 
true, x -> merge(schema, x));
+                                       mpi.getAnnotations(Body.class, x -> 
true, x -> merge(schema, x.schema()));
                                        pushupSchemaFields(BODY, param, schema);
                                        param.appendIf(true, true, true, 
"schema", schema);
                                        param.putIfAbsent("required", true);
@@ -332,40 +330,32 @@ public class BasicSwaggerProviderSession {
                                } else if (mpi.hasAnnotation(Query.class) || 
pt.hasAnnotation(Query.class)) {
                                        String name = 
QueryAnnotation.findName(mpi).orElse(null);
                                        OMap param = paramMap.getMap(QUERY + 
"." + name, true).a("name", name).a("in", QUERY);
-                                       pt.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       pt.getAnnotations(Query.class, x -> 
merge(param, x.schema()));
-                                       mpi.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       mpi.getAnnotations(Query.class, x -> 
merge(param, x.schema()));
+                                       mpi.getAnnotations(Schema.class, x -> 
true, x -> merge(param, x));
+                                       mpi.getAnnotations(Query.class, x -> 
true, x -> merge(param, x.schema()));
                                        pushupSchemaFields(QUERY, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, QUERY, type);
 
                                } else if (mpi.hasAnnotation(FormData.class) || 
pt.hasAnnotation(FormData.class)) {
                                        String name = 
FormDataAnnotation.findName(mpi).orElse(null);
                                        OMap param = paramMap.getMap(FORM_DATA 
+ "." + name, true).a("name", name).a("in", FORM_DATA);
-                                       pt.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       pt.getAnnotations(FormData.class, x -> 
merge(param, x.schema()));
-                                       mpi.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       mpi.getAnnotations(FormData.class, x -> 
merge(param, x.schema()));
+                                       mpi.getAnnotations(Schema.class, x -> 
true, x -> merge(param, x));
+                                       mpi.getAnnotations(FormData.class, x -> 
true, x -> merge(param, x.schema()));
                                        pushupSchemaFields(FORM_DATA, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, FORM_DATA, 
type);
 
                                } else if (mpi.hasAnnotation(Header.class) || 
pt.hasAnnotation(Header.class)) {
                                        String name = 
HeaderAnnotation.findName(mpi).orElse(null);
                                        OMap param = paramMap.getMap(HEADER + 
"." + name, true).a("name", name).a("in", HEADER);
-                                       pt.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       pt.getAnnotations(Header.class, x -> 
merge(param, x.schema()));
-                                       mpi.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       mpi.getAnnotations(Header.class, x -> 
merge(param, x.schema()));
+                                       mpi.getAnnotations(Schema.class, x -> 
true, x -> merge(param, x));
+                                       mpi.getAnnotations(Header.class, x -> 
true, x -> merge(param, x.schema()));
                                        pushupSchemaFields(HEADER, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, HEADER, 
type);
 
                                } else if (mpi.hasAnnotation(Path.class) || 
pt.hasAnnotation(Path.class)) {
                                        String name = 
PathAnnotation.findName(mpi).orElse(null);
                                        OMap param = paramMap.getMap(PATH + "." 
+ name, true).a("name", name).a("in", PATH);
-                                       pt.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       pt.getAnnotations(Path.class, x -> 
merge(param, x.schema()));
-                                       mpi.getAnnotations(Schema.class, x -> 
merge(param, x));
-                                       mpi.getAnnotations(Path.class, x -> 
merge(param, x.schema()));
+                                       mpi.getAnnotations(Schema.class, x -> 
true, x -> merge(param, x));
+                                       mpi.getAnnotations(Path.class, x -> 
true, x -> merge(param, x.schema()));
                                        pushupSchemaFields(PATH, param, 
getSchema(param.getMap("schema"), type, bs));
                                        addParamExample(sm, param, PATH, type);
                                        param.putIfAbsent("required", true);
@@ -379,15 +369,15 @@ public class BasicSwaggerProviderSession {
 
                        for (ClassInfo eci : mi.getExceptionTypes()) {
                                if (eci.hasAnnotation(Response.class)) {
-                                       List<Response> la = 
eci.getAnnotations(Response.class);
-                                       List<StatusCode> la2 = 
eci.getAnnotations(StatusCode.class);
+                                       List<Response> la = 
eci.getAnnotations(context, Response.class);
+                                       List<StatusCode> la2 = 
eci.getAnnotations(context, StatusCode.class);
                                        Set<Integer> codes = getCodes(la2, 500);
                                        for (Response a : la) {
                                                for (Integer code : codes) {
                                                        OMap om = 
responses.getMap(String.valueOf(code), true);
                                                        merge(om, a);
                                                        OMap schema = 
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
-                                                       
eci.getAnnotations(Schema.class, x -> merge(schema, x));
+                                                       
eci.getAnnotations(Schema.class, x -> true, x -> merge(schema, x));
                                                        
pushupSchemaFields(RESPONSE, om, schema);
                                                        om.appendIf(true, true, 
true, "schema", schema);
                                                }
@@ -402,8 +392,8 @@ public class BasicSwaggerProviderSession {
                                                        String ha = a.name();
                                                        for (Integer code : 
codes) {
                                                                OMap header = 
responses.getMap(String.valueOf(code), true).getMap("headers", true).getMap(ha, 
true);
-                                                               
ecmi.getAnnotations(Schema.class, x -> merge(header, x));
-                                                               
ecmi.getReturnType().unwrap(Value.class,Optional.class).getAnnotations(Schema.class,
 x -> merge(header, x));
+                                                               
ecmi.getAnnotations(context, Schema.class, x-> true, x -> merge(header, x));
+                                                               
ecmi.getReturnType().unwrap(Value.class,Optional.class).getAnnotations(Schema.class,
 x -> true, x -> merge(header, x));
                                                                
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header.getMap("schema"), 
ecmi.getReturnType().unwrap(Value.class,Optional.class).innerType(), bs));
                                                        }
                                                }
@@ -412,15 +402,15 @@ public class BasicSwaggerProviderSession {
                        }
 
                        if (mi.hasAnnotation(Response.class) || 
mi.getReturnType().unwrap(Value.class,Optional.class).hasAnnotation(Response.class))
 {
-                               List<Response> la = 
mi.getAnnotations(Response.class);
-                               List<StatusCode> la2 = 
mi.getAnnotations(StatusCode.class);
+                               List<Response> la = mi.getAnnotations(context, 
Response.class);
+                               List<StatusCode> la2 = 
mi.getAnnotations(context, StatusCode.class);
                                Set<Integer> codes = getCodes(la2, 200);
                                for (Response a : la) {
                                        for (Integer code : codes) {
                                                OMap om = 
responses.getMap(String.valueOf(code), true);
                                                merge(om, a);
                                                OMap schema = 
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
-                                               mi.getAnnotations(Schema.class, 
x -> merge(schema, x));
+                                               mi.getAnnotations(context, 
Schema.class, x -> true, x -> merge(schema, x));
                                                pushupSchemaFields(RESPONSE, 
om, schema);
                                                om.appendIf(true, true, true, 
"schema", schema);
                                                addBodyExamples(sm, om, true, 
m.getGenericReturnType(), locale);
@@ -436,8 +426,8 @@ public class BasicSwaggerProviderSession {
                                                        if (! isMulti(a)) {
                                                                for (Integer 
code : codes) {
                                                                        OMap 
header = responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(ha, true);
-                                                                       
ecmi.getAnnotations(Schema.class, x -> merge(header, x));
-                                                                       
ecmi.getReturnType().unwrap(Value.class,Optional.class).getAnnotations(Schema.class,
 x -> merge(header, x));
+                                                                       
ecmi.getAnnotations(context, Schema.class, x -> true, x -> merge(header, x));
+                                                                       
ecmi.getReturnType().unwrap(Value.class,Optional.class).getAnnotations(Schema.class,
 x -> true, x -> merge(header, x));
                                                                        
merge(header, a.schema());
                                                                        
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header, 
ecmi.getReturnType().innerType(), bs));
                                                                }
@@ -449,7 +439,7 @@ public class BasicSwaggerProviderSession {
                                OMap om = responses.getMap("200", true);
                                ClassInfo pt2 = 
ClassInfo.of(m.getGenericReturnType());
                                OMap schema = getSchema(om.getMap("schema"), 
m.getGenericReturnType(), bs);
-                               pt2.getAnnotations(Schema.class, x -> 
merge(schema, x));
+                               pt2.getAnnotations(Schema.class, x -> true, x 
-> merge(schema, x));
                                pushupSchemaFields(RESPONSE, om, schema);
                                om.appendIf(true, true, true, "schema", schema);
                                addBodyExamples(sm, om, true, 
m.getGenericReturnType(), locale);
@@ -470,8 +460,7 @@ public class BasicSwaggerProviderSession {
                                                if (! isMulti(a)) {
                                                        for (Integer code : 
codes) {
                                                                OMap header = 
responses.getMap(String.valueOf(code), true).getMap("headers", 
true).getMap(name, true);
-                                                               
mpi.getAnnotations(Schema.class, x -> merge(header, x));
-                                                               
mpi.getParameterType().getAnnotations(Schema.class, x -> merge(header, x));
+                                                               
mpi.getAnnotations(Schema.class, x -> true, x -> merge(header, x));
                                                                merge(header, 
a.schema());
                                                                
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header, type, bs));
                                                        }
@@ -488,8 +477,7 @@ public class BasicSwaggerProviderSession {
                                                        OMap om = 
responses.getMap(String.valueOf(code), true);
                                                        merge(om, a);
                                                        OMap schema = 
getSchema(om.getMap("schema"), type, bs);
-                                                       
pt.getAnnotations(Schema.class, x -> merge(schema, x));
-                                                       
mpi.getAnnotations(Schema.class, x -> merge(schema, x));
+                                                       
mpi.getAnnotations(Schema.class, x -> true, x -> merge(schema, x));
                                                        la.forEach(x -> 
merge(schema, x.schema()));
                                                        
pushupSchemaFields(RESPONSE, om, schema);
                                                        om.appendIf(true, true, 
true, "schema", schema);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
index 53adb91..1f2eccf 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
@@ -630,28 +630,6 @@ public class ClassInfoTest {
        }
 
        @Test
-       public void getDeclaredAnnotation() {
-               check("@A(7)", g3.getDeclaredAnnotation(A.class));
-               check(null, g3.getDeclaredAnnotation(B.class));
-       }
-
-       @Test
-       public void getDeclaredAnnotation_null() {
-               check(null, g3.getDeclaredAnnotation(null));
-       }
-
-       @Test
-       public void getDeclaredAnnotation_twice() {
-               check("@A(7)", g3.getDeclaredAnnotation(A.class));
-               check("@A(7)", g3.getDeclaredAnnotation(A.class));
-       }
-
-       @Test
-       public void getDeclaredAnnotation_onType() {
-               check(null, aTypeInfo.getDeclaredAnnotation(A.class));
-       }
-
-       @Test
        public void getPackageAnnotation() {
                check("@PA(10)", g3.getPackageAnnotation(PA.class));
        }
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java
index 59717cd..d06d39a 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/reflection/MethodInfoTest.java
@@ -224,15 +224,6 @@ public class MethodInfoTest {
        }
 
        @Test
-       public void appendAnnotationsParentFirst() {
-               check("@A(C1),@A(C2),@A(C3),@A(a1)", c_a1.appendAnnotations(new 
ArrayList<>(), A.class));
-               check("@A(C1),@A(C2),@A(C3),@A(a2a),@A(a2b)", 
c_a2.appendAnnotations(new ArrayList<>(), A.class));
-               check("@A(C1),@A(C2),@A(C3),@A(a3)", c_a3.appendAnnotations(new 
ArrayList<>(), A.class));
-               check("@A(C1),@A(C2),@A(C3),@A(a4)", c_a4.appendAnnotations(new 
ArrayList<>(), A.class));
-               check("@A(C1),@A(C2),@A(C3)", c_a5.appendAnnotations(new 
ArrayList<>(), A.class));
-       }
-
-       @Test
        public void getAnnotation() {
                check("@A(a1)", c_a1.getLastAnnotation(A.class));
                check("@A(a2b)", c_a2.getLastAnnotation(A.class));
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Messages_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Messages_Test.java
index 659089b..9a6e2ab 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Messages_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Rest_Messages_Test.java
@@ -56,20 +56,6 @@ public class Rest_Messages_Test {
                a1.get("/c?name=key3").run().assertBody().is("{!key3}");
        }
 
-       @Rest
-       public static class A2 extends A1 {}
-
-       @Test
-       public void a02_subclassed() throws Exception {
-               MockRestClient a2 = MockRestClient.build(A2.class);
-               
a2.get("/a").run().assertBody().is("{'A1.key2':'A1.value2a','A2.key3':'A2.value3b',key1:'value1a',key2:'value2b',key3:'A2.value3b'}");
-               
a2.get("/b").run().assertBody().is("{'A1.key2':'A1.value2a','A2.key3':'A2.value3b',key1:'value1a',key2:'value2b',key3:'A2.value3b'}");
-               a2.get("/c?name=key1").run().assertBody().is("value1a");
-               a2.get("/c?name=key2").run().assertBody().is("value2b");
-               a2.get("/c?name=key3").run().assertBody().is("A2.value3b");
-               a2.get("/c?name=key4").run().assertBody().is("{!key4}");
-       }
-
        
//------------------------------------------------------------------------------------------------------------------
        // Overridden on subclass.
        
//------------------------------------------------------------------------------------------------------------------

Reply via email to