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() {