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 fbfd9ae76a New BeanCreator API
fbfd9ae76a is described below
commit fbfd9ae76aabdccbdd8c2bf579e7fa036759de37
Author: James Bognar <[email protected]>
AuthorDate: Wed Jan 21 12:38:41 2026 -0500
New BeanCreator API
---
.../juneau/assertions/FluentObjectAssertion.java | 2 +-
.../apache/juneau/commons/reflect/ClassInfo.java | 126 +++++++++++++--
.../apache/juneau/commons/reflect/MethodInfo.java | 16 +-
.../apache/juneau/commons/utils/ClassUtils.java | 2 +-
.../main/java/org/apache/juneau/BeanContext.java | 6 +-
.../src/main/java/org/apache/juneau/BeanMeta.java | 18 +--
.../java/org/apache/juneau/BeanPropertyMeta.java | 20 +--
.../main/java/org/apache/juneau/BeanRegistry.java | 4 +-
.../main/java/org/apache/juneau/BeanSession.java | 6 +-
.../src/main/java/org/apache/juneau/ClassMeta.java | 46 +++---
.../src/main/java/org/apache/juneau/Context.java | 2 +-
.../org/apache/juneau/collections/JsonMap.java | 2 +-
.../org/apache/juneau/internal/ClassUtils2.java | 2 +-
.../jsonschema/JsonSchemaGeneratorSession.java | 4 +-
.../juneau/serializer/SerializerSession.java | 4 +-
.../org/apache/juneau/swap/AutoNumberSwap.java | 4 +-
.../java/org/apache/juneau/swap/BuilderSwap.java | 2 +-
.../java/org/apache/juneau/swap/ObjectSwap.java | 4 +-
.../microservice/jetty/JettyMicroservice.java | 4 +-
.../org/apache/juneau/rest/client/RestClient.java | 4 +-
.../java/org/apache/juneau/http/HttpHeaders.java | 2 +-
.../java/org/apache/juneau/http/HttpParts.java | 6 +-
.../org/apache/juneau/http/part/BasicPart.java | 2 +-
.../java/org/apache/juneau/rest/RestContext.java | 2 +-
.../juneau/commons/reflect/ClassInfo_Test.java | 178 +++++++++++++--------
.../client/RestClient_Config_RestClient_Test.java | 2 +-
26 files changed, 310 insertions(+), 160 deletions(-)
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 8da62f289f..cd4ec38ba7 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
@@ -504,7 +504,7 @@ public class FluentObjectAssertion<T,R> extends
FluentAssertion<R> {
*/
public R isType(Class<?> parent) throws AssertionError {
assertArgNotNull("parent", parent);
- if (! info(value()).isChildOf(parent))
+ if (! info(value()).isAssignableTo(parent))
throw error(MSG_unexpectedType, cn(parent), cn(value));
return returns();
}
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
index 60fbd14a98..1d7af58f8f 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/ClassInfo.java
@@ -461,7 +461,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
if (inner.isInstance(child))
return true;
if (this.isPrimitive())
- return
this.getWrapperIfPrimitive().isParentOf(of(child).getWrapperIfPrimitive());
+ return
this.getWrapperIfPrimitive().isAssignableFrom(of(child).getWrapperIfPrimitive());
return false;
}
@@ -2010,18 +2010,65 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @param parent The parent class.
* @return <jk>true</jk> if this class is a child or the same as
<c>parent</c>.
*/
- public boolean isChildOf(Class<?> parent) {
+ public boolean isAssignableTo(Class<?> parent) {
return and(nn(inner), nn(parent)) &&
parent.isAssignableFrom(inner);
}
+ /**
+ * Returns <jk>true</jk> if this class is strictly a child of
<c>parent</c> (not the same class).
+ *
+ * <p>
+ * This method returns <jk>true</jk> only if this class is a child of
the parent class,
+ * excluding the case where they are the same class.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * ClassInfo <jv>child</jv> =
ClassInfo.<jsm>of</jsm>(ArrayList.<jk>class</jk>);
+ * ClassInfo <jv>parent</jv> =
ClassInfo.<jsm>of</jsm>(List.<jk>class</jk>);
+ * <jk>boolean</jk> <jv>b1</jv> =
<jv>child</jv>.isChildOf(List.<jk>class</jk>); <jc>// true</jc>
+ * <jk>boolean</jk> <jv>b2</jv> =
<jv>child</jv>.isChildOf(ArrayList.<jk>class</jk>); <jc>// false (same
class)</jc>
+ * </p>
+ *
+ * @param parent The parent class.
+ * @return <jk>true</jk> if this class is strictly a child of
<c>parent</c>.
+ */
+ public boolean isChildOf(Class<?> parent) {
+ return and(nn(inner), nn(parent)) && neq(inner, parent) &&
parent.isAssignableFrom(inner);
+ }
+
+ /**
+ * Returns <jk>true</jk> if this class is strictly a child of
<c>parent</c> (not the same class).
+ *
+ * <p>
+ * Same as {@link #isChildOf(Class)} but takes in a {@link ClassInfo}.
+ *
+ * @param parent The parent class.
+ * @return <jk>true</jk> if this class is strictly a child of
<c>parent</c>.
+ */
+ public boolean isChildOf(ClassInfo parent) {
+ return and(nn(inner), nn(parent)) && neq(inner, parent.inner())
&& parent.inner().isAssignableFrom(inner);
+ }
+
+ /**
+ * Returns <jk>true</jk> if this class is strictly a child of
<c>parent</c> (not the same class).
+ *
+ * @param parent The parent class.
+ * @return <jk>true</jk> if this class is strictly a child of
<c>parent</c>.
+ */
+ public boolean isChildOf(Type parent) {
+ if (parent instanceof Class<?> c)
+ return isChildOf(c);
+ return false;
+ }
+
/**
* Returns <jk>true</jk> if this class is a child or the same as
<c>parent</c>.
*
* @param parent The parent class.
* @return <jk>true</jk> if this class is a parent or the same as
<c>parent</c>.
*/
- public boolean isChildOf(ClassInfo parent) {
- return isChildOf(parent.inner());
+ public boolean isAssignableTo(ClassInfo parent) {
+ return isAssignableTo(parent.inner());
}
/**
@@ -2030,9 +2077,9 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @param parent The parent class.
* @return <jk>true</jk> if this class is a parent or the same as
<c>parent</c>.
*/
- public boolean isChildOf(Type parent) {
+ public boolean isAssignableTo(Type parent) {
if (parent instanceof Class<?> c)
- return isChildOf(c);
+ return isAssignableTo(c);
return false;
}
@@ -2042,9 +2089,9 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @param parents The parents class.
* @return <jk>true</jk> if this class is a child or the same as any of
the <c>parents</c>.
*/
- public boolean isChildOfAny(Class<?>...parents) {
+ public boolean isAssignableToAny(Class<?>...parents) {
for (var p : parents)
- if (isChildOf(p))
+ if (isAssignableTo(p))
return true;
return false;
}
@@ -2180,16 +2227,63 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @param child The child class.
* @return <jk>true</jk> if this class is a parent or the same as
<c>child</c>.
*/
- public boolean isParentOf(Class<?> child) {
+ public boolean isAssignableFrom(Class<?> child) {
return nn(inner) && nn(child) && inner.isAssignableFrom(child);
}
/**
- * Returns <jk>true</jk> if this class is a parent or the same as
<c>child</c>.
+ * Returns <jk>true</jk> if this class is strictly a parent of
<c>child</c> (not the same class).
+ *
+ * <p>
+ * This method returns <jk>true</jk> only if this class is a parent of
the child class,
+ * excluding the case where they are the same class.
+ *
+ * <h5 class='section'>Example:</h5>
+ * <p class='bjava'>
+ * ClassInfo <jv>parent</jv> =
ClassInfo.<jsm>of</jsm>(List.<jk>class</jk>);
+ * ClassInfo <jv>child</jv> =
ClassInfo.<jsm>of</jsm>(ArrayList.<jk>class</jk>);
+ * <jk>boolean</jk> <jv>b1</jv> =
<jv>parent</jv>.isParentOf(ArrayList.<jk>class</jk>); <jc>// true</jc>
+ * <jk>boolean</jk> <jv>b2</jv> =
<jv>parent</jv>.isParentOf(List.<jk>class</jk>); <jc>// false (same class)</jc>
+ * </p>
+ *
+ * @param child The child class.
+ * @return <jk>true</jk> if this class is strictly a parent of
<c>child</c>.
+ */
+ public boolean isParentOf(Class<?> child) {
+ return nn(inner) && nn(child) && neq(inner, child) &&
inner.isAssignableFrom(child);
+ }
+
+ /**
+ * Returns <jk>true</jk> if this class is strictly a parent of
<c>child</c> (not the same class).
*
* <p>
* Same as {@link #isParentOf(Class)} but takes in a {@link ClassInfo}.
*
+ * @param child The child class.
+ * @return <jk>true</jk> if this class is strictly a parent of
<c>child</c>.
+ */
+ public boolean isParentOf(ClassInfo child) {
+ return nn(inner) && nn(child) && neq(inner, child.inner()) &&
inner.isAssignableFrom(child.inner());
+ }
+
+ /**
+ * Returns <jk>true</jk> if this class is strictly a parent of
<c>child</c> (not the same class).
+ *
+ * @param child The child class.
+ * @return <jk>true</jk> if this class is strictly a parent of
<c>child</c>.
+ */
+ public boolean isParentOf(Type child) {
+ if (child instanceof Class<?> c)
+ return isParentOf(c);
+ return false;
+ }
+
+ /**
+ * Returns <jk>true</jk> if this class is a parent or the same as
<c>child</c>.
+ *
+ * <p>
+ * Same as {@link #isAssignableFrom(Class)} but takes in a {@link
ClassInfo}.
+ *
* <h5 class='section'>Example:</h5>
* <p class='bjava'>
* ClassInfo <jv>parent</jv> =
ClassInfo.<jsm>of</jsm>(List.<jk>class</jk>);
@@ -2200,7 +2294,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @param child The child class.
* @return <jk>true</jk> if this class is a parent or the same as
<c>child</c>.
*/
- public boolean isParentOf(ClassInfo child) {
+ public boolean isAssignableFrom(ClassInfo child) {
return nn(inner) && nn(child) &&
inner.isAssignableFrom(child.inner());
}
@@ -2210,9 +2304,9 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
* @param child The child class.
* @return <jk>true</jk> if this class is a parent or the same as
<c>child</c>.
*/
- public boolean isParentOf(Type child) {
+ public boolean isAssignableFrom(Type child) {
if (child instanceof Class<?> c)
- return isParentOf(c);
+ return isAssignableFrom(c);
return false;
}
@@ -2243,7 +2337,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
if (inner.isAssignableFrom(child))
return true;
if (this.isPrimitive() || child.isPrimitive()) {
- return
this.getWrapperIfPrimitive().isParentOf(of(child).getWrapperIfPrimitive());
+ return
this.getWrapperIfPrimitive().isAssignableFrom(of(child).getWrapperIfPrimitive());
}
return false;
}
@@ -2263,7 +2357,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
// Note: If both are primitives and the same type, we would
have returned true above
// So this branch is only reached when at least one is a
primitive and they're not directly assignable
if (this.isPrimitive() || child.isPrimitive()) {
- return
this.getWrapperIfPrimitive().isParentOf(child.getWrapperIfPrimitive());
+ return
this.getWrapperIfPrimitive().isAssignableFrom(child.getWrapperIfPrimitive());
}
return false;
}
@@ -2314,7 +2408,7 @@ public class ClassInfo extends ElementInfo implements
Annotatable, Type, Compara
*
* @return <jk>true</jk> if this class is a {@link RuntimeException}.
*/
- public boolean isRuntimeException() { return
isChildOf(RuntimeException.class); }
+ public boolean isRuntimeException() { return
isAssignableTo(RuntimeException.class); }
/**
* Returns <jk>true</jk> if this class is a sealed class.
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
index b01fabdf56..b3b18938b9 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/reflect/MethodInfo.java
@@ -182,6 +182,20 @@ public class MethodInfo extends ExecutableInfo implements
Comparable<MethodInfo>
}
}
}
+ // Tie-breaker: if methods have same name and parameters (e.g.,
overridden methods),
+ // prefer methods from child classes over parent classes
+ // This ensures consistent ordering and that child methods
(with covariant return types) come first
+ if (i == 0) {
+ var declaringClass = getDeclaringClass();
+ var oDeclaringClass = o.getDeclaringClass();
+ if (declaringClass.isParentOf(oDeclaringClass)) {
+ i = -1; // This method is from a child class,
so it comes first
+ } else if (oDeclaringClass.isParentOf(declaringClass)) {
+ i = 1; // Other method is from a child class,
so it comes first
+ } else {
+ i = cmp(declaringClass.getName(),
oDeclaringClass.getName()); // Neither is a child of the other, compare by
class name for deterministic ordering
+ }
+ }
return i;
}
@@ -531,7 +545,7 @@ public class MethodInfo extends ExecutableInfo implements
Comparable<MethodInfo>
* @return <jk>true</jk> if this method has this parent return type.
*/
public boolean hasReturnTypeParent(Class<?> c) {
- return ClassInfo.of(c).isParentOf(inner.getReturnType());
+ return ClassInfo.of(c).isAssignableFrom(inner.getReturnType());
}
/**
diff --git
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
index bb6c2f4a6a..64314e8f00 100644
---
a/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
+++
b/juneau-core/juneau-commons/src/main/java/org/apache/juneau/commons/utils/ClassUtils.java
@@ -353,7 +353,7 @@ public class ClassUtils {
for (var i = 0; i < paramTypes.length; i++) {
var pt = info(paramTypes[i]).getWrapperIfPrimitive();
for (var arg : args) {
- if (nn(arg) && pt.isParentOf(arg.getClass())) {
+ if (nn(arg) &&
pt.isAssignableFrom(arg.getClass())) {
params[i] = arg;
break;
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
index 4a508d6270..a161335301 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/BeanContext.java
@@ -3676,9 +3676,9 @@ public class BeanContext extends Context {
_objectSwaps.add(os);
} else {
var ci = info((Class<?>)x);
- if (ci.isChildOf(ObjectSwap.class))
+ if (ci.isAssignableTo(ObjectSwap.class))
_objectSwaps.add(BeanCreator.of(ObjectSwap.class).type(ci).run());
- else if (ci.isChildOf(Surrogate.class))
+ else if (ci.isAssignableTo(Surrogate.class))
_objectSwaps.addAll(SurrogateSwap.findObjectSwaps(ci.inner(), this));
else
throw rex("Invalid class {0} specified
in BeanContext.swaps property. Must be a subclass of ObjectSwap or
Surrogate.", cn(ci.inner()));
@@ -4258,7 +4258,7 @@ public class BeanContext extends Context {
return true;
}
for (var exclude : notBeanClasses)
- if (ci.isChildOf(exclude))
+ if (ci.isAssignableTo(exclude))
return true;
return false;
}
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 ff3aacc256..a463f0c192 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
@@ -132,7 +132,7 @@ public class BeanMeta<T> {
return true;
// Doesn't match if not same type or super type as
getter/field.
- if (! type.isParentOf(pt))
+ if (! type.isAssignableFrom(pt))
return false;
// If a setter was previously set, only use this setter
if it's a closer
@@ -212,7 +212,7 @@ public class BeanMeta<T> {
if (bc.isNotABean(cm))
return notABean("Class matches exclude-class
list");
- if (bc.isBeansRequireSerializable() && !
cm.isChildOf(Serializable.class) && ! ap.has(Bean.class, cm))
+ if (bc.isBeansRequireSerializable() && !
cm.isAssignableTo(Serializable.class) && ! ap.has(Bean.class, cm))
return notABean("Class is not serializable");
if (ap.has(BeanIgnore.class, cm))
@@ -1093,9 +1093,9 @@ public class BeanMeta<T> {
if (params.isEmpty()) {
if ("*".equals(bpName)) {
- if
(rt.isChildOf(Collection.class)) {
+ if
(rt.isAssignableTo(Collection.class)) {
methodType = EXTRAKEYS;
- } else if
(rt.isChildOf(Map.class)) {
+ } else if
(rt.isAssignableTo(Map.class)) {
methodType = GETTER;
}
n = bpName;
@@ -1119,17 +1119,17 @@ public class BeanMeta<T> {
}
} else if (params.size() == 1) {
if ("*".equals(bpName)) {
- if
(params.get(0).getParameterType().isChildOf(Map.class)) {
+ if
(params.get(0).getParameterType().isAssignableTo(Map.class)) {
methodType = SETTER;
n = bpName;
} else if
(params.get(0).getParameterType().is(String.class)) {
methodType = GETTER;
n = bpName;
}
- } else if (n.startsWith("set") &&
(rt.isParentOf(ci) || rt.is(Void.TYPE))) {
+ } else if (n.startsWith("set") &&
(rt.isAssignableFrom(ci) || rt.is(Void.TYPE))) {
methodType = SETTER;
n = n.substring(3);
- } else if (n.startsWith("with") &&
(rt.isParentOf(ci))) {
+ } else if (n.startsWith("with") &&
(rt.isAssignableFrom(ci))) {
methodType = SETTER;
n = n.substring(4);
} else if (nn(bpName)) {
@@ -1141,12 +1141,12 @@ public class BeanMeta<T> {
} else {
n = bpName;
}
- } else if (fluentSetters &&
rt.isParentOf(ci)) {
+ } else if (fluentSetters &&
rt.isAssignableFrom(ci)) {
methodType = SETTER;
}
} else if (params.size() == 2) {
if ("*".equals(bpName) &&
params.get(0).getParameterType().is(String.class)) {
- if (n.startsWith("set") &&
(rt.isParentOf(ci) || rt.is(Void.TYPE))) {
+ if (n.startsWith("set") &&
(rt.isAssignableFrom(ci) || rt.is(Void.TYPE))) {
methodType = SETTER;
} else {
methodType = GETTER;
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 27db36e58e..d80e46a925 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
@@ -154,7 +154,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (isVoid(c))
return null;
var ci = info(c);
- if (ci.isChildOf(ObjectSwap.class)) {
+ if (ci.isAssignableTo(ObjectSwap.class)) {
var ps =
BeanCreator.of(ObjectSwap.class).type(ci).run();
if (nn(ps.forMediaTypes()))
throw unsupportedOp("TODO - Media types
on swaps not yet supported on bean properties.");
@@ -162,7 +162,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
throw unsupportedOp("TODO - Templates
on swaps not yet supported on bean properties.");
return ps;
}
- if (ci.isChildOf(Surrogate.class))
+ if (ci.isAssignableTo(Surrogate.class))
throw unsupportedOp("TODO - Surrogate swaps not
yet supported on bean properties.");
throw rex("Invalid class used in @Swap annotation.
Must be a subclass of ObjectSwap or Surrogate. {0}", cn(c));
}
@@ -362,7 +362,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (nn(getter)) {
var pt = getter.getParameterTypes();
if (isDyna) {
- if (ci.isChildOf(Map.class) && e(pt)) {
+ if (ci.isAssignableTo(Map.class) &&
e(pt)) {
isDynaGetterMap = true;
} else if (pt.size() == 1 &&
pt.get(0).is(String.class)) {
// OK.
@@ -370,7 +370,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
return false;
}
} else {
- if (!
ci.isChildOf(getter.getReturnType()))
+ if (!
ci.isAssignableTo(getter.getReturnType()))
return false;
}
}
@@ -383,16 +383,16 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
return false;
}
} else {
- if (pt.size() != 1 || !
ci.isChildOf(pt.get(0).inner()))
+ if (pt.size() != 1 || !
ci.isAssignableTo(pt.get(0).inner()))
return false;
}
}
if (nn(field)) {
if (isDyna) {
- if (!
field.getFieldType().isChildOf(Map.class))
+ if (!
field.getFieldType().isAssignableTo(Map.class))
return false;
} else {
- if (!
ci.isChildOf(field.getFieldType()))
+ if (!
ci.isAssignableTo(field.getFieldType()))
return false;
}
}
@@ -999,7 +999,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
var vc = value1 == null ? null :
value1.getClass();
- if (isMap && (setter == null || !
pcInfo.isParentOf(vc))) {
+ if (isMap && (setter == null || !
pcInfo.isAssignableFrom(vc))) {
if (! (value1 instanceof Map)) {
if (value1 instanceof
CharSequence value21)
@@ -1057,7 +1057,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
if (nn(setter) || nn(field))
invokeSetter(bean, pName,
propMap);
- } else if (isCollection && (setter == null || !
pcInfo.isParentOf(vc))) {
+ } else if (isCollection && (setter == null || !
pcInfo.isAssignableFrom(vc))) {
if (! (value1 instanceof Collection)) {
if (value1 instanceof
CharSequence value2)
@@ -1116,7 +1116,7 @@ public class BeanPropertyMeta implements
Comparable<BeanPropertyMeta> {
});
} else {
- if (nn(swap) && value1 != null &&
swap.getSwapClass().isParentOf(value1.getClass())) {
+ if (nn(swap) && value1 != null &&
swap.getSwapClass().isAssignableFrom(value1.getClass())) {
value1 = swap.unswap(session,
value1, rawTypeMeta);
} else {
value1 =
session.convertToType(value1, rawTypeMeta);
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 df74e20152..603eea18b2 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
@@ -132,7 +132,7 @@ public class BeanRegistry {
private void addClass(ClassInfo ci) {
try {
if (nn(ci) && nn(ci.inner())) {
- if (ci.isChildOf(Collection.class)) {
+ if (ci.isAssignableTo(Collection.class)) {
Collection<?> cc =
BeanCreator.of(Collection.class).type(ci).run();
cc.forEach(x -> {
if (x instanceof Class<?> x2)
@@ -140,7 +140,7 @@ public class BeanRegistry {
else
throw bex("Collection
class ''{0}'' passed to BeanRegistry does not contain Class objects.",
ci.getName());
});
- } else if (ci.isChildOf(Map.class)) {
+ } else if (ci.isAssignableTo(Map.class)) {
Map<?,?> m =
BeanCreator.of(Map.class).type(ci).run();
m.forEach((k, v) -> {
var typeName = s(k);
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 9468f513af..3f2032393c 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
@@ -1173,7 +1173,7 @@ public class BeanSession extends ContextSession {
if (nn(swap)) {
var nc = swap.getNormalClass();
var fc = swap.getSwapClass();
- if (nc.isParentOf(tc) &&
fc.isParentOf(value.getClass()))
+ if (nc.isAssignableFrom(tc) &&
fc.isAssignableFrom(value.getClass()))
return (T)swap.unswap(this, value, to);
var fcm = getClassMeta(fc);
if (fcm.isNumber() && value instanceof Number
value2) {
@@ -1187,7 +1187,7 @@ public class BeanSession extends ContextSession {
if (nn(swap)) {
var nc = swap.getNormalClass();
var fc = swap.getSwapClass();
- if (nc.isParentOf(from.inner()) &&
fc.isParentOf(tc))
+ if (nc.isAssignableFrom(from.inner()) &&
fc.isAssignableFrom(tc))
return (T)swap.swap(this, value);
}
@@ -1494,7 +1494,7 @@ public class BeanSession extends ContextSession {
var typeName =
m2.getString(getBeanTypePropertyName(to));
if (nn(typeName)) {
var cm =
to.getBeanRegistry().getClassMeta(typeName);
- if (nn(cm) &&
to.isParentOf(cm.inner()))
+ if (nn(cm) &&
to.isAssignableFrom(cm.inner()))
return (T)m2.cast(cm);
}
}
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 3b2b9b106d..bdf6998617 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
@@ -190,48 +190,48 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
var ap = beanContext.getAnnotationProvider();
- if (isChildOf(Delegate.class)) {
+ if (isAssignableTo(Delegate.class)) {
cat.set(DELEGATE);
}
if (isEnum()) {
cat.set(ENUM);
- } else if (isChildOf(CharSequence.class)) {
+ } else if (isAssignableTo(CharSequence.class)) {
cat.set(CHARSEQ);
if (is(String.class)) {
cat.set(STR);
}
- } else if (isChildOf(Number.class) || isAny(byte.class,
short.class, int.class, long.class, float.class, double.class)) {
+ } else if (isAssignableTo(Number.class) || isAny(byte.class,
short.class, int.class, long.class, float.class, double.class)) {
cat.set(NUMBER);
- if (isChildOfAny(Float.class, Double.class) ||
isAny(float.class, double.class)) {
+ if (isAssignableToAny(Float.class, Double.class) ||
isAny(float.class, double.class)) {
cat.set(DECIMAL);
}
- } else if (isChildOf(Collection.class)) {
+ } else if (isAssignableTo(Collection.class)) {
cat.set(COLLECTION);
- if (isChildOf(Set.class)) {
+ if (isAssignableTo(Set.class)) {
cat.set(SET);
- } else if (isChildOf(List.class)) {
+ } else if (isAssignableTo(List.class)) {
cat.set(LIST);
}
- } else if (isChildOf(Map.class)) {
+ } else if (isAssignableTo(Map.class)) {
cat.set(MAP);
- if (isChildOf(BeanMap.class)) {
+ if (isAssignableTo(BeanMap.class)) {
cat.set(BEANMAP);
}
- } else if (isChildOfAny(Date.class, Calendar.class)) {
- if (isChildOf(Date.class)) {
+ } else if (isAssignableToAny(Date.class, Calendar.class)) {
+ if (isAssignableTo(Date.class)) {
cat.set(DATE);
- } else if (isChildOf(Calendar.class)) {
+ } else if (isAssignableTo(Calendar.class)) {
cat.set(CALENDAR);
}
- } else if (isChildOf(Temporal.class)) {
+ } else if (isAssignableTo(Temporal.class)) {
cat.set(TEMPORAL);
} else if (inner().isArray()) {
cat.set(ARRAY);
- } else if (isChildOfAny(URL.class, URI.class) ||
ap.has(Uri.class, this)) {
+ } else if (isAssignableToAny(URL.class, URI.class) ||
ap.has(Uri.class, this)) {
cat.set(URI);
- } else if (isChildOf(Reader.class)) {
+ } else if (isAssignableTo(Reader.class)) {
cat.set(READER);
- } else if (isChildOf(InputStream.class)) {
+ } else if (isAssignableTo(InputStream.class)) {
cat.set(INPUTSTREAM);
}
@@ -262,11 +262,11 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
}
protected ObjectSwap<?,?> findSwap(Class<?> c) {
- return childSwaps.get().stream().filter(x ->
x.getNormalClass().isParentOf(c)).findFirst().orElse(null);
+ return childSwaps.get().stream().filter(x ->
x.getNormalClass().isAssignableFrom(c)).findFirst().orElse(null);
}
protected ObjectSwap<?,?> findUnswap(Class<?> c) {
- return childSwaps.get().stream().filter(x ->
x.getSwapClass().isParentOf(c)).findFirst().orElse(null);
+ return childSwaps.get().stream().filter(x ->
x.getSwapClass().isAssignableFrom(c)).findFirst().orElse(null);
}
@@ -1273,7 +1273,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
c = s.impl();
var ci = info(c);
- if (ci.isChildOf(ObjectSwap.class)) {
+ if (ci.isAssignableTo(ObjectSwap.class)) {
var ps =
BeanCreator.of(ObjectSwap.class).type(ci).run();
if (s.mediaTypes().length > 0)
ps.forMediaTypes(MediaType.ofAll(s.mediaTypes()));
@@ -1282,7 +1282,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
return ps;
}
- if (ci.isChildOf(Surrogate.class)) {
+ if (ci.isAssignableTo(Surrogate.class)) {
List<SurrogateSwap<?,?>> l =
SurrogateSwap.findObjectSwaps(c, beanContext);
if (! l.isEmpty())
return (ObjectSwap<T,?>)l.iterator().next();
@@ -1362,7 +1362,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
if (! swapArray.isEmpty()) {
var innerClass = inner();
for (var f : swapArray)
- if (f.getNormalClass().isParentOf(innerClass))
+ if
(f.getNormalClass().isAssignableFrom(innerClass))
list.add((ObjectSwap<T,?>)f);
}
@@ -1393,7 +1393,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
var list = new ArrayList<ObjectSwap<?,?>>();
var innerClass = inner();
for (var f : swapArray)
- if (f.getNormalClass().isChildOf(innerClass))
+ if (f.getNormalClass().isAssignableTo(innerClass))
list.add(f);
return u(list);
}
@@ -1447,7 +1447,7 @@ public class ClassMeta<T> extends ClassInfoTyped<T> {
return getDeclaredFields()
.stream()
- .filter(x -> x.isStatic() &&
isParentOf(x.getFieldType()) && ap.has(Example.class, x))
+ .filter(x -> x.isStatic() &&
isAssignableFrom(x.getFieldType()) && ap.has(Example.class, x))
.map(x -> x.accessible())
.findFirst()
.orElse(null);
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 5c8825d9ce..b77f27b50b 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
@@ -779,7 +779,7 @@ public abstract class Context {
var ct = info(cacheType);
var bt = info(builderType);
return ct
- .getPublicConstructor(x ->
x.hasNumParameters(1) &&
x.getParameter(0).getParameterType().isParentOf(builderType))
+ .getPublicConstructor(x ->
x.hasNumParameters(1) &&
x.getParameter(0).getParameterType().isAssignableFrom(builderType))
.orElseThrow(() -> rex("Public constructor not
found: {0}({1})", ct.getName(), bt.getName()));
})
.build();
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
index 5452817792..659ed8249d 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/collections/JsonMap.java
@@ -292,7 +292,7 @@ public class JsonMap extends LinkedHashMap<String,Object> {
* Otherwise, returns c2.
*/
private static ClassMeta<?> getNarrowedClassMeta(ClassMeta<?> c1,
ClassMeta<?> c2) {
- if (c2 == null || c2.isParentOf(c1.inner()))
+ if (c2 == null || c2.isAssignableFrom(c1.inner()))
return c1;
return c2;
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
index eebf21a9dc..cd25dd7f28 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ClassUtils2.java
@@ -51,7 +51,7 @@ public class ClassUtils2 {
for (var i = 0; i < paramTypes.length; i++) {
var pt = info(paramTypes[i]).getWrapperIfPrimitive();
for (var arg : args) {
- if (nn(arg) && pt.isParentOf(arg.getClass())) {
+ if (nn(arg) &&
pt.isAssignableFrom(arg.getClass())) {
params[i] = arg;
break;
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
index a678cb7ade..78ff9a9624 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/jsonschema/JsonSchemaGeneratorSession.java
@@ -430,13 +430,13 @@ public class JsonSchemaGeneratorSession extends
BeanTraverseSession {
} else if (tc == COLLECTION) {
ClassMeta et = sType.getElementType();
- if (sType.isCollection() &&
sType.isChildOf(Set.class))
+ if (sType.isCollection() &&
sType.isAssignableTo(Set.class))
out.put("uniqueItems", true);
out.put("items", getSchema(et, "items", pNames,
exampleAdded, descriptionAdded, null));
} else if (tc == ARRAY) {
ClassMeta et = sType.getElementType();
- if (sType.isCollection() &&
sType.isChildOf(Set.class))
+ if (sType.isCollection() &&
sType.isAssignableTo(Set.class))
out.put("uniqueItems", true);
out.put("items", getSchema(et, "items", pNames,
exampleAdded, descriptionAdded, null));
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
index b62cbe2620..bbff0e3f9d 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/serializer/SerializerSession.java
@@ -367,14 +367,14 @@ public class SerializerSession extends
BeanTraverseSession {
if (((Object[])value).length == 0)
return true;
}
- if (cm.isCollection() || (cm.isObject() &&
info(value).isChildOf(Collection.class))) {
+ if (cm.isCollection() || (cm.isObject() &&
info(value).isAssignableTo(Collection.class))) {
if (((Collection<?>)value).isEmpty())
return true;
}
}
if (isTrimEmptyMaps()) {
- if (cm.isMap() || (cm.isObject() &&
info(value).isChildOf(Map.class))) {
+ if (cm.isMap() || (cm.isObject() &&
info(value).isAssignableTo(Map.class))) {
if (((Map<?,?>)value).isEmpty())
return true;
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
index ea535af188..b26226693d 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoNumberSwap.java
@@ -155,7 +155,7 @@ public class AutoNumberSwap<T> extends ObjectSwap<T,Number>
{
mi.isNotDeprecated()
&& mi.isNotStatic()
&& mi.isVisible(bc.getBeanMethodVisibility())
- && (rt.isChildOf(Number.class) || (rt.isPrimitive() &&
rt.isAny(int.class, short.class, long.class, float.class, double.class,
byte.class)))
+ && (rt.isAssignableTo(Number.class) ||
(rt.isPrimitive() && rt.isAny(int.class, short.class, long.class, float.class,
double.class, byte.class)))
&& mi.hasAnyName(SWAP_METHOD_NAMES)
&& mi.hasParameterTypesLenient(BeanSession.class)
&& ! mi.getMatchingMethods().stream().anyMatch(m2 ->
bc.getAnnotationProvider().has(BeanIgnore.class, m2));
@@ -190,7 +190,7 @@ public class AutoNumberSwap<T> extends ObjectSwap<T,Number>
{
return
ci.isNonStaticMemberClass()
|| ci.isPrimitive()
- || ci.isChildOf(Number.class)
+ || ci.isAssignableTo(Number.class)
|| bc.getAnnotationProvider().has(BeanIgnore.class, ci);
// @formatter:on
}
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 807c0ce4c4..0faeabd6d8 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
@@ -111,7 +111,7 @@ public class BuilderSwap<T,B> {
var cc = pci.getPublicConstructor(
x -> x.isVisible(cVis)
&& x.hasNumParameters(1)
- &&
x.getParameter(0).getParameterType().isChildOf(Builder.class)
+ &&
x.getParameter(0).getParameterType().isAssignableTo(Builder.class)
).orElse(null);
// @formatter:on
if (nn(cc)) {
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
index 67f560c3b9..db526e81ab 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/ObjectSwap.java
@@ -226,7 +226,7 @@ public abstract class ObjectSwap<T,S> {
public boolean isNormalObject(Object o) {
if (o == null)
return false;
- return normalClassInfo.isParentOf(o.getClass());
+ return normalClassInfo.isAssignableFrom(o.getClass());
}
/**
@@ -240,7 +240,7 @@ public abstract class ObjectSwap<T,S> {
public boolean isSwappedObject(Object o) {
if (o == null)
return false;
- return swapClassInfo.isParentOf(o.getClass());
+ return swapClassInfo.isAssignableFrom(o.getClass());
}
/**
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 c450e62b19..40063f6991 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
@@ -573,7 +573,7 @@ public class JettyMicroservice extends Microservice {
for (var s :
cf.get("Jetty/servlets").asStringArray().orElse(new String[0])) {
try {
var c = info(Class.forName(s));
- if (c.isChildOf(RestServlet.class)) {
+ if (c.isAssignableTo(RestServlet.class)) {
var rs = (RestServlet)c.newInstance();
addServlet(rs, rs.getPath());
} else {
@@ -587,7 +587,7 @@ public class JettyMicroservice extends Microservice {
cf.get("Jetty/servletMap").asMap().orElse(EMPTY_MAP).forEach((k, v) -> {
try {
var c = info(Class.forName(v.toString()));
- if (c.isChildOf(Servlet.class)) {
+ if (c.isAssignableTo(Servlet.class)) {
var rs = (Servlet)c.newInstance();
addServlet(rs, k);
} else {
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 adcaa74397..a90016beae 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
@@ -2941,7 +2941,7 @@ public class RestClient extends BeanContextable
implements HttpClient, Closeable
continue;
var ci = ClassInfo.of(c);
if (nn(ci)) {
- if
(ci.isChildOfAny(RestCallInterceptor.class, HttpRequestInterceptor.class,
HttpResponseInterceptor.class))
+ if
(ci.isAssignableToAny(RestCallInterceptor.class, HttpRequestInterceptor.class,
HttpResponseInterceptor.class))
interceptors(ci.newInstance());
else
throw new
ConfigException("Invalid class of type ''{0}'' passed to interceptors().",
ci.getName());
@@ -3007,7 +3007,7 @@ public class RestClient extends BeanContextable
implements HttpClient, Closeable
continue;
ClassInfo ci = ClassInfo.of(o);
if (nn(ci)) {
- if (!
ci.isChildOfAny(HttpRequestInterceptor.class, HttpResponseInterceptor.class,
RestCallInterceptor.class))
+ if (!
ci.isAssignableToAny(HttpRequestInterceptor.class,
HttpResponseInterceptor.class, RestCallInterceptor.class))
throw new
ConfigException("Invalid object of type ''{0}'' passed to interceptors().",
ci.getName());
if (o instanceof HttpRequestInterceptor
o2)
addInterceptorLast(o2);
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
index 8a8adfd75b..d54d4d8a87 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpHeaders.java
@@ -505,7 +505,7 @@ public class HttpHeaders {
if (o == null)
return false;
var ci = ClassInfo.of(o);
- return nn(ci) && ci.isChildOfAny(Header.class,
Headerable.class, NameValuePair.class, NameValuePairable.class,
Map.Entry.class);
+ return nn(ci) && ci.isAssignableToAny(Header.class,
Headerable.class, NameValuePair.class, NameValuePairable.class,
Map.Entry.class);
}
/**
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
index 9658d146e5..962d3a9c9a 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/HttpParts.java
@@ -157,7 +157,7 @@ public class HttpParts {
if (o == null)
return false;
var ci = ClassInfo.of(o);
- return nn(ci) && ci.isChildOfAny(Headerable.class,
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
+ return nn(ci) && ci.isAssignableToAny(Headerable.class,
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
}
/**
@@ -360,8 +360,8 @@ public class HttpParts {
*/
public static boolean isHttpPart(HttpPartType partType, ClassMeta<?>
type) {
return switch (partType) {
- case PATH, QUERY, FORMDATA ->
type.getProperty("HttpPart.isNameValuePair", x ->
x.isChildOf(NameValuePair.class)).orElse(false);
- case HEADER -> type.getProperty("HttpPart.isHeader", x
-> x.isChildOf(org.apache.http.Header.class)).orElse(false);
+ case PATH, QUERY, FORMDATA ->
type.getProperty("HttpPart.isNameValuePair", x ->
x.isAssignableTo(NameValuePair.class)).orElse(false);
+ case HEADER -> type.getProperty("HttpPart.isHeader", x
-> x.isAssignableTo(org.apache.http.Header.class)).orElse(false);
default -> false;
};
}
diff --git
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
index 9940f3057a..615251e621 100644
---
a/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
+++
b/juneau-rest/juneau-rest-common/src/main/java/org/apache/juneau/http/part/BasicPart.java
@@ -60,7 +60,7 @@ public class BasicPart implements NameValuePair, Headerable {
if (o == null)
return false;
var ci = ClassInfo.of(o);
- return nn(ci) && ci.isChildOfAny(Headerable.class,
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
+ return nn(ci) && ci.isAssignableToAny(Headerable.class,
NameValuePair.class, NameValuePairable.class, Map.Entry.class);
}
/**
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 e3dc57f604..f8d2f3193e 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
@@ -5922,7 +5922,7 @@ public class RestContext extends Context {
if (ci.hasAnnotation(Response.class))
return t;
- if (ci.isChildOf(ParseException.class) ||
ci.is(InvalidDataConversionException.class))
+ if (ci.isAssignableTo(ParseException.class) ||
ci.is(InvalidDataConversionException.class))
return new BadRequest(t);
String n = cn(t);
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
index c88d407abe..3629843542 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/commons/reflect/ClassInfo_Test.java
@@ -2621,34 +2621,76 @@ public class ClassInfo_Test extends TestBase {
//====================================================================================================
@Test
void a077_isChildOf() {
- assertTrue(ka.isChildOf(KA.class));
- assertFalse(ka.isChildOf(KB.class));
- assertFalse(ka.isChildOf(KC.class));
- assertTrue(kb.isChildOf(KA.class));
- assertTrue(kb.isChildOf(KB.class));
- assertFalse(kb.isChildOf(KC.class));
- assertTrue(kc.isChildOf(KA.class));
- assertTrue(kc.isChildOf(KB.class));
- assertTrue(kc.isChildOf(KC.class));
+ assertTrue(ka.isAssignableTo(KA.class));
+ assertFalse(ka.isAssignableTo(KB.class));
+ assertFalse(ka.isAssignableTo(KC.class));
+ assertTrue(kb.isAssignableTo(KA.class));
+ assertTrue(kb.isAssignableTo(KB.class));
+ assertFalse(kb.isAssignableTo(KC.class));
+ assertTrue(kc.isAssignableTo(KA.class));
+ assertTrue(kc.isAssignableTo(KB.class));
+ assertTrue(kc.isAssignableTo(KC.class));
+ // Test with null
+ assertFalse(ka.isAssignableTo((Class<?>)null));
+ // Test on types
+ assertFalse(ka.isAssignableTo(aType));
+ assertFalse(ka.isAssignableTo(pType));
+ assertFalse(ka.isAssignableTo(pTypeDimensional));
+ assertFalse(ka.isAssignableTo(pTypeGeneric));
+ assertFalse(ka.isAssignableTo(pTypeGenericArg));
+ assertFalse(aTypeInfo.isAssignableTo(KA.class));
+ assertFalse(pTypeInfo.isAssignableTo(KA.class));
+ assertFalse(pTypeDimensionalInfo.isAssignableTo(KA.class));
+ assertFalse(pTypeGenericInfo.isAssignableTo(KA.class));
+ assertFalse(pTypeGenericArgInfo.isAssignableTo(KA.class));
+
+ // Test isChildOf(ClassInfo)
+ assertTrue(kb.isAssignableTo(ka));
+ assertTrue(kc.isAssignableTo(ka));
+ assertTrue(kc.isAssignableTo(kb));
+ assertFalse(ka.isAssignableTo(kb));
+ }
+
+
//====================================================================================================
+ // isChildOf(Class<?>) - strict version
+
//====================================================================================================
+ @Test
+ void a077a_isChildOf_strict() {
+ // Strict version excludes same class
+ assertFalse(ka.isChildOf(KA.class)); // Same class, should be
false
+ assertTrue(kb.isChildOf(KA.class)); // KB extends KA, should
be true
+ assertTrue(kc.isChildOf(KA.class)); // KC extends KB extends
KA, should be true
+ assertFalse(kb.isChildOf(KB.class)); // Same class, should be
false
+ assertTrue(kc.isChildOf(KB.class)); // KC extends KB, should
be true
+ assertFalse(kc.isChildOf(KC.class)); // Same class, should be
false
+ assertFalse(ka.isChildOf(KB.class)); // KA is not a child of
KB, should be false
+ assertFalse(ka.isChildOf(KC.class)); // KA is not a child of
KC, should be false
// Test with null
assertFalse(ka.isChildOf((Class<?>)null));
// Test on types
assertFalse(ka.isChildOf(aType));
- assertFalse(ka.isChildOf(pType));
- assertFalse(ka.isChildOf(pTypeDimensional));
- assertFalse(ka.isChildOf(pTypeGeneric));
- assertFalse(ka.isChildOf(pTypeGenericArg));
assertFalse(aTypeInfo.isChildOf(KA.class));
- assertFalse(pTypeInfo.isChildOf(KA.class));
- assertFalse(pTypeDimensionalInfo.isChildOf(KA.class));
- assertFalse(pTypeGenericInfo.isChildOf(KA.class));
- assertFalse(pTypeGenericArgInfo.isChildOf(KA.class));
+ }
- // Test isChildOf(ClassInfo)
- assertTrue(kb.isChildOf(ka));
- assertTrue(kc.isChildOf(ka));
- assertTrue(kc.isChildOf(kb));
- assertFalse(ka.isChildOf(kb));
+
//====================================================================================================
+ // isParentOf(Class<?>) - strict version
+
//====================================================================================================
+ @Test
+ void a077b_isParentOf_strict() {
+ // Strict version excludes same class
+ assertFalse(ka.isParentOf(KA.class)); // Same class, should be
false
+ assertTrue(ka.isParentOf(KB.class)); // KA is parent of KB,
should be true
+ assertTrue(ka.isParentOf(KC.class)); // KA is parent of KC,
should be true
+ assertFalse(kb.isParentOf(KB.class)); // Same class, should be
false
+ assertTrue(kb.isParentOf(KC.class)); // KB is parent of KC,
should be true
+ assertFalse(kc.isParentOf(KC.class)); // Same class, should be
false
+ assertFalse(kb.isParentOf(KA.class)); // KB is not a parent of
KA, should be false
+ assertFalse(kc.isParentOf(KA.class)); // KC is not a parent of
KA, should be false
+ // Test with null
+ assertFalse(ka.isParentOf((Class<?>)null));
+ // Test on types
+ assertFalse(ka.isParentOf(aType));
+ assertFalse(aTypeInfo.isParentOf(KA.class));
}
//====================================================================================================
@@ -2656,21 +2698,21 @@ public class ClassInfo_Test extends TestBase {
//====================================================================================================
@Test
void a078_isChildOfAny() {
- assertTrue(ka.isChildOfAny(KA.class));
- assertFalse(ka.isChildOfAny(KB.class));
- assertFalse(ka.isChildOfAny(KC.class));
- assertTrue(kb.isChildOfAny(KA.class));
- assertTrue(kb.isChildOfAny(KB.class));
- assertFalse(kb.isChildOfAny(KC.class));
- assertTrue(kc.isChildOfAny(KA.class));
- assertTrue(kc.isChildOfAny(KB.class));
- assertTrue(kc.isChildOfAny(KC.class));
+ assertTrue(ka.isAssignableToAny(KA.class));
+ assertFalse(ka.isAssignableToAny(KB.class));
+ assertFalse(ka.isAssignableToAny(KC.class));
+ assertTrue(kb.isAssignableToAny(KA.class));
+ assertTrue(kb.isAssignableToAny(KB.class));
+ assertFalse(kb.isAssignableToAny(KC.class));
+ assertTrue(kc.isAssignableToAny(KA.class));
+ assertTrue(kc.isAssignableToAny(KB.class));
+ assertTrue(kc.isAssignableToAny(KC.class));
// Test on types
- assertFalse(aTypeInfo.isChildOfAny(KA.class));
- assertFalse(pTypeInfo.isChildOfAny(KA.class));
- assertFalse(pTypeDimensionalInfo.isChildOfAny(KA.class));
- assertFalse(pTypeGenericInfo.isChildOfAny(KA.class));
- assertFalse(pTypeGenericArgInfo.isChildOfAny(KA.class));
+ assertFalse(aTypeInfo.isAssignableToAny(KA.class));
+ assertFalse(pTypeInfo.isAssignableToAny(KA.class));
+ assertFalse(pTypeDimensionalInfo.isAssignableToAny(KA.class));
+ assertFalse(pTypeGenericInfo.isAssignableToAny(KA.class));
+ assertFalse(pTypeGenericArgInfo.isAssignableToAny(KA.class));
}
//====================================================================================================
@@ -2947,28 +2989,28 @@ public class ClassInfo_Test extends TestBase {
//====================================================================================================
@Test
void a093_isParentOf() {
- assertTrue(ka.isParentOf(KA.class));
- assertTrue(ka.isParentOf(KB.class));
- assertTrue(ka.isParentOf(KC.class));
- assertFalse(kb.isParentOf(KA.class));
- assertTrue(kb.isParentOf(KB.class));
- assertTrue(kb.isParentOf(KC.class));
- assertFalse(kc.isParentOf(KA.class));
- assertFalse(kc.isParentOf(KB.class));
- assertTrue(kc.isParentOf(KC.class));
+ assertTrue(ka.isAssignableFrom(KA.class));
+ assertTrue(ka.isAssignableFrom(KB.class));
+ assertTrue(ka.isAssignableFrom(KC.class));
+ assertFalse(kb.isAssignableFrom(KA.class));
+ assertTrue(kb.isAssignableFrom(KB.class));
+ assertTrue(kb.isAssignableFrom(KC.class));
+ assertFalse(kc.isAssignableFrom(KA.class));
+ assertFalse(kc.isAssignableFrom(KB.class));
+ assertTrue(kc.isAssignableFrom(KC.class));
// Test with null
- assertFalse(ka.isParentOf((Class<?>)null));
+ assertFalse(ka.isAssignableFrom((Class<?>)null));
// Test on types
- assertFalse(ka.isParentOf(aType));
- assertFalse(ka.isParentOf(pType));
- assertFalse(ka.isParentOf(pTypeDimensional));
- assertFalse(ka.isParentOf(pTypeGeneric));
- assertFalse(ka.isParentOf(pTypeGenericArg));
- assertFalse(aTypeInfo.isParentOf(KA.class));
- assertFalse(pTypeInfo.isParentOf(KA.class));
- assertFalse(pTypeDimensionalInfo.isParentOf(KA.class));
- assertFalse(pTypeGenericInfo.isParentOf(KA.class));
- assertFalse(pTypeGenericArgInfo.isParentOf(KA.class));
+ assertFalse(ka.isAssignableFrom(aType));
+ assertFalse(ka.isAssignableFrom(pType));
+ assertFalse(ka.isAssignableFrom(pTypeDimensional));
+ assertFalse(ka.isAssignableFrom(pTypeGeneric));
+ assertFalse(ka.isAssignableFrom(pTypeGenericArg));
+ assertFalse(aTypeInfo.isAssignableFrom(KA.class));
+ assertFalse(pTypeInfo.isAssignableFrom(KA.class));
+ assertFalse(pTypeDimensionalInfo.isAssignableFrom(KA.class));
+ assertFalse(pTypeGenericInfo.isAssignableFrom(KA.class));
+ assertFalse(pTypeGenericArgInfo.isAssignableFrom(KA.class));
}
//====================================================================================================
@@ -2977,23 +3019,23 @@ public class ClassInfo_Test extends TestBase {
@Test
void a093b_isParentOf_ClassInfo() {
// Test isParentOf(ClassInfo) with valid classes
- assertTrue(ka.isParentOf(ka));
- assertTrue(ka.isParentOf(kb));
- assertTrue(ka.isParentOf(kc));
- assertFalse(kb.isParentOf(ka));
- assertTrue(kb.isParentOf(kb));
- assertTrue(kb.isParentOf(kc));
- assertFalse(kc.isParentOf(ka));
- assertFalse(kc.isParentOf(kb));
- assertTrue(kc.isParentOf(kc));
+ assertTrue(ka.isAssignableFrom(ka));
+ assertTrue(ka.isAssignableFrom(kb));
+ assertTrue(ka.isAssignableFrom(kc));
+ assertFalse(kb.isAssignableFrom(ka));
+ assertTrue(kb.isAssignableFrom(kb));
+ assertTrue(kb.isAssignableFrom(kc));
+ assertFalse(kc.isAssignableFrom(ka));
+ assertFalse(kc.isAssignableFrom(kb));
+ assertTrue(kc.isAssignableFrom(kc));
// Test with null child (line 2029)
- assertFalse(ka.isParentOf((ClassInfo)null));
+ assertFalse(ka.isAssignableFrom((ClassInfo)null));
// Test with null inner
var nullInnerCi = ClassInfo.of((Class<?>)null, pType);
- assertFalse(nullInnerCi.isParentOf(ka));
- assertFalse(nullInnerCi.isParentOf((ClassInfo)null));
+ assertFalse(nullInnerCi.isAssignableFrom(ka));
+ assertFalse(nullInnerCi.isAssignableFrom((ClassInfo)null));
}
//====================================================================================================
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
index 9bb1304e0a..417b66b853 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/rest/client/RestClient_Config_RestClient_Test.java
@@ -427,7 +427,7 @@ class RestClient_Config_RestClient_Test extends TestBase {
private static Object in(HttpPartType type, HttpPartSchema
schema, String in, ClassMeta<?> c) {
try {
- if (c.isParentOf(ABean.class))
+ if (c.isAssignableFrom(ABean.class))
return
Json5.DEFAULT.read(in.substring(1),c);
return
SimplePartParser.DEFAULT.parse(type,schema,in,c);
} catch (Exception e) {