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 4d338b3  BeanStore refactoring.
4d338b3 is described below

commit 4d338b328b770a2939af6ae48c3b1f110e38707b
Author: JamesBognar <[email protected]>
AuthorDate: Sat Jan 22 17:06:29 2022 -0500

    BeanStore refactoring.
---
 .../main/ConfigurablePropertyCodeGenerator.java    |  4 +-
 .../src/main/java/org/apache/juneau/BeanMeta.java  | 47 ++++++++----------
 .../src/main/java/org/apache/juneau/ClassMeta.java | 15 ++++--
 .../src/main/java/org/apache/juneau/Context.java   | 12 ++---
 .../juneau/httppart/bean/RequestBeanMeta.java      | 47 +++++++++---------
 .../juneau/httppart/bean/ResponseBeanMeta.java     | 34 ++++++-------
 .../org/apache/juneau/internal/ObjectUtils.java    |  4 +-
 .../java/org/apache/juneau/reflect/ClassInfo.java  | 57 ++++++++++++++--------
 .../java/org/apache/juneau/reflect/FieldInfo.java  | 21 ++++++++
 .../java/org/apache/juneau/reflect/Mutaters.java   | 24 ++++-----
 .../java/org/apache/juneau/swap/AutoListSwap.java  | 14 +++---
 .../java/org/apache/juneau/swap/AutoMapSwap.java   | 14 +++---
 .../org/apache/juneau/swap/AutoNumberSwap.java     | 14 +++---
 .../org/apache/juneau/swap/AutoObjectSwap.java     | 14 +++---
 .../java/org/apache/juneau/swap/BuilderSwap.java   | 16 +++---
 .../java/org/apache/juneau/swap/DefaultSwaps.java  |  8 +--
 .../java/org/apache/juneau/rest/RestContext.java   |  1 -
 .../rest/swagger/BasicSwaggerProviderSession.java  |  8 ++-
 .../apache/juneau/reflection/ClassInfoTest.java    | 41 +++-------------
 19 files changed, 199 insertions(+), 196 deletions(-)

diff --git a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java 
b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
index 94bbf82..ad66eb8 100644
--- a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
+++ b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
@@ -111,7 +111,9 @@ public class ConfigurablePropertyCodeGenerator {
                        String indent = c.getDeclaringClass() != null ? "\t\t" 
: "\t";
                        Set<String> sigsAdded = new HashSet<String>();
 
-                       for (ClassInfo pc : 
ClassInfo.of(c).getParentsParentFirst()) {
+                       List<ClassInfo> l = ClassInfo.of(c).getParents();
+                       for (int i = l.size()-1; i>=0; i--) {
+                               ClassInfo pc = l.get(i);
                                Class<?> pcc = pc.inner();
                                if (pcc != c) {
                                        Set<Method> ms = configMethods.get(pcc);
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 b4c6573..48e6af3 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
@@ -16,7 +16,6 @@ import static org.apache.juneau.internal.CollectionUtils.*;
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.ThrowableUtils.*;
 import static org.apache.juneau.internal.ObjectUtils.*;
-import static org.apache.juneau.reflect.ReflectFlags.*;
 import static org.apache.juneau.BeanMeta.MethodType.*;
 
 import java.beans.*;
@@ -771,38 +770,32 @@ public class BeanMeta<T> {
 
        static final Collection<Field> findBeanFields(BeanContext ctx, Class<?> 
c, Class<?> stopClass, Visibility v) {
                List<Field> l = new LinkedList<>();
+               boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
                for (ClassInfo c2 : findClasses(c, stopClass)) {
-                       for (FieldInfo f : c2.getDeclaredFields()) {
-                               if (f.is(STATIC))
-                                       continue;
-                               if (f.is(TRANSIENT) && 
ctx.isIgnoreTransientFields())
-                                       continue;
-                               if (ctx.hasAnnotation(BeanIgnore.class, f))
-                                       continue;
-
-                               List<Beanp> lp = 
ctx.getAnnotations(Beanp.class, f);
-
-                               if (! (v.isVisible(f.inner()) || lp.size() > 0))
-                                       continue;
-
-                               l.add(f.inner());
-                       }
+                       c2.getDeclaredFields(
+                               x -> x.isNotStatic()
+                               && (x.isNotTransient() || noIgnoreTransients)
+                               && (x.hasNoAnnotation(Transient.class) || 
noIgnoreTransients)
+                               && x.hasNoAnnotation(BeanIgnore.class, ctx)
+                               && (v.isVisible(x.inner()) || 
ctx.getAnnotations(Beanp.class, x).size() > 0),
+                               x -> l.add(x.inner())
+                       );
                }
                return l;
        }
 
-       static final Field findInnerBeanField(BeanContext bc, Class<?> c, 
Class<?> stopClass, String name) {
+       static final Field findInnerBeanField(BeanContext ctx, Class<?> c, 
Class<?> stopClass, String name) {
+               boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
                for (ClassInfo c2 : findClasses(c, stopClass)) {
-                       for (FieldInfo f : c2.getDeclaredFields()) {
-                               if (f.is(STATIC))
-                                       continue;
-                               if ((f.is(TRANSIENT) || 
f.hasAnnotation(Transient.class)) && bc.isIgnoreTransientFields())
-                                       continue;
-                               if (f.hasAnnotation(BeanIgnore.class, bc))
-                                       continue;
-                               if (f.hasName(name))
-                                       return f.inner();
-                       }
+                       FieldInfo f = c2.getDeclaredField(
+                               x -> x.isNotStatic()
+                               && (x.isNotTransient() || noIgnoreTransients)
+                               && (x.hasNoAnnotation(Transient.class) || 
noIgnoreTransients)
+                               && x.hasNoAnnotation(BeanIgnore.class, ctx)
+                               && x.hasName(name)
+                       );
+                       if (f != null)
+                               return f.inner();
                }
                return null;
        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index 6ae7ce6..875587a 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
@@ -481,7 +481,9 @@ public final class ClassMeta<T> implements Type {
                        }
 
                        // Find @NameProperty and @ParentProperty methods if 
present.
-                       for (MethodInfo m : ci.getAllMethodsParentFirst()) {
+                       List<MethodInfo> methods = ci.getMethods();
+                       for (int i = methods.size()-1; i >=0; i--) {
+                               MethodInfo m = methods.get(i);
                                if (bc.hasAnnotation(ParentProperty.class, m)) {
                                        if (m.isStatic() || ! m.hasNumParams(1))
                                                throw new 
ClassMetaRuntimeException(c, "@ParentProperty used on invalid method ''{0}''.  
Must not be static and have one argument.", m);
@@ -927,10 +929,13 @@ public final class ClassMeta<T> implements Type {
                if (ci.isAbstract())
                        return null;
                boolean isMemberClass = ci.isMemberClass() && ci.isNotStatic();
-               for (ConstructorInfo cc : ci.getPublicConstructors()) {
-                       if (cc.hasNumParams(isMemberClass ? 1 : 0) && 
cc.isVisible(v) && cc.isNotDeprecated())
-                               return (Constructor<? extends T>) 
v.transform(cc.inner());
-               }
+               ConstructorInfo cc = ci.getPublicConstructor(
+                       x -> x.isVisible(v)
+                       && x.isNotDeprecated()
+                       && x.hasNumParams(isMemberClass ? 1 : 0)
+               );
+               if (cc != null)
+                       return (Constructor<? extends T>) 
v.transform(cc.inner());
                return null;
        }
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
index 32ccc82..1f9108a 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/Context.java
@@ -194,12 +194,12 @@ public abstract class Context implements MetaProvider {
                private ConstructorInfo getContextConstructor() {
                        ConstructorInfo cci = CONTEXT_CONSTRUCTORS.get(type);
                        if (cci == null) {
-                               cci = ClassInfo.of(type)
-                                       .getPublicConstructors()
-                                       .stream()
-                                       .filter(x -> x.hasNumParams(1) && 
x.getParam(0).getParameterType().isParentOf(this.getClass()))
-                                       .findFirst()
-                                       
.orElseThrow(()->runtimeException("Public constructor not found: {0}({1})", 
className(type), className(this)));
+                               cci = ClassInfo.ofc(type).getPublicConstructor(
+                                       x -> x.hasNumParams(1)
+                                       && x.getParam(0).canAccept(this)
+                               );
+                               if (cci == null)
+                                       throw runtimeException("Public 
constructor not found: {0}({1})", className(type), className(this));
                                CONTEXT_CONSTRUCTORS.put(type, cci);
                        }
                        return cci;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
index ee79b31..c7fa6f6 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
@@ -97,31 +97,28 @@ public class RequestBeanMeta {
                Builder apply(Class<?> c) {
                        this.cm = BeanContext.DEFAULT.getClassMeta(c);
                        apply(cm.getLastAnnotation(Request.class));
-                       for (MethodInfo m : cm.getInfo().getAllMethods()) {
-
-                               if (m.isPublic()) {
-                                       String n = m.getSimpleName();
-                                       if (m.hasAnnotation(Header.class)) {
-                                               assertNoArgs(m, Header.class);
-                                               assertReturnNotVoid(m, 
Header.class);
-                                               properties.put(n, 
RequestBeanPropertyMeta.create(HEADER, Header.class, m));
-                                       } else if 
(m.hasAnnotation(Query.class)) {
-                                               assertNoArgs(m, Query.class);
-                                               assertReturnNotVoid(m, 
Query.class);
-                                               properties.put(n, 
RequestBeanPropertyMeta.create(QUERY, Query.class, m));
-                                       } else if 
(m.hasAnnotation(FormData.class)) {
-                                               assertNoArgs(m, FormData.class);
-                                               assertReturnNotVoid(m, 
FormData.class);
-                                               properties.put(n, 
RequestBeanPropertyMeta.create(FORMDATA, FormData.class, m));
-                                       } else if (m.hasAnnotation(Path.class)) 
{
-                                               assertNoArgs(m, Path.class);
-                                               assertReturnNotVoid(m, 
Path.class);
-                                               properties.put(n, 
RequestBeanPropertyMeta.create(PATH, Path.class, m));
-                                       } else if (m.hasAnnotation(Body.class)) 
{
-                                               assertNoArgs(m, Body.class);
-                                               assertReturnNotVoid(m, 
Body.class);
-                                               properties.put(n, 
RequestBeanPropertyMeta.create(BODY, Body.class, m));
-                                       }
+                       for (MethodInfo m : cm.getInfo().getPublicMethods()) {
+                               String n = m.getSimpleName();
+                               if (m.hasAnnotation(Header.class)) {
+                                       assertNoArgs(m, Header.class);
+                                       assertReturnNotVoid(m, Header.class);
+                                       properties.put(n, 
RequestBeanPropertyMeta.create(HEADER, Header.class, m));
+                               } else if (m.hasAnnotation(Query.class)) {
+                                       assertNoArgs(m, Query.class);
+                                       assertReturnNotVoid(m, Query.class);
+                                       properties.put(n, 
RequestBeanPropertyMeta.create(QUERY, Query.class, m));
+                               } else if (m.hasAnnotation(FormData.class)) {
+                                       assertNoArgs(m, FormData.class);
+                                       assertReturnNotVoid(m, FormData.class);
+                                       properties.put(n, 
RequestBeanPropertyMeta.create(FORMDATA, FormData.class, m));
+                               } else if (m.hasAnnotation(Path.class)) {
+                                       assertNoArgs(m, Path.class);
+                                       assertReturnNotVoid(m, Path.class);
+                                       properties.put(n, 
RequestBeanPropertyMeta.create(PATH, Path.class, m));
+                               } else if (m.hasAnnotation(Body.class)) {
+                                       assertNoArgs(m, Body.class);
+                                       assertReturnNotVoid(m, Body.class);
+                                       properties.put(n, 
RequestBeanPropertyMeta.create(BODY, Body.class, m));
                                }
                        }
                        return this;
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 66d04e0..f96b7a0 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
@@ -155,25 +155,23 @@ public class ResponseBeanMeta {
                        Class<?> c = ClassUtils.toClass(t);
                        this.cm = BeanContext.DEFAULT.getClassMeta(c);
                        ClassInfo ci = cm.getInfo();
-                       for (MethodInfo m : ci.getAllMethods()) {
-                               if (m.isPublic()) {
-                                       assertNoInvalidAnnotations(m, 
Query.class, FormData.class);
-                                       if (m.hasAnnotation(Header.class)) {
-                                               assertNoArgs(m, Header.class);
+                       for (MethodInfo m : ci.getPublicMethods()) {
+                               assertNoInvalidAnnotations(m, Query.class, 
FormData.class);
+                               if (m.hasAnnotation(Header.class)) {
+                                       assertNoArgs(m, Header.class);
+                                       assertReturnNotVoid(m, Header.class);
+                                       HttpPartSchema s = 
HttpPartSchema.create(m.getLastAnnotation(Header.class), m.getPropertyName());
+                                       headerMethods.put(s.getName(), 
ResponseBeanPropertyMeta.create(RESPONSE_HEADER, s, m));
+                               } else if (m.hasAnnotation(StatusCode.class)) {
+                                       assertNoArgs(m, Header.class);
+                                       assertReturnType(m, Header.class, 
int.class, Integer.class);
+                                       statusMethod = 
ResponseBeanPropertyMeta.create(RESPONSE_STATUS, m);
+                               } else if (m.hasAnnotation(Body.class)) {
+                                       if (m.getParamCount() == 0)
                                                assertReturnNotVoid(m, 
Header.class);
-                                               HttpPartSchema s = 
HttpPartSchema.create(m.getLastAnnotation(Header.class), m.getPropertyName());
-                                               headerMethods.put(s.getName(), 
ResponseBeanPropertyMeta.create(RESPONSE_HEADER, s, m));
-                                       } else if 
(m.hasAnnotation(StatusCode.class)) {
-                                               assertNoArgs(m, Header.class);
-                                               assertReturnType(m, 
Header.class, int.class, Integer.class);
-                                               statusMethod = 
ResponseBeanPropertyMeta.create(RESPONSE_STATUS, m);
-                                       } else if (m.hasAnnotation(Body.class)) 
{
-                                               if (m.getParamCount() == 0)
-                                                       assertReturnNotVoid(m, 
Header.class);
-                                               else
-                                                       assertArgType(m, 
Header.class, OutputStream.class, Writer.class);
-                                               bodyMethod = 
ResponseBeanPropertyMeta.create(RESPONSE_BODY, m);
-                                       }
+                                       else
+                                               assertArgType(m, Header.class, 
OutputStream.class, Writer.class);
+                                       bodyMethod = 
ResponseBeanPropertyMeta.create(RESPONSE_BODY, m);
                                }
                        }
                        return this;
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
index e40c5c5..54d83f9 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
@@ -262,7 +262,9 @@ public class ObjectUtils {
                        Map<String,MethodInfo> methods2 = new LinkedHashMap<>();
                        do {
                                String cname = ci.getShortName();
-                               ci.getDeclaredMethods().stream().filter(x -> 
x.getName().equals("properties")).findFirst().ifPresent(x -> 
methods2.put(cname, x.accessible()));
+                               MethodInfo mi = ci.getDeclaredMethod(x -> 
x.hasName("properties"));
+                               if (mi != null)
+                                       methods2.put(cname, mi.accessible());
                                ci = ci.getParent();
                        } while (ci != null);
                        methods = methods2;
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 8f034c8..45eeb83 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
@@ -317,36 +317,26 @@ public final class ClassInfo {
        }
 
        /**
-        * Returns a list including this class and all parent classes.
-        *
-        * <p>
-        * Does not include interfaces.
-        *
-        * @return An unmodifiable list including this class and all parent 
classes.
-        *      <br>Results are in parent-to-child order.
-        */
-       public List<ClassInfo> getParentsParentFirst() {
-               return new UnmodifiableArray<>(_getParents(), true);
-       }
-
-       /**
         * Returns a list including this class and all parent classes and 
interfaces.
         *
         * @return An unmodifiable list including this class and all parent 
classes.
         *      <br>Results are ordered child-to-parent order with classes 
listed before interfaces.
         */
-       public List<ClassInfo> getAllParentsChildFirst() {
+       public List<ClassInfo> getAllParents() {
                return new UnmodifiableArray<>(_getAllParents());
        }
 
        /**
-        * Returns a list including this class and all parent classes and 
interfaces.
+        * Returns the parent class or interface that matches the specified 
predicate.
         *
-        * @return An unmodifiable list including this class and all parent 
classes.
-        *      <br>Results are ordered parent-to-child order with interfaces 
listed before classes.
+        * @param predicate The predicate to test for.
+        * @return The parent class or interface that matches the specified 
predicate.
         */
-       public List<ClassInfo> getAllParentsParentFirst() {
-               return new UnmodifiableArray<>(_getAllParents(), true);
+       public ClassInfo getAllParent(Predicate<ClassInfo> predicate) {
+               for (ClassInfo ci : _getAllParents())
+                       if (predicate.test(ci))
+                               return ci;
+               return null;
        }
 
        ClassInfo[] _getInterfaces() {
@@ -436,7 +426,7 @@ public final class ClassInfo {
         *      All declared methods on this class and all parent classes.
         *      <br>Results are ordered child-to-parent, and then 
alphabetically per class.
         */
-       public List<MethodInfo> getAllMethods() {
+       public List<MethodInfo> getMethods() {
                return new UnmodifiableArray<>(_getAllMethods());
        }
 
@@ -729,6 +719,20 @@ public final class ClassInfo {
        }
 
        /**
+        * Consumes all declared fields on this class that match the specified 
predicate.
+        *
+        * @param predicate The predicate to test against.
+        * @param consumer The consumer.
+        * @return This object.
+        */
+       public ClassInfo getDeclaredFields(Predicate<FieldInfo> predicate, 
Consumer<FieldInfo> consumer) {
+               for (FieldInfo fi : _getDeclaredFields())
+                       if (predicate.test(fi))
+                               consumer.accept(fi);
+               return this;
+       }
+
+       /**
         * Returns all declared fields on this class and all parent classes.
         *
         * @return
@@ -777,6 +781,19 @@ public final class ClassInfo {
        }
 
        /**
+        * Returns the declared field that passes the specified predicate.
+        *
+        * @param predicate The predicate to test against.
+        * @return The declared field, or <jk>null</jk> if not found.
+        */
+       public FieldInfo getDeclaredField(Predicate<FieldInfo> predicate) {
+               for (FieldInfo f : _getDeclaredFields())
+                       if (predicate.test(f))
+                               return f;
+               return null;
+       }
+
+       /**
         * Returns the static public field with the specified name.
         *
         * @param name The field name.
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 883edb2..282fc41 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
@@ -128,6 +128,16 @@ public final class FieldInfo implements 
Comparable<FieldInfo> {
        }
 
        /**
+        * Returns <jk>true</jk> if the specified annotation is not present on 
this field.
+        *
+        * @param a The annotation to check for.
+        * @return <jk>true</jk> if the specified annotation is not present on 
this field.
+        */
+       public final boolean hasNoAnnotation(Class<? extends Annotation> a) {
+               return ! hasAnnotation(a);
+       }
+
+       /**
         * Returns <jk>true</jk> if the specified annotation is present.
         *
         * @param a The annotation to check for.
@@ -138,6 +148,17 @@ public final class FieldInfo implements 
Comparable<FieldInfo> {
                return ! mp.getAnnotations(a, f).isEmpty();
        }
 
+       /**
+        * Returns <jk>true</jk> if the specified annotation is not present.
+        *
+        * @param a The annotation to check for.
+        * @param mp The meta provider for looking up annotations on reflection 
objects (classes, methods, fields, constructors).
+        * @return <jk>true</jk> if the specified annotation is not present.
+        */
+       public boolean hasNoAnnotation(Class<? extends Annotation> a, 
MetaProvider mp) {
+               return ! hasAnnotation(a, mp);
+       }
+
        
//-----------------------------------------------------------------------------------------------------------------
        // Characteristics
        
//-----------------------------------------------------------------------------------------------------------------
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 1c91d68..578ba7f 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
@@ -14,8 +14,6 @@ package org.apache.juneau.reflect;
 
 import static org.apache.juneau.internal.StringUtils.*;
 import static org.apache.juneau.internal.ThrowableUtils.*;
-import static org.apache.juneau.reflect.ReflectFlags.*;
-
 import java.util.concurrent.*;
 
 import java.lang.reflect.*;
@@ -153,11 +151,9 @@ public class Mutaters {
 
                ClassInfo ici = ClassInfo.of(ic), oci = ClassInfo.of(oc);
 
-               for (ClassInfo pic : ici.getAllParentsChildFirst()) {
-                       Mutater t = m.get(pic.inner());
-                       if (t != null)
-                               return t;
-               }
+               ClassInfo pic = ici.getAllParent(x -> m.get(x.inner()) != null);
+               if (pic != null)
+                       return m.get(pic.inner());
 
                if (ic == String.class) {
                        Class<?> oc2 = oci.hasPrimitiveWrapper() ? 
oci.getPrimitiveWrapper() : oc;
@@ -299,13 +295,11 @@ public class Mutaters {
 
        private static MethodInfo findToXMethod(ClassInfo ic, ClassInfo oc) {
                String tn = oc.getReadableName();
-               for (MethodInfo m : ic.getAllMethods()) {
-                       if (m.isAll(PUBLIC, NOT_STATIC, HAS_NO_PARAMS, 
NOT_DEPRECATED)
-                               && m.getSimpleName().startsWith("to")
-                               && 
m.getSimpleName().substring(2).equalsIgnoreCase(tn))
-                               return m;
-               }
-               return null;
+               return ic.getPublicMethod(
+                       x -> x.isNotStatic()
+                       && x.hasNoParams()
+                       && x.getSimpleName().startsWith("to")
+                       && x.getSimpleName().substring(2).equalsIgnoreCase(tn)
+               );
        }
-
 }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
index 3208d08..848c890 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
@@ -98,18 +98,18 @@ public class AutoListSwap<T> extends ObjectSwap<T,List<?>> {
                        return null;
 
                // Find swap() method if present.
-               for (MethodInfo m : ci.getAllMethods()) {
+               for (MethodInfo m : ci.getMethods()) {
                        if (isSwapMethod(bc, m)) {
 
                                ClassInfo rt = m.getReturnType();
 
-                               for (MethodInfo m2 : ci.getAllMethods())
-                                       if (isUnswapMethod(bc, m2, ci, rt))
-                                               return new AutoListSwap(bc, ci, 
m, m2, null);
+                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt));
+                               if (mi != null)
+                                       return new AutoListSwap(bc, ci, m, mi, 
null);
 
-                               for (ConstructorInfo cs : 
ci.getDeclaredConstructors())
-                                       if (isUnswapConstructor(bc, cs, rt))
-                                               return new AutoListSwap(bc, ci, 
m, null, cs);
+                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+                               if (cs != null)
+                                       return new AutoListSwap(bc, ci, m, 
null, cs);
 
                                return new AutoListSwap(bc, ci, m, null, null);
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
index 628ba53..f0f613f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
@@ -97,18 +97,18 @@ public class AutoMapSwap<T> extends ObjectSwap<T,Map<?,?>> {
                        return null;
 
                // Find swap() method if present.
-               for (MethodInfo m : ci.getAllMethods()) {
+               for (MethodInfo m : ci.getMethods()) {
                        if (isSwapMethod(bc, m)) {
 
                                ClassInfo rt = m.getReturnType();
 
-                               for (MethodInfo m2 : ci.getAllMethods())
-                                       if (isUnswapMethod(bc, m2, ci, rt))
-                                               return new AutoMapSwap(bc, ci, 
m, m2, null);
+                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt));
+                               if (mi != null)
+                                       return new AutoMapSwap(bc, ci, m, mi, 
null);
 
-                               for (ConstructorInfo cs : 
ci.getDeclaredConstructors())
-                                       if (isUnswapConstructor(bc, cs, rt))
-                                               return new AutoMapSwap(bc, ci, 
m, null, cs);
+                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+                               if (cs != null)
+                                       return new AutoMapSwap(bc, ci, m, null, 
cs);
 
                                return new AutoMapSwap(bc, ci, m, null, null);
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
index 4a95cfd..ec1ec9e 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
@@ -121,19 +121,19 @@ public class AutoNumberSwap<T> extends 
ObjectSwap<T,Number> {
                        return null;
 
                // Find swap() method if present.
-               for (MethodInfo m : ci.getAllMethods()) {
+               for (MethodInfo m : ci.getMethods()) {
 
                        if (isSwapMethod(bc, m)) {
 
                                ClassInfo rt = m.getReturnType();
 
-                               for (MethodInfo m2 : ci.getAllMethods())
-                                       if (isUnswapMethod(bc, m2, ci, rt))
-                                               return new AutoNumberSwap(bc, 
ci, m, m2, null);
+                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt));
+                               if (mi != null)
+                                       return new AutoNumberSwap(bc, ci, m, 
mi, null);
 
-                               for (ConstructorInfo cs : 
ci.getDeclaredConstructors())
-                                       if (isUnswapConstructor(bc, cs, rt))
-                                               return new AutoNumberSwap(bc, 
ci, m, null, cs);
+                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+                               if (cs != null)
+                                       return new AutoNumberSwap(bc, ci, m, 
null, cs);
 
                                return new AutoNumberSwap(bc, ci, m, null, 
null);
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
index ff5ff75..2b98fb7 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
@@ -100,18 +100,18 @@ public class AutoObjectSwap<T> extends 
ObjectSwap<T,Object> {
                        return null;
 
                // Find swap() method if present.
-               for (MethodInfo m : ci.getAllMethods()) {
+               for (MethodInfo m : ci.getMethods()) {
                        if (isSwapMethod(bc, m)) {
 
                                ClassInfo rt = m.getReturnType();
 
-                               for (MethodInfo m2 : ci.getAllMethods())
-                                       if (isUnswapMethod(bc, m2, ci, rt))
-                                               return new AutoObjectSwap(bc, 
ci, m, m2, null);
+                               MethodInfo mi = ci.getMethod(x -> 
isUnswapMethod(bc, x, ci, rt));
+                               if (mi != null)
+                                       return new AutoObjectSwap(bc, ci, m, 
mi, null);
 
-                               for (ConstructorInfo cs : 
ci.getDeclaredConstructors())
-                                       if (isUnswapConstructor(bc, cs, rt))
-                                               return new AutoObjectSwap(bc, 
ci, m, null, cs);
+                               ConstructorInfo cs = 
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+                               if (cs != null)
+                                       return new AutoObjectSwap(bc, ci, m, 
null, cs);
 
                                return new AutoObjectSwap(bc, ci, m, null, 
null);
                        }
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
index eca3489..052851f 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
@@ -201,14 +201,14 @@ public class BuilderSwap<T,B> {
                        builderClass = 
builderCreateMethod.getReturnType().inner();
 
                if (builderClass == null) {
-                       for (ConstructorInfo cc : pci.getPublicConstructors()) {
-                               if (cc.isVisible(cVis) && cc.hasNumParams(1)) {
-                                       ClassInfo pt = cc.getParamType(0);
-                                       if (pt.isChildOf(Builder.class)) {
-                                               objectConstructor = cc;
-                                               builderClass = pt.inner();
-                                       }
-                               }
+                       ConstructorInfo cc = pci.getPublicConstructor(
+                               x -> x.isVisible(cVis)
+                               && x.hasNumParams(1)
+                               && x.getParamType(0).isChildOf(Builder.class)
+                       );
+                       if (cc != null) {
+                               objectConstructor = cc;
+                               builderClass = cc.getParamType(0).inner();
                        }
                }
 
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 23596e3..ce112ee 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,11 +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) {
-               for (ClassInfo ci2 : ci.getAllParentsChildFirst()) {
-                       ObjectSwap<?,?> ps = SWAPS.get(ci2.inner());
-                       if (ps != null)
-                               return ps;
-               }
-               return null;
+               ClassInfo ci2 = ci.getAllParent(x -> SWAPS.get(x.inner()) != 
null);
+               return ci2 == null ? null : SWAPS.get(ci2.inner());
        }
 }
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 7096732..d23492f 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
@@ -35,7 +35,6 @@ import java.lang.reflect.Method;
 import java.nio.charset.*;
 import java.time.*;
 import java.util.*;
-import java.util.ArrayList;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.*;
 import java.util.function.*;
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 99e38ff..cbd83bf 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
@@ -392,7 +392,9 @@ public class BasicSwaggerProviderSession {
                                                        om.appendIf(true, true, 
true, "schema", schema);
                                                }
                                        }
-                                       for (MethodInfo ecmi : 
eci.getAllMethodsParentFirst()) {
+                                       List<MethodInfo> methods = 
eci.getMethods();
+                                       for (int i = methods.size()-1; i>=0; 
i--) {
+                                               MethodInfo ecmi = 
methods.get(i);
                                                Header a = 
ecmi.getLastAnnotation(Header.class);
                                                if (a == null)
                                                        a = 
ecmi.getReturnType().unwrap(Value.class,Optional.class).getLastAnnotation(Header.class);
@@ -425,7 +427,9 @@ public class BasicSwaggerProviderSession {
                                        }
                                }
                                if 
(mi.getReturnType().hasAnnotation(Response.class)) {
-                                       for (MethodInfo ecmi : 
mi.getReturnType().getAllMethodsParentFirst()) {
+                                       List<MethodInfo> methods = 
mi.getReturnType().getMethods();
+                                       for (int i = methods.size()-1; i>=0; 
i--) {
+                                               MethodInfo ecmi = 
methods.get(i);
                                                if 
(ecmi.hasAnnotation(Header.class)) {
                                                        Header a = 
ecmi.getLastAnnotation(Header.class);
                                                        String ha = a.name();
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 b5976c9..62c735c 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
@@ -256,30 +256,16 @@ public class ClassInfoTest {
        }
 
        @Test
-       public void getParentsParentFirst() {
-               check("BC1,BC2,BC3", bc3.getParentsParentFirst());
-               check("", object.getParentsParentFirst());
-               check("BI1", bi1.getParentsParentFirst());
-       }
-
-       @Test
        public void getAllParents() {
-               check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParentsChildFirst());
-               check("", object.getAllParentsChildFirst());
-               check("BI1", bi1.getAllParentsChildFirst());
+               check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParents());
+               check("", object.getAllParents());
+               check("BI1", bi1.getAllParents());
        }
 
        @Test
        public void getAllParents_twice() {
-               check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParentsChildFirst());
-               check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParentsChildFirst());
-       }
-
-       @Test
-       public void getAllParentsParentFirst() {
-               check("BI2,BI1,BI3,BC1,BC2,BC3", 
bc3.getAllParentsParentFirst());
-               check("", object.getAllParentsParentFirst());
-               check("BI1", bi1.getAllParentsParentFirst());
+               check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParents());
+               check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParents());
        }
 
        @Test
@@ -359,24 +345,13 @@ public class ClassInfoTest {
 
        @Test
        public void getAllMethods() throws Exception {
-               
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
 cc3.getAllMethods());
+               
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
 cc3.getMethods());
        }
 
        @Test
        public void getAllMethods_twice() throws Exception {
-               
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
 cc3.getAllMethods());
-               
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
 cc3.getAllMethods());
-       }
-
-       @Test
-       public void getAllMethodsParentFirst() throws Exception {
-               
check("CI2.i2a(),CI2.i2b(),CI1.i1a(),CI1.i1b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC3.c3a(),CC3.c3b(),CC3.i2b()",
 cc3.getAllMethodsParentFirst());
-       }
-
-       @Test
-       public void getAllMethodsParentFirst_twice() throws Exception {
-               
check("CI2.i2a(),CI2.i2b(),CI1.i1a(),CI1.i1b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC3.c3a(),CC3.c3b(),CC3.i2b()",
 cc3.getAllMethodsParentFirst());
-               
check("CI2.i2a(),CI2.i2b(),CI1.i1a(),CI1.i1b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC3.c3a(),CC3.c3b(),CC3.i2b()",
 cc3.getAllMethodsParentFirst());
+               
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
 cc3.getMethods());
+               
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
 cc3.getMethods());
        }
 
        @Test

Reply via email to