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 54c1f9ee9d org.apache.juneau.common.reflect API improvements
54c1f9ee9d is described below
commit 54c1f9ee9d560d0acaa1b8c043d79e1375770fcf
Author: James Bognar <[email protected]>
AuthorDate: Fri Nov 21 19:14:54 2025 -0500
org.apache.juneau.common.reflect API improvements
---
.../juneau/assertions/FluentAnyAssertion.java | 1 -
.../juneau/assertions/FluentObjectAssertion.java | 1 -
.../juneau/junit/bct/BasicBeanConverter.java | 1 -
.../juneau/common/collections/ReversedList.java | 4 +-
.../juneau/common/reflect/AnnotationInfo.java | 9 -
.../juneau/common/reflect/AnnotationProvider.java | 349 +++------------------
.../juneau/common/reflect/ExecutableInfo.java | 1 -
.../juneau/common/utils/CollectionUtils.java | 22 ++
.../src/main/java/org/apache/juneau/BeanMeta.java | 32 +-
.../java/org/apache/juneau/BeanPropertyMeta.java | 52 ++-
.../apache/juneau/BeanProxyInvocationHandler.java | 1 -
.../src/main/java/org/apache/juneau/Context.java | 8 +-
.../juneau/InvalidDataConversionException.java | 1 -
.../annotation/TargetedAnnotationCBuilder.java | 2 -
.../annotation/TargetedAnnotationMBuilder.java | 2 -
.../annotation/TargetedAnnotationMFBuilder.java | 2 -
.../annotation/TargetedAnnotationMFCBuilder.java | 2 -
.../annotation/TargetedAnnotationTMBuilder.java | 2 -
.../annotation/TargetedAnnotationTMFBuilder.java | 2 -
.../annotation/TargetedAnnotationTMFCBuilder.java | 2 -
.../apache/juneau/html/HtmlBeanPropertyMeta.java | 8 +-
.../juneau/http/annotation/FormDataAnnotation.java | 2 +
.../juneau/http/annotation/HeaderAnnotation.java | 2 +
.../juneau/http/annotation/PathAnnotation.java | 2 +
.../http/annotation/PathRemainderAnnotation.java | 1 +
.../juneau/http/annotation/QueryAnnotation.java | 2 +
.../juneau/httppart/bean/RequestBeanMeta.java | 2 +-
.../httppart/bean/RequestBeanPropertyMeta.java | 9 +-
.../juneau/httppart/bean/ResponseBeanMeta.java | 12 +-
.../org/apache/juneau/internal/ClassUtils2.java | 2 -
.../org/apache/juneau/svl/VarResolverSession.java | 1 -
.../rest/client/remote/RemoteOperationMeta.java | 24 +-
.../rest/client/remote/RemoteOperationReturn.java | 3 +-
.../juneau/http/remote/RrpcInterfaceMeta.java | 2 +-
.../java/org/apache/juneau/rest/RestContext.java | 11 +-
.../java/org/apache/juneau/rest/RestOpContext.java | 3 +-
.../org/apache/juneau/rest/arg/AttributeArg.java | 1 +
.../org/apache/juneau/rest/arg/FormDataArg.java | 2 +-
.../org/apache/juneau/rest/arg/HasFormDataArg.java | 1 +
.../org/apache/juneau/rest/arg/HasQueryArg.java | 1 +
.../java/org/apache/juneau/rest/arg/HeaderArg.java | 2 +-
.../java/org/apache/juneau/rest/arg/PathArg.java | 4 +-
.../java/org/apache/juneau/rest/arg/QueryArg.java | 2 +-
.../juneau/rest/debug/BasicDebugEnablement.java | 7 +-
.../juneau/rest/matcher/ClientVersionMatcher.java | 1 +
.../apache/juneau/rest/servlet/RestServlet.java | 3 +-
.../rest/swagger/BasicSwaggerProviderSession.java | 247 +++++++--------
.../juneau/common/reflect/MethodInfo_Test.java | 2 +-
48 files changed, 295 insertions(+), 560 deletions(-)
diff --git
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
index 9c4363b075..74f716885c 100644
---
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
+++
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentAnyAssertion.java
@@ -26,7 +26,6 @@ import java.util.function.*;
import org.apache.juneau.*;
import org.apache.juneau.cp.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.serializer.*;
/**
diff --git
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
index 8b4fe22c14..fe9088d3a6 100644
---
a/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
+++
b/juneau-core/juneau-assertions/src/main/java/org/apache/juneau/assertions/FluentObjectAssertion.java
@@ -29,7 +29,6 @@ import java.util.function.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.serializer.*;
/**
diff --git
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
index e0028c7cc8..2491df011d 100644
---
a/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
+++
b/juneau-core/juneau-bct/src/main/java/org/apache/juneau/junit/bct/BasicBeanConverter.java
@@ -31,7 +31,6 @@ import java.util.concurrent.*;
import java.util.function.*;
import java.util.stream.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.utils.*;
/**
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
index ad9cd4def5..7299a3f544 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/collections/ReversedList.java
@@ -119,7 +119,7 @@ public class ReversedList<E> extends AbstractList<E>
implements RandomAccess {
*/
@Override
public Iterator<E> iterator() {
- return new Iterator<E>() {
+ return new Iterator<>() {
private final ListIterator<E> it =
list.listIterator(list.size());
@Override
@@ -167,7 +167,7 @@ public class ReversedList<E> extends AbstractList<E>
implements RandomAccess {
if (index < 0 || index > size())
throw new IndexOutOfBoundsException("Index: " + index +
", Size: " + size());
- return new ListIterator<E>() {
+ return new ListIterator<>() {
private final ListIterator<E> it =
list.listIterator(list.size() - index);
@Override
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 063af2383e..e05c954126 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
@@ -22,20 +22,11 @@ import static
org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.ThrowableUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
-import java.lang.annotation.*;
-import java.lang.reflect.*;
-import java.util.*;
-import java.util.function.*;
-import java.util.stream.*;
-
-import org.apache.juneau.common.utils.*;
-
import java.lang.annotation.*;
import java.util.*;
import java.util.function.*;
import org.apache.juneau.common.annotation.*;
-import org.apache.juneau.common.utils.*;
/**
* Encapsulates information about an annotation instance and the element it's
declared on.
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 540639f7da..60a8b311f4 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
@@ -26,7 +26,6 @@ import static org.apache.juneau.common.utils.Utils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;
-import java.util.stream.*;
import org.apache.juneau.common.collections.*;
@@ -477,32 +476,32 @@ public class AnnotationProvider {
//-----------------------------------------------------------------------------------------------------------------
/**
- * Streams annotations from a class using configurable traversal
options.
+ * Finds annotations from a class using configurable traversal options.
*
* <p>
- * This method provides a flexible, stream-based API for traversing
annotations without creating intermediate lists.
+ * This method provides a flexible API for traversing annotations.
* It uses {@link AnnotationTraversal} enums to configure what elements
to search and in what order.
*
* <h5 class='section'>Examples:</h5>
* <p class='bjava'>
* <jc>// Search class only</jc>
- * Stream<AnnotationInfo<MyAnnotation>> <jv>s1</jv> =
- * search(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF);
+ * List<AnnotationInfo<MyAnnotation>> <jv>l1</jv> =
+ * find(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF);
*
* <jc>// Search class and parents</jc>
- * Stream<AnnotationInfo<MyAnnotation>> <jv>s2</jv> =
- * search(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF,
PARENTS);
+ * List<AnnotationInfo<MyAnnotation>> <jv>l2</jv> =
+ * find(MyAnnotation.<jk>class</jk>, <jv>ci</jv>, SELF,
PARENTS);
*
* <jc>// Search class, parents, and package (parent-first order
using rstream)</jc>
* Stream<AnnotationInfo<MyAnnotation>> <jv>s3</jv> =
- * rstream(search(MyAnnotation.<jk>class</jk>,
<jv>ci</jv>, SELF, PARENTS, PACKAGE).toList());
+ * rstream(find(MyAnnotation.<jk>class</jk>, <jv>ci</jv>,
SELF, PARENTS, PACKAGE));
* </p>
*
* @param <A> The annotation type.
* @param type The annotation type to search for.
* @param c The class to search.
* @param traversals The traversal options (what to search and order).
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A>
type, ClassInfo c, AnnotationTraversal... traversals) {
assertArgNotNull("type", type);
@@ -511,69 +510,32 @@ public class AnnotationProvider {
}
/**
- * Streams all annotations from a class using configurable traversal
options, without filtering by annotation type.
+ * Finds all annotations from a class using configurable traversal
options, without filtering by annotation type.
*
* <p>
- * This method provides a flexible, stream-based API for traversing all
class annotations without creating intermediate lists.
+ * This method provides a flexible API for traversing all class
annotations.
* Unlike {@link #find(Class, ClassInfo, AnnotationTraversal...)}, this
method does not filter by annotation type.
*
* <h5 class='section'>Examples:</h5>
* <p class='bjava'>
* <jc>// Get all annotations from class only</jc>
- * Stream<AnnotationInfo<Annotation>> <jv>s1</jv> =
+ * List<AnnotationInfo<Annotation>> <jv>l1</jv> =
* find(<jv>ci</jv>, SELF);
*
* <jc>// Get all annotations from class and parents</jc>
- * Stream<AnnotationInfo<Annotation>> <jv>s2</jv> =
+ * List<AnnotationInfo<Annotation>> <jv>l2</jv> =
* find(<jv>ci</jv>, SELF, PARENTS);
* </p>
*
* @param c The class to search.
* @param traversals The traversal options (what to search and order).
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
public List<AnnotationInfo<? extends Annotation>> find(ClassInfo c,
AnnotationTraversal... traversals) {
assertArgNotNull("c", c);
return cache.get(null, c, traversals);
}
- /**
- * Streams annotations from a class using configurable traversal
options in parent-first order.
- *
- * <p>
- * This is equivalent to calling {@link #find(Class, ClassInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param <A> The annotation type.
- * @param type The annotation type to search for.
- * @param c The class to search.
- * @param traversals The traversal options (what to search and order).
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>>
findTopDown(Class<A> type, ClassInfo c, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("c", c);
- return rstream(cache.get(type, c, traversals));
- }
-
- /**
- * Streams all annotations from a class using configurable traversal
options in parent-first order, without filtering by annotation type.
- *
- * <p>
- * This is equivalent to calling {@link #find(ClassInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param c The class to search.
- * @param traversals The traversal options (what to search and order).
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>>
findTopDown(ClassInfo c, AnnotationTraversal... traversals) {
- assertArgNotNull("c", c);
- return rstream(cache.get(null, c, traversals));
- }
-
/**
* Checks if a class has the specified annotation.
*
@@ -616,111 +578,61 @@ public class AnnotationProvider {
}
/**
- * Streams annotations from a method using configurable traversal
options.
+ * Finds annotations from a method using configurable traversal options.
*
* <p>
- * This method provides a flexible, stream-based API for traversing
method annotations without creating intermediate lists.
+ * This method provides a flexible API for traversing method
annotations.
*
* <h5 class='section'>Examples:</h5>
* <p class='bjava'>
* <jc>// Search method and matching parent methods</jc>
- * Stream<AnnotationInfo<MyAnnotation>> <jv>s1</jv> =
- * findAnnotations(MyAnnotation.<jk>class</jk>,
<jv>mi</jv>, SELF, MATCHING_METHODS);
+ * List<AnnotationInfo<MyAnnotation>> <jv>l1</jv> =
+ * find(MyAnnotation.<jk>class</jk>, <jv>mi</jv>, SELF,
MATCHING_METHODS);
*
- * <jc>// Search method, matching methods, and return type
(parent-first using findAnnotationsParentFirst)</jc>
+ * <jc>// Search method, matching methods, and return type
(parent-first using rstream)</jc>
* Stream<AnnotationInfo<MyAnnotation>> <jv>s2</jv> =
- * findAnnotationsParentFirst(MyAnnotation.<jk>class</jk>,
<jv>mi</jv>, SELF, MATCHING_METHODS, RETURN_TYPE);
+ * rstream(find(MyAnnotation.<jk>class</jk>, <jv>mi</jv>,
SELF, MATCHING_METHODS, RETURN_TYPE));
* </p>
*
* @param <A> The annotation type.
* @param type The annotation type to search for.
* @param m The method to search.
* @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A>
type, MethodInfo m, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("m", m);
- return cache.get(type, m, traversals).stream();
- }
-
- public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A>
type, MethodInfo m, AnnotationTraversal... traversals) {
+ public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A>
type, MethodInfo m, AnnotationTraversal... traversals) {
assertArgNotNull("type", type);
assertArgNotNull("m", m);
return cache.get(type, m, traversals);
}
/**
- * Streams all annotations from a method using configurable traversal
options, without filtering by annotation type.
+ * Finds all annotations from a method using configurable traversal
options, without filtering by annotation type.
*
* <p>
- * This method provides a flexible, stream-based API for traversing all
method annotations without creating intermediate lists.
+ * This method provides a flexible API for traversing all method
annotations.
* Unlike {@link #find(Class, MethodInfo, AnnotationTraversal...)},
this method does not filter by annotation type.
*
* <h5 class='section'>Examples:</h5>
* <p class='bjava'>
* <jc>// Get all annotations from method and matching parent
methods</jc>
- * Stream<AnnotationInfo<Annotation>> <jv>s1</jv> =
+ * List<AnnotationInfo<Annotation>> <jv>l1</jv> =
* find(<jv>mi</jv>, SELF, MATCHING_METHODS);
*
* <jc>// Get all annotations from method, matching methods, and
return type</jc>
- * Stream<AnnotationInfo<Annotation>> <jv>s2</jv> =
+ * List<AnnotationInfo<Annotation>> <jv>l2</jv> =
* find(<jv>mi</jv>, SELF, MATCHING_METHODS, RETURN_TYPE);
* </p>
*
* @param m The method to search.
* @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>> find(MethodInfo m,
AnnotationTraversal... traversals) {
- assertArgNotNull("m", m);
- return cache.get(null, m, traversals).stream();
- }
-
- public List<AnnotationInfo<? extends Annotation>> find2(MethodInfo m,
AnnotationTraversal... traversals) {
+ public List<AnnotationInfo<? extends Annotation>> find(MethodInfo m,
AnnotationTraversal... traversals) {
assertArgNotNull("m", m);
return cache.get(null, m, traversals);
}
- /**
- * Streams annotations from a method using configurable traversal
options in parent-first order.
- *
- * <p>
- * This is equivalent to calling {@link #find(Class, MethodInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param <A> The annotation type.
- * @param type The annotation type to search for.
- * @param m The method to search.
- * @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>>
findTopDown(Class<A> type, MethodInfo m, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("m", m);
- return rstream(cache.get(type, m, traversals));
- }
-
- /**
- * Streams all annotations from a method using configurable traversal
options in parent-first order, without filtering by annotation type.
- *
- * <p>
- * This is equivalent to calling {@link #find(MethodInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param m The method to search.
- * @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>>
findTopDown(MethodInfo m, AnnotationTraversal... traversals) {
- assertArgNotNull("m", m);
- return rstream(cache.get(null, m, traversals));
- }
-
/**
* Checks if a method has the specified annotation.
*
@@ -759,11 +671,11 @@ public class AnnotationProvider {
* @return <jk>true</jk> if the annotation is found, <jk>false</jk>
otherwise.
*/
public <A extends Annotation> boolean has(Class<A> type, MethodInfo m,
AnnotationTraversal... traversals) {
- return ! find2(type, m, traversals).isEmpty();
+ return ! find(type, m, traversals).isEmpty();
}
/**
- * Streams annotations from a parameter using configurable traversal
options in child-to-parent order.
+ * Finds annotations from a parameter using configurable traversal
options in child-to-parent order.
*
* <p>
* This method provides a flexible, stream-based API for traversing
parameter annotations without creating intermediate lists.
@@ -799,65 +711,16 @@ public class AnnotationProvider {
* @param traversals
* The traversal options. If not specified, defaults to {@code
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
* <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
- * @return A stream of {@link AnnotationInfo} objects in
child-to-parent order. Never <jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects in child-to-parent
order. Never <jk>null</jk>.
*/
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A>
type, ParameterInfo p, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("p", p);
- return cache.get(type, p, traversals).stream();
- }
-
- public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A>
type, ParameterInfo p, AnnotationTraversal... traversals) {
+ public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A>
type, ParameterInfo p, AnnotationTraversal... traversals) {
assertArgNotNull("type", type);
assertArgNotNull("p", p);
return cache.get(type, p, traversals);
}
/**
- * Streams annotations from a parameter using configurable traversal
options in parent-to-child order.
- *
- * <p>
- * This is equivalent to calling {@link #find(Class, ParameterInfo,
AnnotationTraversal...)} and reversing the result.
- * Use this when you need parent annotations to take precedence over
child annotations.
- *
- * <h5 class='section'>Supported Traversal Types:</h5>
- * <ul>
- * <li>{@link AnnotationTraversal#SELF SELF} - Annotations
declared directly on this parameter
- * <li>{@link AnnotationTraversal#MATCHING_PARAMETERS
MATCHING_PARAMETERS} - Matching parameters in parent methods/constructors
(parent-to-child)
- * <li>{@link AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE} -
The parameter's type hierarchy (includes class parents and package)
- * </ul>
- *
- * <p>
- * <b>Default:</b> If no traversals are specified, defaults to: {@code
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}
- *
- * <h5 class='section'>Example:</h5>
- * <p class='bjava'>
- * <jc>// Search in parent-to-child order</jc>
- * Stream<AnnotationInfo<MyAnnotation>> <jv>s</jv> =
- * findTopDown(MyAnnotation.<jk>class</jk>, <jv>pi</jv>,
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE);
- *
- * <jc>// Get first annotation (from parent)</jc>
- * Optional<AnnotationInfo<MyAnnotation>>
<jv>first</jv> = <jv>s</jv>.findFirst();
- * </p>
- *
- * @param <A> The annotation type.
- * @param type The annotation type to search for.
- * @param p The parameter to search.
- * @param traversals
- * The traversal options. If not specified, defaults to {@code
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
- * <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
- * @return A stream of {@link AnnotationInfo} objects in
parent-to-child order. Never <jk>null</jk>.
- */
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>>
findTopDown(Class<A> type, ParameterInfo p, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("p", p);
- return rstream(cache.get(type, p, traversals));
- }
-
- /**
- * Streams all annotations from a parameter using configurable
traversal options, without filtering by annotation type.
+ * Finds all annotations from a parameter using configurable traversal
options, without filtering by annotation type.
*
* <p>
* This method provides a flexible, stream-based API for traversing all
parameter annotations without creating intermediate lists.
@@ -888,38 +751,13 @@ public class AnnotationProvider {
* @param traversals
* The traversal options. If not specified, defaults to {@code
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
* <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
- * @return A stream of {@link AnnotationInfo} objects in
child-to-parent order. Never <jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects in child-to-parent
order. Never <jk>null</jk>.
*/
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>> find(ParameterInfo
p, AnnotationTraversal... traversals) {
- assertArgNotNull("p", p);
- return cache.get(null, p, traversals).stream();
- }
-
- public List<AnnotationInfo<? extends Annotation>> find2(ParameterInfo
p, AnnotationTraversal... traversals) {
+ public List<AnnotationInfo<? extends Annotation>> find(ParameterInfo p,
AnnotationTraversal... traversals) {
assertArgNotNull("p", p);
return cache.get(null, p, traversals);
}
- /**
- * Streams all annotations from a parameter using configurable
traversal options in parent-first order, without filtering by annotation type.
- *
- * <p>
- * This is equivalent to calling {@link #find(ParameterInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param p The parameter to search.
- * @param traversals
- * The traversal options. If not specified, defaults to {@code
SELF, MATCHING_PARAMETERS, PARAMETER_TYPE}.
- * <br>Valid values: {@link AnnotationTraversal#SELF SELF}, {@link
AnnotationTraversal#MATCHING_PARAMETERS MATCHING_PARAMETERS}, {@link
AnnotationTraversal#PARAMETER_TYPE PARAMETER_TYPE}
- * @return A stream of {@link AnnotationInfo} objects in
parent-to-child order. Never <jk>null</jk>.
- */
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>>
findTopDown(ParameterInfo p, AnnotationTraversal... traversals) {
- assertArgNotNull("p", p);
- return rstream(cache.get(null, p, traversals));
- }
-
/**
* Checks if a parameter has the specified annotation.
*
@@ -957,11 +795,11 @@ public class AnnotationProvider {
* @return <jk>true</jk> if the annotation is found, <jk>false</jk>
otherwise.
*/
public <A extends Annotation> boolean has(Class<A> type, ParameterInfo
p, AnnotationTraversal... traversals) {
- return ! find2(type, p, traversals).isEmpty();
+ return ! find(type, p, traversals).isEmpty();
}
/**
- * Streams annotations from a field using configurable traversal
options.
+ * Finds annotations from a field using configurable traversal options.
*
* <p>
* This method provides a flexible, stream-based API for traversing
field annotations without creating intermediate lists.
@@ -977,23 +815,16 @@ public class AnnotationProvider {
* @param type The annotation type to search for.
* @param f The field to search.
* @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>> find(Class<A>
type, FieldInfo f, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("f", f);
- return cache.get(type, f, traversals).stream();
- }
-
- public <A extends Annotation> List<AnnotationInfo<A>> find2(Class<A>
type, FieldInfo f, AnnotationTraversal... traversals) {
+ public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A>
type, FieldInfo f, AnnotationTraversal... traversals) {
assertArgNotNull("type", type);
assertArgNotNull("f", f);
return cache.get(type, f, traversals);
}
/**
- * Streams all annotations from a field using configurable traversal
options, without filtering by annotation type.
+ * Finds all annotations from a field using configurable traversal
options, without filtering by annotation type.
*
* <p>
* This method provides a flexible, stream-based API for traversing all
field annotations without creating intermediate lists.
@@ -1008,56 +839,13 @@ public class AnnotationProvider {
*
* @param f The field to search.
* @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>> find(FieldInfo f,
AnnotationTraversal... traversals) {
- assertArgNotNull("f", f);
- return cache.get(null, f, traversals).stream();
- }
-
- public List<AnnotationInfo<? extends Annotation>> find2(FieldInfo f,
AnnotationTraversal... traversals) {
+ public List<AnnotationInfo<? extends Annotation>> find(FieldInfo f,
AnnotationTraversal... traversals) {
assertArgNotNull("f", f);
return cache.get(null, f, traversals);
}
- /**
- * Streams annotations from a field using configurable traversal
options in parent-first order.
- *
- * <p>
- * This is equivalent to calling {@link #find(Class, FieldInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param <A> The annotation type.
- * @param type The annotation type to search for.
- * @param f The field to search.
- * @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>>
findTopDown(Class<A> type, FieldInfo f, AnnotationTraversal... traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("f", f);
- return rstream(cache.get(type, f, traversals));
- }
-
- /**
- * Streams all annotations from a field using configurable traversal
options in parent-first order, without filtering by annotation type.
- *
- * <p>
- * This is equivalent to calling {@link #find(FieldInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param f The field to search.
- * @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>>
findTopDown(FieldInfo f, AnnotationTraversal... traversals) {
- assertArgNotNull("f", f);
- return rstream(cache.get(null, f, traversals));
- }
-
/**
* Checks if a field has the specified annotation.
*
@@ -1090,11 +878,11 @@ public class AnnotationProvider {
* @return <jk>true</jk> if the annotation is found, <jk>false</jk>
otherwise.
*/
public <A extends Annotation> boolean has(Class<A> type, FieldInfo f,
AnnotationTraversal... traversals) {
- return ! find2(type, f, traversals).isEmpty();
+ return ! find(type, f, traversals).isEmpty();
}
/**
- * Streams annotations from a constructor using configurable traversal
options.
+ * Finds annotations from a constructor using configurable traversal
options.
*
* <p>
* This method provides a flexible, stream-based API for traversing
constructor annotations without creating intermediate lists.
@@ -1110,7 +898,7 @@ public class AnnotationProvider {
* @param type The annotation type to search for.
* @param c The constructor to search.
* @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
public <A extends Annotation> List<AnnotationInfo<A>> find(Class<A>
type, ConstructorInfo c, AnnotationTraversal... traversals) {
assertArgNotNull("type", type);
@@ -1119,7 +907,7 @@ public class AnnotationProvider {
}
/**
- * Streams all annotations from a constructor using configurable
traversal options, without filtering by annotation type.
+ * Finds all annotations from a constructor using configurable
traversal options, without filtering by annotation type.
*
* <p>
* This method provides a flexible, stream-based API for traversing all
constructor annotations without creating intermediate lists.
@@ -1134,56 +922,13 @@ public class AnnotationProvider {
*
* @param c The constructor to search.
* @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
+ * @return A list of {@link AnnotationInfo} objects. Never
<jk>null</jk>.
*/
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>>
find(ConstructorInfo c, AnnotationTraversal... traversals) {
- assertArgNotNull("c", c);
- return cache.get(null, c, traversals).stream();
- }
-
- public List<AnnotationInfo<? extends Annotation>> find2(ConstructorInfo
c, AnnotationTraversal... traversals) {
+ public List<AnnotationInfo<? extends Annotation>> find(ConstructorInfo
c, AnnotationTraversal... traversals) {
assertArgNotNull("c", c);
return cache.get(null, c, traversals);
}
- /**
- * Streams annotations from a constructor using configurable traversal
options in parent-first order.
- *
- * <p>
- * This is equivalent to calling {@link #find(Class, ConstructorInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param <A> The annotation type.
- * @param type The annotation type to search for.
- * @param c The constructor to search.
- * @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public <A extends Annotation> Stream<AnnotationInfo<A>>
findTopDown(Class<A> type, ConstructorInfo c, AnnotationTraversal...
traversals) {
- assertArgNotNull("type", type);
- assertArgNotNull("c", c);
- return rstream(cache.get(type, c, traversals));
- }
-
- /**
- * Streams all annotations from a constructor using configurable
traversal options in parent-first order, without filtering by annotation type.
- *
- * <p>
- * This is equivalent to calling {@link #find(ConstructorInfo,
AnnotationTraversal...)}
- * and reversing the result.
- *
- * @param c The constructor to search.
- * @param traversals The traversal options.
- * @return A stream of {@link AnnotationInfo} objects in parent-first
order. Never <jk>null</jk>.
- */
- @Deprecated
- public Stream<AnnotationInfo<? extends Annotation>>
findTopDown(ConstructorInfo c, AnnotationTraversal... traversals) {
- assertArgNotNull("c", c);
- return rstream(cache.get(null, c, traversals));
- }
-
/**
* Checks if a constructor has the specified annotation.
*
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
index 5062c31fd2..ae7285493c 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ExecutableInfo.java
@@ -18,7 +18,6 @@ package org.apache.juneau.common.reflect;
import static org.apache.juneau.common.reflect.ClassArrayFormat.*;
import static org.apache.juneau.common.reflect.ClassNameFormat.*;
-import static org.apache.juneau.common.reflect.ReflectionUtils.*;
import static org.apache.juneau.common.utils.AssertionUtils.*;
import static org.apache.juneau.common.utils.ClassUtils.*;
import static org.apache.juneau.common.utils.CollectionUtils.*;
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 857b37a2e4..4e171cc919 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
@@ -1413,6 +1413,13 @@ public class CollectionUtils {
* @param array The array to reverse.
* @return The same array.
*/
+ /**
+ * Reverses the elements in the specified array in-place.
+ *
+ * @param <E> The element type.
+ * @param array The array to reverse.
+ * @return The same array, reversed.
+ */
public static <E> E[] reverse(E[] array) {
for (int i = 0; i < array.length / 2; i++) {
E temp = array[i];
@@ -1422,6 +1429,20 @@ public class CollectionUtils {
return array;
}
+ /**
+ * Returns a reversed view of the specified list.
+ *
+ * <p>
+ * The returned list is a live view that reflects changes to the
original list.
+ *
+ * @param <E> The element type.
+ * @param list The list to reverse.
+ * @return A reversed view of the list.
+ */
+ public static <E> List<E> reverse(List<E> list) {
+ return new ReversedList<>(list);
+ }
+
/**
* Converts the specified collection to an array.
*
@@ -1628,6 +1649,7 @@ public class CollectionUtils {
* @param length The length of the array.
* @return A new array of the specified type and length. Never
<jk>null</jk>.
*/
+ @SuppressWarnings("unchecked")
public static <E> E[] array(Class<E> componentType, int length) {
return (E[])Array.newInstance(componentType, length);
}
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 b5dc2adcac..d66edff5bc 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
@@ -187,9 +187,8 @@ public class BeanMeta<T> {
private String findPropertyName(FieldInfo f) {
List<Beanp> lp = list();
List<Name> ln = list();
- // Inline Context.forEachAnnotation() calls
- ap.find(Beanp.class, f).map(x -> x.inner()).forEach(x
-> lp.add(x));
- ap.find(Name.class, f).map(x -> x.inner()).forEach(x ->
ln.add(x));
+ ap.find(Beanp.class, f).forEach(x -> lp.add(x.inner()));
+ ap.find(Name.class, f).forEach(x -> ln.add(x.inner()));
String name = bpName(lp, ln);
if (isNotEmpty(name))
return name;
@@ -593,25 +592,24 @@ public class BeanMeta<T> {
* @param pn Use this property namer to determine property names from
the method names.
*/
static final List<BeanMethod> findBeanMethods(BeanContext ctx, Class<?>
c, Class<?> stopClass, Visibility v, PropertyNamer pn, boolean fluentSetters) {
- List<BeanMethod> l = new LinkedList<>();
+ var l = new LinkedList<BeanMethod>();
var ap = ctx.getAnnotationProvider();
forEachClass(info(c), stopClass, c2 -> {
for (var m : c2.getDeclaredMethods()) {
if (m.isStatic() || m.isBridge() ||
m.getParameterCount() > 2 || m.getMatchingMethods().stream().anyMatch(m2 ->
ap.has(BeanIgnore.class, m2, SELF, MATCHING_METHODS)))
continue;
- Transient t = m.getMatchingMethods().stream()
- .map(m2 -> ap.find(Transient.class,
m2).map(x -> x.inner()).findFirst().orElse(null))
+
+ var t = m.getMatchingMethods().stream()
+ .map(m2 -> ap.find(Transient.class,
m2).stream().map(AnnotationInfo::inner).findFirst().orElse(null))
.filter(Objects::nonNull)
.findFirst()
.orElse(null);
if (nn(t) && t.value())
continue;
- List<Beanp> lp = list();
- List<Name> ln = list();
- ap.find(Beanp.class, m).map(x ->
x.inner()).forEach(x -> lp.add(x));
- ap.find(Name.class, m).map(x ->
x.inner()).forEach(x -> ln.add(x));
+ var lp = ap.find(Beanp.class,
m).stream().map(AnnotationInfo::inner).toList();
+ var ln = ap.find(Name.class,
m).stream().map(AnnotationInfo::inner).toList();
// If this method doesn't have @Beanp or @Name,
check if it overrides a parent method that does
// This ensures property names are inherited
correctly, preventing duplicate property definitions
@@ -620,12 +618,12 @@ public class BeanMeta<T> {
if (! (m.isVisible(v) || isNotEmpty(lp) ||
isNotEmpty(ln)))
continue;
- String n = m.getSimpleName();
+ var n = m.getSimpleName();
- List<ParameterInfo> params = m.getParameters();
- ClassInfo rt = m.getReturnType();
- MethodType methodType = UNKNOWN;
- String bpName = bpName(lp, ln);
+ var params = m.getParameters();
+ var rt = m.getReturnType();
+ var methodType = UNKNOWN;
+ var bpName = bpName(lp, ln);
if (params.isEmpty()) {
if ("*".equals(bpName)) {
@@ -825,8 +823,8 @@ public class BeanMeta<T> {
if (paramsMatch) {
// Found a matching parent
method - check for @Beanp and @Name annotations
- ap.find(Beanp.class,
parentMethod).map(x -> x.inner()).forEach(x -> lp.add(x));
- ap.find(Name.class,
parentMethod).map(x -> x.inner()).forEach(x -> ln.add(x));
+ ap.find(Beanp.class,
parentMethod).forEach(x -> lp.add(x.inner()));
+ ap.find(Name.class,
parentMethod).forEach(x -> ln.add(x.inner()));
// If we found annotations,
we're done
if (! lp.isEmpty() || !
ln.isEmpty())
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
index 89c8d3d370..eafe5b0db8 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanPropertyMeta.java
@@ -65,7 +65,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
*/
public static class Builder {
BeanMeta<?> beanMeta;
- BeanContext beanContext;
+ BeanContext bc;
String name;
Field field, innerField; // TODO - Replace with FieldInfo
fields
Method getter, setter, extraKeys; // TODO - Replace with
MethodInfo fields
@@ -80,7 +80,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
Builder(BeanMeta<?> beanMeta, String name) {
this.beanMeta = beanMeta;
- this.beanContext = beanMeta.ctx;
+ this.bc = beanMeta.ctx;
this.name = name;
}
@@ -227,8 +227,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (nn(innerField)) {
List<Beanp> lp = list();
- // Inline Context.forEachAnnotation() call
- ap.find(Beanp.class, ifi).map(x ->
x.inner()).forEach(x -> lp.add(x));
+ ap.find(Beanp.class, ifi).forEach(x ->
lp.add(x.inner()));
if (nn(field) || isNotEmpty(lp)) {
// Only use field type if it's a bean
property or has @Beanp annotation.
// Otherwise, we want to infer the type
from the getter or setter.
@@ -246,14 +245,12 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (! x.wo().isEmpty())
writeOnly =
Boolean.valueOf(x.wo());
});
- // Inline Context.forEachAnnotation() call
- ap.find(Swap.class, ifi).map(x ->
x.inner()).forEach(x -> swap = getPropertySwap(x));
+ ap.find(Swap.class,
ifi).stream().findFirst().ifPresent(x -> swap = getPropertySwap(x.inner()));
isUri |= ap.has(Uri.class, ifi);
}
if (nn(getter)) {
- List<Beanp> lp = list();
- ap.find(Beanp.class, gi).map(x ->
x.inner()).forEach(x -> lp.add(x));
+ var lp = ap.find(Beanp.class,
gi).stream().map(AnnotationInfo::inner).toList();
if (rawTypeMeta == null)
rawTypeMeta =
bc.resolveClassMeta(last(lp), getter.getGenericReturnType(), typeVarImpls);
isUri |= (rawTypeMeta.isUri() ||
ap.has(Uri.class, gi));
@@ -268,12 +265,11 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (! x.wo().isEmpty())
writeOnly =
Boolean.valueOf(x.wo());
});
- ap.find(Swap.class, gi).map(x ->
x.inner()).forEach(x -> swap = getPropertySwap(x));
+ ap.find(Swap.class,
gi).stream().map(AnnotationInfo::inner).forEach(x -> swap = getPropertySwap(x));
}
if (nn(setter)) {
- List<Beanp> lp = list();
- ap.find(Beanp.class, si).map(x ->
x.inner()).forEach(x -> lp.add(x));
+ var lp = ap.find(Beanp.class,
si).stream().map(AnnotationInfo::inner).toList();
if (rawTypeMeta == null)
rawTypeMeta =
bc.resolveClassMeta(last(lp), setter.getGenericParameterTypes()[0],
typeVarImpls);
isUri |= (rawTypeMeta.isUri() ||
ap.has(Uri.class, si));
@@ -288,13 +284,13 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (! x.wo().isEmpty())
writeOnly =
Boolean.valueOf(x.wo());
});
- ap.find(Swap.class, si).map(x ->
x.inner()).forEach(x -> swap = getPropertySwap(x));
+ ap.find(Swap.class,
si).stream().map(AnnotationInfo::inner).forEach(x -> swap = getPropertySwap(x));
}
if (rawTypeMeta == null)
return false;
- this.beanRegistry = new BeanRegistry(beanContext,
parentBeanRegistry, bdClasses.toArray(new Class<?>[0]));
+ this.beanRegistry = new BeanRegistry(bc,
parentBeanRegistry, bdClasses.toArray(new Class<?>[0]));
isDyna = "*".equals(name);
@@ -341,13 +337,13 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (isDyna) {
rawTypeMeta = rawTypeMeta.getValueType();
if (rawTypeMeta == null)
- rawTypeMeta = beanContext.object();
+ rawTypeMeta = bc.object();
}
if (rawTypeMeta == null)
return false;
if (typeMeta == null)
- typeMeta = (nn(swap) ?
beanContext.getClassMeta(swap.getSwapClass().innerType()) : rawTypeMeta == null
? beanContext.object() : rawTypeMeta);
+ typeMeta = (nn(swap) ?
bc.getClassMeta(swap.getSwapClass().innerType()) : rawTypeMeta == null ?
bc.object() : rawTypeMeta);
if (typeMeta == null)
typeMeta = rawTypeMeta;
@@ -381,7 +377,8 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
}
final BeanMeta<?> beanMeta; // The bean
that this property belongs to.
- private final BeanContext beanContext; // The
context that created this meta.
+ private final BeanContext bc; // The context that
created this meta.
+ private final AnnotationProvider ap;
private final String name; // The name
of the property.
private final Field field; // The bean
property field (if it has one).
private final Field innerField; // The
bean property field (if it has one).
@@ -418,7 +415,8 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
this.extraKeys = b.extraKeys;
this.isUri = b.isUri;
this.beanMeta = b.beanMeta;
- this.beanContext = b.beanContext;
+ this.bc = b.bc;
+ this.ap = bc.getAnnotationProvider();
this.name = b.name;
this.rawTypeMeta = b.rawTypeMeta;
this.typeMeta = b.typeMeta;
@@ -642,11 +640,10 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
* @return A list of annotations ordered in child-to-parent order.
Never <jk>null</jk>.
*/
public <A extends Annotation> BeanPropertyMeta
forEachAnnotation(Class<A> a, Predicate<A> filter, Consumer<A> action) {
- BeanContext bc = beanContext;
if (nn(a)) {
- if (nn(field)) bc.getAnnotationProvider().find(a,
info(field)).map(x -> x.inner()).filter(filter).forEach(action);
- if (nn(getter)) bc.getAnnotationProvider().find(a,
info(getter), SELF, MATCHING_METHODS, RETURN_TYPE, PACKAGE).map(x ->
x.inner()).filter(filter).forEach(action);
- if (nn(setter)) bc.getAnnotationProvider().find(a,
info(setter), SELF, MATCHING_METHODS, RETURN_TYPE, PACKAGE).map(x ->
x.inner()).filter(filter).forEach(action);
+ if (nn(field)) ap.find(a,
info(field)).stream().map(AnnotationInfo::inner).filter(filter).forEach(action);
+ if (nn(getter)) ap.find(a, info(getter), SELF,
MATCHING_METHODS, RETURN_TYPE,
PACKAGE).stream().map(AnnotationInfo::inner).filter(filter).forEach(action);
+ if (nn(setter)) ap.find(a, info(setter), SELF,
MATCHING_METHODS, RETURN_TYPE,
PACKAGE).stream().map(AnnotationInfo::inner).filter(filter).forEach(action);
}
return this;
}
@@ -684,7 +681,6 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
@SuppressWarnings("null")
public <A extends Annotation> List<A>
getAllAnnotationsParentFirst(Class<A> a) {
List<A> l = new LinkedList<>();
- BeanContext bc = beanContext;
var ap = bc.getAnnotationProvider();
var fi = field == null ? null : info(field);
var gi = getter == null ? null : info(getter);
@@ -852,7 +848,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
return invokeGetter(bean, pName);
} catch (Throwable e) {
- if
(beanContext.isIgnoreInvocationExceptionsOnGetters()) {
+ if (bc.isIgnoreInvocationExceptionsOnGetters()) {
if (rawTypeMeta.isPrimitive())
return
rawTypeMeta.getPrimitiveDefault();
return null;
@@ -939,7 +935,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (cm.isObject()) {
if (o instanceof Map)
return new FilteredMap(cm, (Map)o, properties);
- BeanMeta bm = beanContext.getBeanMeta(o.getClass());
+ BeanMeta bm = bc.getBeanMeta(o.getClass());
if (nn(bm))
return new BeanMap(session, o, new
BeanMetaFiltered(cm.getBeanMeta(), properties));
}
@@ -1011,7 +1007,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
return toSerializedForm(m.getBeanSession(), getRaw(m,
pName));
} catch (Throwable e) {
- if
(beanContext.isIgnoreInvocationExceptionsOnGetters()) {
+ if (bc.isIgnoreInvocationExceptionsOnGetters()) {
if (rawTypeMeta.isPrimitive())
return
rawTypeMeta.getPrimitiveDefault();
return null;
@@ -1091,7 +1087,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
boolean isCollection = rawTypeMeta.isCollection();
if ((! isDyna) && field == null && setter == null && !
(isMap || isCollection)) {
- if ((value == null &&
beanContext.isIgnoreUnknownNullBeanProperties()) ||
beanContext.isIgnoreMissingSetters())
+ if ((value == null &&
bc.isIgnoreUnknownNullBeanProperties()) || bc.isIgnoreMissingSetters())
return null;
throw bex(beanMeta.c, "Setter or public field
not defined on property ''{0}''", name);
}
@@ -1100,7 +1096,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
try {
- Object r =
(beanContext.isBeanMapPutReturnsOldValue() || isMap || isCollection) &&
(nn(getter) || nn(field)) ? get(m, pName) : null;
+ Object r = (bc.isBeanMapPutReturnsOldValue() ||
isMap || isCollection) && (nn(getter) || nn(field)) ? get(m, pName) : null;
Class<?> propertyClass =
rawTypeMeta.getInnerClass();
ClassInfo pcInfo = rawTypeMeta.getInfo();
@@ -1241,7 +1237,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
} catch (BeanRuntimeException e) {
throw e;
} catch (Exception e) {
- if
(beanContext.isIgnoreInvocationExceptionsOnSetters()) {
+ if (bc.isIgnoreInvocationExceptionsOnSetters())
{
if (rawTypeMeta.isPrimitive())
return
rawTypeMeta.getPrimitiveDefault();
return null;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
index 7be205cf29..f37be3b3c2 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanProxyInvocationHandler.java
@@ -24,7 +24,6 @@ import java.lang.reflect.*;
import java.util.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.common.reflect.*;
/**
* Provides an {@link InvocationHandler} for creating beans from bean
interfaces.
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 4d949ca3ad..621a063867 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
@@ -673,13 +673,13 @@ public abstract class Context {
AnnotationProvider ap = AnnotationProvider.INSTANCE;
CollectionUtils.traverse(x, y -> {
if (x instanceof Class<?> x2)
-
work.add(ap.findTopDown(info(x2)).filter(CONTEXT_APPLY_FILTER));
+
work.add(rstream(ap.find(info(x2))).filter(CONTEXT_APPLY_FILTER));
else if (x instanceof ClassInfo x2)
-
work.add(ap.findTopDown(x2).filter(CONTEXT_APPLY_FILTER));
+
work.add(rstream(ap.find(x2)).filter(CONTEXT_APPLY_FILTER));
else if (x instanceof Method x2)
-
work.add(ap.findTopDown(info(x2)).filter(CONTEXT_APPLY_FILTER));
+
work.add(rstream(ap.find(info(x2))).filter(CONTEXT_APPLY_FILTER));
else if (x instanceof MethodInfo x2)
-
work.add(ap.findTopDown(x2).filter(CONTEXT_APPLY_FILTER));
+
work.add(rstream(ap.find(x2)).filter(CONTEXT_APPLY_FILTER));
else
illegalArg("Invalid type passed to
applyAnnotations: {0}", cn(x));
});
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
index 03ef7d2fb5..d2dd162dee 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/InvalidDataConversionException.java
@@ -22,7 +22,6 @@ import static org.apache.juneau.common.utils.Utils.*;
import java.text.*;
import org.apache.juneau.json.*;
-import org.apache.juneau.common.reflect.*;
/**
* General invalid conversion exception.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
index 518735c505..de10b27f35 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationCBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
index 2f74499ec6..45d3e02417 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
index 8e6d86998a..458d37bef4 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
index f2b773fafc..d73cc68ba4 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationMFCBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
index 89fc895fa5..2ff859a650 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
index a4cd36d75e..8cb91567db 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
index 90e7c9f8fa..1e03d74982 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/TargetedAnnotationTMFCBuilder.java
@@ -21,8 +21,6 @@ import static
org.apache.juneau.common.reflect.ReflectionUtils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* An implementation of an annotation that has an <code>on</code> value
targeting classes/methods/fields/constructors.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
index ca2a3213bd..2c71bf6438 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/html/HtmlBeanPropertyMeta.java
@@ -77,16 +77,16 @@ public class HtmlBeanPropertyMeta extends
ExtendedBeanPropertyMeta {
* @param bpm The metadata of the bean property of this additional
metadata.
* @param mp HTML metadata provider (for finding information about
other artifacts).
*/
- public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, AnnotationProvider
annotationProvider, HtmlMetaProvider mp) {
+ public HtmlBeanPropertyMeta(BeanPropertyMeta bpm, AnnotationProvider
ap, HtmlMetaProvider mp) {
super(bpm);
Builder b = new Builder();
if (nn(bpm.getInnerField()))
- annotationProvider.find(Html.class,
info(bpm.getInnerField())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+ ap.find(Html.class, info(bpm.getInnerField())).forEach(x ->
b.findHtmlInfo(x.inner()));
if (nn(bpm.getGetter()))
- annotationProvider.find(Html.class,
info(bpm.getGetter())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+ ap.find(Html.class, info(bpm.getGetter())).forEach(x ->
b.findHtmlInfo(x.inner()));
if (nn(bpm.getSetter()))
- annotationProvider.find(Html.class,
info(bpm.getSetter())).map(x -> x.inner()).forEach(x -> b.findHtmlInfo(x));
+ ap.find(Html.class, info(bpm.getSetter())).forEach(x ->
b.findHtmlInfo(x.inner()));
this.format = b.format;
this.noTables = b.noTables;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
index 3b47907f17..4047a12a00 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/FormDataAnnotation.java
@@ -278,6 +278,7 @@ public class FormDataAnnotation {
*/
public static Optional<String> findDef(ParameterInfo pi) {
return AP.find(FormData.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isNotEmpty(x.def()))
.findFirst()
@@ -295,6 +296,7 @@ public class FormDataAnnotation {
*/
public static Optional<String> findName(ParameterInfo pi) {
return AP.find(FormData.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotBlank(x.value(), x.name()))
.findFirst()
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
index 3a7af85219..dda5f4b8b3 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HeaderAnnotation.java
@@ -278,6 +278,7 @@ public class HeaderAnnotation {
*/
public static Optional<String> findDef(ParameterInfo pi) {
return AP.find(Header.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isNotEmpty(x.def()))
.findFirst()
@@ -295,6 +296,7 @@ public class HeaderAnnotation {
*/
public static Optional<String> findName(ParameterInfo pi) {
return AP.find(Header.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotBlank(x.value(), x.name()))
.findFirst()
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
index 9f1f9e59c6..f87e49c616 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathAnnotation.java
@@ -279,6 +279,7 @@ public class PathAnnotation {
*/
public static Optional<String> findDef(ParameterInfo pi) {
return AP.find(Header.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isNotEmpty(x.def()) && ne(NONE, x.def()))
.findFirst()
@@ -296,6 +297,7 @@ public class PathAnnotation {
*/
public static Optional<String> findName(ParameterInfo pi) {
return AP.find(Path.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotBlank(x.value(), x.name()))
.findFirst()
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
index 1f1de34044..5a64f940a8 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/PathRemainderAnnotation.java
@@ -266,6 +266,7 @@ public class PathRemainderAnnotation {
*/
public static Optional<String> findDef(ParameterInfo pi) {
return AP.find(PathRemainder.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isNotEmpty(x.def()))
.findFirst()
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
index 58a31eda37..cce49b68d2 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/QueryAnnotation.java
@@ -278,6 +278,7 @@ public class QueryAnnotation {
*/
public static Optional<String> findDef(ParameterInfo pi) {
return AP.find(Query.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isNotEmpty(x.def()))
.findFirst()
@@ -292,6 +293,7 @@ public class QueryAnnotation {
*/
public static Optional<String> findName(ParameterInfo pi) {
return AP.find(Query.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotBlank(x.value(), x.name()))
.findFirst()
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 763af27661..28c781c028 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
@@ -84,7 +84,7 @@ public class RequestBeanMeta {
}
Builder apply(ParameterInfo mpi) {
- return
apply(mpi.getParameterType().inner()).apply(AP.find(Request.class,
mpi).findFirst().map(x -> x.inner()).orElse(null));
+ return
apply(mpi.getParameterType().inner()).apply(AP.find(Request.class,
mpi).stream().findFirst().map(AnnotationInfo::inner).orElse(null));
}
Builder apply(Request a) {
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 dd7958ee37..841e7d4438 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
@@ -16,6 +16,7 @@
*/
package org.apache.juneau.httppart.bean;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
import java.lang.annotation.*;
@@ -63,10 +64,10 @@ 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(Schema.class,
m).map(AnnotationInfo::inner).forEach(x -> sb.apply(x));
- ap.findTopDown(c, m).map(AnnotationInfo::inner).forEach(x ->
sb.apply(x));
+ var sb = HttpPartSchema.create().name(m.getPropertyName());
+ var ap = AnnotationProvider.INSTANCE;
+ rstream(ap.find(Schema.class, m)).forEach(x ->
sb.apply(x.inner()));
+ rstream(ap.find(c, m)).forEach(x -> sb.apply(x.inner()));
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 ba1662c328..919b7e114f 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
@@ -129,8 +129,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(Response.class,
m).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
- ap.findTopDown(StatusCode.class,
m).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+ rstream(ap.find(Response.class, m)).forEach(x ->
b.apply(x.inner()));
+ rstream(ap.find(StatusCode.class, m)).forEach(x ->
b.apply(x.inner()));
return b.build();
}
@@ -146,8 +146,8 @@ public class ResponseBeanMeta {
return null;
var b = new Builder(annotations);
b.apply(mpi.getParameterType().unwrap(Value.class,
Optional.class).innerType());
- AP.findTopDown(Response.class,
mpi).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
- AP.findTopDown(StatusCode.class,
mpi).map(AnnotationInfo::inner).forEach(x -> b.apply(x));
+ rstream(AP.find(Response.class, mpi)).forEach(x ->
b.apply(x.inner()));
+ rstream(AP.find(StatusCode.class, mpi)).forEach(x ->
b.apply(x.inner()));
return b.build();
}
@@ -165,8 +165,8 @@ public class ResponseBeanMeta {
var b = new Builder(annotations);
b.apply(ci.innerType());
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));
+ rstream(ai.find(Response.class, ci)).forEach(x ->
b.apply(x.inner()));
+ rstream(ai.find(StatusCode.class, ci)).forEach(x ->
b.apply(x.inner()));
return b.build();
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
index 92f2ea2b14..b9c774ce46 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
@@ -19,8 +19,6 @@ package org.apache.juneau.internal;
import static org.apache.juneau.common.reflect.ReflectionUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
-import org.apache.juneau.common.reflect.*;
-
/**
* Class-related utility methods.
*
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
index f131ea1812..0832ba7811 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/svl/VarResolverSession.java
@@ -30,7 +30,6 @@ import java.util.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.cp.*;
-import org.apache.juneau.common.reflect.*;
/**
* A var resolver session that combines a {@link VarResolver} with one or more
session objects.
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 375bd133e4..631448e2a5 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
@@ -17,6 +17,7 @@
package org.apache.juneau.rest.client.remote;
import static org.apache.juneau.Constants.*;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.StringUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
import static org.apache.juneau.http.remote.RemoteUtils.*;
@@ -25,14 +26,12 @@ import static org.apache.juneau.httppart.HttpPartType.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.function.*;
-import java.util.stream.*;
import org.apache.juneau.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.http.annotation.*;
import org.apache.juneau.http.remote.*;
-import org.apache.juneau.httppart.*;
import org.apache.juneau.httppart.bean.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.rest.common.utils.*;
@@ -58,15 +57,15 @@ public class RemoteOperationMeta {
RemoteOperationReturn methodReturn;
Map<String,String> pathDefaults = new LinkedHashMap<>(),
queryDefaults = new LinkedHashMap<>(), headerDefaults = new LinkedHashMap<>(),
formDataDefaults = new LinkedHashMap<>();
String contentDefault = null;
+ static AnnotationProvider AP = AnnotationProvider.INSTANCE;
Builder(String parentPath, Method m, String defaultMethod) {
var mi = MethodInfo.of(m);
- AnnotationProvider ap = AnnotationProvider.INSTANCE;
- List<AnnotationInfo<?>> al =
ap.findTopDown(mi).filter(REMOTE_OP_GROUP).collect(Collectors.toList());
+ var al =
rstream(AP.find(mi)).filter(REMOTE_OP_GROUP).toList();
if (al.isEmpty())
- al =
ap.findTopDown(mi.getReturnType().unwrap(Value.class,
Optional.class)).filter(REMOTE_OP_GROUP).collect(Collectors.toList());
+ al =
rstream(AP.find(mi.getReturnType().unwrap(Value.class,
Optional.class))).filter(REMOTE_OP_GROUP).toList();
var _httpMethod = Value.<String>empty();
var _path = Value.<String>empty();
@@ -80,7 +79,7 @@ public class RemoteOperationMeta {
al.stream().filter(x -> x.isType(RemoteOp.class) &&
isNotEmpty(((RemoteOp)x.inner()).value().trim())).forEach(x ->
value.set(((RemoteOp)x.inner()).value().trim()));
if (value.isPresent()) {
- String v = value.get();
+ var v = value.get();
int i = v.indexOf(' ');
if (i == -1) {
httpMethod = v;
@@ -114,7 +113,7 @@ public class RemoteOperationMeta {
mi.getParameters().forEach(x -> {
var rma = RemoteOperationArg.create(x);
if (nn(rma)) {
- HttpPartType pt = rma.getPartType();
+ var pt = rma.getPartType();
if (pt == HEADER)
headerArgs.add(rma);
else if (pt == QUERY)
@@ -145,7 +144,8 @@ public class RemoteOperationMeta {
// These handle both individual annotations and repeated
annotation arrays
private void processContentDefaults(MethodInfo mi) {
- AnnotationProvider.INSTANCE.find(Content.class, mi)
+ AP.find(Content.class, mi)
+ .stream()
.map(x -> x.inner().def())
.filter(x -> isNotBlank(x))
.findFirst()
@@ -153,28 +153,28 @@ public class RemoteOperationMeta {
}
private static void processFormDataDefaults(MethodInfo mi,
Map<String,String> defaults) {
- AnnotationProvider.INSTANCE.findTopDown(FormData.class,
mi)
+ rstream(AP.find(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(Header.class,
mi)
+ rstream(AP.find(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(Path.class, mi)
+ rstream(AP.find(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(Query.class, mi)
+ rstream(AP.find(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-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
index 44fdd707a3..70b7d4e66f 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/remote/RemoteOperationReturn.java
@@ -16,6 +16,7 @@
*/
package org.apache.juneau.rest.client.remote;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.http.remote.RemoteUtils.*;
import java.lang.reflect.*;
@@ -46,7 +47,7 @@ public class RemoteOperationReturn {
ClassInfo rt = m.getReturnType();
var ap = AnnotationProvider.INSTANCE;
- var al = ap.findTopDown(m).filter(REMOTE_OP_GROUP).toList();
+ var al = rstream(ap.find(m)).filter(REMOTE_OP_GROUP).toList();
RemoteReturn rv = null;
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 57331a9ce1..30d5e9344b 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);
- AnnotationProvider.INSTANCE.findTopDown(Remote.class, ci).map(x
-> x.inner().path()).filter(x -> isNotEmpty(x)).forEach(x ->
path.set(trimSlashes(x)));
+ rstream(AnnotationProvider.INSTANCE.find(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 fc9e05b48d..104b9643c5 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
@@ -20,6 +20,7 @@ import static jakarta.servlet.http.HttpServletResponse.*;
import static java.util.Collections.*;
import static java.util.Optional.*;
import static org.apache.juneau.collections.JsonMap.*;
+import static org.apache.juneau.common.reflect.ReflectionUtils.*;
import static org.apache.juneau.common.utils.ClassUtils.*;
import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.CollectionUtils.addAll;
@@ -206,7 +207,7 @@ public class RestContext extends Context {
// @formatter:off
ClassInfo.ofProxy(r).getAllMethodsTopDown().stream()
.filter(y -> y.hasAnnotation(annotation))
- .forEach(y -> ap.findTopDown(annotation,
y).map(AnnotationInfo::inner)
+ .forEach(y -> rstream(ap.find(annotation,
y)).map(AnnotationInfo::inner)
.filter(z -> predicate == null ||
predicate.test(z))
.forEach(z -> x.put(y.getSignature(),
y.accessible().inner())));
// @formatter:on
@@ -1787,7 +1788,7 @@ public class RestContext extends Context {
});
var vrs = varResolver().build().createSession();
- var work = AnnotationWorkList.of(vrs,
AnnotationProvider.INSTANCE.findTopDown(rci).filter(CONTEXT_APPLY_FILTER));
+ var work = AnnotationWorkList.of(vrs,
rstream(AnnotationProvider.INSTANCE.find(rci)).filter(CONTEXT_APPLY_FILTER));
apply(work);
beanContext().apply(work);
@@ -3852,7 +3853,7 @@ public class RestContext extends Context {
// @formatter:on
// Apply @Rest(beanStore).
- AnnotationProvider.INSTANCE.findTopDown(Rest.class,
ClassInfo.of(resourceClass)).map(x -> x.inner().beanStore()).filter(x ->
isNotVoid(x)).forEach(x -> v.get().type(x));
+ rstream(AnnotationProvider.INSTANCE.find(Rest.class,
info(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
@@ -3916,7 +3917,7 @@ public class RestContext extends Context {
// 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();
- AnnotationProvider.INSTANCE.findTopDown(Rest.class,
ClassInfo.of(resourceClass)).map(x -> x.inner().config()).filter(x ->
isNotEmpty(x)).forEach(x -> cfv.set(vr.resolve(x)));
+ rstream(AnnotationProvider.INSTANCE.find(Rest.class,
info(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.
@@ -4583,7 +4584,7 @@ public class RestContext extends Context {
// @formatter:on
for (var mi : rci.getPublicMethods()) {
- List<AnnotationInfo<?>> al =
ap.findTopDown(mi).filter(REST_OP_GROUP).collect(Collectors.toList());
+ var al =
rstream(ap.find(mi)).filter(REST_OP_GROUP).collect(Collectors.toList());
// Also include methods on @Rest-annotated
interfaces.
if (al.isEmpty()) {
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
index 0a30ab07b5..4783348485 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpContext.java
@@ -135,7 +135,7 @@ public class RestOpContext extends Context implements
Comparable<RestOpContext>
var vr = context.getVarResolver();
var vrs = vr.createSession();
- var work = AnnotationWorkList.of(vrs,
ap.findTopDown(mi, SELF, MATCHING_METHODS, DECLARING_CLASS, RETURN_TYPE,
PACKAGE).filter(CONTEXT_APPLY_FILTER));
+ var work = AnnotationWorkList.of(vrs,
rstream(ap.find(mi, SELF, MATCHING_METHODS, DECLARING_CLASS, RETURN_TYPE,
PACKAGE)).filter(CONTEXT_APPLY_FILTER));
apply(work);
@@ -1949,6 +1949,7 @@ public class RestOpContext extends Context implements
Comparable<RestOpContext>
httpMethod = "delete";
else if (mi.hasAnnotation(RestOp.class)) {
httpMethod =
AnnotationProvider.INSTANCE.find(RestOp.class, mi)
+ .stream()
.map(x -> x.inner().method())
.filter(x -> isNotEmpty(x))
.findFirst()
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
index 108395d811..4036055d32 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/AttributeArg.java
@@ -77,6 +77,7 @@ public class AttributeArg implements RestOpArg {
private static String getName(ParameterInfo paramInfo) {
return AP.find(Attr.class, paramInfo)
+ .stream()
.map(AnnotationInfo::inner)
.filter(x -> isAnyNotBlank(x.value(), x.name()))
.findFirst()
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
index 44762188fa..326b03f5fd 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/FormDataArg.java
@@ -105,7 +105,7 @@ public class FormDataArg implements RestOpArg {
return null;
// Get parameter-level @FormData
- var paramFormData = AP.find(FormData.class,
pi).findFirst().map(x -> x.inner()).orElse(null);
+ var paramFormData = AP.find(FormData.class,
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
if (paramFormData == null) {
// No parameter-level @FormData, use class-level as-is
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
index 48584f9a9e..89eafb0ee2 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasFormDataArg.java
@@ -79,6 +79,7 @@ public class HasFormDataArg implements RestOpArg {
*/
protected HasFormDataArg(ParameterInfo pi) {
this.name = AP.find(HasFormData.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(HasFormDataArg::hasName)
.findFirst()
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
index 2b650c4ba0..eb629fc0ec 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HasQueryArg.java
@@ -80,6 +80,7 @@ public class HasQueryArg implements RestOpArg {
*/
protected HasQueryArg(ParameterInfo pi) {
this.name = AP.find(HasQuery.class, pi)
+ .stream()
.map(AnnotationInfo::inner)
.filter(HasQueryArg::hasName)
.findFirst()
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
index 53f5e01407..33a9244d98 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/HeaderArg.java
@@ -146,7 +146,7 @@ public class HeaderArg implements RestOpArg {
return null;
// Get parameter-level @Header
- var paramHeader =
AnnotationProvider.INSTANCE.find(Header.class, pi).findFirst().map(x ->
x.inner()).orElse(null);
+ var paramHeader =
AnnotationProvider.INSTANCE.find(Header.class,
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
if (paramHeader == null) {
// No parameter-level @Header, use class-level as-is
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
index c002ee49a8..3e40ad5080 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/PathArg.java
@@ -104,7 +104,7 @@ public class PathArg implements RestOpArg {
return null;
// Get parameter-level @Path
- var paramPath = AP.find(Path.class, pi).findFirst().map(x ->
x.inner()).orElse(null);
+ var paramPath = AP.find(Path.class,
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
if (paramPath == null) {
// No parameter-level @Path, use class-level as-is
@@ -200,7 +200,7 @@ public class PathArg implements RestOpArg {
var mi = pi.getMethod();
for (int j = 0; j < i; j++) {
- var hasAnnotation =
AnnotationProvider.INSTANCE.find(Path.class,
mi.getParameter(j)).findAny().isPresent();
+ var hasAnnotation =
AnnotationProvider.INSTANCE.has(Path.class, mi.getParameter(j));
if (hasAnnotation)
idx++;
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
index d00a01fb08..1baf07be45 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/arg/QueryArg.java
@@ -105,7 +105,7 @@ public class QueryArg implements RestOpArg {
return null;
// Get parameter-level @Query
- var paramQuery = AP.find(Query.class, pi).findFirst().map(x ->
x.inner()).orElse(null);
+ var paramQuery = AP.find(Query.class,
pi).stream().findFirst().map(AnnotationInfo::inner).orElse(null);
if (paramQuery == null) {
// No parameter-level @Query, use class-level as-is
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 9cae292cba..9cff499364 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
@@ -16,6 +16,7 @@
*/
package org.apache.juneau.rest.debug;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.StringUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
import static org.apache.juneau.rest.annotation.RestOpAnnotation.*;
@@ -74,7 +75,7 @@ public class BasicDebugEnablement extends DebugEnablement {
// Gather @Rest(debug) settings.
// @formatter:off
- ap.findTopDown(Rest.class,
ci).map(AnnotationInfo::inner).forEach(x -> {
+ rstream(ap.find(Rest.class,
ci)).map(AnnotationInfo::inner).forEach(x -> {
String x2 = varResolver.resolve(x.debug());
if (! x2.isEmpty())
b.enable(Enablement.fromString(x2),
ci.getNameFull());
@@ -85,7 +86,7 @@ public class BasicDebugEnablement extends DebugEnablement {
// @formatter:off
ci.getPublicMethods().stream()
.forEach(x ->
- ap.findTopDown(x)
+ rstream(ap.find(x))
.filter(REST_OP_GROUP)
.flatMap(ai ->
ai.getValue(String.class, "debug").stream())
.filter(Utils::isNotEmpty)
@@ -98,7 +99,7 @@ public class BasicDebugEnablement extends DebugEnablement {
// Gather @Rest(debugOn) settings.
// @formatter:off
- ap.findTopDown(Rest.class,
ci).map(AnnotationInfo::inner).forEach(x -> {
+ rstream(ap.find(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/matcher/ClientVersionMatcher.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
index 6d97fb5c2c..d682cd2e4c 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/matcher/ClientVersionMatcher.java
@@ -47,6 +47,7 @@ public class ClientVersionMatcher extends RestMatcher {
public ClientVersionMatcher(String clientVersionHeader, MethodInfo mi) {
this.clientVersionHeader = isEmpty(clientVersionHeader) ?
"Client-Version" : clientVersionHeader;
var clientVersion = AnnotationProvider.INSTANCE.find(mi)
+ .stream()
.filter(REST_OP_GROUP)
.flatMap(ai -> ai.getValue(String.class,
"clientVersion").stream())
.filter(NOT_EMPTY)
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 67e3554330..fde317bf48 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
@@ -18,6 +18,7 @@ package org.apache.juneau.rest.servlet;
import static jakarta.servlet.http.HttpServletResponse.*;
import static java.util.logging.Level.*;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.StringUtils.*;
import static org.apache.juneau.common.utils.ThrowableUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
@@ -111,7 +112,7 @@ public abstract class RestServlet extends HttpServlet {
if (nn(context))
return context.getFullPath();
var ci = ClassInfo.of(getClass());
- return AnnotationProvider.INSTANCE.findTopDown(Rest.class, ci)
+ return rstream(AnnotationProvider.INSTANCE.find(Rest.class, ci))
.map(x -> x.inner().path())
.filter(x -> isNotEmpty(x))
.map(x -> trimSlashes(x))
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 c5910ce539..4b37fe79bc 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
@@ -24,12 +24,9 @@ import static org.apache.juneau.common.utils.Utils.isEmpty;
import static org.apache.juneau.rest.annotation.RestOpAnnotation.*;
import static org.apache.juneau.rest.httppart.RestPartType.*;
-import java.io.*;
import java.lang.reflect.*;
-import java.lang.reflect.Method;
import java.util.*;
import java.util.function.*;
-import java.util.stream.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
@@ -143,7 +140,7 @@ public class BasicSwaggerProviderSession {
public Swagger getSwagger() throws Exception {
// @formatter:off
- InputStream is = ff.getStream(rci.getNameSimple() + ".json",
locale).orElse(null);
+ var is = ff.getStream(rci.getNameSimple() + ".json",
locale).orElse(null);
var ap = this.context.getBeanContext().getAnnotationProvider();
@@ -152,16 +149,16 @@ public class BasicSwaggerProviderSession {
Predicate<Map<?,?>> nem = Utils::isNotEmpty;
// Load swagger JSON from classpath.
- JsonMap omSwagger = Json5.DEFAULT.read(is, JsonMap.class);
+ var omSwagger = Json5.DEFAULT.read(is, JsonMap.class);
if (omSwagger == null)
omSwagger = new JsonMap();
// Combine it with @Rest(swagger)
- List<Rest> restAnnotations = list();
- ap.findTopDown(Rest.class, rci).map(x -> x.inner()).forEach(x
-> restAnnotations.add(x));
+ var restAnnotations = rstream(ap.find(Rest.class,
rci)).map(AnnotationInfo::inner).toList();
+
for (var rr : restAnnotations) {
- JsonMap sInfo = omSwagger.getMap("info", true);
+ var sInfo = omSwagger.getMap("info", true);
sInfo
.appendIf(ne, "title",
@@ -177,12 +174,12 @@ public class BasicSwaggerProviderSession {
)
);
- org.apache.juneau.rest.annotation.Swagger r =
rr.swagger();
+ var r = rr.swagger();
omSwagger.append(parseMap(r.value(), "@Swagger(value)
on class {0}", c));
if (! SwaggerAnnotation.empty(r)) {
- JsonMap info = omSwagger.getMap("info", true);
+ var info = omSwagger.getMap("info", true);
info
.appendIf(ne, "title",
resolve(r.title()))
@@ -220,7 +217,7 @@ public class BasicSwaggerProviderSession {
omSwagger.appendIf(nem, "externalDocs",
parseMap(mb.findFirstString("externalDocs"), "Messages/externalDocs on class
{0}", c));
- JsonMap info = omSwagger.getMap("info", true);
+ var info = omSwagger.getMap("info", true);
info
.appendIf(ne, "title",
resolve(mb.findFirstString("title")))
@@ -233,9 +230,9 @@ public class BasicSwaggerProviderSession {
if (info.isEmpty())
omSwagger.remove("info");
- JsonList
- produces = omSwagger.getList("produces", true),
- consumes = omSwagger.getList("consumes", true);
+ var produces = omSwagger.getList("produces", true);
+ var consumes = omSwagger.getList("consumes", true);
+
if (consumes.isEmpty())
consumes.addAll(context.getConsumes());
if (produces.isEmpty())
@@ -251,10 +248,10 @@ public class BasicSwaggerProviderSession {
}
}
- String s = mb.findFirstString("tags");
+ var s = mb.findFirstString("tags");
if (nn(s)) {
for (var m : parseListOrCdl(s, "Messages/tags on class
{0}", c).elements(JsonMap.class)) {
- String name = m.getString("name");
+ var name = m.getString("name");
if (name == null)
throw new SwaggerException(null, "Tag
definition found without name in resource bundle on class {0}", c);
if (tagMap.containsKey(name))
@@ -265,22 +262,22 @@ public class BasicSwaggerProviderSession {
}
// Load our existing bean definitions into our session.
- JsonMap definitions = omSwagger.getMap("definitions", true);
+ var definitions = omSwagger.getMap("definitions", true);
for (var defId : definitions.keySet())
js.addBeanDef(defId, new
JsonMap(definitions.getMap(defId)));
// Iterate through all the @RestOp methods.
for (var sm : context.getRestOperations().getOpContexts()) {
- BeanSession bs = sm.getBeanContext().getSession();
+ var bs = sm.getBeanContext().getSession();
- Method m = sm.getJavaMethod();
+ var m = sm.getJavaMethod();
var mi = MethodInfo.of(m);
- List<AnnotationInfo<?>> al =
ap.findTopDown(mi).filter(REST_OP_GROUP).collect(Collectors.toList());
- String mn = m.getName();
+ var al =
rstream(ap.find(mi)).filter(REST_OP_GROUP).toList();
+ var mn = m.getName();
// Get the operation from the existing swagger so far.
- JsonMap op = getOperation(omSwagger,
sm.getPathPattern(), sm.getHttpMethod().toLowerCase());
+ var op = getOperation(omSwagger, sm.getPathPattern(),
sm.getHttpMethod().toLowerCase());
// Add @RestOp(swagger)
Value<OpSwagger> _ms = Value.empty();
@@ -380,48 +377,48 @@ public class BasicSwaggerProviderSession {
// Finally, look for parameters defined on method.
for (var mpi : mi.getParameters()) {
- ClassInfo pt = mpi.getParameterType();
- Type type = pt.innerType();
+ var pt = mpi.getParameterType();
+ var type = pt.innerType();
if (ap.has(Content.class, mpi)) {
- JsonMap param = paramMap.getMap(BODY +
".body", true).append("in", BODY);
- JsonMap schema =
getSchema(param.getMap("schema"), type, bs);
- ap.findTopDown(Schema.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(schema, x));
- ap.findTopDown(Content.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(schema, x.schema()));
+ var param = paramMap.getMap(BODY +
".body", true).append("in", BODY);
+ var schema =
getSchema(param.getMap("schema"), type, bs);
+ rstream(ap.find(Schema.class,
mpi)).forEach(x -> merge(schema, x.inner()));
+ rstream(ap.find(Content.class,
mpi)).forEach(x -> merge(schema, x.inner().schema()));
pushupSchemaFields(BODY, param, schema);
param.appendIf(nem, "schema", schema);
param.putIfAbsent("required", true);
addBodyExamples(sm, param, false, type,
locale);
} else if (ap.has(Query.class, mpi)) {
- String name =
QueryAnnotation.findName(mpi).orElse(null);
- JsonMap param = paramMap.getMap(QUERY +
"." + name, true).append("name", name).append("in", QUERY);
- ap.findTopDown(Schema.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
- ap.findTopDown(Query.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+ var name =
QueryAnnotation.findName(mpi).orElse(null);
+ var param = paramMap.getMap(QUERY + "."
+ name, true).append("name", name).append("in", QUERY);
+ rstream(ap.find(Schema.class,
mpi)).forEach(x -> merge(param, x.inner()));
+ rstream(ap.find(Query.class,
mpi)).forEach(x -> merge(param, x.inner().schema()));
pushupSchemaFields(QUERY, param,
getSchema(param.getMap("schema"), type, bs));
addParamExample(sm, param, QUERY, type);
} else if (ap.has(FormData.class, mpi)) {
- String name =
FormDataAnnotation.findName(mpi).orElse(null);
- JsonMap param =
paramMap.getMap(FORM_DATA + "." + name, true).append("name", name).append("in",
FORM_DATA);
- ap.findTopDown(Schema.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
- ap.findTopDown(FormData.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+ var name =
FormDataAnnotation.findName(mpi).orElse(null);
+ var param = paramMap.getMap(FORM_DATA +
"." + name, true).append("name", name).append("in", FORM_DATA);
+ rstream(ap.find(Schema.class,
mpi)).forEach(x -> merge(param, x.inner()));
+ rstream(ap.find(FormData.class,
mpi)).forEach(x -> merge(param, x.inner().schema()));
pushupSchemaFields(FORM_DATA, param,
getSchema(param.getMap("schema"), type, bs));
addParamExample(sm, param, FORM_DATA,
type);
} else if (ap.has(Header.class, mpi)) {
- String name =
HeaderAnnotation.findName(mpi).orElse(null);
- JsonMap param = paramMap.getMap(HEADER
+ "." + name, true).append("name", name).append("in", HEADER);
- ap.findTopDown(Schema.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
- ap.findTopDown(Header.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+ var name =
HeaderAnnotation.findName(mpi).orElse(null);
+ var param = paramMap.getMap(HEADER +
"." + name, true).append("name", name).append("in", HEADER);
+ rstream(ap.find(Schema.class,
mpi)).forEach(x -> merge(param, x.inner()));
+ rstream(ap.find(Header.class,
mpi)).forEach(x -> merge(param, x.inner().schema()));
pushupSchemaFields(HEADER, param,
getSchema(param.getMap("schema"), type, bs));
addParamExample(sm, param, HEADER,
type);
} else if (ap.has(Path.class, mpi)) {
- String name =
PathAnnotation.findName(mpi).orElse(null);
- JsonMap param = paramMap.getMap(PATH +
"." + name, true).append("name", name).append("in", PATH);
- ap.findTopDown(Schema.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x));
- ap.findTopDown(Path.class,
mpi).map(AnnotationInfo::inner).forEach(x -> merge(param, x.schema()));
+ var name =
PathAnnotation.findName(mpi).orElse(null);
+ var param = paramMap.getMap(PATH + "."
+ name, true).append("name", name).append("in", PATH);
+ rstream(ap.find(Schema.class,
mpi)).forEach(x -> merge(param, x.inner()));
+ rstream(ap.find(Path.class,
mpi)).forEach(x -> merge(param, x.inner().schema()));
pushupSchemaFields(PATH, param,
getSchema(param.getMap("schema"), type, bs));
addParamExample(sm, param, PATH, type);
param.putIfAbsent("required", true);
@@ -431,37 +428,35 @@ public class BasicSwaggerProviderSession {
if (! paramMap.isEmpty())
op.put("parameters", paramMap.values());
- JsonMap responses = op.getMap("responses", true);
+ var responses = op.getMap("responses", true);
for (var eci : mi.getExceptionTypes()) {
if (eci.hasAnnotation(Response.class)) {
- List<Response> la = list();
- ap.findTopDown(Response.class,
eci).map(x -> x.inner()).forEach(x -> la.add(x));
- List<StatusCode> la2 = list();
- ap.findTopDown(StatusCode.class,
eci).map(x -> x.inner()).forEach(x -> la2.add(x));
- Set<Integer> codes = getCodes(la2, 500);
+ var la =
rstream(ap.find(Response.class, eci)).map(AnnotationInfo::inner).toList();
+ var la2 =
rstream(ap.find(StatusCode.class, eci)).map(x -> x.inner()).toList();
+ var codes = getCodes(la2, 500);
for (var a : la) {
for (var code : codes) {
- JsonMap om =
responses.getMap(String.valueOf(code), true);
+ var om =
responses.getMap(String.valueOf(code), true);
merge(om, a);
- JsonMap schema =
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
-
ap.findTopDown(Schema.class, eci).map(AnnotationInfo::inner).forEach(x ->
merge(schema, x));
+ var schema =
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
+
rstream(ap.find(Schema.class, eci)).forEach(x -> merge(schema, x.inner()));
pushupSchemaFields(RESPONSE, om, schema);
om.appendIf(nem,
"schema", schema);
}
}
- List<MethodInfo> methods = eci.getAllMethods();
+ var methods = eci.getAllMethods();
for (int i = methods.size() - 1; i >= 0; i--) {
- MethodInfo ecmi = methods.get(i);
- Header a =
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
+ var ecmi = methods.get(i);
+ var a =
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
if (a == null)
a =
ecmi.getReturnType().unwrap(Value.class,
Optional.class).getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
if (nn(a) && ! isMulti(a)) {
- String ha = a.name();
+ var ha = a.name();
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));
-
ap.findTopDown(Schema.class, ecmi.getReturnType().unwrap(Value.class,
Optional.class)).map(AnnotationInfo::inner).forEach(x -> merge(header, x));
+ var header =
responses.getMap(String.valueOf(code), true).getMap("headers", true).getMap(ha,
true);
+
rstream(ap.find(Schema.class, ecmi)).forEach(x -> merge(header, x.inner()));
+
rstream(ap.find(Schema.class, ecmi.getReturnType().unwrap(Value.class,
Optional.class))).forEach(x -> merge(header, x.inner()));
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header.getMap("schema"),
ecmi.getReturnType().unwrap(Value.class, Optional.class).innerType(), bs));
}
}
@@ -470,19 +465,15 @@ public class BasicSwaggerProviderSession {
}
if (mi.hasAnnotation(Response.class) ||
mi.getReturnType().unwrap(Value.class,
Optional.class).hasAnnotation(Response.class)) {
- List<Response> la = list();
- ap.findTopDown(Response.class, mi).map(x ->
x.inner()).forEach(x -> la.add(x));
-
//context.getAnnotationProvider().xforEachMethodAnnotation(Response.class, mi,
x -> true, x -> la.add(x));
- List<StatusCode> la2 = list();
-
//context.getAnnotationProvider().xforEachMethodAnnotation(StatusCode.class,
mi, x -> true, x -> la2.add(x));
- ap.findTopDown(StatusCode.class, mi).map(x ->
x.inner()).forEach(x -> la2.add(x));
- Set<Integer> codes = getCodes(la2, 200);
+ var la = rstream(ap.find(Response.class,
mi)).map(x -> x.inner()).toList();
+ var la2 = rstream(ap.find(StatusCode.class,
mi)).map(x -> x.inner()).toList();
+ var codes = getCodes(la2, 200);
for (var a : la) {
for (var code : codes) {
- JsonMap om =
responses.getMap(String.valueOf(code), true);
+ var om =
responses.getMap(String.valueOf(code), true);
merge(om, a);
- JsonMap schema =
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
- ap.findTopDown(Schema.class,
mi).map(x -> x.inner()).forEach(x -> merge(schema, x));
+ var schema =
getSchema(om.getMap("schema"), m.getGenericReturnType(), bs);
+ rstream(ap.find(Schema.class,
mi)).forEach(x -> merge(schema, x.inner()));
//context.getAnnotationProvider().xforEachMethodAnnotation(Schema.class, mi, x
-> true, x -> merge(schema, x));
pushupSchemaFields(RESPONSE,
om, schema);
om.appendIf(nem, "schema",
schema);
@@ -490,18 +481,17 @@ public class BasicSwaggerProviderSession {
}
}
if (mi.getReturnType().hasAnnotation(Response.class)) {
- List<MethodInfo> methods =
mi.getReturnType().getAllMethods();
+ var methods =
mi.getReturnType().getAllMethods();
for (int i = methods.size() - 1; i >= 0; i--) {
- MethodInfo ecmi = methods.get(i);
+ var ecmi = methods.get(i);
if
(ecmi.hasAnnotation(Header.class)) {
- Header a =
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
- String ha = a.name();
+ var a =
ecmi.getAnnotations(Header.class).findFirst().map(AnnotationInfo::inner).orElse(null);
+ var ha = a.name();
if (! isMulti(a)) {
for (var code :
codes) {
- 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));
-
ap.findTopDown(Schema.class, ecmi.getReturnType().unwrap(Value.class,
Optional.class)).map(AnnotationInfo::inner).forEach(x -> merge(header, x));
+ var
header = responses.getMap(String.valueOf(code), true).getMap("headers",
true).getMap(ha, true);
+
rstream(ap.find(Schema.class, ecmi)).forEach(x -> merge(header, x.inner()));
+
rstream(ap.find(Schema.class, ecmi.getReturnType().unwrap(Value.class,
Optional.class))).forEach(x -> merge(header, x.inner()));
merge(header, a.schema());
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header,
ecmi.getReturnType().innerType(), bs));
}
@@ -510,10 +500,10 @@ public class BasicSwaggerProviderSession {
}
}
} else if (m.getGenericReturnType() != void.class) {
- JsonMap om = responses.getMap("200", true);
+ var om = responses.getMap("200", true);
var pt2 =
ClassInfo.of(m.getGenericReturnType());
- JsonMap schema = getSchema(om.getMap("schema"),
m.getGenericReturnType(), bs);
- ap.findTopDown(Schema.class,
pt2).map(AnnotationInfo::inner).forEach(x -> merge(schema, x));
+ var schema = getSchema(om.getMap("schema"),
m.getGenericReturnType(), bs);
+ rstream(ap.find(Schema.class, pt2)).forEach(x
-> merge(schema, x.inner()));
pushupSchemaFields(RESPONSE, om, schema);
om.appendIf(nem, "schema", schema);
addBodyExamples(sm, om, true,
m.getGenericReturnType(), locale);
@@ -522,21 +512,19 @@ public class BasicSwaggerProviderSession {
// Finally, look for Value @Header parameters defined
on method.
for (var mpi : mi.getParameters()) {
- ClassInfo pt = mpi.getParameterType();
+ var pt = mpi.getParameterType();
if (pt.is(Value.class) && (ap.has(Header.class,
mpi))) {
- List<Header> la = list();
- ap.findTopDown(Header.class,
mpi).map(AnnotationInfo::inner).forEach(x -> la.add(x));
- List<StatusCode> la2 = list();
- ap.findTopDown(StatusCode.class,
mpi).map(AnnotationInfo::inner).forEach(x -> la2.add(x));
- Set<Integer> codes = getCodes(la2, 200);
- String name =
HeaderAnnotation.findName(mpi).orElse(null);
- Type type =
Value.unwrap(mpi.getParameterType().innerType());
+ var la = rstream(ap.find(Header.class,
mpi)).map(AnnotationInfo::inner).toList();
+ var la2 =
rstream(ap.find(StatusCode.class, mpi)).map(AnnotationInfo::inner).toList();
+ var codes = getCodes(la2, 200);
+ var name =
HeaderAnnotation.findName(mpi).orElse(null);
+ var type =
Value.unwrap(mpi.getParameterType().innerType());
for (var a : la) {
if (! isMulti(a)) {
for (var code : codes) {
- JsonMap header
= responses.getMap(String.valueOf(code), true).getMap("headers",
true).getMap(name, true);
-
ap.findTopDown(Schema.class, mpi).map(AnnotationInfo::inner).forEach(x ->
merge(header, x));
+ var header =
responses.getMap(String.valueOf(code), true).getMap("headers",
true).getMap(name, true);
+
rstream(ap.find(Schema.class, mpi)).forEach(x -> merge(header, x.inner()));
merge(header,
a.schema());
pushupSchemaFields(RESPONSE_HEADER, header, getSchema(header, type, bs));
}
@@ -544,18 +532,16 @@ public class BasicSwaggerProviderSession {
}
} else if (ap.has(Response.class, mpi)) {
- List<Response> la = list();
- ap.findTopDown(Response.class,
mpi).map(AnnotationInfo::inner).forEach(x -> la.add(x));
- List<StatusCode> la2 = list();
- ap.findTopDown(StatusCode.class,
mpi).map(AnnotationInfo::inner).forEach(x -> la2.add(x));
- Set<Integer> codes = getCodes(la2, 200);
- Type type =
Value.unwrap(mpi.getParameterType().innerType());
+ var la =
rstream(ap.find(Response.class, mpi)).map(AnnotationInfo::inner).toList();
+ var la2 =
rstream(ap.find(StatusCode.class, mpi)).map(AnnotationInfo::inner).toList();
+ var codes = getCodes(la2, 200);
+ var type =
Value.unwrap(mpi.getParameterType().innerType());
for (var a : la) {
for (var code : codes) {
- JsonMap om =
responses.getMap(String.valueOf(code), true);
+ var om =
responses.getMap(String.valueOf(code), true);
merge(om, a);
- JsonMap schema =
getSchema(om.getMap("schema"), type, bs);
-
ap.findTopDown(Schema.class, mpi).map(AnnotationInfo::inner).forEach(x ->
merge(schema, x));
+ var schema =
getSchema(om.getMap("schema"), type, bs);
+
rstream(ap.find(Schema.class, mpi)).forEach(x -> merge(schema, x.inner()));
la.forEach(x ->
merge(schema, x.schema()));
pushupSchemaFields(RESPONSE, om, schema);
om.appendIf(nem,
"schema", schema);
@@ -566,9 +552,9 @@ public class BasicSwaggerProviderSession {
// Add default response descriptions.
for (var e : responses.entrySet()) {
- String key = e.getKey();
- JsonMap val = responses.getMap(key);
- if (StringUtils.isDecimal(key))
+ var key = e.getKey();
+ var val = responses.getMap(key);
+ if (isDecimal(key))
val.appendIfAbsentIf(ne, "description",
RestUtils.getHttpResponseText(Integer.parseInt(key)));
}
@@ -578,13 +564,13 @@ public class BasicSwaggerProviderSession {
op.put("responses", new TreeMap<>(responses));
if (! op.containsKey("consumes")) {
- List<MediaType> mConsumes =
sm.getSupportedContentTypes();
+ var mConsumes = sm.getSupportedContentTypes();
if (! mConsumes.equals(consumes))
op.put("consumes", mConsumes);
}
if (! op.containsKey("produces")) {
- List<MediaType> mProduces =
sm.getSupportedAcceptTypes();
+ var mProduces = sm.getSupportedAcceptTypes();
if (! mProduces.equals(produces))
op.put("produces", mProduces);
}
@@ -593,6 +579,7 @@ public class BasicSwaggerProviderSession {
if (nn(js.getBeanDefs()))
for (var e : js.getBeanDefs().entrySet())
definitions.put(e.getKey(),
fixSwaggerExtensions(e.getValue()));
+
if (definitions.isEmpty())
omSwagger.remove("definitions");
@@ -605,7 +592,7 @@ public class BasicSwaggerProviderSession {
omSwagger.remove("produces");
try {
- String swaggerJson =
Json5Serializer.DEFAULT_READABLE.toString(omSwagger);
+ var swaggerJson =
Json5Serializer.DEFAULT_READABLE.toString(omSwagger);
return jp.parse(swaggerJson, Swagger.class);
} catch (Exception e) {
throw new ServletException("Error detected in
swagger.", e);
@@ -615,10 +602,10 @@ public class BasicSwaggerProviderSession {
private void addBodyExamples(RestOpContext sm, JsonMap piri, boolean
response, Type type, Locale locale) throws Exception {
- String sex = piri.getString("example");
+ var sex = piri.getString("example");
if (sex == null) {
- JsonMap schema = resolveRef(piri.getMap("schema"));
+ var schema = resolveRef(piri.getMap("schema"));
if (nn(schema))
sex = schema.getString("example",
schema.getString("example"));
}
@@ -636,21 +623,21 @@ public class BasicSwaggerProviderSession {
}
}
- String examplesKey = "examples"; // Parameters don't have an
examples attribute.
+ var examplesKey = "examples"; // Parameters don't have an
examples attribute.
- JsonMap examples = piri.getMap(examplesKey);
+ var examples = piri.getMap(examplesKey);
if (examples == null)
examples = new JsonMap();
- List<MediaType> mediaTypes = response ?
sm.getSerializers().getSupportedMediaTypes() :
sm.getParsers().getSupportedMediaTypes();
+ var mediaTypes = response ?
sm.getSerializers().getSupportedMediaTypes() :
sm.getParsers().getSupportedMediaTypes();
for (var mt : mediaTypes) {
if (mt != MediaType.HTML) {
- Serializer s2 =
sm.getSerializers().getSerializer(mt);
+ var s2 = sm.getSerializers().getSerializer(mt);
if (nn(s2)) {
try {
// @formatter:off
- String eVal = s2
+ var eVal = s2
.createSession()
.locale(locale)
.mediaType(mt)
@@ -672,16 +659,16 @@ public class BasicSwaggerProviderSession {
private static void addParamExample(RestOpContext sm, JsonMap piri,
RestPartType in, Type type) throws Exception {
- String s = piri.getString("example");
+ var s = piri.getString("example");
if (isEmpty(s))
return;
- JsonMap examples = piri.getMap("examples");
+ var examples = piri.getMap("examples");
if (examples == null)
examples = new JsonMap();
- String paramName = piri.getString("name");
+ var paramName = piri.getString("name");
if (in == QUERY)
s = "?" + urlEncodeLax(paramName) + "=" +
urlEncodeLax(s);
@@ -741,7 +728,7 @@ public class BasicSwaggerProviderSession {
schema = newMap(schema);
- ClassMeta<?> cm = bs.getClassMeta(type);
+ var cm = bs.getClassMeta(type);
if (schema.getBoolean("ignore", false))
return null;
@@ -749,7 +736,7 @@ public class BasicSwaggerProviderSession {
if (schema.containsKey("type") || schema.containsKey("$ref"))
return schema;
- JsonMap om =
fixSwaggerExtensions(schema.append(js.getSchema(cm)));
+ var om = fixSwaggerExtensions(schema.append(js.getSchema(cm)));
return om;
}
@@ -761,8 +748,8 @@ public class BasicSwaggerProviderSession {
}
private static JsonList merge(JsonList...lists) {
- JsonList l = lists[0];
- for (int i = 1; i < lists.length; i++) {
+ var l = lists[0];
+ for (var i = 1; i < lists.length; i++) {
if (nn(lists[i])) {
if (l == null)
l = new JsonList();
@@ -773,8 +760,8 @@ public class BasicSwaggerProviderSession {
}
private static JsonMap merge(JsonMap...maps) {
- JsonMap m = maps[0];
- for (int i = 1; i < maps.length; i++) {
+ var m = maps[0];
+ for (var i = 1; i < maps.length; i++) {
if (nn(maps[i])) {
if (m == null)
m = new JsonMap();
@@ -802,7 +789,7 @@ public class BasicSwaggerProviderSession {
return om;
om = newMap(om);
for (var aa : a) {
- String name = StringUtils.firstNonEmpty(aa.name(),
aa.value());
+ var name = StringUtils.firstNonEmpty(aa.name(),
aa.value());
if (isEmpty(name))
throw illegalArg("@Header used without name or
value.");
merge(om.getMap(name, true), aa.schema());
@@ -947,7 +934,7 @@ public class BasicSwaggerProviderSession {
try {
if (o == null)
return null;
- String s = (o instanceof String[] ? joinnl((String[])o)
: o.toString());
+ var s = (o instanceof String[] ? joinnl((String[])o) :
o.toString());
if (s.isEmpty())
return null;
s = resolve(s);
@@ -963,7 +950,7 @@ public class BasicSwaggerProviderSession {
try {
if (o == null)
return null;
- String s = (o instanceof String[] ? joinnl((String[])o)
: o.toString());
+ var s = (o instanceof String[] ? joinnl((String[])o) :
o.toString());
if (s.isEmpty())
return null;
s = resolve(s);
@@ -979,7 +966,7 @@ public class BasicSwaggerProviderSession {
if (o instanceof String[])
o = joinnl((String[])o);
if (o instanceof String) {
- String s = o.toString();
+ var s = o.toString();
if (s.isEmpty())
return null;
s = resolve(s);
@@ -1075,7 +1062,7 @@ public class BasicSwaggerProviderSession {
om2 = new JsonMap();
}
for (var e : om.entrySet()) {
- Object val = e.getValue();
+ var val = e.getValue();
if (val instanceof JsonMap) {
val = resolve((JsonMap)val);
} else if (val instanceof JsonList) {
@@ -1106,7 +1093,7 @@ public class BasicSwaggerProviderSession {
if (m == null)
return null;
if (m.containsKey("$ref") && nn(js.getBeanDefs())) {
- String ref = m.getString("$ref");
+ var ref = m.getString("$ref");
if (ref.startsWith("#/definitions/"))
return js.getBeanDefs().get(ref.substring(14));
}
@@ -1116,7 +1103,7 @@ public class BasicSwaggerProviderSession {
private JsonMap toJsonMap(String[] ss) throws ParseException {
if (ss.length == 0)
return null;
- String s = joinnl(ss);
+ var s = joinnl(ss);
if (s.isEmpty())
return null;
if (! isJsonObject(s, true))
@@ -1189,7 +1176,7 @@ public class BasicSwaggerProviderSession {
return null;
Set<String> set = set();
for (var s : ss)
- StringUtils.split(s, x -> set.add(x));
+ split(s, x -> set.add(x));
return set.isEmpty() ? null : set;
}
}
\ No newline at end of file
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
index 687153f886..ed9e1c85fa 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/MethodInfo_Test.java
@@ -350,7 +350,7 @@ class MethodInfo_Test extends TestBase {
}
private static List<A> annotations(MethodInfo mi, Class<? extends
Annotation> a) {
- return AnnotationProvider.INSTANCE.findTopDown(a,
mi).map(AnnotationInfo::inner).map(x -> (A)x).collect(Collectors.toList());
+ return rstream(AnnotationProvider.INSTANCE.find(a,
mi)).map(AnnotationInfo::inner).map(x -> (A)x).toList();
}
@Test void getAnnotationAny() {