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 2a2807d456 org.apache.juneau.common.reflect API improvements
2a2807d456 is described below
commit 2a2807d456457f0b380e07833b9acaa1c6e239eb
Author: James Bognar <[email protected]>
AuthorDate: Thu Nov 20 09:02:13 2025 -0500
org.apache.juneau.common.reflect API improvements
---
.../org/apache/juneau/httppart/HttpPartSchema.java | 2 +-
.../httppart/bean/RequestBeanPropertyMeta.java | 4 ++--
.../juneau/httppart/bean/ResponseBeanMeta.java | 9 ++++----
.../rest/client/remote/RemoteOperationMeta.java | 20 +++++-------------
.../juneau/http/remote/RrpcInterfaceMeta.java | 2 +-
.../java/org/apache/juneau/rest/RestContext.java | 12 +++++------
.../juneau/rest/debug/BasicDebugEnablement.java | 4 ++--
.../apache/juneau/rest/servlet/RestServlet.java | 9 +++++---
.../rest/swagger/BasicSwaggerProviderSession.java | 9 ++++----
.../juneau/common/reflect/ClassInfo_Test.java | 24 ----------------------
10 files changed, 32 insertions(+), 63 deletions(-)
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
index 5beaacee1e..637a58b283 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/HttpPartSchema.java
@@ -2548,7 +2548,7 @@ public class HttpPartSchema {
Builder apply(Class<? extends Annotation> c,
java.lang.reflect.Type t) {
if (t instanceof Class<?>) {
-
rstream(ClassInfo.of((Class<?>)t).getAnnotations()).map(x ->
x.cast(c)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(this::apply);
+ AnnotationProvider.INSTANCE.findTopDown(c,
ClassInfo.of((Class<?>)t)).map(AnnotationInfo::inner).forEach(this::apply);
} else if (Value.isType(t)) {
apply(c, getValueParameterType(t));
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
index 8b3bcf1fd0..517b589fe9 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanPropertyMeta.java
@@ -66,8 +66,8 @@ public class RequestBeanPropertyMeta {
static RequestBeanPropertyMeta.Builder create(HttpPartType partType,
Class<? extends Annotation> c, MethodInfo m) {
HttpPartSchema.Builder sb =
HttpPartSchema.create().name(m.getPropertyName());
AnnotationProvider ap = AnnotationProvider.INSTANCE;
- ap.findTopDown(m).map(x ->
x.cast(Schema.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> sb.apply(x));
- ap.findTopDown(m).map(x ->
x.cast(c)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x ->
sb.apply(x));
+ ap.findTopDown(Schema.class,
m).map(AnnotationInfo::inner).forEach(x -> sb.apply(x));
+ ap.findTopDown(c, m).map(AnnotationInfo::inner).forEach(x ->
sb.apply(x));
return new
Builder().partType(partType).schema(sb.build()).getter(m.inner());
}
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 f0757bfee8..e6fd406307 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
@@ -128,8 +128,8 @@ public class ResponseBeanMeta {
var b = new Builder(annotations);
b.apply(m.getReturnType().unwrap(Value.class,
Optional.class).innerType());
AnnotationProvider ap = AnnotationProvider.INSTANCE;
- ap.findTopDown(m).map(x ->
x.cast(Response.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> b.apply(x));
- ap.findTopDown(m).map(x ->
x.cast(StatusCode.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> b.apply(x));
+ ap.findTopDown(Response.class,
m).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+ ap.findTopDown(StatusCode.class,
m).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
return b.build();
}
@@ -163,8 +163,9 @@ public class ResponseBeanMeta {
return null;
var b = new Builder(annotations);
b.apply(ci.innerType());
- rstream(ci.getAnnotations()).map(x ->
x.cast(Response.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> b.apply(x));
- rstream(ci.getAnnotations()).map(x ->
x.cast(StatusCode.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> b.apply(x));
+ var ai = AnnotationProvider.INSTANCE;
+ ai.findTopDown(Response.class,
ci).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+ ai.findTopDown(StatusCode.class,
ci).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
return b.build();
}
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
index 430fef4ba8..bd1372a36b 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationMeta.java
@@ -146,9 +146,7 @@ public class RemoteOperationMeta {
// These handle both individual annotations and repeated
annotation arrays
private void processContentDefaults(MethodInfo mi) {
- AnnotationProvider.INSTANCE.find(mi)
- .map(x -> x.cast(Content.class))
- .filter(Objects::nonNull)
+ AnnotationProvider.INSTANCE.find(Content.class, mi)
.map(x -> x.inner().def())
.filter(x -> isNotBlank(x))
.findFirst()
@@ -156,36 +154,28 @@ public class RemoteOperationMeta {
}
private static void processFormDataDefaults(MethodInfo mi,
Map<String,String> defaults) {
- AnnotationProvider.INSTANCE.findTopDown(mi)
- .map(x -> x.cast(FormData.class))
- .filter(Objects::nonNull)
+ AnnotationProvider.INSTANCE.findTopDown(FormData.class,
mi)
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotEmpty(x.name(), x.value())
&& isNotEmpty(x.def()))
.forEach(x ->
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
}
private static void processHeaderDefaults(MethodInfo mi,
Map<String,String> defaults) {
- AnnotationProvider.INSTANCE.findTopDown(mi)
- .map(x -> x.cast(Header.class))
- .filter(Objects::nonNull)
+ AnnotationProvider.INSTANCE.findTopDown(Header.class,
mi)
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotEmpty(x.name(), x.value())
&& isNotEmpty(x.def()))
.forEach(x ->
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
}
private static void processPathDefaults(MethodInfo mi,
Map<String,String> defaults) {
- AnnotationProvider.INSTANCE.findTopDown(mi)
- .map(x -> x.cast(Path.class))
- .filter(Objects::nonNull)
+ AnnotationProvider.INSTANCE.findTopDown(Path.class, mi)
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotEmpty(x.name(), x.value())
&& ne(NONE, x.def()))
.forEach(x ->
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
}
private static void processQueryDefaults(MethodInfo mi,
Map<String,String> defaults) {
- AnnotationProvider.INSTANCE.findTopDown(mi)
- .map(x -> x.cast(Query.class))
- .filter(Objects::nonNull)
+ AnnotationProvider.INSTANCE.findTopDown(Query.class, mi)
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotEmpty(x.name(), x.value())
&& isNotEmpty(x.def()))
.forEach(x ->
defaults.put(firstNonEmpty(x.name(), x.value()), x.def()));
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 ba84100de3..57331a9ce1 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
@@ -58,7 +58,7 @@ public class RrpcInterfaceMeta {
Value<String> path = Value.of("");
var ci = ClassInfo.of(c);
- rstream(ci.getAnnotations()).map(x ->
x.cast(Remote.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).filter(x
-> isNotEmpty(x.path())).forEach(x -> path.set(trimSlashes(x.path())));
+ AnnotationProvider.INSTANCE.findTopDown(Remote.class, ci).map(x
-> x.inner().path()).filter(x -> isNotEmpty(x)).forEach(x ->
path.set(trimSlashes(x)));
Map<Method,RrpcInterfaceMethodMeta> methods = map();
ci.getPublicMethods().stream().forEach(x ->
methods.put(x.inner(), new RrpcInterfaceMethodMeta(uri, x.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 90cef99500..fa96a8a6ae 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
@@ -206,7 +206,7 @@ public class RestContext extends Context {
// @formatter:off
ClassInfo.ofProxy(r).getAllMethodsTopDown().stream()
.filter(y -> y.hasAnnotation(annotation))
- .forEach(y -> ap.findTopDown(y).map(ai ->
ai.cast(annotation)).filter(Objects::nonNull).map(AnnotationInfo::inner)
+ .forEach(y -> ap.findTopDown(annotation,
y).map(AnnotationInfo::inner)
.filter(z -> predicate == null ||
predicate.test(z))
.forEach(z -> x.put(y.getSignature(),
y.accessible().inner())));
// @formatter:on
@@ -3852,7 +3852,7 @@ public class RestContext extends Context {
// @formatter:on
// Apply @Rest(beanStore).
-
rstream(ClassInfo.of(resourceClass).getAnnotations()).map(x ->
x.cast(Rest.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).filter(x
-> isNotVoid(x.beanStore())).forEach(x -> v.get().type(x.beanStore()));
+ AnnotationProvider.INSTANCE.findTopDown(Rest.class,
ClassInfo.of(resourceClass)).map(x -> x.inner().beanStore()).filter(x ->
isNotVoid(x)).forEach(x -> v.get().type(x));
// Replace with bean from: @RestInject public [static]
BeanStore xxx(<args>)
// @formatter:off
@@ -3914,10 +3914,10 @@ public class RestContext extends Context {
var v = Value.<Config>empty();
// Find our config file. It's the last non-empty
@RestResource(config).
- var vr = beanStore.getBean(VarResolver.class).orElseThrow(() ->
new IllegalArgumentException("VarResolver not found."));
- var cfv = Value.<String>empty();
- rstream(ClassInfo.of(resourceClass).getAnnotations()).map(x ->
x.cast(Rest.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).filter(x
-> isNotEmpty(x.config())).forEach(x -> cfv.set(vr.resolve(x.config())));
- var cf = cfv.orElse("");
+ var vr =
beanStore.getBean(VarResolver.class).orElseThrow(() -> new
IllegalArgumentException("VarResolver not found."));
+ var cfv = Value.<String>empty();
+ AnnotationProvider.INSTANCE.findTopDown(Rest.class,
ClassInfo.of(resourceClass)).map(x -> x.inner().config()).filter(x ->
isNotEmpty(x)).forEach(x -> cfv.set(vr.resolve(x)));
+ var cf = cfv.orElse("");
// If not specified or value is set to SYSTEM_DEFAULT,
use system default config.
if (v.isEmpty() && "SYSTEM_DEFAULT".equals(cf))
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 5e9e5b8fc3..1971987559 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
@@ -74,7 +74,7 @@ public class BasicDebugEnablement extends DebugEnablement {
// Gather @Rest(debug) settings.
// @formatter:off
- rstream(ci.getAnnotations()).map(x ->
x.cast(Rest.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> {
+ ap.findTopDown(Rest.class,
ci).map(AnnotationInfo::inner).forEach(x -> {
String x2 = varResolver.resolve(x.debug());
if (! x2.isEmpty())
b.enable(Enablement.fromString(x2),
ci.getNameFull());
@@ -95,7 +95,7 @@ public class BasicDebugEnablement extends DebugEnablement {
// Gather @Rest(debugOn) settings.
// @formatter:off
- rstream(ci.getAnnotations()).map(x ->
x.cast(Rest.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> {
+ ap.findTopDown(Rest.class,
ci).map(AnnotationInfo::inner).forEach(x -> {
String x2 = varResolver.resolve(x.debugOn());
for (var e : splitMap(x2, true).entrySet()) {
var k = e.getKey();
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
index 34fbdb89e0..0898405fc4 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/servlet/RestServlet.java
@@ -114,9 +114,12 @@ public abstract class RestServlet extends HttpServlet {
if (nn(context))
return context.getFullPath();
var ci = ClassInfo.of(getClass());
- Value<String> path = Value.empty();
- rstream(ci.getAnnotations()).map(x ->
x.cast(Rest.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).filter(x
-> isNotEmpty(x.path())).forEach(x -> path.set(trimSlashes(x.path())));
- return path.orElse("");
+ return AnnotationProvider.INSTANCE.findTopDown(Rest.class, ci)
+ .map(x -> x.inner().path())
+ .filter(x -> isNotEmpty(x))
+ .map(x -> trimSlashes(x))
+ .findFirst()
+ .orElse("");
}
/**
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 1d99a31c48..ce1778c99f 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
@@ -445,7 +445,7 @@ public class BasicSwaggerProviderSession {
JsonMap om =
responses.getMap(String.valueOf(code), true);
merge(om, a);
JsonMap schema =
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
-
rstream(eci.getAnnotations()).map(x ->
x.cast(Schema.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> merge(schema, x));
+
ap.findTopDown(Schema.class, eci).map(AnnotationInfo::inner).forEach(x ->
merge(schema, x));
pushupSchemaFields(RESPONSE, om, schema);
om.appendIf(nem,
"schema", schema);
}
@@ -461,8 +461,7 @@ public class BasicSwaggerProviderSession {
for (var code : codes) {
JsonMap header
= responses.getMap(String.valueOf(code), true).getMap("headers",
true).getMap(ha, true);
ap.findTopDown(Schema.class, ecmi).map(x -> x.inner()).forEach(x ->
merge(header, x));
- //
context.getAnnotationProvider().xforEachMethodAnnotation(Schema.class, ecmi, x
-> true, x -> merge(header, x));
-
rstream(ecmi.getReturnType().unwrap(Value.class,
Optional.class).getAnnotations()).map(x ->
x.cast(Schema.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> merge(header, x));
+
ap.findTopDown(Schema.class, ecmi.getReturnType().unwrap(Value.class,
Optional.class)).map(AnnotationInfo::inner).forEach(x -> merge(header, x));
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header.getMap("schema"),
ecmi.getReturnType().unwrap(Value.class, Optional.class).innerType(), bs));
}
}
@@ -502,7 +501,7 @@ public class BasicSwaggerProviderSession {
JsonMap
header = responses.getMap(String.valueOf(code), true).getMap("headers",
true).getMap(ha, true);
//context.getAnnotationProvider().xforEachMethodAnnotation(Schema.class, ecmi,
x -> true, x -> merge(header, x));
ap.findTopDown(Schema.class, ecmi).map(x -> x.inner()).forEach(x ->
merge(header, x));
-
rstream(ecmi.getReturnType().unwrap(Value.class,
Optional.class).getAnnotations()).map(x ->
x.cast(Schema.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> merge(header, x));
+
ap.findTopDown(Schema.class, ecmi.getReturnType().unwrap(Value.class,
Optional.class)).map(AnnotationInfo::inner).forEach(x -> merge(header, x));
merge(header, a.schema());
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header,
ecmi.getReturnType().innerType(), bs));
}
@@ -514,7 +513,7 @@ public class BasicSwaggerProviderSession {
JsonMap om = responses.getMap("200", true);
var pt2 =
ClassInfo.of(m.getGenericReturnType());
JsonMap schema = getSchema(om.getMap("schema"),
m.getGenericReturnType(), bs);
- rstream(pt2.getAnnotations()).map(x ->
x.cast(Schema.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> merge(schema, x));
+ ap.findTopDown(Schema.class,
pt2).map(AnnotationInfo::inner).forEach(x -> merge(schema, x));
pushupSchemaFields(RESPONSE, om, schema);
om.appendIf(nem, "schema", schema);
addBodyExamples(sm, om, true,
m.getGenericReturnType(), locale);
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 2d8f64b6ce..d2d49b39a4 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
@@ -568,30 +568,6 @@ public class ClassInfo_Test extends TestBase {
assertThrows(IllegalArgumentException.class,
()->g3.hasAnnotation(null));
}
- @Test void getAnnotations() {
- check("@A(2),@A(1),@A(5),@A(3),@A(6),@A(7)",
rstream(g3.getAnnotations()).map(ai -> (AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).toList());
- check("@A(2),@A(1),@A(5),@A(3),@A(6),@A(7)",
rstream(g4.getAnnotations()).map(ai -> (AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).toList());
- check("@A(3)", rstream(g5.getAnnotations()).map(ai ->
(AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).toList());
- }
-
- @Test void forEachAnnotation() {
- var l1 = list();
- rstream(g3.getAnnotations()).map(ai ->
(AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> l1.add(x.value()));
- assertList(l1, "2", "1", "5", "3", "6", "7");
-
- var l2 = list();
- rstream(g4.getAnnotations()).map(ai ->
(AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> l2.add(x.value()));
- assertList(l2, "2", "1", "5", "3", "6", "7");
-
- var l3 = list();
- rstream(g5.getAnnotations()).map(ai ->
(AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).forEach(x
-> l3.add(x.value()));
- assertList(l3, "3");
-
- var l4 = list();
- rstream(g3.getAnnotations()).map(ai ->
(AnnotationInfo<?>)ai).map(x ->
x.cast(A.class)).filter(Objects::nonNull).map(AnnotationInfo::inner).filter(x
-> x.value() == 5).forEach(x -> l4.add(x.value()));
- assertList(l4, "5");
- }
-
@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;