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 6c3eeee2e8 Utility class modernization
6c3eeee2e8 is described below

commit 6c3eeee2e853cc4796955b0b71d587b94596552d
Author: James Bognar <[email protected]>
AuthorDate: Wed Nov 5 16:49:14 2025 -0500

    Utility class modernization
---
 .../juneau/common/reflect/AnnotationInfo.java      |   2 +-
 .../apache/juneau/common/reflect/ClassInfo.java    | 104 -----------------
 .../org/apache/juneau/common/utils/ClassUtils.java |   2 +-
 .../apache/juneau/common/utils/PredicateUtils.java |  67 +++++++++++
 .../src/main/java/org/apache/juneau/BeanMeta.java  |  12 +-
 .../src/main/java/org/apache/juneau/ClassMeta.java |  13 +--
 .../java/org/apache/juneau/cp/BeanCreator.java     |   8 +-
 .../juneau/httppart/bean/RequestBeanMeta.java      |   2 +-
 .../juneau/httppart/bean/ResponseBeanMeta.java     |   2 +-
 .../java/org/apache/juneau/swap/SurrogateSwap.java |   2 +-
 .../juneau/rest/client/remote/RemoteMeta.java      |   2 +-
 .../juneau/http/remote/RrpcInterfaceMeta.java      |   2 +-
 .../java/org/apache/juneau/rest/RestContext.java   |  24 ++--
 .../juneau/rest/debug/BasicDebugEnablement.java    |   5 +-
 .../juneau/common/utils/PredicateUtils_Test.java   | 125 +++++++++++++++++++++
 15 files changed, 228 insertions(+), 144 deletions(-)

diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
index b001a29ef0..bf7d8f1023 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java
@@ -166,7 +166,7 @@ public class AnnotationInfo<T extends Annotation> {
                jm.put(s(annotatable.getAnnotatableType()), 
annotatable.getAnnotatableName());
                var ja = new LinkedHashMap<String, Object>();
                var ca = ClassInfo.of(a.annotationType());
-               ca.forEachDeclaredMethod(null, x -> {
+               ca.getDeclaredMethods().stream().forEach(x -> {
                        try {
                                var v = x.invoke(a);
                                var d = x.inner().getDefaultValue();
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
index 2a94f54fa6..f48e8bcf51 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
@@ -402,19 +402,6 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
        }
 
 
-       /**
-        * Performs an action on all matching declared methods on this class 
and all parent classes.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachAllMethodParentFirst(Predicate<MethodInfo> 
filter, Consumer<MethodInfo> action) {
-               for (var mi : allMethodsParentFirst.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
        /**
         * Performs an action on all matching annotations on this class and 
superclasses/interfaces.
         *
@@ -483,97 +470,6 @@ public class ClassInfo extends ElementInfo implements 
Annotatable {
                return this;
        }
 
-       /**
-        * Performs an action on all matching declared constructors on this 
class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachDeclaredConstructor(Predicate<ConstructorInfo> 
filter, Consumer<ConstructorInfo> action) {
-               for (var mi : declaredConstructors.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
-       /**
-        * Performs an action on all matching declared fields on this class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachDeclaredField(Predicate<FieldInfo> filter, 
Consumer<FieldInfo> action) {
-               for (var fi : declaredFields.get())
-                       consumeIf(filter, action, fi);
-               return this;
-       }
-
-       /**
-        * Performs an action on all matching declared methods on this class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachDeclaredMethod(Predicate<MethodInfo> filter, 
Consumer<MethodInfo> action) {
-               for (var mi : declaredMethods.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
-       /**
-        * Performs an action on all matching methods on this class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachMethod(Predicate<MethodInfo> filter, 
Consumer<MethodInfo> action) {
-               for (var mi : allMethods.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
-       /**
-        * Performs an action on all matching public constructors on this class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachPublicConstructor(Predicate<ConstructorInfo> 
filter, Consumer<ConstructorInfo> action) {
-               for (var mi : publicConstructors.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
-       /**
-        * Performs an action on all matching public fields on this class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachPublicField(Predicate<FieldInfo> filter, 
Consumer<FieldInfo> action) {
-               for (var mi : publicFields.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
-       /**
-        * Performs an action on all matching public methods on this class.
-        *
-        * @param filter A predicate to apply to the entries to determine if 
action should be performed.  Can be <jk>null</jk>.
-        * @param action An action to perform on the entry.
-        * @return This object.
-        */
-       public ClassInfo forEachPublicMethod(Predicate<MethodInfo> filter, 
Consumer<MethodInfo> action) {
-               for (var mi : publicMethods.get())
-                       consumeIf(filter, action, mi);
-               return this;
-       }
-
        /**
         * Returns all fields on this class and all parent classes.
         *
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
index 65cfec54bd..4c8a6058c3 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/ClassUtils.java
@@ -429,7 +429,7 @@ public class ClassUtils {
                if (s.contains("$$EnhancerBySpringCGLIB$$")) {
                        // Try to invoke getTargetClass() if available (Spring 
specific)
                        Value<Class<?>> v = Value.empty();
-                       ClassInfo.of(c).forEachPublicMethod(m -> 
m.hasName("getTargetClass") && m.hasNoParameters() && 
m.hasReturnType(Class.class), m -> safe(() -> v.set(m.invoke(o))));
+                       ClassInfo.of(c).getPublicMethods().stream().filter(m -> 
m.hasName("getTargetClass") && m.hasNoParameters() && 
m.hasReturnType(Class.class)).forEach(m -> safe(() -> v.set(m.invoke(o))));
                        return v.isPresent() ? v.get() : c.getSuperclass();
                }
 
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/PredicateUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/PredicateUtils.java
index ac8186b639..8c69cd5fd4 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/PredicateUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/PredicateUtils.java
@@ -20,6 +20,8 @@ import static org.apache.juneau.common.utils.Utils.*;
 
 import java.util.function.*;
 
+import org.apache.juneau.common.reflect.*;
+
 /**
  * Utility methods for composing {@link Predicate} instances.
  */
@@ -174,4 +176,69 @@ public final class PredicateUtils {
                        return v;
                };
        }
+
+       /**
+        * Returns a predicate that tests whether an {@link ElementInfo} has 
the specified flag.
+        *
+        * <p>
+        * Useful for filtering streams of reflection elements.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      List&lt;ClassInfo&gt; classes = ...;
+        *      ClassInfo publicClass = classes.stream()
+        *              .filter(is(PUBLIC))
+        *              .findFirst()
+        *              .orElse(<jk>null</jk>);
+        * </p>
+        *
+        * @param flag The flag to test for.
+        * @return A predicate that returns {@code true} if the element has the 
specified flag.
+        */
+       public static Predicate<ElementInfo> is(ElementFlag flag) {
+               return ei -> ei.is(flag);
+       }
+
+       /**
+        * Returns a predicate that tests whether an {@link ElementInfo} has 
all of the specified flags.
+        *
+        * <p>
+        * Useful for filtering streams of reflection elements.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      List&lt;ClassInfo&gt; classes = ...;
+        *      ClassInfo publicNonDeprecated = classes.stream()
+        *              .filter(isAll(PUBLIC, NOT_DEPRECATED))
+        *              .findFirst()
+        *              .orElse(<jk>null</jk>);
+        * </p>
+        *
+        * @param flags The flags to test for.
+        * @return A predicate that returns {@code true} if the element has all 
of the specified flags.
+        */
+       public static Predicate<ElementInfo> isAll(ElementFlag...flags) {
+               return ei -> ei.isAll(flags);
+       }
+
+       /**
+        * Returns a predicate that tests whether an {@link ElementInfo} has 
any of the specified flags.
+        *
+        * <p>
+        * Useful for filtering streams of reflection elements.
+        *
+        * <h5 class='section'>Example:</h5>
+        * <p class='bjava'>
+        *      List&lt;ClassInfo&gt; classes = ...;
+        *      List&lt;ClassInfo&gt; visibleClasses = classes.stream()
+        *              .filter(isAny(PUBLIC, PROTECTED))
+        *              .collect(Collectors.toList());
+        * </p>
+        *
+        * @param flags The flags to test for.
+        * @return A predicate that returns {@code true} if the element has any 
of the specified flags.
+        */
+       public static Predicate<ElementInfo> isAny(ElementFlag...flags) {
+               return ei -> ei.isAny(flags);
+       }
 }
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 b3c2f4e913..0678497c22 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
@@ -247,7 +247,7 @@ public class BeanMeta<T> {
                                        return "Class is not serializable";
 
                                // Look for @Beanc constructor on public 
constructors.
-                               ci.forEachPublicConstructor(x -> 
x.hasAnnotation(ctx, Beanc.class), x -> {
+                               ci.getPublicConstructors().stream().filter(x -> 
x.hasAnnotation(ctx, Beanc.class)).forEach(x -> {
                                        if (nn(constructor))
                                                throw new 
BeanRuntimeException(c, "Multiple instances of '@Beanc' found.");
                                        constructor = x;
@@ -270,7 +270,7 @@ public class BeanMeta<T> {
 
                                // Look for @Beanc on all other constructors.
                                if (constructor == null) {
-                                       ci.forEachDeclaredConstructor(x -> 
x.hasAnnotation(ctx, Beanc.class), x -> {
+                                       
ci.getDeclaredConstructors().stream().filter(x -> x.hasAnnotation(ctx, 
Beanc.class)).forEach(x -> {
                                                if (nn(constructor))
                                                        throw new 
BeanRuntimeException(c, "Multiple instances of '@Beanc' found.");
                                                constructor = x;
@@ -565,13 +565,13 @@ public class BeanMeta<T> {
                boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
                forEachClass(ClassInfo.of(c), stopClass, c2 -> {
                        // @formatter:off
-                       c2.forEachDeclaredField(
-                               x -> x.isNotStatic()
+                       c2.getDeclaredFields().stream()
+                               .filter(x -> x.isNotStatic()
                                && (x.isNotTransient() || noIgnoreTransients)
                                && (x.hasNoAnnotation(Transient.class) || 
noIgnoreTransients)
                                && x.hasNoAnnotation(ctx, BeanIgnore.class)
-                               && (v.isVisible(x.inner()) || 
x.hasAnnotation(ctx, Beanp.class)),
-                               x -> l.add(x.inner())
+                               && (v.isVisible(x.inner()) || 
x.hasAnnotation(ctx, Beanp.class)))
+                               .forEach(x -> l.add(x.inner())
                        );
                        // @formatter:on
                });
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 8b29d4ece4..152869c968 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
@@ -218,7 +218,7 @@ public class ClassMeta<T> implements Type {
                                namePropertyMethod = new 
Setter.FieldSetter(x.accessible().inner());
                        });
 
-                       ci.forEachDeclaredField(x -> x.hasAnnotation(bc, 
Example.class), x -> {
+                       ci.getDeclaredFields().stream().filter(x -> 
x.hasAnnotation(bc, Example.class)).forEach(x -> {
                                if (! (x.isStatic() && 
ci.isParentOf(x.getType().inner())))
                                        throw new ClassMetaRuntimeException(c, 
"@Example used on invalid field ''{0}''.  Must be static and an instance of the 
type.", x);
                                exampleField = x.accessible().inner();
@@ -242,7 +242,7 @@ public class ClassMeta<T> implements Type {
                                }
                        }
 
-                       ci.forEachDeclaredMethod(m -> m.hasAnnotation(bc, 
Example.class), m -> {
+                       ci.getDeclaredMethods().stream().filter(m -> 
m.hasAnnotation(bc, Example.class)).forEach(m -> {
                                if (! (m.isStatic() && 
m.hasParameterTypesLenient(BeanSession.class) && 
ci.isParentOf(m.getReturnType().inner())))
                                        throw new ClassMetaRuntimeException(c, 
"@Example used on invalid method ''{0}''.  Must be static and return an 
instance of the declaring class.", m.toString());
                                m.setAccessible();
@@ -253,7 +253,7 @@ public class ClassMeta<T> implements Type {
                        isAbstract = ci.isAbstract() && ci.isNotPrimitive();
 
                        // Find constructor(String) method if present.
-                       ci.forEachPublicConstructor(cs -> cs.isPublic() && 
cs.isNotDeprecated(), cs -> {
+                       ci.getPublicConstructors().stream().filter(cs -> 
cs.isPublic() && cs.isNotDeprecated()).forEach(cs -> {
                                var params = cs.getParameters();
                                if (params.size() == (isMemberClass ? 1 : 0) && 
c != Object.class && ! isAbstract) {
                                        noArgConstructor = cs;
@@ -267,10 +267,9 @@ public class ClassMeta<T> implements Type {
                        primitiveDefault = ci.getPrimitiveDefault();
 
                        // @formatter:off
-                       ci.forEachPublicMethod(
-                               MethodInfo::isNotDeprecated,
-                               x -> publicMethods.put(x.getSignature(), 
x.inner())
-                       );
+                       ci.getPublicMethods().stream()
+                               .filter(MethodInfo::isNotDeprecated)
+                               .forEach(x -> 
publicMethods.put(x.getSignature(), x.inner()));
                        // @formatter:on
 
                        BeanFilter beanFilter = findBeanFilter(bc);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
index 619234c97b..1fa4c03f03 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
@@ -285,7 +285,7 @@ public class BeanCreator<T> {
                        Match<MethodInfo> match = new Match<>();
 
                        // Look for static creator method.
-                       type.forEachPublicMethod(x -> isStaticCreateMethod(x), 
x -> {
+                       type.getPublicMethods().stream().filter(x -> 
isStaticCreateMethod(x)).forEach(x -> {
                                found.set("STATIC_CREATOR");
                                if (hasAllParams(x))
                                        match.add(x);
@@ -309,7 +309,7 @@ public class BeanCreator<T> {
 
                // Look for public constructor.
                Match<ConstructorInfo> constructorMatch = new Match<>();
-               type.forEachPublicConstructor(x -> true, x -> {
+               type.getPublicConstructors().stream().forEach(x -> {
                        found.setIfEmpty("PUBLIC_CONSTRUCTOR");
                        if (hasAllParams(x))
                                constructorMatch.add(x);
@@ -317,7 +317,7 @@ public class BeanCreator<T> {
 
                // Look for protected constructor.
                if (! constructorMatch.isPresent()) {
-                       
type.forEachDeclaredConstructor(ConstructorInfo::isProtected, x -> {
+                       
type.getDeclaredConstructors().stream().filter(ConstructorInfo::isProtected).forEach(x
 -> {
                                found.setIfEmpty("PROTECTED_CONSTRUCTOR");
                                if (hasAllParams(x))
                                        constructorMatch.add(x);
@@ -331,7 +331,7 @@ public class BeanCreator<T> {
                if (builder == null) {
                        // Look for static-builder/protected-constructor pair.
                        Value<T> value = Value.empty();
-                       type.forEachDeclaredConstructor(x -> 
x.hasNumParameters(1) && x.isVisible(PROTECTED), x -> {
+                       type.getDeclaredConstructors().stream().filter(x -> 
x.hasNumParameters(1) && x.isVisible(PROTECTED)).forEach(x -> {
                                Class<?> pt = 
x.getParameter(0).getParameterType().inner();
                                MethodInfo m = type.getPublicMethod(y -> 
isStaticCreateMethod(y, pt));
                                if (nn(m)) {
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 d8bebebf25..97ec86f252 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
@@ -53,7 +53,7 @@ public class RequestBeanMeta {
                Builder apply(Class<?> c) {
                        this.cm = BeanContext.DEFAULT.getClassMeta(c);
                        apply(cm.getLastAnnotation(Request.class));
-                       cm.getInfo().forEachPublicMethod(x -> true, x -> {
+                       cm.getInfo().getPublicMethods().stream().forEach(x -> {
                                String n = x.getSimpleName();
                                if (x.hasAnnotation(Header.class)) {
                                        assertNoArgs(x, Header.class);
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 33e3859641..63e10ea0d8 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
@@ -81,7 +81,7 @@ public class ResponseBeanMeta {
                        Class<?> c = toClass(t);
                        this.cm = BeanContext.DEFAULT.getClassMeta(c);
                        ClassInfo ci = cm.getInfo();
-                       ci.forEachPublicMethod(x -> true, x -> {
+                       ci.getPublicMethods().stream().forEach(x -> {
                                assertNoInvalidAnnotations(x, Query.class, 
FormData.class);
                                if (x.hasAnnotation(Header.class)) {
                                        assertNoArgs(x, Header.class);
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
index 95a71641ac..6b063664dc 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/SurrogateSwap.java
@@ -54,7 +54,7 @@ public class SurrogateSwap<T,F> extends ObjectSwap<T,F> {
        public static List<SurrogateSwap<?,?>> findObjectSwaps(Class<?> c, 
BeanContext bc) {
                List<SurrogateSwap<?,?>> l = new LinkedList<>();
                var ci = ClassInfo.of(c);
-               ci.forEachPublicConstructor(x -> x.hasNoAnnotation(bc, 
BeanIgnore.class) && x.hasNumParameters(1) && x.isPublic(), x -> {
+               ci.getPublicConstructors().stream().filter(x -> 
x.hasNoAnnotation(bc, BeanIgnore.class) && x.hasNumParameters(1) && 
x.isPublic()).forEach(x -> {
                        var pt = x.getParameter(0).getParameterType().inner();
                        if (! pt.equals(c.getDeclaringClass())) {
                                // Find the unswap method if there is one.
diff --git 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
index 1dedaca6f3..600d83be7d 100644
--- 
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
+++ 
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteMeta.java
@@ -91,7 +91,7 @@ public class RemoteMeta {
 
                Map<Method,RemoteOperationMeta> operations = map();
                var path2 = path;
-               ci.forEachPublicMethod(x -> true, x -> 
operations.put(x.inner(), new RemoteOperationMeta(path2, x.inner(), "GET")));
+               ci.getPublicMethods().stream().forEach(x -> 
operations.put(x.inner(), new RemoteOperationMeta(path2, x.inner(), "GET")));
 
                this.operations = u(operations);
                this.headers = headers;
diff --git 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
index 98248cba98..28ced4863c 100644
--- 
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
+++ 
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMeta.java
@@ -61,7 +61,7 @@ public class RrpcInterfaceMeta {
                ci.forEachAnnotation(Remote.class, x -> isNotEmpty(x.path()), x 
-> path.set(trimSlashes(x.path())));
 
                Map<Method,RrpcInterfaceMethodMeta> methods = map();
-               ci.forEachPublicMethod(x -> true, x -> methods.put(x.inner(), 
new RrpcInterfaceMethodMeta(uri, x.inner())));
+               ci.getPublicMethods().stream().forEach(x -> 
methods.put(x.inner(), new RrpcInterfaceMethodMeta(uri, x.inner())));
 
                Map<String,RrpcInterfaceMethodMeta> methodsByPath = map();
                methods.values().forEach(x -> methodsByPath.put(x.getPath(), 
x));
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 8151383fe2..f403acc196 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
@@ -202,10 +202,9 @@ public class RestContext extends Context {
                        var r = resource.get();
 
                        // @formatter:off
-                       ClassInfo.ofProxy(r).forEachAllMethodParentFirst(
-                               y -> y.hasAnnotation(annotation),
-                               y -> y.forEachAnnotation(annotation, predicate, 
z -> x.put(y.getSignature(), y.accessible().inner()))
-                       );
+                       ClassInfo.ofProxy(r).getAllMethodsParentFirst().stream()
+                               .filter(y -> y.hasAnnotation(annotation))
+                               .forEach(y -> y.forEachAnnotation(annotation, 
predicate, z -> x.put(y.getSignature(), y.accessible().inner())));
                        // @formatter:on
 
                        var x2 = MethodList.of(x.values());
@@ -1769,7 +1768,7 @@ public class RestContext extends Context {
                        ));
                        // @formatter:on
 
-                       rci.forEachMethod(x -> 
x.hasAnnotation(RestInject.class), x -> {
+                       rci.getMethods().stream().filter(x -> 
x.hasAnnotation(RestInject.class)).forEach(x -> {
                                var rt = x.getReturnType().<Object>inner();
                                var name = 
RestInjectAnnotation.name(x.getAnnotation(RestInject.class));
                                if (! (DELAYED_INJECTION.contains(rt) || 
DELAYED_INJECTION_NAMES.contains(name))) {
@@ -3778,9 +3777,9 @@ public class RestContext extends Context {
 
                        var map = CollectionUtils.<String,MethodInfo>map();
                        // @formatter:off
-                       ClassInfo.ofProxy(r).forEachAllMethodParentFirst(
-                               y -> y.hasAnnotation(RestInit.class) && ! 
y.hasArg(RestOpContext.Builder.class),
-                               y -> {
+                       ClassInfo.ofProxy(r).getAllMethodsParentFirst().stream()
+                               .filter(y -> y.hasAnnotation(RestInit.class) && 
! y.hasArg(RestOpContext.Builder.class))
+                               .forEach(y -> {
                                        var sig = y.getSignature();
                                        if (! map.containsKey(sig))
                                                map.put(sig, y.accessible());
@@ -4568,14 +4567,13 @@ public class RestContext extends Context {
 
                        var initMap = CollectionUtils.<String,MethodInfo>map();
                        // @formatter:off
-                       
ClassInfo.ofProxy(resource.get()).forEachAllMethodParentFirst(
-                               y -> y.hasAnnotation(RestInit.class) && 
y.hasArg(RestOpContext.Builder.class),
-                               y -> {
+                       
ClassInfo.ofProxy(resource.get()).getAllMethodsParentFirst().stream()
+                               .filter(y -> y.hasAnnotation(RestInit.class) && 
y.hasArg(RestOpContext.Builder.class))
+                               .forEach(y -> {
                                        String sig = y.getSignature();
                                        if (! initMap.containsKey(sig))
                                                initMap.put(sig, 
y.accessible());
-                               }
-                       );
+                               });
                        // @formatter:on
 
                        for (var mi : rci.getPublicMethods()) {
diff --git 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
index 92d400638d..7a41225c6f 100644
--- 
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
+++ 
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/debug/BasicDebugEnablement.java
@@ -83,9 +83,8 @@ public class BasicDebugEnablement extends DebugEnablement {
 
                // Gather @RestOp(debug) settings.
                // @formatter:off
-               ci.forEachPublicMethod(
-                       x -> true,
-                       x -> {
+               ci.getPublicMethods().stream()
+                       .forEach(x -> {
                                x.getAnnotationList(REST_OP_GROUP).forEachValue(
                                        String.class,
                                        "debug",
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/utils/PredicateUtils_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/utils/PredicateUtils_Test.java
index 6261584afb..d81f772231 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/utils/PredicateUtils_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/utils/PredicateUtils_Test.java
@@ -17,10 +17,14 @@
 package org.apache.juneau.common.utils;
 
 import static org.apache.juneau.common.utils.PredicateUtils.*;
+import static org.apache.juneau.common.reflect.ElementFlag.*;
 import static org.junit.jupiter.api.Assertions.*;
 
+import java.util.*;
 import java.util.function.*;
+import java.util.stream.*;
 
+import org.apache.juneau.common.reflect.*;
 import org.junit.jupiter.api.*;
 
 public class PredicateUtils_Test {
@@ -108,6 +112,127 @@ public class PredicateUtils_Test {
         assertTrue(p.test("Alpha"));
         assertFalse(p.test("Beta"));
     }
+
+    // Test classes for ElementInfo filtering
+    public static class PublicClass {}
+    private static class PrivateClass {}
+    public static final class PublicFinalClass {}
+    @Deprecated
+    public static class DeprecatedPublicClass {}
+
+    @Test
+    void is_singleFlag_matches() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class, 
PrivateClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        ClassInfo result = classes.stream()
+            .filter(is(PUBLIC))
+            .findFirst()
+            .orElse(null);
+
+        assertNotNull(result);
+        assertEquals(PublicClass.class.getName(), result.getName());
+    }
+
+    @Test
+    void is_singleFlag_noMatch() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        ClassInfo result = classes.stream()
+            .filter(is(PRIVATE))
+            .findFirst()
+            .orElse(null);
+
+        assertNull(result);
+    }
+
+    @Test
+    void isAll_multipleFlags_matches() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class, 
PrivateClass.class, PublicFinalClass.class, DeprecatedPublicClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        ClassInfo result = classes.stream()
+            .filter(isAll(PUBLIC, NOT_DEPRECATED))
+            .findFirst()
+            .orElse(null);
+
+        assertNotNull(result);
+        assertEquals(PublicClass.class.getName(), result.getName());
+    }
+
+    @Test
+    void isAll_multipleFlags_collectAll() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class, 
PrivateClass.class, PublicFinalClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        List<ClassInfo> results = classes.stream()
+            .filter(isAll(PUBLIC, NOT_DEPRECATED))
+            .collect(Collectors.toList());
+
+        assertEquals(2, results.size());
+        assertTrue(results.stream().anyMatch(c -> 
c.getName().equals(PublicClass.class.getName())));
+        assertTrue(results.stream().anyMatch(c -> 
c.getName().equals(PublicFinalClass.class.getName())));
+    }
+
+    @Test
+    void isAll_noMatch() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class, 
PrivateClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        ClassInfo result = classes.stream()
+            .filter(isAll(PUBLIC, FINAL))
+            .findFirst()
+            .orElse(null);
+
+        assertNull(result);
+    }
+
+    @Test
+    void isAny_multipleFlags_matchesFirst() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class, 
PrivateClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        List<ClassInfo> results = classes.stream()
+            .filter(isAny(PUBLIC, PROTECTED))
+            .collect(Collectors.toList());
+
+        assertEquals(1, results.size());
+        assertEquals(PublicClass.class.getName(), results.get(0).getName());
+    }
+
+    @Test
+    void isAny_multipleFlags_matchesMultiple() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class, 
PrivateClass.class, PublicFinalClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        List<ClassInfo> results = classes.stream()
+            .filter(isAny(PUBLIC, PRIVATE))
+            .collect(Collectors.toList());
+
+        assertEquals(3, results.size());
+    }
+
+    @Test
+    void isAny_noMatch() {
+        List<ClassInfo> classes = Stream.of(PublicClass.class)
+            .map(ClassInfo::of)
+            .collect(Collectors.toList());
+
+        ClassInfo result = classes.stream()
+            .filter(isAny(PRIVATE, PROTECTED))
+            .findFirst()
+            .orElse(null);
+
+        assertNull(result);
+    }
 }
 
 

Reply via email to