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 a086ba034f Utility class modernization
a086ba034f is described below
commit a086ba034ff3b35cb853c88d8fbf6b5af1b3f396
Author: James Bognar <[email protected]>
AuthorDate: Mon Nov 3 15:51:19 2025 -0500
Utility class modernization
---
.../org/apache/juneau/bean/openapi3/OpenApi.java | 1 -
.../juneau/assertions/FluentObjectAssertion.java | 1 -
.../common/annotation/AnnotationBuilder.java | 10 +
.../juneau/common/reflect/AccessibleInfo.java | 7 -
.../apache/juneau/common/reflect/Annotatable.java | 73 ++++
.../juneau/common/reflect/AnnotatableType.java | 39 ++
.../juneau/common/reflect/AnnotationInfo.java | 291 ++-----------
.../juneau/common/reflect/AnnotationInfo.java.new | 479 +++++++++++++++++++++
.../apache/juneau/common/reflect/ClassInfo.java | 21 +-
.../juneau/common/reflect/ConstructorInfo.java | 18 +-
.../juneau/common/reflect/ExecutableInfo.java | 4 +-
.../apache/juneau/common/reflect/FieldInfo.java | 23 +-
.../apache/juneau/common/reflect/MethodInfo.java | 29 +-
.../apache/juneau/common/reflect/PackageInfo.java | 25 +-
.../juneau/common/reflect/ParameterInfo.java | 22 +-
.../juneau/common/utils/CollectionUtils.java | 15 +
.../org/apache/juneau/common/utils/DateUtils.java | 1 -
.../main/java/org/apache/juneau/jena/RdfUtils.java | 1 -
.../java/org/apache/juneau/AnnotationWorkList.java | 1 -
.../src/main/java/org/apache/juneau/BeanMap.java | 1 -
.../src/main/java/org/apache/juneau/BeanMeta.java | 1 -
.../java/org/apache/juneau/BeanPropertyMeta.java | 1 -
.../main/java/org/apache/juneau/BeanRegistry.java | 1 -
.../main/java/org/apache/juneau/BeanSession.java | 1 -
.../src/main/java/org/apache/juneau/ClassMeta.java | 1 -
.../src/main/java/org/apache/juneau/Context.java | 1 -
.../juneau/annotation/BeanConfigAnnotation.java | 1 -
.../apache/juneau/cp/BeanCreateMethodFinder.java | 1 -
.../java/org/apache/juneau/cp/BeanCreator.java | 1 -
.../main/java/org/apache/juneau/cp/BeanStore.java | 1 -
.../java/org/apache/juneau/cp/BeanStoreEntry.java | 1 -
.../juneau/http/annotation/ContactAnnotation.java | 1 -
.../http/annotation/HasFormDataAnnotation.java | 1 -
.../juneau/http/annotation/HasQueryAnnotation.java | 1 -
.../juneau/http/annotation/LicenseAnnotation.java | 1 -
.../juneau/httppart/SimplePartParserSession.java | 1 -
.../juneau/httppart/SimplePartSerializer.java | 1 -
.../httppart/SimplePartSerializerSession.java | 1 -
.../org/apache/juneau/parser/ParserSession.java | 1 -
.../apache/juneau/serializer/SerializerPipe.java | 2 -
.../java/org/apache/juneau/swap/BuilderSwap.java | 1 -
.../java/org/apache/juneau/swaps/TemporalSwap.java | 1 -
.../apache/juneau/uon/UonSerializerSession.java | 1 -
.../main/java/org/apache/juneau/xml/XmlUtils.java | 2 -
.../microservice/jetty/JettyMicroservice.java | 1 -
.../apache/juneau/rest/client/ResponseContent.java | 1 -
.../apache/juneau/rest/client/ResponseHeader.java | 1 -
.../org/apache/juneau/rest/client/RestClient.java | 1 -
.../org/apache/juneau/http/header/HeaderList.java | 1 -
.../java/org/apache/juneau/http/part/PartList.java | 1 -
.../apache/juneau/http/remote/RemoteDelete.java | 1 -
.../org/apache/juneau/http/remote/RemoteGet.java | 1 -
.../org/apache/juneau/http/remote/RemoteOp.java | 1 -
.../org/apache/juneau/http/remote/RemotePatch.java | 1 -
.../org/apache/juneau/http/remote/RemotePost.java | 1 -
.../org/apache/juneau/http/remote/RemotePut.java | 1 -
.../http/remote/RrpcInterfaceMethodMeta.java | 2 -
.../java/org/apache/juneau/rest/RestContext.java | 1 -
.../java/org/apache/juneau/rest/RestOpSession.java | 2 -
.../juneau/rest/debug/BasicDebugEnablement.java | 2 -
.../rest/processor/SerializedPojoProcessor.java | 2 -
.../org/apache/juneau/rest/remote/RrpcServlet.java | 1 -
.../juneau/rest/widget/ContentTypeMenuItem.java | 1 -
.../apache/juneau/rest/widget/MenuItemWidget.java | 1 -
.../apache/juneau/BasicRuntimeException_Test.java | 1 -
.../java/org/apache/juneau/BenchmarkRunner.java | 1 -
.../juneau/common/reflect/AnnotationInfoTest.java | 2 -
.../juneau/common/reflect/ClassInfo_Test.java | 2 -
.../juneau/common/reflect/ConstructorInfoTest.java | 1 -
.../juneau/common/reflect/ExecutableInfo_Test.java | 1 -
.../juneau/common/reflect/FieldInfo_Test.java | 1 -
.../juneau/common/reflect/MethodInfo_Test.java | 1 -
.../juneau/common/reflect/ParamInfoTest.java | 1 -
.../java/org/apache/juneau/cp/BeanStore_Test.java | 1 -
.../rest/annotation/Restx_ReqAttrs_Test.java | 2 -
.../juneau/rest/client/RestClient_Body_Test.java | 1 -
.../juneau/utils/StringBuilderWriterTest.java | 1 -
77 files changed, 761 insertions(+), 367 deletions(-)
diff --git
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
index 93852be5f6..83256778da 100644
---
a/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
+++
b/juneau-bean/juneau-bean-openapi-v3/src/main/java/org/apache/juneau/bean/openapi3/OpenApi.java
@@ -24,7 +24,6 @@ import static org.apache.juneau.internal.ConverterUtils.*;
import java.util.*;
-import org.apache.juneau.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.json.*;
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 1b6b8e27a7..3fb9181dce 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
@@ -27,7 +27,6 @@ import java.util.function.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.cp.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.serializer.*;
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/annotation/AnnotationBuilder.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/annotation/AnnotationBuilder.java
index 3a3e9421e8..990586b869 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/annotation/AnnotationBuilder.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/annotation/AnnotationBuilder.java
@@ -63,10 +63,20 @@ public class AnnotationBuilder<B extends
AnnotationBuilder<B>> {
return (B)this;
}
+ /**
+ * Returns the annotation type being built.
+ *
+ * @return The annotation type being built.
+ */
public Class<? extends Annotation> getAnnotationType() {
return annotationType;
}
+ /**
+ * Returns the description of this annotation builder.
+ *
+ * @return The description array, or <jk>null</jk> if not set.
+ */
public String[] getDescription() {
return description;
}
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AccessibleInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AccessibleInfo.java
index 10ee1a68e7..a98c019748 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AccessibleInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AccessibleInfo.java
@@ -16,15 +16,9 @@
*/
package org.apache.juneau.common.reflect;
-import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
-import java.lang.annotation.*;
import java.lang.reflect.*;
-import java.util.*;
-import java.util.function.*;
-
-import org.apache.juneau.common.collections.*;
/**
* Base class for reflection info classes that wrap {@link AccessibleObject}.
@@ -36,7 +30,6 @@ import org.apache.juneau.common.collections.*;
* <h5 class='section'>See Also:</h5><ul>
* </ul>
*/
-@SuppressWarnings({"rawtypes", "unchecked"})
public abstract class AccessibleInfo {
AccessibleObject ao; // Effectively final
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/Annotatable.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/Annotatable.java
new file mode 100644
index 0000000000..873806403f
--- /dev/null
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/Annotatable.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.juneau.common.reflect;
+
+/**
+ * Interface for all annotatable wrapper classes.
+ *
+ * <p>
+ * This interface provides a common type for all wrappers around Java
reflection objects,
+ * allowing polymorphic handling of different annotatable types (Class,
Method, Field, Constructor, Parameter, Package).
+ *
+ * <p>
+ * Implementers include:
+ * <ul>
+ * <li>{@link ClassInfo} - Wraps {@link Class}
+ * <li>{@link MethodInfo} - Wraps {@link java.lang.reflect.Method}
+ * <li>{@link FieldInfo} - Wraps {@link java.lang.reflect.Field}
+ * <li>{@link ConstructorInfo} - Wraps {@link
java.lang.reflect.Constructor}
+ * <li>{@link ParameterInfo} - Wraps {@link java.lang.reflect.Parameter}
+ * <li>{@link PackageInfo} - Wraps {@link java.lang.Package}
+ * </ul>
+ */
+public interface Annotatable {
+
+ /**
+ * Returns the type of this annotatable object.
+ *
+ * @return The type of annotatable object this represents.
+ */
+ AnnotatableType getAnnotatableType();
+
+ /**
+ * Returns the class info associated with this annotatable element.
+ *
+ * <p>
+ * Returns the declaring class from whichever context this annotatable
belongs to.
+ *
+ * @return The class info, or <jk>null</jk> if this is a package.
+ */
+ ClassInfo getClassInfo();
+
+ /**
+ * Returns a human-readable name for this annotatable element.
+ *
+ * <p>
+ * The name format depends on the type of annotatable:
+ * <ul>
+ * <li>{@link AnnotatableType#CLASS CLASS} - Simple class name
+ * <li>{@link AnnotatableType#METHOD METHOD} - Short method name
(with parameter types)
+ * <li>{@link AnnotatableType#FIELD FIELD} - Field name
+ * <li>{@link AnnotatableType#CONSTRUCTOR CONSTRUCTOR} - Short
constructor name (with parameter types)
+ * <li>{@link AnnotatableType#PARAMETER PARAMETER} - Parameter name
+ * <li>{@link AnnotatableType#PACKAGE PACKAGE} - Package name
+ * </ul>
+ *
+ * @return The annotatable name.
+ */
+ String getAnnotatableName();
+}
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotatableType.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotatableType.java
new file mode 100644
index 0000000000..5570ec8fd6
--- /dev/null
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotatableType.java
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.juneau.common.reflect;
+
+/**
+ * Enum representing the type of reflective object.
+ *
+ * <p>
+ * Used to identify the specific type of reflective wrapper (ClassInfo,
MethodInfo, FieldInfo, etc.)
+ * for runtime dispatch and polymorphic handling.
+ */
+public enum AnnotatableType {
+ /** Represents a {@link Class} wrapped in {@link ClassInfo}. */
+ CLASS,
+ /** Represents a {@link java.lang.reflect.Method} wrapped in {@link
MethodInfo}. */
+ METHOD,
+ /** Represents a {@link java.lang.reflect.Field} wrapped in {@link
FieldInfo}. */
+ FIELD,
+ /** Represents a {@link java.lang.Package} wrapped in {@link
PackageInfo}. */
+ PACKAGE,
+ /** Represents a {@link java.lang.reflect.Constructor} wrapped in
{@link ConstructorInfo}. */
+ CONSTRUCTOR,
+ /** Represents a {@link java.lang.reflect.Parameter} wrapped in {@link
ParameterInfo}. */
+ PARAMETER
+}
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 25920d92e7..b7255f7669 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
@@ -16,6 +16,7 @@
*/
package org.apache.juneau.common.reflect;
+import static org.apache.juneau.common.utils.AssertionUtils.*;
import static org.apache.juneau.common.utils.ClassUtils.*;
import static org.apache.juneau.common.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.PredicateUtils.*;
@@ -23,7 +24,6 @@ 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.*;
@@ -40,110 +40,23 @@ import org.apache.juneau.common.annotation.*;
public class AnnotationInfo<T extends Annotation> {
/**
- * Convenience constructor when annotation is found on a class.
+ * Convenience constructor for creating an annotation info object.
*
* @param <A> The annotation class.
- * @param onClass The class where the annotation was found.
+ * @param on The annotatable object where the annotation was found
(class, method, field, constructor, parameter, or package).
* @param value The annotation found.
* @return A new {@link AnnotationInfo} object.
*/
- public static <A extends Annotation> AnnotationInfo<A> of(ClassInfo
onClass, A value) {
- return new AnnotationInfo<>(onClass, value);
+ public static <A extends Annotation> AnnotationInfo<A> of(Annotatable
on, A value) {
+ return new AnnotationInfo<>(on, value);
}
- /**
- * Convenience constructor when annotation is found on a method.
- *
- * @param <A> The annotation class.
- * @param onMethod The method where the annotation was found.
- * @param value The annotation found.
- * @return A new {@link AnnotationInfo} object.
- */
- public static <A extends Annotation> AnnotationInfo<A> of(MethodInfo
onMethod, A value) {
- return new AnnotationInfo<>(onMethod, value);
- }
-
- /**
- * Convenience constructor when annotation is found on a package.
- *
- * @param <A> The annotation class.
- * @param onPackage The package where the annotation was found.
- * @param value The annotation found.
- * @return A new {@link AnnotationInfo} object.
- */
- public static <A extends Annotation> AnnotationInfo<A> of(Package
onPackage, A value) {
- return new AnnotationInfo<>(PackageInfo.of(onPackage), value);
- }
-
- /**
- * Convenience constructor when annotation is found on a package.
- *
- * @param <A> The annotation class.
- * @param onPackage The package where the annotation was found.
- * @param value The annotation found.
- * @return A new {@link AnnotationInfo} object.
- */
- public static <A extends Annotation> AnnotationInfo<A> of(PackageInfo
onPackage, A value) {
- return new AnnotationInfo<>(onPackage, value);
- }
-
- /**
- * Convenience constructor when annotation is found on a field.
- *
- * @param <A> The annotation class.
- * @param onField The field where the annotation was found.
- * @param value The annotation found.
- * @return A new {@link AnnotationInfo} object.
- */
- public static <A extends Annotation> AnnotationInfo<A> of(FieldInfo
onField, A value) {
- return new AnnotationInfo<>(onField, value);
- }
-
- /**
- * Convenience constructor when annotation is found on a constructor.
- *
- * @param <A> The annotation class.
- * @param onConstructor The constructor where the annotation was found.
- * @param value The annotation found.
- * @return A new {@link AnnotationInfo} object.
- */
- public static <A extends Annotation> AnnotationInfo<A>
of(ConstructorInfo onConstructor, A value) {
- return new AnnotationInfo<>(onConstructor, value);
- }
-
- /**
- * Convenience constructor when annotation is found on a parameter.
- *
- * @param <A> The annotation class.
- * @param onParam The parameter where the annotation was found.
- * @param value The annotation found.
- * @return A new {@link AnnotationInfo} object.
- */
- public static <A extends Annotation> AnnotationInfo<A> of(ParameterInfo
onParam, A value) {
- return new AnnotationInfo<>(onParam, value);
- }
-
- private static int getRank(Object a) {
- var ci = ClassInfo.of(a);
- var mi = ci.getPublicMethod(x -> x.hasName("rank") &&
x.hasNoParams() && x.hasReturnType(int.class));
- if (nn(mi)) {
- return safe(() -> (int)mi.invoke(a));
- }
- return 0;
- }
-
- private final ClassInfo c;
- private final MethodInfo m;
- private final FieldInfo f;
- private final ConstructorInfo ctor;
- private final ParameterInfo param;
- private final PackageInfo p;
+ private final Annotatable annotatable;
+ final int rank;
private T a; // Effectively final
- private final Supplier<List<Method>> methods = memoize(() ->
u(l(a.annotationType().getMethods())));
-
- final int rank;
+ private final Supplier<List<MethodInfo>> methods = memoize(() ->
stream(a.annotationType().getMethods()).map(m ->
MethodInfo.of(ClassInfo.of(a.annotationType()), m)).toList());
/**
* Constructor for class annotations.
@@ -151,100 +64,10 @@ public class AnnotationInfo<T extends Annotation> {
* @param c The class where the annotation was found.
* @param a The annotation found.
*/
- AnnotationInfo(ClassInfo c, T a) {
- this.c = c;
- this.m = null;
- this.f = null;
- this.ctor = null;
- this.param = null;
- this.p = null;
- this.a = a;
- this.rank = getRank(a);
- }
-
- /**
- * Constructor for method annotations.
- *
- * @param m The method where the annotation was found.
- * @param a The annotation found.
- */
- AnnotationInfo(MethodInfo m, T a) {
- this.c = null;
- this.m = m;
- this.f = null;
- this.ctor = null;
- this.param = null;
- this.p = null;
- this.a = a;
- this.rank = getRank(a);
- }
-
- /**
- * Constructor for field annotations.
- *
- * @param f The field where the annotation was found.
- * @param a The annotation found.
- */
- AnnotationInfo(FieldInfo f, T a) {
- this.c = null;
- this.m = null;
- this.f = f;
- this.ctor = null;
- this.param = null;
- this.p = null;
- this.a = a;
- this.rank = getRank(a);
- }
-
- /**
- * Constructor for constructor annotations.
- *
- * @param ctor The constructor where the annotation was found.
- * @param a The annotation found.
- */
- AnnotationInfo(ConstructorInfo ctor, T a) {
- this.c = null;
- this.m = null;
- this.f = null;
- this.ctor = ctor;
- this.param = null;
- this.p = null;
- this.a = a;
- this.rank = getRank(a);
- }
-
- /**
- * Constructor for parameter annotations.
- *
- * @param param The parameter where the annotation was found.
- * @param a The annotation found.
- */
- AnnotationInfo(ParameterInfo param, T a) {
- this.c = null;
- this.m = null;
- this.f = null;
- this.ctor = null;
- this.param = param;
- this.p = null;
- this.a = a;
- this.rank = getRank(a);
- }
-
- /**
- * Constructor for package annotations.
- *
- * @param p The package where the annotation was found.
- * @param a The annotation found.
- */
- AnnotationInfo(PackageInfo p, T a) {
- this.c = null;
- this.m = null;
- this.f = null;
- this.ctor = null;
- this.param = null;
- this.p = p;
- this.a = a;
- this.rank = getRank(a);
+ AnnotationInfo(Annotatable on, T a) {
+ this.annotatable = on; // TODO - Shouldn't allow null.
+ this.a = assertArgNotNull("a", a);
+ this.rank = findRank(a);
}
/**
@@ -273,68 +96,11 @@ public class AnnotationInfo<T extends Annotation> {
@SuppressWarnings("unchecked")
public <V> AnnotationInfo<?> forEachValue(Class<V> type, String name,
Predicate<V> test, Consumer<V> action) {
methods.get().stream()
- .filter(m -> eq(m.getName(), name) &&
eq(m.getReturnType(), type))
+ .filter(m -> eq(m.getName(), name) &&
eq(m.getReturnType().inner(), type))
.forEach(m -> safe(() -> consumeIf(test, action,
(V)m.invoke(a))));
return this;
}
- /**
- * Returns the class that this annotation was found on.
- *
- * <p>
- * Returns the declaring class from whichever context this annotation
belongs to.
- *
- * @return The class that this annotation was found on, or
<jk>null</jk> if it was found on a package.
- */
- public ClassInfo getClassInfo() {
- if (nn(this.c))
- return this.c;
- if (nn(this.m))
- return this.m.getDeclaringClass();
- if (nn(this.f))
- return this.f.getDeclaringClass();
- if (nn(this.ctor))
- return this.ctor.getDeclaringClass();
- if (nn(this.param))
- return
this.param.getDeclaringExecutable().getDeclaringClass();
- return null;
- }
-
- /**
- * Returns the class where the annotation was found.
- *
- * @return the class where the annotation was found, or <jk>null</jk>
if it wasn't found on a method.
- */
- public ClassInfo getClassOn() { return c; }
-
- /**
- * Returns the method where the annotation was found.
- *
- * @return the method where the annotation was found, or <jk>null</jk>
if it wasn't found on a method.
- */
- public MethodInfo getMethodOn() { return m; }
-
- /**
- * Returns the field where the annotation was found.
- *
- * @return the field where the annotation was found, or <jk>null</jk>
if it wasn't found on a field.
- */
- public FieldInfo getFieldOn() { return f; }
-
- /**
- * Returns the constructor where the annotation was found.
- *
- * @return the constructor where the annotation was found, or
<jk>null</jk> if it wasn't found on a constructor.
- */
- public ConstructorInfo getConstructorOn() { return ctor; }
-
- /**
- * Returns the parameter where the annotation was found.
- *
- * @return the parameter where the annotation was found, or
<jk>null</jk> if it wasn't found on a parameter.
- */
- public ParameterInfo getParamOn() { return param; }
-
/**
* Returns the class name of the annotation.
*
@@ -342,13 +108,6 @@ public class AnnotationInfo<T extends Annotation> {
*/
public String getName() { return scn(a.annotationType()); }
- /**
- * Returns the package where the annotation was found.
- *
- * @return the package where the annotation was found, or <jk>null</jk>
if it wasn't found on a package.
- */
- public PackageInfo getPackageOn() { return p; }
-
/**
* Returns a matching value on this annotation.
*
@@ -361,7 +120,7 @@ public class AnnotationInfo<T extends Annotation> {
@SuppressWarnings("unchecked")
public <V> Optional<V> getValue(Class<V> type, String name,
Predicate<V> test) {
return methods.get().stream()
- .filter(m -> eq(m.getName(), name) &&
eq(m.getReturnType(), type))
+ .filter(m -> eq(m.getName(), name) &&
eq(m.getReturnType().inner(), type))
.map(m -> safe(() -> (V)m.invoke(a)))
.filter(v -> test(test, v))
.findFirst();
@@ -427,18 +186,7 @@ public class AnnotationInfo<T extends Annotation> {
*/
public LinkedHashMap<String, Object> toMap() {
var jm = new LinkedHashMap<String, Object>();
- if (nn(c))
- jm.put("class", c.getNameSimple());
- if (nn(m))
- jm.put("method", m.getShortName());
- if (nn(f))
- jm.put("field", f.getName());
- if (nn(ctor))
- jm.put("constructor", ctor.getShortName());
- if (nn(param))
- jm.put("parameter", param.getName());
- if (nn(p))
- jm.put("package", p.getName());
+ jm.put(s(annotatable.getAnnotatableType()),
annotatable.getAnnotatableName());
var ja = new LinkedHashMap<String, Object>();
var ca = ClassInfo.of(a.annotationType());
ca.forEachDeclaredMethod(null, x -> {
@@ -719,6 +467,15 @@ public class AnnotationInfo<T extends Annotation> {
// Private helper methods
//-----------------------------------------------------------------------------------------------------------------
+ private static int findRank(Object a) {
+ return ClassInfo.of(a).getMethods().stream()
+ .filter(m -> m.hasName("rank") && m.hasNoParams() &&
m.hasReturnType(int.class))
+ .findFirst()
+ .map(m -> safe(() -> (int)m.invoke(a)))
+ .orElse(0);
+ }
+
+ @SuppressWarnings("unchecked")
private static void forEachDeclaredAnnotationInfo(ClassInfo ci,
Predicate<AnnotationInfo<?>> filter, Consumer<AnnotationInfo<?>> action) {
if (nn(ci))
for (var ai : ci.getDeclaredAnnotationInfos())
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java.new
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java.new
new file mode 100644
index 0000000000..411bd06c13
--- /dev/null
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/AnnotationInfo.java.new
@@ -0,0 +1,479 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.juneau.common.reflect;
+
+import static org.apache.juneau.common.utils.AssertionUtils.*;
+import static org.apache.juneau.common.utils.ClassUtils.*;
+import static org.apache.juneau.common.utils.CollectionUtils.*;
+import static org.apache.juneau.common.utils.PredicateUtils.*;
+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.annotation.*;
+
+/**
+ * Represents an annotation instance on a class and the class it was found on.
+ *
+ * <h5 class='section'>See Also:</h5><ul>
+ * </ul>
+ *
+ * @param <T> The annotation type.
+ */
+public class AnnotationInfo<T extends Annotation> {
+
+ /**
+ * Creates an {@link AnnotationInfo} for any annotatable object.
+ *
+ * <p>
+ * This unified factory method accepts any annotatable type (Class,
Method, Field, Constructor, Parameter, Package)
+ * and creates an appropriate {@link AnnotationInfo} wrapper.
+ *
+ * @param <A> The annotation class.
+ * @param on The annotatable object where the annotation was found.
+ * @param value The annotation found.
+ * @return A new {@link AnnotationInfo} object, or {@code null} if
{@code on} is null.
+ */
+ public static <A extends Annotation> AnnotationInfo<A> of(Annotatable
on, A value) {
+ return new AnnotationInfo<>(on, value);
+ }
+
+ private final Annotatable annotatable;
+ private final ClassInfo classInfo;
+
+ private T a; // Effectively final
+
+ private final Supplier<List<MethodInfo>> methods = memoize(() ->
stream(a.annotationType().getMethods()).map(m ->
MethodInfo.of(ClassInfo.of(a.annotationType()), m)).toList());
+
+ final int rank;
+ /**
+ * Constructor that accepts any annotatable object.
+ *
+ * @param on The annotatable object where the annotation was found.
+ * @param a The annotation found.
+ */
+ private AnnotationInfo(Annotatable on, T a) {
+ this.annotatable = on; // TODO - Shouldn't allow null.
+ this.classInfo = annotatable.getClassInfo();
+ this.a = assertArgNotNull("a", a);
+ this.rank = findRank(a);
+ }
+
+ private static ClassInfo findClassInfo(Annotatable on) {
+ if (on instanceof ClassInfo ci)
+ return ci;
+ if (on instanceof MethodInfo mi)
+ return mi.getDeclaringClass();
+ if (on instanceof FieldInfo fi)
+ return fi.getDeclaringClass();
+ if (on instanceof ConstructorInfo ci)
+ return ci.getDeclaringClass();
+ if (on instanceof ParameterInfo pi)
+ return pi.getDeclaringExecutable().getDeclaringClass();
+ return null; // Package
+ }
+
+ private static String findAnnotatableName(Annotatable on) {
+ if (on == null)
+ return null;
+ return switch (on.getAnnotatableType()) {
+ case CLASS -> ((ClassInfo)on).getNameSimple();
+ case METHOD -> ((MethodInfo)on).getShortName();
+ case FIELD -> ((FieldInfo)on).getName();
+ case CONSTRUCTOR ->
((ConstructorInfo)on).getShortName();
+ case PARAMETER -> ((ParameterInfo)on).getName();
+ case PACKAGE -> ((PackageInfo)on).getName();
+ };
+ }
+
+ private static int findRank(Object a) {
+ return ClassInfo.of(a).getMethods().stream()
+ .filter(m -> m.hasName("rank") && m.hasNoParameters()
&& m.hasReturnType(int.class))
+ .findFirst()
+ .map(m -> safe(() -> (int)m.invoke(a)))
+ .orElse(0);
+ }
+
+
+ /**
+ * Performs an action on this object if the specified predicate test
passes.
+ *
+ * @param test A test to apply to determine if action should be
executed. Can be <jk>null</jk>.
+ * @param action An action to perform on this object.
+ * @return This object.
+ */
+ public AnnotationInfo<?> accept(Predicate<AnnotationInfo<?>> test,
Consumer<AnnotationInfo<?>> action) {
+ if (matches(test))
+ action.accept(this);
+ return this;
+ }
+
+ /**
+ * Performs an action on all matching values on this annotation.
+ *
+ * @param <V> The annotation field type.
+ * @param type The annotation field type.
+ * @param name The annotation field name.
+ * @param test A predicate to apply to the value to determine if action
should be performed. Can be <jk>null</jk>.
+ * @param action An action to perform on the value.
+ * @return This object.
+ */
+ @SuppressWarnings("unchecked")
+ public <V> AnnotationInfo<?> forEachValue(Class<V> type, String name,
Predicate<V> test, Consumer<V> action) {
+ getMethods(type, name)
+ .forEach(m -> safe(() -> consumeIf(test, action,
(V)m.invoke(a))));
+ return this;
+ }
+
+ /**
+ * Returns a stream of methods matching the specified name and return
type.
+ *
+ * <p>
+ * This is a convenience method for filtering annotation members by
name and return type.
+ *
+ * @param <V> The return type to match.
+ * @param type The return type to filter by.
+ * @param name The method name to filter by.
+ * @return A stream of <c>MethodInfo</c> objects matching the specified
criteria.
+ */
+ public <V> Stream<MethodInfo> getMethods(Class<V> type, String name) {
+ return getMethods().stream().filter(m -> m.hasName(name) &&
m.hasReturnType(type));
+ }
+
+ /**
+ * Returns the class that this annotation was found on.
+ *
+ * <p>
+ * Returns the declaring class from whichever context this annotation
belongs to.
+ *
+ * @return The class that this annotation was found on, or
<jk>null</jk> if it was found on a package.
+ */
+ public ClassInfo getClassInfo() {
+ return classInfo;
+ }
+
+ /**
+ * Returns the class name of the annotation.
+ *
+ * @return The simple class name of the annotation.
+ */
+ public String getName() { return scn(a.annotationType()); }
+
+ /**
+ * Returns all public methods defined on this annotation type.
+ *
+ * <p>
+ * These are the members of the annotation interface (e.g.,
<c>value()</c>, <c>name()</c>, etc.).
+ * The list is cached and unmodifiable.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * AnnotationInfo<MyAnnotation> <jv>ai</jv> = ...;
+ * List<MethodInfo> <jv>methods</jv> =
<jv>ai</jv>.getMethods();
+ * <jc>// Returns methods like: value(), name(), description(),
etc.</jc>
+ * </p>
+ *
+ * @return An unmodifiable list of <c>MethodInfo</c> objects for all
public methods defined on this annotation type.
+ * <br>Results are cached on first access.
+ */
+ public List<MethodInfo> getMethods() {
+ return methods.get();
+ }
+
+ /**
+ * Returns a matching value on this annotation.
+ *
+ * @param <V> The annotation field type.
+ * @param type The annotation field type.
+ * @param name The annotation field name.
+ * @param test A predicate to apply to the value to determine if value
should be used. Can be <jk>null</jk>.
+ * @return This object.
+ */
+ @SuppressWarnings("unchecked")
+ public <V> Optional<V> getValue(Class<V> type, String name) {
+ return getMethods(type, name)
+ .map(m -> safe(() -> (V)m.invoke(a)))
+ .findFirst();
+ }
+
+ /**
+ * Returns <jk>true</jk> if this annotation has the specified
annotation defined on it.
+ *
+ * @param <A> The annotation class.
+ * @param type The annotation to test for.
+ * @return <jk>true</jk> if this annotation has the specified
annotation defined on it.
+ */
+ public <A extends Annotation> boolean hasAnnotation(Class<A> type) {
+ return nn(this.a.annotationType().getAnnotation(type));
+ }
+
+ /**
+ * Returns the annotation found.
+ *
+ * @return The annotation found.
+ */
+ public T inner() {
+ return a;
+ }
+
+ /**
+ * Returns <jk>true</jk> if this annotation is in the specified {@link
AnnotationGroup group}.
+ *
+ * @param <A> The annotation class.
+ * @param group The group annotation.
+ * @return <jk>true</jk> if this annotation is in the specified {@link
AnnotationGroup group}.
+ */
+ public <A extends Annotation> boolean isInGroup(Class<A> group) {
+ var x = a.annotationType().getAnnotation(AnnotationGroup.class);
+ return (nn(x) && x.value().equals(group));
+ }
+
+ /**
+ * Returns <jk>true</jk> if this annotation is the specified type.
+ *
+ * @param <A> The annotation class.
+ * @param type The type to test against.
+ * @return <jk>true</jk> if this annotation is the specified type.
+ */
+ public <A extends Annotation> boolean isType(Class<A> type) {
+ return this.a.annotationType() == type;
+ }
+
+ /**
+ * Returns <jk>true</jk> if this object passes the specified predicate
test.
+ *
+ * @param test The test to perform.
+ * @return <jk>true</jk> if this object passes the specified predicate
test.
+ */
+ public boolean matches(Predicate<AnnotationInfo<?>> test) {
+ return test(test, this);
+ }
+
+ /**
+ * Converts this object to a readable map for debugging purposes.
+ *
+ * @return A new map showing the attributes of this object.
+ */
+ public LinkedHashMap<String, Object> toMap() {
+ var jm = new LinkedHashMap<String,Object>();
+ jm.put(s(annotatable.getAnnotatableType()), annotatableName);
+ var ja = map();
+ var ca = ClassInfo.of(a.annotationType());
+ ca.forEachDeclaredMethod(null, x -> {
+ try {
+ var v = x.invoke(a);
+ var d = x.inner().getDefaultValue();
+ if (ne(v, d)) {
+ if (! (isArray(v) && length(v) == 0 &&
length(d) == 0))
+ ja.put(x.getName(), v);
+ }
+ } catch (Exception e) {
+ ja.put(x.getName(), lm(e));
+ }
+ });
+ jm.put("@" + ca.getNameSimple(), ja);
+ return jm;
+ }
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Annotation interface methods
+
//-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Returns the annotation type of this annotation.
+ *
+ * <p>
+ * Same as calling {@link Annotation#annotationType()}.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * AnnotationInfo<Deprecated> <jv>ai</jv> =
ClassInfo.<jsm>of</jsm>(MyClass.<jk>class</jk>).getAnnotation(Deprecated.<jk>class</jk>);
+ * Class<? <jk>extends</jk> Annotation> <jv>type</jv> =
<jv>ai</jv>.annotationType(); <jc>// Returns Deprecated.class</jc>
+ * </p>
+ *
+ * @return The annotation type of this annotation.
+ * @see Annotation#annotationType()
+ */
+ public Class<? extends Annotation> annotationType() {
+ return a.annotationType();
+ }
+
+ /**
+ * Returns the hash code of this annotation.
+ *
+ * <p>
+ * Same as calling {@link Annotation#hashCode()} on the wrapped
annotation.
+ *
+ * <p>
+ * The hash code of an annotation is the sum of the hash codes of its
members (including those with default values).
+ *
+ * @return The hash code of this annotation.
+ * @see Annotation#hashCode()
+ */
+ @Override /* Overridden from Object */
+ public int hashCode() {
+ return a.hashCode();
+ }
+
+ /**
+ * Returns true if the specified object represents an annotation that
is logically equivalent to this one.
+ *
+ * <p>
+ * Same as calling {@link Annotation#equals(Object)} on the wrapped
annotation.
+ *
+ * <p>
+ * Two annotations are considered equal if:
+ * <ul>
+ * <li>They are of the same annotation type
+ * <li>All their corresponding member values are equal
+ * </ul>
+ *
+ * @param o The reference object with which to compare.
+ * @return <jk>true</jk> if the specified object is equal to this
annotation.
+ * @see Annotation#equals(Object)
+ */
+ @Override /* Overridden from Object */
+ public boolean equals(Object o) {
+ if (o instanceof AnnotationInfo o2)
+ return a.equals(o2.a);
+ return a.equals(o);
+ }
+
+ /**
+ * Returns a string representation of this annotation.
+ *
+ * <p>
+ * Returns the map representation created by {@link #toMap()}.
+ *
+ * @return A string representation of this annotation.
+ */
+ @Override /* Overridden from Object */
+ public String toString() {
+ return toMap().toString();
+ }
+
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Static methods for ClassInfo
+
//-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Constructs an {@link AnnotationList} of all annotations found on the
specified class.
+ *
+ * <p>
+ * Annotations are appended in the following orders:
+ * <ol>
+ * <li>On the package of this class.
+ * <li>On interfaces ordered parent-to-child.
+ * <li>On parent classes ordered parent-to-child.
+ * <li>On this class.
+ * </ol>
+ *
+ * @param classInfo The class to process.
+ * @return A new {@link AnnotationList} object on every call.
+ */
+ public static AnnotationList getAnnotationList(ClassInfo classInfo) {
+ return getAnnotationList(classInfo, x -> true);
+ }
+
+ /**
+ * Constructs an {@link AnnotationList} of all matching annotations on
the specified class.
+ *
+ * <p>
+ * Annotations are appended in the following orders:
+ * <ol>
+ * <li>On the package of this class.
+ * <li>On interfaces ordered parent-to-child.
+ * <li>On parent classes ordered parent-to-child.
+ * <li>On this class.
+ * </ol>
+ *
+ * @param classInfo The class to process.
+ * @param filter A predicate to apply to the entries to determine if
value should be used. Can be <jk>null</jk>.
+ * @return A new {@link AnnotationList} object on every call.
+ */
+ public static AnnotationList getAnnotationList(ClassInfo classInfo,
Predicate<AnnotationInfo<?>> filter) {
+ var l = new AnnotationList();
+ Utils.forEachAnnotationInfo(classInfo, filter, x -> l.add(x));
+ return l;
+ }
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Static methods for MethodInfo
+
//-----------------------------------------------------------------------------------------------------------------
+
+ /**
+ * Constructs an {@link AnnotationList} of all annotations found on the
specified method.
+ *
+ * <p>
+ * Annotations are appended in the following orders:
+ * <ol>
+ * <li>On the package of this class.
+ * <li>On interfaces ordered parent-to-child.
+ * <li>On parent classes ordered parent-to-child.
+ * <li>On this class.
+ * <li>On this method and matching methods ordered parent-to-child.
+ * </ol>
+ *
+ * @param methodInfo The method to process.
+ * @return A new {@link AnnotationList} object on every call.
+ */
+ public static AnnotationList getAnnotationList(MethodInfo methodInfo) {
+ return getAnnotationList(methodInfo, x -> true);
+ }
+
+ /**
+ * Constructs an {@link AnnotationList} of all matching annotations
found on the specified method.
+ *
+ * <p>
+ * Annotations are appended in the following orders:
+ * <ol>
+ * <li>On the package of this class.
+ * <li>On interfaces ordered parent-to-child.
+ * <li>On parent classes ordered parent-to-child.
+ * <li>On this class.
+ * <li>On this method and matching methods ordered parent-to-child.
+ * </ol>
+ *
+ * @param methodInfo The method to process.
+ * @param filter A predicate to apply to the entries to determine if
value should be added. Can be <jk>null</jk>.
+ * @return A new {@link AnnotationList} object on every call.
+ */
+ public static AnnotationList getAnnotationList(MethodInfo methodInfo,
Predicate<AnnotationInfo<?>> filter) {
+ var al = new AnnotationList();
+ Utils.forEachAnnotationInfo(methodInfo, filter, x -> al.add(x));
+ return al;
+ }
+
+ /**
+ * Same as {@link #getAnnotationList(MethodInfo, Predicate)} except
only returns annotations defined on methods.
+ *
+ * @param methodInfo The method to process.
+ * @param filter A predicate to apply to the entries to determine if
value should be added. Can be <jk>null</jk>.
+ * @return A new {@link AnnotationList} object on every call.
+ */
+ public static AnnotationList getAnnotationListMethodOnly(MethodInfo
methodInfo, Predicate<AnnotationInfo<?>> filter) {
+ var al = new AnnotationList();
+ Utils.forEachAnnotationInfoMethodOnly(methodInfo, filter, x ->
al.add(x));
+ return al;
+ }
+}
\ No newline at end of file
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
index a9215f81c5..cbfce03389 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ClassInfo.java
@@ -66,7 +66,7 @@ import org.apache.juneau.common.collections.*;
* </ul>
*/
@SuppressWarnings({"unchecked","rawtypes"})
-public class ClassInfo {
+public class ClassInfo implements Annotatable {
private static final Cache<Class,ClassInfo> CACHE =
Cache.of(Class.class, ClassInfo.class).build();
@@ -2793,4 +2793,23 @@ public class ClassInfo {
return this;
}
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Annotatable interface methods
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Override /* Annotatable */
+ public AnnotatableType getAnnotatableType() {
+ return AnnotatableType.CLASS;
+ }
+
+ @Override /* Annotatable */
+ public ClassInfo getClassInfo() {
+ return this;
+ }
+
+ @Override /* Annotatable */
+ public String getAnnotatableName() {
+ return getNameSimple();
+ }
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ConstructorInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ConstructorInfo.java
index f25c9f0822..227a087e52 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ConstructorInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ConstructorInfo.java
@@ -32,7 +32,7 @@ import org.apache.juneau.common.utils.*;
* <h5 class='section'>See Also:</h5><ul>
* </ul>
*/
-public class ConstructorInfo extends ExecutableInfo implements
Comparable<ConstructorInfo> {
+public class ConstructorInfo extends ExecutableInfo implements
Comparable<ConstructorInfo>, Annotatable {
/**
* Convenience method for instantiating a {@link ConstructorInfo};
*
@@ -259,7 +259,21 @@ public class ConstructorInfo extends ExecutableInfo
implements Comparable<Constr
}
//-----------------------------------------------------------------------------------------------------------------
- // High Priority Methods (direct Constructor API compatibility)
+ // Annotatable interface methods
//-----------------------------------------------------------------------------------------------------------------
+ @Override /* Annotatable */
+ public AnnotatableType getAnnotatableType() {
+ return AnnotatableType.CONSTRUCTOR;
+ }
+
+ @Override /* Annotatable */
+ public ClassInfo getClassInfo() {
+ return getDeclaringClass();
+ }
+
+ @Override /* Annotatable */
+ public String getAnnotatableName() {
+ return getShortName();
+ }
}
\ No newline at end of file
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 1e7f167a22..d621fc5582 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
@@ -16,8 +16,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.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.PredicateUtils.*;
import static org.apache.juneau.common.utils.StringUtils.*;
@@ -41,7 +39,7 @@ import java.util.function.*;
public abstract class ExecutableInfo extends AccessibleInfo {
final ClassInfo declaringClass;
- final Executable e;
+ Executable e; // Effectively final.
final boolean isConstructor;
private volatile ParameterInfo[] params;
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/FieldInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/FieldInfo.java
index 644b9eaaf8..c9d5ead252 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/FieldInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/FieldInfo.java
@@ -16,8 +16,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.utils.PredicateUtils.*;
import static org.apache.juneau.common.utils.ThrowableUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
@@ -38,7 +36,7 @@ import org.apache.juneau.common.collections.*;
* <h5 class='section'>See Also:</h5><ul>
* </ul>
*/
-public class FieldInfo extends AccessibleInfo implements Comparable<FieldInfo>
{
+public class FieldInfo extends AccessibleInfo implements
Comparable<FieldInfo>, Annotatable {
/**
* Convenience method for instantiating a {@link FieldInfo};
*
@@ -630,4 +628,23 @@ public class FieldInfo extends AccessibleInfo implements
Comparable<FieldInfo> {
public String toString() {
return cn(f.getDeclaringClass()) + "." + f.getName();
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Annotatable interface methods
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Override /* Annotatable */
+ public AnnotatableType getAnnotatableType() {
+ return AnnotatableType.FIELD;
+ }
+
+ @Override /* Annotatable */
+ public ClassInfo getClassInfo() {
+ return getDeclaringClass();
+ }
+
+ @Override /* Annotatable */
+ public String getAnnotatableName() {
+ return getName();
+ }
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/MethodInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/MethodInfo.java
index cc3ffbf081..362ffe3644 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/MethodInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/MethodInfo.java
@@ -16,8 +16,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.utils.CollectionUtils.*;
import static org.apache.juneau.common.utils.PredicateUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
@@ -28,8 +26,6 @@ import java.lang.reflect.*;
import java.util.*;
import java.util.function.*;
-import static java.util.Arrays.*;
-
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.utils.*;
@@ -39,7 +35,7 @@ import org.apache.juneau.common.utils.*;
* <h5 class='section'>See Also:</h5><ul>
* </ul>
*/
-public class MethodInfo extends ExecutableInfo implements
Comparable<MethodInfo> {
+public class MethodInfo extends ExecutableInfo implements
Comparable<MethodInfo>, Annotatable {
/**
* Convenience method for instantiating a {@link MethodInfo};
*
@@ -774,8 +770,27 @@ public class MethodInfo extends ExecutableInfo implements
Comparable<MethodInfo>
MethodInfo findMatchingOnClass(ClassInfo c) {
for (var m2 : c.getDeclaredMethods())
- if (hasName(m2.getName()) &&
Arrays.equals(_getParameterTypes(), m2._getParameterTypes()))
- return m2;
+ if (hasName(m2.getName()) &&
Arrays.equals(_getParameterTypes(), m2._getParameterTypes()))
+ return m2;
return null;
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Annotatable interface methods
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Override /* Annotatable */
+ public AnnotatableType getAnnotatableType() {
+ return AnnotatableType.METHOD;
+ }
+
+ @Override /* Annotatable */
+ public ClassInfo getClassInfo() {
+ return getDeclaringClass();
+ }
+
+ @Override /* Annotatable */
+ public String getAnnotatableName() {
+ return getShortName();
+ }
}
\ No newline at end of file
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/PackageInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/PackageInfo.java
index b40de43eae..7b1aaaf71c 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/PackageInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/PackageInfo.java
@@ -37,7 +37,7 @@ import org.apache.juneau.common.collections.*;
* <h5 class='section'>See Also:</h5><ul>
* </ul>
*/
-public class PackageInfo {
+public class PackageInfo implements Annotatable {
//-----------------------------------------------------------------------------------------------------------------
// Static
@@ -84,7 +84,7 @@ public class PackageInfo {
private Package p; // Effectively final
// All annotations on this package, wrapped in AnnotationInfo. Repeated
annotations have been unwrapped and are present as individual instances.
Lazy-initialized in getter.
- private final Supplier<List<AnnotationInfo>> annotations = memoize(()
-> opt(p).map(p -> stream(p.getAnnotations()).flatMap(a ->
stream(splitRepeated(a))).map(a -> (AnnotationInfo)AnnotationInfo.of(this,
a)).toList()).orElse(liste()));
+ private final Supplier<List<AnnotationInfo<Annotation>>> annotations =
memoize(() -> opt(p).map(p -> stream(p.getAnnotations()).flatMap(a ->
stream(splitRepeated(a))).map(a -> AnnotationInfo.of(this,
a)).toList()).orElse(liste()));
/**
* Constructor.
@@ -290,7 +290,7 @@ public class PackageInfo {
*
* @return All annotations present on this package, or an empty list if
there are none.
*/
- public List<AnnotationInfo> getAnnotations() {
+ public List<AnnotationInfo<Annotation>> getAnnotations() {
return annotations.get();
}
@@ -364,5 +364,24 @@ public class PackageInfo {
public String toString() {
return p.toString();
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Annotatable interface methods
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Override /* Annotatable */
+ public AnnotatableType getAnnotatableType() {
+ return AnnotatableType.PACKAGE;
+ }
+
+ @Override /* Annotatable */
+ public ClassInfo getClassInfo() {
+ return null; // Package has no declaring class
+ }
+
+ @Override /* Annotatable */
+ public String getAnnotatableName() {
+ return getName();
+ }
}
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ParameterInfo.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ParameterInfo.java
index 62fc16a6df..ddb6a64688 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ParameterInfo.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/reflect/ParameterInfo.java
@@ -23,7 +23,6 @@ import static org.apache.juneau.common.utils.Utils.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;
-import java.util.concurrent.*;
import java.util.function.*;
import org.apache.juneau.common.collections.*;
@@ -34,7 +33,7 @@ import org.apache.juneau.common.collections.*;
* <h5 class='section'>See Also:</h5><ul>
* </ul>
*/
-public class ParameterInfo {
+public class ParameterInfo implements Annotatable {
private final ExecutableInfo eInfo;
private final Parameter p;
@@ -662,4 +661,23 @@ public class ParameterInfo {
}
return this;
}
+
+
//-----------------------------------------------------------------------------------------------------------------
+ // Annotatable interface methods
+
//-----------------------------------------------------------------------------------------------------------------
+
+ @Override /* Annotatable */
+ public AnnotatableType getAnnotatableType() {
+ return AnnotatableType.PARAMETER;
+ }
+
+ @Override /* Annotatable */
+ public ClassInfo getClassInfo() {
+ return getDeclaringExecutable().getDeclaringClass();
+ }
+
+ @Override /* Annotatable */
+ public String getAnnotatableName() {
+ return getName();
+ }
}
\ No newline at end of file
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 230edb413e..66c6725e59 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
@@ -1769,6 +1769,21 @@ public class CollectionUtils {
return Collections.emptyList();
}
+ /**
+ * Shortcut for creating an empty list.
+ *
+ * <p>
+ * This is a convenience method that provides a more concise syntax
than {@link Collections#emptyList()}.
+ * The "e" suffix indicates "empty".
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * List<String> <jv>myList</jv> = <jsm>liste</jsm>();
+ * </p>
+ *
+ * @param <T> The element type.
+ * @return An empty unmodifiable list.
+ */
public static <T> List<T> liste() {
return Collections.emptyList();
}
diff --git
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/DateUtils.java
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/DateUtils.java
index 656554e62f..f9d8deaef2 100644
---
a/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/DateUtils.java
+++
b/juneau-core/juneau-common/src/main/java/org/apache/juneau/common/utils/DateUtils.java
@@ -22,7 +22,6 @@ import static org.apache.juneau.common.utils.ThrowableUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
import java.lang.ref.*;
-import java.lang.reflect.*;
import java.text.*;
import java.time.*;
import java.time.format.*;
diff --git
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
index 5133dff4b1..b07934a36c 100644
---
a/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
+++
b/juneau-core/juneau-marshall-rdf/src/main/java/org/apache/juneau/jena/RdfUtils.java
@@ -20,7 +20,6 @@ import static org.apache.juneau.common.utils.Utils.*;
import java.util.*;
-import org.apache.juneau.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.jena.annotation.*;
import org.apache.juneau.xml.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationWorkList.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationWorkList.java
index cf25883a81..3880389d3e 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationWorkList.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/AnnotationWorkList.java
@@ -24,7 +24,6 @@ import java.util.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.common.reflect.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.svl.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
index f143fa3889..834f50ab06 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanMap.java
@@ -32,7 +32,6 @@ import org.apache.juneau.common.reflect.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
import org.apache.juneau.parser.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.swap.*;
/**
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 c31520d622..2970285776 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
@@ -33,7 +33,6 @@ import org.apache.juneau.annotation.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.reflect.Visibility;
-import org.apache.juneau.common.reflect.*;
/**
* Encapsulates all access to the properties of a bean class (like a souped-up
{@link java.beans.BeanInfo}).
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 14517c6199..0c1d9468e2 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
@@ -36,7 +36,6 @@ import org.apache.juneau.common.utils.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.internal.*;
import org.apache.juneau.parser.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.swap.*;
import org.apache.juneau.swaps.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
index 622aa19d31..bafa93bcb8 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanRegistry.java
@@ -26,7 +26,6 @@ import org.apache.juneau.annotation.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.cp.*;
-import org.apache.juneau.common.reflect.*;
/**
* A lookup table for resolving bean types by name.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
index 7e6c263677..3577104adc 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanSession.java
@@ -38,7 +38,6 @@ import org.apache.juneau.collections.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.utils.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.swap.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
index e9715ce812..f89d09800b 100644
--- a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
+++ b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/ClassMeta.java
@@ -37,7 +37,6 @@ import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.cp.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.json.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.swap.*;
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 048fc16e59..b3f3747b55 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
@@ -42,7 +42,6 @@ import org.apache.juneau.msgpack.annotation.*;
import org.apache.juneau.oapi.annotation.*;
import org.apache.juneau.parser.annotation.*;
import org.apache.juneau.plaintext.annotation.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.serializer.annotation.*;
import org.apache.juneau.soap.annotation.*;
import org.apache.juneau.svl.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
index 81f9a3f5e8..03dc279ac0 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/annotation/BeanConfigAnnotation.java
@@ -22,7 +22,6 @@ import java.util.*;
import org.apache.juneau.*;
import org.apache.juneau.common.reflect.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.svl.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
index 4a6225c8de..4c390354a9 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreateMethodFinder.java
@@ -24,7 +24,6 @@ import java.util.function.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.common.reflect.*;
-import org.apache.juneau.common.reflect.*;
/**
* Utility class for creating beans through creator methods.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
index 0ac3324e2c..1938c78ea9 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanCreator.java
@@ -26,7 +26,6 @@ import java.util.function.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
-import org.apache.juneau.common.reflect.*;
/**
* Utility class for creating beans through constructors, creator methods, and
builders.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
index 94d7bb92a0..c939eae7af 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStore.java
@@ -33,7 +33,6 @@ import java.util.stream.*;
import org.apache.juneau.collections.*;
import org.apache.juneau.common.utils.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.marshaller.*;
import org.apache.juneau.common.reflect.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStoreEntry.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStoreEntry.java
index ba674e33b9..036f5206d3 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStoreEntry.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/cp/BeanStoreEntry.java
@@ -25,7 +25,6 @@ import java.util.function.*;
import org.apache.juneau.collections.*;
import org.apache.juneau.common.utils.*;
-import org.apache.juneau.internal.*;
/**
* Represents a bean in a {@link BeanStore}.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ContactAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ContactAnnotation.java
index 88360660b1..79688a2432 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ContactAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/ContactAnnotation.java
@@ -18,7 +18,6 @@ package org.apache.juneau.http.annotation;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasFormDataAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasFormDataAnnotation.java
index 6e611014d5..94d2704334 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasFormDataAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasFormDataAnnotation.java
@@ -18,7 +18,6 @@ package org.apache.juneau.http.annotation;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasQueryAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasQueryAnnotation.java
index 5d2d945f70..6b5022b87d 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasQueryAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/HasQueryAnnotation.java
@@ -18,7 +18,6 @@ package org.apache.juneau.http.annotation;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/LicenseAnnotation.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/LicenseAnnotation.java
index 2120314b53..bdce3e40b1 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/LicenseAnnotation.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/http/annotation/LicenseAnnotation.java
@@ -18,7 +18,6 @@ package org.apache.juneau.http.annotation;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
index d96c49fcbd..e62a45d16d 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartParserSession.java
@@ -18,7 +18,6 @@ package org.apache.juneau.httppart;
import org.apache.juneau.*;
import org.apache.juneau.parser.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.reflect.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializer.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializer.java
index cb4d286888..c9bbf571c7 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializer.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializer.java
@@ -18,7 +18,6 @@ package org.apache.juneau.httppart;
import org.apache.juneau.*;
import org.apache.juneau.common.collections.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.utils.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializerSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializerSession.java
index 6d5b4595a6..e50c4191a9 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializerSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/SimplePartSerializerSession.java
@@ -16,7 +16,6 @@
*/
package org.apache.juneau.httppart;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.reflect.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
index afce1ee11f..e18b8a1c25 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/parser/ParserSession.java
@@ -33,7 +33,6 @@ import org.apache.juneau.collections.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.httppart.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.objecttools.*;
import org.apache.juneau.swap.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
index 0594325a08..c5c7446380 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerPipe.java
@@ -23,11 +23,9 @@ import static org.apache.juneau.common.utils.Utils.*;
import java.io.*;
import java.nio.charset.*;
-import org.apache.juneau.*;
import org.apache.juneau.common.io.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.utils.*;
-import org.apache.juneau.internal.*;
/**
* A wrapper around an object that a serializer sends its output to.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
index a936dbb59c..fe7ce66d33 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/BuilderSwap.java
@@ -24,7 +24,6 @@ import java.lang.reflect.*;
import org.apache.juneau.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.reflect.*;
-import org.apache.juneau.common.reflect.*;
/**
* Specialized transform for builder classes.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
index d04b9b59ff..e8244c3ddd 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swaps/TemporalSwap.java
@@ -28,7 +28,6 @@ import java.util.concurrent.*;
import org.apache.juneau.*;
import org.apache.juneau.common.reflect.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.swap.*;
/**
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
index ea268ec9b0..d6008da0eb 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/uon/UonSerializerSession.java
@@ -29,7 +29,6 @@ import java.util.function.*;
import org.apache.juneau.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.httppart.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.serializer.*;
import org.apache.juneau.svl.*;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
index fedb706ca7..a3af8bae34 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/xml/XmlUtils.java
@@ -25,11 +25,9 @@ import java.util.*;
import javax.xml.stream.*;
-import org.apache.juneau.*;
import org.apache.juneau.common.io.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.utils.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.xml.annotation.*;
/**
diff --git
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
index 6fb182e2c1..e95270c180 100644
---
a/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
+++
b/juneau-microservice/juneau-microservice-jetty/src/main/java/org/apache/juneau/microservice/jetty/JettyMicroservice.java
@@ -37,7 +37,6 @@ import org.apache.juneau.cp.*;
import org.apache.juneau.microservice.*;
import org.apache.juneau.microservice.console.*;
import org.apache.juneau.parser.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.servlet.*;
import org.apache.juneau.svl.*;
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
index 7314ab7aef..fe845353ba 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseContent.java
@@ -41,7 +41,6 @@ import org.apache.juneau.oapi.*;
import org.apache.juneau.objecttools.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.parser.ParseException;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.rest.client.assertion.*;
/**
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
index 5c822cb1e6..b2f2f98883 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/ResponseHeader.java
@@ -34,7 +34,6 @@ import org.apache.juneau.http.header.*;
import org.apache.juneau.httppart.*;
import org.apache.juneau.oapi.*;
import org.apache.juneau.parser.ParseException;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.rest.client.assertion.*;
/**
diff --git
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
index ca0222cdd6..5823047d95 100644
---
a/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
+++
b/juneau-rest/juneau-rest-client/src/main/java/org/apache/juneau/rest/client/RestClient.java
@@ -89,7 +89,6 @@ import org.apache.juneau.objecttools.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.parser.ParseException;
import org.apache.juneau.plaintext.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.rest.client.assertion.*;
import org.apache.juneau.rest.client.remote.*;
import org.apache.juneau.serializer.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
index 88ed30095f..8c23630441 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/header/HeaderList.java
@@ -28,7 +28,6 @@ import java.util.stream.*;
import org.apache.http.*;
import org.apache.http.util.*;
-import org.apache.juneau.collections.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.http.HttpHeaders;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
index 22f963e6ac..7817ac5567 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/PartList.java
@@ -28,7 +28,6 @@ import java.util.stream.*;
import org.apache.http.*;
import org.apache.http.util.*;
-import org.apache.juneau.collections.*;
import org.apache.juneau.common.collections.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteDelete.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteDelete.java
index c6685e8641..f3654d7d23 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteDelete.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteDelete.java
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.io.*;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteGet.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteGet.java
index 2c01085bbb..4d1736afbc 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteGet.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteGet.java
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.io.*;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteOp.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteOp.java
index 48da4958d0..a3c696d306 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteOp.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemoteOp.java
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.io.*;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePatch.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePatch.java
index ade5ef065b..5466ab296d 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePatch.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePatch.java
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.io.*;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePost.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePost.java
index 32d5d514e5..cf478c9705 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePost.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePost.java
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.io.*;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePut.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePut.java
index 0bf0e6aa27..2d38d850f7 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePut.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RemotePut.java
@@ -22,7 +22,6 @@ import static java.lang.annotation.RetentionPolicy.*;
import java.io.*;
import java.lang.annotation.*;
-import org.apache.juneau.annotation.*;
import org.apache.juneau.common.annotation.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMethodMeta.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMethodMeta.java
index 23d1c902c9..627c9847c5 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMethodMeta.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/remote/RrpcInterfaceMethodMeta.java
@@ -16,8 +16,6 @@
*/
package org.apache.juneau.http.remote;
-import static org.apache.juneau.common.reflect.ClassArrayFormat.*;
-import static org.apache.juneau.common.reflect.ClassNameFormat.*;
import static org.apache.juneau.common.utils.StringUtils.*;
import java.lang.reflect.*;
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 48f6c9258f..ae21cc3c83 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
@@ -65,7 +65,6 @@ import org.apache.juneau.jsonschema.*;
import org.apache.juneau.oapi.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.parser.ParseException;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.arg.*;
import org.apache.juneau.rest.debug.*;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
index 9d43de2ea7..9920a45188 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestOpSession.java
@@ -22,8 +22,6 @@ import org.apache.http.*;
import org.apache.juneau.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.http.response.*;
-import org.apache.juneau.rest.converter.*;
-import org.apache.juneau.rest.guard.*;
import org.apache.juneau.rest.logger.*;
/**
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 35607cab0f..92d400638d 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
@@ -19,8 +19,6 @@ package org.apache.juneau.rest.debug;
import static org.apache.juneau.common.utils.StringUtils.*;
import static org.apache.juneau.rest.annotation.RestOpAnnotation.*;
-import java.util.*;
-
import org.apache.juneau.*;
import org.apache.juneau.cp.*;
import org.apache.juneau.common.reflect.*;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/SerializedPojoProcessor.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/SerializedPojoProcessor.java
index 1a5ca816e7..c0c1beb687 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/SerializedPojoProcessor.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/processor/SerializedPojoProcessor.java
@@ -20,8 +20,6 @@ import static org.apache.juneau.common.utils.StringUtils.*;
import static org.apache.juneau.common.utils.Utils.*;
import java.io.*;
-import java.util.*;
-
import org.apache.juneau.*;
import org.apache.juneau.http.header.*;
import org.apache.juneau.http.response.*;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
index e9cf36fb54..7a8f05fa21 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/remote/RrpcServlet.java
@@ -37,7 +37,6 @@ import org.apache.juneau.http.header.*;
import org.apache.juneau.http.remote.*;
import org.apache.juneau.http.response.*;
import org.apache.juneau.parser.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.reflect.*;
import org.apache.juneau.rest.annotation.*;
import org.apache.juneau.rest.servlet.*;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java
index ce29e109f9..24da48f1e6 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/ContentTypeMenuItem.java
@@ -25,7 +25,6 @@ import org.apache.juneau.*;
import org.apache.juneau.bean.html5.*;
import org.apache.juneau.common.utils.*;
import org.apache.juneau.rest.*;
-import org.apache.juneau.serializer.*;
/**
* Widget that returns back a list of hyperlinks for rendering the contents of
a page in a variety of content types.
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
index d686ab0b50..4289a26dcc 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/widget/MenuItemWidget.java
@@ -25,7 +25,6 @@ import java.io.*;
import org.apache.juneau.common.io.*;
import org.apache.juneau.html.*;
-import org.apache.juneau.internal.*;
import org.apache.juneau.rest.*;
import org.apache.juneau.serializer.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/BasicRuntimeException_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/BasicRuntimeException_Test.java
index f5973aa9d5..57443cbca9 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/BasicRuntimeException_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/BasicRuntimeException_Test.java
@@ -19,7 +19,6 @@ package org.apache.juneau;
import static org.junit.jupiter.api.Assertions.*;
import org.apache.juneau.annotation.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.objecttools.*;
import org.apache.juneau.parser.*;
import org.apache.juneau.rest.client.remote.*;
diff --git a/juneau-utest/src/test/java/org/apache/juneau/BenchmarkRunner.java
b/juneau-utest/src/test/java/org/apache/juneau/BenchmarkRunner.java
index 2a7601b041..5bf0055917 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/BenchmarkRunner.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/BenchmarkRunner.java
@@ -17,7 +17,6 @@
package org.apache.juneau;
import java.util.*;
-import java.util.Map.*;
import java.util.concurrent.*;
import java.util.function.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/AnnotationInfoTest.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/AnnotationInfoTest.java
index 0e90465801..ad48f5b1fc 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/AnnotationInfoTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/AnnotationInfoTest.java
@@ -23,8 +23,6 @@ import static org.apache.juneau.junit.bct.BctAssertions.*;
import java.lang.annotation.*;
import org.apache.juneau.*;
-import org.apache.juneau.annotation.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.annotation.*;
import org.junit.jupiter.api.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
index ad446e933a..ffd2074590 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ClassInfo_Test.java
@@ -37,9 +37,7 @@ import java.util.stream.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.collections.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.svl.*;
import org.junit.jupiter.api.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
index cd23644ade..c199e56b71 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ConstructorInfoTest.java
@@ -26,7 +26,6 @@ import java.util.function.*;
import java.util.stream.*;
import org.apache.juneau.*;
-import org.apache.juneau.common.reflect.*;
import org.junit.jupiter.api.*;
class ConstructorInfoTest extends TestBase {
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
index 5634d4fa1c..da935e821a 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ExecutableInfo_Test.java
@@ -30,7 +30,6 @@ import java.util.function.*;
import java.util.stream.*;
import org.apache.juneau.*;
-import org.apache.juneau.common.reflect.*;
import org.junit.jupiter.api.*;
class ExecutableInfo_Test extends TestBase {
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
index d5d856a417..53872e7032 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/FieldInfo_Test.java
@@ -27,7 +27,6 @@ import java.lang.reflect.*;
import java.util.function.*;
import org.apache.juneau.*;
-import org.apache.juneau.common.reflect.*;
import org.junit.jupiter.api.*;
class FieldInfo_Test extends TestBase {
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 3064cbd006..ad4bb84573 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
@@ -30,7 +30,6 @@ import java.util.stream.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
-import org.apache.juneau.common.reflect.*;
import org.apache.juneau.svl.*;
import org.junit.jupiter.api.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
index b5b644179e..1a8ab045d5 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/common/reflect/ParamInfoTest.java
@@ -29,7 +29,6 @@ import java.util.stream.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
-import org.apache.juneau.common.reflect.*;
import org.junit.jupiter.api.*;
/**
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
index ec1e398c3e..763bf006a5 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/cp/BeanStore_Test.java
@@ -30,7 +30,6 @@ import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.common.reflect.*;
import org.apache.juneau.common.utils.*;
-import org.apache.juneau.common.reflect.*;
import org.junit.jupiter.api.*;
class BeanStore_Test extends TestBase {
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Restx_ReqAttrs_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Restx_ReqAttrs_Test.java
index ca995d0d29..d0ed0cf153 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Restx_ReqAttrs_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/annotation/Restx_ReqAttrs_Test.java
@@ -16,8 +16,6 @@
*/
package org.apache.juneau.rest.annotation;
-import java.util.*;
-
import org.apache.juneau.*;
import org.apache.juneau.collections.*;
import org.apache.juneau.http.annotation.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Body_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Body_Test.java
index df27419c5a..5e04835f78 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Body_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Body_Test.java
@@ -27,7 +27,6 @@ import org.apache.http.*;
import org.apache.juneau.*;
import org.apache.juneau.json.*;
import org.apache.juneau.rest.annotation.*;
-import org.apache.juneau.rest.httppart.*;
import org.apache.juneau.rest.mock.*;
import org.apache.juneau.rest.servlet.*;
import org.apache.juneau.testutils.pojos.*;
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringBuilderWriterTest.java
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringBuilderWriterTest.java
index cb995a16d0..f4da96960c 100755
---
a/juneau-utest/src/test/java/org/apache/juneau/utils/StringBuilderWriterTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/utils/StringBuilderWriterTest.java
@@ -20,7 +20,6 @@ import static org.junit.jupiter.api.Assertions.*;
import org.apache.juneau.*;
import org.apache.juneau.common.io.*;
-import org.apache.juneau.internal.*;
import org.junit.jupiter.api.*;
class StringBuilderWriterTest extends TestBase {