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 cc4242770d org.apache.juneau.common.reflect API improvements
cc4242770d is described below

commit cc4242770d2bb956853cc4501308f5b12737309a
Author: James Bognar <[email protected]>
AuthorDate: Fri Nov 21 16:46:07 2025 -0500

    org.apache.juneau.common.reflect API improvements
---
 .../juneau/common/reflect/AnnotationProvider.java  |  6 ---
 .../juneau/common/utils/CollectionUtils.java       | 10 ++++
 .../src/main/java/org/apache/juneau/ClassMeta.java | 58 +++++++++++-----------
 .../java/org/apache/juneau/swap/BuilderSwap.java   |  2 +-
 .../java/org/apache/juneau/xml/XmlBeanMeta.java    |  2 +-
 .../juneau/common/reflect/ClassInfo_Test.java      |  8 +--
 6 files changed, 44 insertions(+), 42 deletions(-)

diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
index b6c3398a73..9af833dfa9 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationProvider.java
@@ -509,12 +509,6 @@ public class AnnotationProvider {
                return cache.get(type, c, traversals);
        }
 
-       public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A> 
type, ClassInfo c, AnnotationTraversal... traversals) {
-               assertArgNotNull("type", type);
-               assertArgNotNull("c", c);
-               return cache.get(type, c, traversals);
-       }
-
        /**
         * Streams all annotations from a class using configurable traversal 
options, without filtering by annotation type.
         *
diff --git 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
index de1211abf5..e36c657f5a 100644
--- 
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
+++ 
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/CollectionUtils.java
@@ -388,6 +388,12 @@ public class CollectionUtils {
                return l.get(l.size() - 1);
        }
 
+       public static <E> E first(List<E> l) {
+               if (l == null || l.isEmpty())
+                       return null;
+               return l.get(0);
+       }
+
        /**
         * Creates an {@link ArrayList} copy from a collection.
         *
@@ -1607,6 +1613,10 @@ public class CollectionUtils {
                return value.toArray(array);
        }
 
+       public static <E> E[] array(Class<E> componentType, int length) {
+               return (E[])Array.newInstance(componentType, length);
+       }
+
        /**
         * Creates an array of objects.
         *
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 d54b571470..7e369bbe2f 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
@@ -362,8 +362,7 @@ public class ClassMeta<T> implements Type {
                                invocationHandler = new 
BeanProxyInvocationHandler<T>(beanMeta);
 
                        if (nn(bc)) {
-                               // Inline Context.forEachAnnotation() call
-                               ap.find(Bean.class, ci).map(x -> 
x.inner()).forEach(x -> {
+                               ap.find(Bean.class, 
ci).stream().map(AnnotationInfo::inner).forEach(x -> {
                                        if (x.dictionary().length != 0)
                                                beanRegistry = new 
BeanRegistry(bc, null, x.dictionary());
                                        // This could be a non-bean POJO with a 
type name.
@@ -373,8 +372,7 @@ public class ClassMeta<T> implements Type {
                        }
 
                        if (example == null && nn(bc)) {
-                               // Inline Context.forEachAnnotation() call
-                               ap.find(Example.class, ci).map(x -> 
x.inner().value()).filter(x -> isNotEmpty(x)).forEach(x -> example = x);
+                               rstream(ap.find(Example.class, ci)).map(x -> 
x.inner().value()).filter(Utils::isNotEmpty).findFirst().ifPresent(x -> example 
= x);
                        }
 
                        if (example == null) {
@@ -498,21 +496,21 @@ public class ClassMeta<T> implements Type {
 
                private void findSwaps(List<ObjectSwap> l, BeanContext bc) {
 
-               if (nn(bc))
-                       // Inline Context.forEachAnnotation() call
-                       bc.getAnnotationProvider().find(Swap.class, ci).map(x 
-> x.inner()).forEach(x -> l.add(createSwap(x)));
-
-                       ObjectSwap defaultSwap = DefaultSwaps.find(ci);
-                       if (defaultSwap == null)
-                               defaultSwap = AutoObjectSwap.find(bc, ci);
-                       if (defaultSwap == null)
-                               defaultSwap = AutoNumberSwap.find(bc, ci);
-                       if (defaultSwap == null)
-                               defaultSwap = AutoMapSwap.find(bc, ci);
-                       if (defaultSwap == null)
-                               defaultSwap = AutoListSwap.find(bc, ci);
-                       if (nn(defaultSwap))
-                               l.add(defaultSwap);
+                       if (nn(bc))
+                               bc.getAnnotationProvider().find(Swap.class, 
ci).stream().map(AnnotationInfo::inner).forEach(x -> l.add(createSwap(x)));
+
+                       var ds = DefaultSwaps.find(ci);
+                       if (ds == null)
+                               ds = AutoObjectSwap.find(bc, ci);
+                       if (ds == null)
+                               ds = AutoNumberSwap.find(bc, ci);
+                       if (ds == null)
+                               ds = AutoMapSwap.find(bc, ci);
+                       if (ds == null)
+                               ds = AutoListSwap.find(bc, ci);
+
+                       if (nn(ds))
+                               l.add(ds);
                }
        }
 
@@ -865,7 +863,7 @@ public class ClassMeta<T> implements Type {
         */
        public <A extends Annotation> ClassMeta<T> forEachAnnotation(Class<A> 
type, Predicate<A> filter, Consumer<A> action) {
                if (beanContext != null) {
-                       beanContext.getAnnotationProvider().find(type, 
info).map(x -> x.inner()).filter(x -> x != null).filter(x -> filter == null || 
filter.test(x)).forEach(x -> action.accept(x));
+                       beanContext.getAnnotationProvider().find(type, 
info).stream().map(AnnotationInfo::inner).filter(x -> filter == null || 
filter.test(x)).forEach(x -> action.accept(x));
                }
                return this;
        }
@@ -1113,11 +1111,11 @@ public class ClassMeta<T> implements Type {
         */
        @SuppressWarnings("unchecked")
        public <A extends Annotation> A getLastAnnotation(Class<A> a) {
-               Optional<A> o = (Optional<A>)annotationLastMap.get(a);
+               var o = (Optional<A>)annotationLastMap.get(a);
                if (o == null) {
                        if (beanContext == null)
-                               return AnnotationProvider.INSTANCE.find(a, 
info).findFirst().map(x -> x.inner()).orElse(null);
-                       o = beanContext.getAnnotationProvider().find(a, 
info).findFirst().map(x -> x.inner());
+                               return AnnotationProvider.INSTANCE.find(a, 
info).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
+                       o = beanContext.getAnnotationProvider().find(a, 
info).stream().findFirst().map(AnnotationInfo::inner);
                        annotationLastMap.put(a, o);
                }
                return o.orElse(null);
@@ -1762,7 +1760,7 @@ public class ClassMeta<T> implements Type {
                A[] array = annotationArray(type);
                if (array == null) {
                        if (beanContext == null)
-                               return AnnotationProvider.INSTANCE.find(type, 
info)
+                               return AnnotationProvider.INSTANCE.find(type, 
info).stream()
                                        .map(AnnotationInfo::inner)
                                        .filter(a -> test(filter, a))
                                        .findFirst();  // AnnotationProvider 
returns child-to-parent, so first is "last"
@@ -1936,13 +1934,13 @@ public class ClassMeta<T> implements Type {
 
        @SuppressWarnings("unchecked")
        private <A extends Annotation> A[] annotationArray(Class<A> type) {
-               A[] array = (A[])annotationArrayMap.get(type);
+               var array = (A[])annotationArrayMap.get(type);
                if (array == null && nn(beanContext)) {
-                       List<A> l = list();
-                       beanContext.getAnnotationProvider().find(type, 
info).map(x -> x.inner()).filter(x -> true).forEach(x -> l.add(x));
-                       array = (A[])Array.newInstance(type, l.size());
-                       for (int i = 0; i < l.size(); i++)
-                               Array.set(array, i, l.get(i));
+                       var ap = beanContext.getAnnotationProvider();
+                       array = ap.find(type, info)
+                               .stream()
+                               .map(AnnotationInfo::inner)
+                               .toArray(i -> array(type, i));
                        annotationArrayMap.put(type, array);
                }
                return array;
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 b289385bb8..76ba5d2a6d 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
@@ -98,7 +98,7 @@ public class BuilderSwap<T,B> {
                ConstructorInfo builderConstructor;
                var pci = ClassInfo.of(objectClass);
 
-               
bc.getAnnotationProvider().find(org.apache.juneau.annotation.Builder.class, 
pci).map(x -> x.inner()).filter(x -> isNotVoid(x.value())).forEach(x -> 
builderClass.set(x.value()));
+               
bc.getAnnotationProvider().find(org.apache.juneau.annotation.Builder.class, 
pci).stream().map(x -> x.inner().value()).filter(x -> isNotVoid(x)).forEach(x 
-> builderClass.set(x));
 
                builderCreateMethod = getBuilderCreateMethod(pci);
 
diff --git 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
index 0d606bf063..33d53641f0 100644
--- 
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
+++ 
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlBeanMeta.java
@@ -47,7 +47,7 @@ public class XmlBeanMeta extends ExtendedBeanMeta {
                        var ci = beanMeta.getClassMeta().getInfo();
                        Value<XmlFormat> defaultFormat = Value.empty();
 
-                       
beanMeta.getClassMeta().getBeanContext().getAnnotationProvider().find(Xml.class,
 ci).map(x -> x.inner()).forEach(x -> {
+                       
beanMeta.getClassMeta().getBeanContext().getAnnotationProvider().find(Xml.class,
 ci).stream().map(AnnotationInfo::inner).forEach(x -> {
                                var xf = x.format();
                                if (xf == ATTRS)
                                        defaultFormat.set(XmlFormat.ATTR);
diff --git 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
index 5721230421..a6c54ac70d 100644
--- 
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
+++ 
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
@@ -571,10 +571,10 @@ public class ClassInfo_Test extends TestBase {
        @Test void lastAnnotation() {
                // Use AnnotationProvider to get last annotation (first in 
child-to-parent order stream)
                var ap = 
org.apache.juneau.common.reflect.AnnotationProvider.INSTANCE;
-               assertEquals(7, ap.find(A.class, g3).map(x -> 
x.inner()).findFirst().get().value());
-               assertEquals(7, ap.find(A.class, g4).map(x -> 
x.inner()).findFirst().get().value());
-               assertEquals(3, ap.find(A.class, g5).map(x -> 
x.inner()).findFirst().get().value());
-               assertEquals(5, ap.find(A.class, g3).map(x -> 
x.inner()).filter(x -> x.value() == 5).findFirst().get().value());
+               assertEquals(7, ap.find(A.class, 
g3).stream().map(AnnotationInfo::inner).findFirst().get().value());
+               assertEquals(7, ap.find(A.class, 
g4).stream().map(AnnotationInfo::inner).findFirst().get().value());
+               assertEquals(3, ap.find(A.class, 
g5).stream().map(AnnotationInfo::inner).findFirst().get().value());
+               assertEquals(5, ap.find(A.class, 
g3).stream().map(AnnotationInfo::inner).filter(x -> x.value() == 
5).findFirst().get().value());
        }
 
        @Test void getPackageAnnotation() {

Reply via email to