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 6f74c64  ClassInfo refactoring.
6f74c64 is described below

commit 6f74c6495c2212f9c92856d9bafd14e03085eb7c
Author: JamesBognar <[email protected]>
AuthorDate: Sun Jan 23 15:45:12 2022 -0500

    ClassInfo refactoring.
---
 .../java/org/apache/juneau/jena/RdfClassMeta.java  | 17 ++-----
 .../src/main/java/org/apache/juneau/BeanMeta.java  | 17 +++----
 .../main/java/org/apache/juneau/BeanRegistry.java  | 14 +++---
 .../src/main/java/org/apache/juneau/ClassMeta.java | 32 ++++++++-----
 .../java/org/apache/juneau/csv/CsvClassMeta.java   | 14 ------
 .../java/org/apache/juneau/html/HtmlClassMeta.java | 52 ++++++++++------------
 .../org/apache/juneau/html/HtmlParserSession.java  | 14 +++---
 .../apache/juneau/html/HtmlSerializerSession.java  | 14 +++---
 .../java/org/apache/juneau/http/HttpParts.java     | 45 +++++++------------
 .../java/org/apache/juneau/json/JsonClassMeta.java | 22 ++-------
 .../juneau/jsonschema/JsonSchemaClassMeta.java     | 16 ++++---
 .../apache/juneau/msgpack/MsgPackClassMeta.java    | 14 ------
 .../org/apache/juneau/oapi/OpenApiClassMeta.java   | 14 ------
 .../juneau/plaintext/PlainTextClassMeta.java       | 14 ------
 .../java/org/apache/juneau/reflect/ClassInfo.java  |  4 +-
 .../org/apache/juneau/soap/SoapXmlClassMeta.java   | 14 ------
 .../java/org/apache/juneau/uon/UonClassMeta.java   | 14 ------
 .../juneau/urlencoding/UrlEncodingClassMeta.java   | 22 ++-------
 .../java/org/apache/juneau/xml/XmlClassMeta.java   | 27 +++--------
 19 files changed, 116 insertions(+), 264 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 1cd3fad..bf39ee2 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
@@ -29,7 +29,6 @@ import org.apache.juneau.xml.*;
  */
 public class RdfClassMeta extends ExtendedClassMeta {
 
-       private final List<Rdf> rdfs;
        private final RdfCollectionFormat collectionFormat;
        private final Namespace namespace;
 
@@ -41,28 +40,20 @@ public class RdfClassMeta extends ExtendedClassMeta {
         */
        public RdfClassMeta(ClassMeta<?> cm, RdfMetaProvider mp) {
                super(cm);
-               this.rdfs = cm.getAnnotations(Rdf.class);
+               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));
 
                RdfCollectionFormat _collectionFormat = 
RdfCollectionFormat.DEFAULT;
                for (Rdf a : rdfs)
                        if (a.collectionFormat() != RdfCollectionFormat.DEFAULT)
                                _collectionFormat = a.collectionFormat();
                this.collectionFormat = _collectionFormat;
-
-               List<RdfSchema> schemas = cm.getAnnotations(RdfSchema.class);
                this.namespace = RdfUtils.findNamespace(rdfs, schemas);
        }
 
        /**
-        * Returns the {@link Rdf @Rdf} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<Rdf> getAnnotations() {
-               return rdfs;
-       }
-
-       /**
         * Returns the {@link Rdf#collectionFormat() @Rdf(collectionFormat)} 
annotation defined on the class.
         *
         * @return The value of the annotation, or <jk>null</jk> if annotation 
is not
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 3fa26b7..b50bcb5 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
@@ -26,6 +26,7 @@ import java.util.*;
 
 import org.apache.juneau.annotation.*;
 import org.apache.juneau.collections.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 
 /**
@@ -180,19 +181,15 @@ public class BeanMeta<T> {
                                if (beanFilter != null && 
beanFilter.getBeanDictionary() != null)
                                        
bdClasses.a(beanFilter.getBeanDictionary());
 
-                               boolean hasTypeName = false;
-                               for (Bean b : 
classMeta.getAnnotations(Bean.class))
-                                       if (! b.typeName().isEmpty())
-                                               hasTypeName = true;
-                               if (hasTypeName)
+                               Value<String> typeName = Value.empty();
+                               classMeta.getAnnotations(Bean.class, x -> 
typeName.setIf(x.typeName(), StringUtils::isNotEmpty));
+                               if (typeName.isPresent())
                                        bdClasses.add(classMeta.innerClass);
                                this.beanRegistry = new BeanRegistry(ctx, null, 
bdClasses.toArray(new Class<?>[bdClasses.size()]));
 
-                               for (Bean b : 
classMeta.getAnnotations(Bean.class))
-                                       if (! b.typePropertyName().isEmpty())
-                                               typePropertyName = 
b.typePropertyName();
-                               if (typePropertyName == null)
-                                       typePropertyName = 
ctx.getBeanTypePropertyName();
+                               Value<String> typePropertyName = Value.empty();
+                               classMeta.getAnnotations(Bean.class, x -> 
typePropertyName.setIf(x.typePropertyName(), StringUtils::isNotEmpty));
+                               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/BeanRegistry.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
index 6c6bb14..e8de10b 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -20,6 +20,7 @@ import java.util.*;
 import java.util.concurrent.*;
 
 import org.apache.juneau.annotation.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.reflect.*;
 
 /**
@@ -93,13 +94,12 @@ public class BeanRegistry {
                                                addToMap(typeName, val);
                                        }
                                } else {
-                                       String typeName = null;
-                                       for (Bean b : 
ci.getAnnotations(Bean.class, beanContext))
-                                               if (! b.typeName().isEmpty())
-                                                       typeName = b.typeName();
-                                       if (typeName == null)
-                                               throw new 
BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but it doesn't 
have a @Bean(typeName) annotation defined.", className(c));
-                                       addToMap(typeName, 
beanContext.getClassMeta(c));
+                                       Value<String> typeName = Value.empty();
+                                       ci.getAnnotations(Bean.class, 
beanContext, x -> typeName.setIf(x.typeName(), StringUtils::isNotEmpty));
+                                       addToMap(
+                                               typeName.orElseThrow(() -> new 
BeanRuntimeException("Class ''{0}'' was passed to BeanRegistry but it doesn't 
have a @Bean(typeName) annotation defined.", className(c))), 
+                                               beanContext.getClassMeta(c)
+                                       );
                                }
                        }
                } catch (BeanRuntimeException e) {
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 875587a..3aeb4b1 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
@@ -117,7 +117,7 @@ public final class ClassMeta<T> implements Type {
        private final Map<Class<?>,Mutater<?,T>> fromMutaters = new 
ConcurrentHashMap<>();
        private final Map<Class<?>,Mutater<T,?>> toMutaters = new 
ConcurrentHashMap<>();
        private final Mutater<String,T> stringMutater;
-       private final Map<Class<?>,List<?>> annotationListMap = new 
ConcurrentHashMap<>();
+       private final Map<Class<?>,Annotation[]> annotationArrayMap = new 
ConcurrentHashMap<>();
        private final Map<Class<?>,Optional<?>> annotationLastMap = new 
ConcurrentHashMap<>();
        private final Map<String,Optional<?>> properties = new 
ConcurrentHashMap<>();
 
@@ -2100,23 +2100,31 @@ public final class ClassMeta<T> implements Type {
        }
 
        /**
-        * Returns all annotations of the specified type defined on the 
specified class or parent classes/interfaces in parent-to-child order.
+        * Consumes all 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.
-        * @return
-        *      A list of all matching annotations found or an empty list if 
none found.
+        * @param consumer The consumer of the annotations.
+        * @return This object.
         */
        @SuppressWarnings("unchecked")
-       public <A extends Annotation> List<A> getAnnotations(Class<A> a) {
-               List<A> l = (List<A>)annotationListMap.get(a);
-               if (l == null) {
-                       if (beanContext == null)
-                               return info.getAnnotations(a, 
BeanContext.DEFAULT);
-                       l = Collections.unmodifiableList(info.getAnnotations(a, 
beanContext));
-                       annotationListMap.put(a, l);
+       public <A extends Annotation> ClassMeta<T> getAnnotations(Class<A> a, 
Consumer<A> consumer) {
+               A[] array = (A[])annotationArrayMap.get(a);
+               if (array == null) {
+                       if (beanContext == null) {
+                               info.getAnnotations(a, BeanContext.DEFAULT, 
consumer);
+                               return this;
+                       }
+                       List<A> l = new ArrayList<>();
+                       info.getAnnotations(a, beanContext, x -> l.add(x));
+                       array = (A[])Array.newInstance(a, l.size());
+                       for (int i = 0; i < l.size(); i++)
+                               Array.set(array, i, l.get(i));
+                       annotationArrayMap.put(a, array);
                }
-               return l;
+               for (A aa : array)
+                       consumer.accept(aa);
+               return this;
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
index ff1137a..640562f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/csv/CsvClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.csv;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.csv.annotation.*;
 
@@ -28,8 +26,6 @@ import org.apache.juneau.csv.annotation.*;
  */
 public class CsvClassMeta extends ExtendedClassMeta {
 
-       private final List<Csv> csvs;
-
        /**
         * Constructor.
         *
@@ -38,15 +34,5 @@ public class CsvClassMeta extends ExtendedClassMeta {
         */
        public CsvClassMeta(ClassMeta<?> cm, CsvMetaProvider mp) {
                super(cm);
-               this.csvs = cm.getAnnotations(Csv.class);
-       }
-
-       /**
-        * Returns the {@link Csv @Csv} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<Csv> getAnnotation() {
-               return csvs;
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlClassMeta.java
index a47b37e..b654fdb 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
@@ -12,9 +12,9 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.html;
 
-import static org.apache.juneau.internal.ClassUtils.*;
+import static org.apache.juneau.internal.ThrowableUtils.*;
 
-import java.util.*;
+import java.util.function.*;
 
 import org.apache.juneau.*;
 import org.apache.juneau.html.annotation.*;
@@ -30,7 +30,6 @@ import org.apache.juneau.html.annotation.*;
  */
 public class HtmlClassMeta extends ExtendedClassMeta {
 
-       private final List<Html> htmls;
        private final boolean noTables, noTableHeaders;
        private final HtmlFormat format;
        private final HtmlRender<?> render;
@@ -43,32 +42,29 @@ public class HtmlClassMeta extends ExtendedClassMeta {
         */
        public HtmlClassMeta(ClassMeta<?> cm, HtmlMetaProvider mp) {
                super(cm);
-               this.htmls = cm.getAnnotations(Html.class);
-
-               boolean _noTables = false, _noTableHeaders = false;
-               HtmlRender<?> _render = null;
-               HtmlFormat _format = HtmlFormat.HTML;
-
-               for (Html a : this.htmls) {
-                       _format = a.format();
-                       _noTables = a.noTables();
-                       _noTableHeaders = a.noTableHeaders();
-                       _render = castOrCreate(HtmlRender.class, a.render());
-               }
-
-               this.noTables = _noTables;
-               this.noTableHeaders = _noTableHeaders;
-               this.render = _render;
-               this.format = _format;
-       }
 
-       /**
-        * Returns the {@link Html @Html} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<Html> getAnnotations() {
-               return htmls;
+               Value<Boolean> noTables = Value.empty(), noTableHeaders = 
Value.empty();
+               Value<HtmlFormat> format = Value.empty();
+               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.render() != HtmlRender.class) {
+                               try {
+                                       render.set(x.render().newInstance());
+                               } catch (Exception e) {
+                                       throw runtimeException(e);
+                               }
+                       }
+               };
+               cm.getAnnotations(Html.class, c);
+
+               this.noTables = noTables.orElse(false);
+               this.noTableHeaders = noTableHeaders.orElse(false);
+               this.render = render.orElse(null);
+               this.format = format.orElse(HtmlFormat.HTML);
        }
 
        /**
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 1ee2006..c40464e 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
@@ -475,16 +475,12 @@ public final class HtmlParserSession extends 
XmlParserSession {
                String href = r.getAttributeValue(null, "href");
                String name = getElementText(r);
                if (beanType.hasAnnotation(HtmlLink.class)) {
-                       String uriProperty = "", nameProperty = "";
-                       for (HtmlLink a : 
beanType.getAnnotations(HtmlLink.class)) {
-                               if (! a.uriProperty().isEmpty())
-                                       uriProperty = a.uriProperty();
-                               if (! a.nameProperty().isEmpty())
-                                       nameProperty = a.nameProperty();
-                       }
+                       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));
                        BeanMap<T> m = newBeanMap(beanType.getInnerClass());
-                       m.put(uriProperty, href);
-                       m.put(nameProperty, name);
+                       m.put(uriProperty.orElse(""), href);
+                       m.put(nameProperty.orElse(""), name);
                        return m.getBean();
                }
                return convertToType(href, beanType);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlSerializerSession.java
index 377a1a4..4ac4f4c 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
@@ -518,15 +518,11 @@ public class HtmlSerializerSession extends 
XmlSerializerSession {
                        } else if (sType.isBean()) {
                                BeanMap m = toBeanMap(o);
                                if (aType.hasAnnotation(HtmlLink.class)) {
-                                       String uriProperty = "", nameProperty = 
"";
-                                       for (HtmlLink a : 
aType.getAnnotations(HtmlLink.class)) {
-                                               if (! a.uriProperty().isEmpty())
-                                                       uriProperty = 
a.uriProperty();
-                                               if (! 
a.nameProperty().isEmpty())
-                                                       nameProperty = 
a.nameProperty();
-                                       }
-                                       Object urlProp = m.get(uriProperty);
-                                       Object nameProp = m.get(nameProperty);
+                                       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));
+                                       Object urlProp = 
m.get(uriProperty.orElse(""));
+                                       Object nameProp = 
m.get(nameProperty.orElse(""));
 
                                        out.oTag("a").attrUri("href", 
urlProp).append('>').text(nameProp).eTag("a");
                                        cr = CR_MIXED;
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 ac2e4ef..c7006cd 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,6 +24,7 @@ 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.*;
 
 /**
@@ -419,43 +420,31 @@ public class HttpParts {
        
//-----------------------------------------------------------------------------------------------------------------
 
        private static final Function<ClassMeta<?>,String> HEADER_NAME_FUNCTION 
= x -> {
-               for (org.apache.juneau.http.annotation.Header a : 
x.getAnnotations(org.apache.juneau.http.annotation.Header.class)) {
-                       if (! a.value().isEmpty())
-                               return a.value();
-                       if (! a.name().isEmpty())
-                               return a.name();
-               }
-               return null;
+               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));
+               return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,String> QUERY_NAME_FUNCTION 
= x -> {
-               for (org.apache.juneau.http.annotation.Query a : 
x.getAnnotations(org.apache.juneau.http.annotation.Query.class)) {
-                       if (! a.value().isEmpty())
-                               return a.value();
-                       if (! a.name().isEmpty())
-                               return a.name();
-               }
-               return null;
+               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));
+               return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,String> 
FORMDATA_NAME_FUNCTION = x -> {
-               for (org.apache.juneau.http.annotation.FormData a : 
x.getAnnotations(org.apache.juneau.http.annotation.FormData.class)) {
-                       if (! a.value().isEmpty())
-                               return a.value();
-                       if (! a.name().isEmpty())
-                               return a.name();
-               }
-               return null;
+               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));
+               return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,String> PATH_NAME_FUNCTION = 
x -> {
-               for (org.apache.juneau.http.annotation.Path a : 
x.getAnnotations(org.apache.juneau.http.annotation.Path.class)) {
-                       if (! a.value().isEmpty())
-                               return a.value();
-                       if (! a.name().isEmpty())
-                               return a.name();
-               }
-               return null;
+               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));
+               return n.orElse(null);
        };
 
        private static final Function<ClassMeta<?>,ConstructorInfo> 
CONSTRUCTOR_FUNCTION = x -> {
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 27f6dc7..ae3714f 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,9 +12,8 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.json;
 
-import java.util.*;
-
 import org.apache.juneau.*;
+import org.apache.juneau.internal.*;
 import org.apache.juneau.json.annotation.*;
 
 /**
@@ -28,7 +27,6 @@ import org.apache.juneau.json.annotation.*;
  */
 public class JsonClassMeta extends ExtendedClassMeta {
 
-       private final List<Json> jsons;
        private final String wrapperAttr;
 
        /**
@@ -39,22 +37,10 @@ public class JsonClassMeta extends ExtendedClassMeta {
         */
        public JsonClassMeta(ClassMeta<?> cm, JsonMetaProvider mp) {
                super(cm);
-               this.jsons = cm.getAnnotations(Json.class);
-
-               String _wrapperAttr = null;
-               for (Json a : this.jsons)
-                       if (! a.wrapperAttr().isEmpty())
-                               _wrapperAttr = a.wrapperAttr();
-               this.wrapperAttr = _wrapperAttr;
-       }
 
-       /**
-        * Returns the {@link Json @Json} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<Json> getAnnotations() {
-               return jsons;
+               Value<String> wrapperAttr = Value.empty();
+               cm.getAnnotations(Json.class, x -> 
wrapperAttr.setIf(x.wrapperAttr(), StringUtils::isNotEmpty));
+               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 ef318d4..6afe157 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
@@ -14,6 +14,8 @@ package org.apache.juneau.jsonschema;
 
 import static org.apache.juneau.internal.ThrowableUtils.*;
 
+import java.util.function.*;
+
 import org.apache.juneau.*;
 import org.apache.juneau.collections.*;
 import org.apache.juneau.http.annotation.*;
@@ -40,12 +42,14 @@ public class JsonSchemaClassMeta extends ExtendedClassMeta {
         */
        public JsonSchemaClassMeta(ClassMeta<?> cm, JsonSchemaMetaProvider mp) {
                super(cm);
-               try {
-                       for (Schema a : cm.getAnnotations(Schema.class))
-                               schema.append(SchemaAnnotation.asMap(a));
-               } catch (ParseException e) {
-                       throw runtimeException(e);
-               }
+               Consumer<Schema> c = x -> {
+                       try {
+                               schema.append(SchemaAnnotation.asMap(x));
+                       } catch (ParseException e) {
+                               throw runtimeException(e);
+                       }
+               };
+               cm.getAnnotations(Schema.class, c);
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
index c311097..7abe184 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.msgpack;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.msgpack.annotation.*;
 
@@ -28,8 +26,6 @@ import org.apache.juneau.msgpack.annotation.*;
  */
 public class MsgPackClassMeta extends ExtendedClassMeta {
 
-       private final List<MsgPack> msgPacks;
-
        /**
         * Constructor.
         *
@@ -38,15 +34,5 @@ public class MsgPackClassMeta extends ExtendedClassMeta {
         */
        public MsgPackClassMeta(ClassMeta<?> cm, MsgPackMetaProvider mp) {
                super(cm);
-               this.msgPacks = cm.getAnnotations(MsgPack.class);
-       }
-
-       /**
-        * Returns the {@link MsgPack @MsgPack} annotations defined on the 
class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<MsgPack> getAnnotations() {
-               return msgPacks;
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
index b577d82..8b9379a 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/oapi/OpenApiClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.oapi;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.oapi.annotation.*;
 
@@ -28,8 +26,6 @@ import org.apache.juneau.oapi.annotation.*;
  */
 public class OpenApiClassMeta extends ExtendedClassMeta {
 
-       private final List<OpenApi> openApis;
-
        /**
         * Constructor.
         *
@@ -38,15 +34,5 @@ public class OpenApiClassMeta extends ExtendedClassMeta {
         */
        public OpenApiClassMeta(ClassMeta<?> cm, OpenApiMetaProvider mp) {
                super(cm);
-               this.openApis = cm.getAnnotations(OpenApi.class);
-       }
-
-       /**
-        * Returns the {@link OpenApi @OpenApi} annotations defined on the 
class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<OpenApi> getAnnotations() {
-               return openApis;
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
index cc5e505..e8e8483 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/plaintext/PlainTextClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.plaintext;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.plaintext.annotation.*;
 
@@ -28,8 +26,6 @@ import org.apache.juneau.plaintext.annotation.*;
  */
 public class PlainTextClassMeta extends ExtendedClassMeta {
 
-       private final List<PlainText> plainTexts;
-
        /**
         * Constructor.
         *
@@ -38,15 +34,5 @@ public class PlainTextClassMeta extends ExtendedClassMeta {
         */
        public PlainTextClassMeta(ClassMeta<?> cm, PlainTextMetaProvider mp) {
                super(cm);
-               this.plainTexts = cm.getAnnotations(PlainText.class);
-       }
-
-       /**
-        * Returns the {@link PlainText @PlainText} annotations defined on the 
class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<PlainText> getAnnotations() {
-               return plainTexts;
        }
 }
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 884ed00..a625c8b 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
@@ -979,7 +979,9 @@ 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, 
MetaProvider mp) {
-               return appendAnnotations(new ArrayList<>(), a, mp);
+               List<T> l = new ArrayList<>();
+               getAnnotations(a, mp, x -> l.add(x));
+               return l;
        }
 
        /**
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
index e19ae28..50147b1 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/soap/SoapXmlClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.soap;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.soap.annotation.*;
 
@@ -28,8 +26,6 @@ import org.apache.juneau.soap.annotation.*;
  */
 public class SoapXmlClassMeta extends ExtendedClassMeta {
 
-       private final List<SoapXml> soapXmls;
-
        /**
         * Constructor.
         *
@@ -38,15 +34,5 @@ public class SoapXmlClassMeta extends ExtendedClassMeta {
         */
        public SoapXmlClassMeta(ClassMeta<?> cm, SoapXmlMetaProvider mp) {
                super(cm);
-               this.soapXmls = cm.getAnnotations(SoapXml.class);
-       }
-
-       /**
-        * Returns the {@link SoapXml @SoapXml} annotations defined on the 
class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<SoapXml> getAnnotations() {
-               return soapXmls;
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
index 2ddf5a0..fa9d122 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.uon;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.uon.annotation.*;
 
@@ -28,8 +26,6 @@ import org.apache.juneau.uon.annotation.*;
  */
 public class UonClassMeta extends ExtendedClassMeta {
 
-       private final List<Uon> uons;
-
        /**
         * Constructor.
         *
@@ -38,15 +34,5 @@ public class UonClassMeta extends ExtendedClassMeta {
         */
        public UonClassMeta(ClassMeta<?> cm, UonMetaProvider mp) {
                super(cm);
-               this.uons = cm.getAnnotations(Uon.class);
-       }
-
-       /**
-        * Returns the {@link Uon @Uon} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<Uon> getAnnotations() {
-               return uons;
        }
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
index c04026a..0f19f5f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/urlencoding/UrlEncodingClassMeta.java
@@ -12,8 +12,6 @@
 // 
***************************************************************************************************************************
 package org.apache.juneau.urlencoding;
 
-import java.util.*;
-
 import org.apache.juneau.*;
 import org.apache.juneau.urlencoding.annotation.*;
 
@@ -27,7 +25,6 @@ import org.apache.juneau.urlencoding.annotation.*;
  */
 public class UrlEncodingClassMeta extends ExtendedClassMeta {
 
-       private final List<UrlEncoding> urlEncodings;
        private final boolean expandedParams;
 
        /**
@@ -38,23 +35,10 @@ public class UrlEncodingClassMeta extends ExtendedClassMeta 
{
         */
        public UrlEncodingClassMeta(ClassMeta<?> cm, UrlEncodingMetaProvider 
mp) {
                super(cm);
-               this.urlEncodings = cm.getAnnotations(UrlEncoding.class);
-
-               boolean _expandedParams = false;
-               for (UrlEncoding a : urlEncodings)
-                       if (a.expandedParams())
-                               _expandedParams = true;
-
-               this.expandedParams = _expandedParams;
-       }
 
-       /**
-        * Returns the {@link UrlEncoding} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<UrlEncoding> getAnnotations() {
-               return urlEncodings;
+               Value<Boolean> expandedParams = Value.empty();
+               cm.getAnnotations(UrlEncoding.class, x -> 
expandedParams.setIf(x.expandedParams(), y -> y == 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 4d4f202..52b24a8 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
@@ -29,7 +29,6 @@ import org.apache.juneau.xml.annotation.*;
 public class XmlClassMeta extends ExtendedClassMeta {
 
        private final Namespace namespace;
-       private final List<Xml> xmls;
        private final XmlFormat format;
        private final String childName;
 
@@ -41,8 +40,13 @@ public class XmlClassMeta extends ExtendedClassMeta {
         */
        public XmlClassMeta(ClassMeta<?> cm, XmlMetaProvider mp) {
                super(cm);
-               this.namespace = findNamespace(cm, mp);
-               this.xmls = cm.getAnnotations(Xml.class);
+               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));
+               }
+               this.namespace = XmlUtils.findNamespace(xmls, schemas);
 
                String _childName = null;
                XmlFormat _format = XmlFormat.DEFAULT;
@@ -57,15 +61,6 @@ public class XmlClassMeta extends ExtendedClassMeta {
        }
 
        /**
-        * Returns the {@link Xml @Xml} annotations defined on the class.
-        *
-        * @return An unmodifiable list of annotations ordered parent-to-child, 
or an empty list if not found.
-        */
-       protected List<Xml> getAnnotations() {
-               return xmls;
-       }
-
-       /**
         * Returns the {@link Xml#format() @Xml(format)} annotation defined on 
the class.
         *
         * @return The value of the annotation, or {@link XmlFormat#DEFAULT} if 
not specified.
@@ -102,12 +97,4 @@ public class XmlClassMeta extends ExtendedClassMeta {
        public Namespace getNamespace() {
                return namespace;
        }
-
-       private static Namespace findNamespace(ClassMeta<?> cm, MetaProvider 
mp) {
-               if (cm == null)
-                       return null;
-               List<Xml> xmls = cm.getAnnotations(Xml.class);
-               List<XmlSchema> schemas = cm.getAnnotations(XmlSchema.class);
-               return XmlUtils.findNamespace(xmls, schemas);
-       }
 }

Reply via email to