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 4d338b3 BeanStore refactoring.
4d338b3 is described below
commit 4d338b328b770a2939af6ae48c3b1f110e38707b
Author: JamesBognar <[email protected]>
AuthorDate: Sat Jan 22 17:06:29 2022 -0500
BeanStore refactoring.
---
.../main/ConfigurablePropertyCodeGenerator.java | 4 +-
.../src/main/java/org/apache/juneau/BeanMeta.java | 47 ++++++++----------
.../src/main/java/org/apache/juneau/ClassMeta.java | 15 ++++--
.../src/main/java/org/apache/juneau/Context.java | 12 ++---
.../juneau/httppart/bean/RequestBeanMeta.java | 47 +++++++++---------
.../juneau/httppart/bean/ResponseBeanMeta.java | 34 ++++++-------
.../org/apache/juneau/internal/ObjectUtils.java | 4 +-
.../java/org/apache/juneau/reflect/ClassInfo.java | 57 ++++++++++++++--------
.../java/org/apache/juneau/reflect/FieldInfo.java | 21 ++++++++
.../java/org/apache/juneau/reflect/Mutaters.java | 24 ++++-----
.../java/org/apache/juneau/swap/AutoListSwap.java | 14 +++---
.../java/org/apache/juneau/swap/AutoMapSwap.java | 14 +++---
.../org/apache/juneau/swap/AutoNumberSwap.java | 14 +++---
.../org/apache/juneau/swap/AutoObjectSwap.java | 14 +++---
.../java/org/apache/juneau/swap/BuilderSwap.java | 16 +++---
.../java/org/apache/juneau/swap/DefaultSwaps.java | 8 +--
.../java/org/apache/juneau/rest/RestContext.java | 1 -
.../rest/swagger/BasicSwaggerProviderSession.java | 8 ++-
.../apache/juneau/reflection/ClassInfoTest.java | 41 +++-------------
19 files changed, 199 insertions(+), 196 deletions(-)
diff --git a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
index 94bbf82..ad66eb8 100644
--- a/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
+++ b/juneau-all/src/java/main/ConfigurablePropertyCodeGenerator.java
@@ -111,7 +111,9 @@ public class ConfigurablePropertyCodeGenerator {
String indent = c.getDeclaringClass() != null ? "\t\t"
: "\t";
Set<String> sigsAdded = new HashSet<String>();
- for (ClassInfo pc :
ClassInfo.of(c).getParentsParentFirst()) {
+ List<ClassInfo> l = ClassInfo.of(c).getParents();
+ for (int i = l.size()-1; i>=0; i--) {
+ ClassInfo pc = l.get(i);
Class<?> pcc = pc.inner();
if (pcc != c) {
Set<Method> ms = configMethods.get(pcc);
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 b4c6573..48e6af3 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
@@ -16,7 +16,6 @@ import static org.apache.juneau.internal.CollectionUtils.*;
import static org.apache.juneau.internal.StringUtils.*;
import static org.apache.juneau.internal.ThrowableUtils.*;
import static org.apache.juneau.internal.ObjectUtils.*;
-import static org.apache.juneau.reflect.ReflectFlags.*;
import static org.apache.juneau.BeanMeta.MethodType.*;
import java.beans.*;
@@ -771,38 +770,32 @@ public class BeanMeta<T> {
static final Collection<Field> findBeanFields(BeanContext ctx, Class<?>
c, Class<?> stopClass, Visibility v) {
List<Field> l = new LinkedList<>();
+ boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
for (ClassInfo c2 : findClasses(c, stopClass)) {
- for (FieldInfo f : c2.getDeclaredFields()) {
- if (f.is(STATIC))
- continue;
- if (f.is(TRANSIENT) &&
ctx.isIgnoreTransientFields())
- continue;
- if (ctx.hasAnnotation(BeanIgnore.class, f))
- continue;
-
- List<Beanp> lp =
ctx.getAnnotations(Beanp.class, f);
-
- if (! (v.isVisible(f.inner()) || lp.size() > 0))
- continue;
-
- l.add(f.inner());
- }
+ c2.getDeclaredFields(
+ x -> x.isNotStatic()
+ && (x.isNotTransient() || noIgnoreTransients)
+ && (x.hasNoAnnotation(Transient.class) ||
noIgnoreTransients)
+ && x.hasNoAnnotation(BeanIgnore.class, ctx)
+ && (v.isVisible(x.inner()) ||
ctx.getAnnotations(Beanp.class, x).size() > 0),
+ x -> l.add(x.inner())
+ );
}
return l;
}
- static final Field findInnerBeanField(BeanContext bc, Class<?> c,
Class<?> stopClass, String name) {
+ static final Field findInnerBeanField(BeanContext ctx, Class<?> c,
Class<?> stopClass, String name) {
+ boolean noIgnoreTransients = ! ctx.isIgnoreTransientFields();
for (ClassInfo c2 : findClasses(c, stopClass)) {
- for (FieldInfo f : c2.getDeclaredFields()) {
- if (f.is(STATIC))
- continue;
- if ((f.is(TRANSIENT) ||
f.hasAnnotation(Transient.class)) && bc.isIgnoreTransientFields())
- continue;
- if (f.hasAnnotation(BeanIgnore.class, bc))
- continue;
- if (f.hasName(name))
- return f.inner();
- }
+ FieldInfo f = c2.getDeclaredField(
+ x -> x.isNotStatic()
+ && (x.isNotTransient() || noIgnoreTransients)
+ && (x.hasNoAnnotation(Transient.class) ||
noIgnoreTransients)
+ && x.hasNoAnnotation(BeanIgnore.class, ctx)
+ && x.hasName(name)
+ );
+ if (f != null)
+ return f.inner();
}
return null;
}
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 6ae7ce6..875587a 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
@@ -481,7 +481,9 @@ public final class ClassMeta<T> implements Type {
}
// Find @NameProperty and @ParentProperty methods if
present.
- for (MethodInfo m : ci.getAllMethodsParentFirst()) {
+ List<MethodInfo> methods = ci.getMethods();
+ for (int i = methods.size()-1; i >=0; i--) {
+ MethodInfo m = methods.get(i);
if (bc.hasAnnotation(ParentProperty.class, m)) {
if (m.isStatic() || ! m.hasNumParams(1))
throw new
ClassMetaRuntimeException(c, "@ParentProperty used on invalid method ''{0}''.
Must not be static and have one argument.", m);
@@ -927,10 +929,13 @@ public final class ClassMeta<T> implements Type {
if (ci.isAbstract())
return null;
boolean isMemberClass = ci.isMemberClass() && ci.isNotStatic();
- for (ConstructorInfo cc : ci.getPublicConstructors()) {
- if (cc.hasNumParams(isMemberClass ? 1 : 0) &&
cc.isVisible(v) && cc.isNotDeprecated())
- return (Constructor<? extends T>)
v.transform(cc.inner());
- }
+ ConstructorInfo cc = ci.getPublicConstructor(
+ x -> x.isVisible(v)
+ && x.isNotDeprecated()
+ && x.hasNumParams(isMemberClass ? 1 : 0)
+ );
+ if (cc != null)
+ return (Constructor<? extends T>)
v.transform(cc.inner());
return 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 32ccc82..1f9108a 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
@@ -194,12 +194,12 @@ public abstract class Context implements MetaProvider {
private ConstructorInfo getContextConstructor() {
ConstructorInfo cci = CONTEXT_CONSTRUCTORS.get(type);
if (cci == null) {
- cci = ClassInfo.of(type)
- .getPublicConstructors()
- .stream()
- .filter(x -> x.hasNumParams(1) &&
x.getParam(0).getParameterType().isParentOf(this.getClass()))
- .findFirst()
-
.orElseThrow(()->runtimeException("Public constructor not found: {0}({1})",
className(type), className(this)));
+ cci = ClassInfo.ofc(type).getPublicConstructor(
+ x -> x.hasNumParams(1)
+ && x.getParam(0).canAccept(this)
+ );
+ if (cci == null)
+ throw runtimeException("Public
constructor not found: {0}({1})", className(type), className(this));
CONTEXT_CONSTRUCTORS.put(type, cci);
}
return cci;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
index ee79b31..c7fa6f6 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/RequestBeanMeta.java
@@ -97,31 +97,28 @@ public class RequestBeanMeta {
Builder apply(Class<?> c) {
this.cm = BeanContext.DEFAULT.getClassMeta(c);
apply(cm.getLastAnnotation(Request.class));
- for (MethodInfo m : cm.getInfo().getAllMethods()) {
-
- if (m.isPublic()) {
- String n = m.getSimpleName();
- if (m.hasAnnotation(Header.class)) {
- assertNoArgs(m, Header.class);
- assertReturnNotVoid(m,
Header.class);
- properties.put(n,
RequestBeanPropertyMeta.create(HEADER, Header.class, m));
- } else if
(m.hasAnnotation(Query.class)) {
- assertNoArgs(m, Query.class);
- assertReturnNotVoid(m,
Query.class);
- properties.put(n,
RequestBeanPropertyMeta.create(QUERY, Query.class, m));
- } else if
(m.hasAnnotation(FormData.class)) {
- assertNoArgs(m, FormData.class);
- assertReturnNotVoid(m,
FormData.class);
- properties.put(n,
RequestBeanPropertyMeta.create(FORMDATA, FormData.class, m));
- } else if (m.hasAnnotation(Path.class))
{
- assertNoArgs(m, Path.class);
- assertReturnNotVoid(m,
Path.class);
- properties.put(n,
RequestBeanPropertyMeta.create(PATH, Path.class, m));
- } else if (m.hasAnnotation(Body.class))
{
- assertNoArgs(m, Body.class);
- assertReturnNotVoid(m,
Body.class);
- properties.put(n,
RequestBeanPropertyMeta.create(BODY, Body.class, m));
- }
+ for (MethodInfo m : cm.getInfo().getPublicMethods()) {
+ String n = m.getSimpleName();
+ if (m.hasAnnotation(Header.class)) {
+ assertNoArgs(m, Header.class);
+ assertReturnNotVoid(m, Header.class);
+ properties.put(n,
RequestBeanPropertyMeta.create(HEADER, Header.class, m));
+ } else if (m.hasAnnotation(Query.class)) {
+ assertNoArgs(m, Query.class);
+ assertReturnNotVoid(m, Query.class);
+ properties.put(n,
RequestBeanPropertyMeta.create(QUERY, Query.class, m));
+ } else if (m.hasAnnotation(FormData.class)) {
+ assertNoArgs(m, FormData.class);
+ assertReturnNotVoid(m, FormData.class);
+ properties.put(n,
RequestBeanPropertyMeta.create(FORMDATA, FormData.class, m));
+ } else if (m.hasAnnotation(Path.class)) {
+ assertNoArgs(m, Path.class);
+ assertReturnNotVoid(m, Path.class);
+ properties.put(n,
RequestBeanPropertyMeta.create(PATH, Path.class, m));
+ } else if (m.hasAnnotation(Body.class)) {
+ assertNoArgs(m, Body.class);
+ assertReturnNotVoid(m, Body.class);
+ properties.put(n,
RequestBeanPropertyMeta.create(BODY, Body.class, m));
}
}
return this;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
index 66d04e0..f96b7a0 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/httppart/bean/ResponseBeanMeta.java
@@ -155,25 +155,23 @@ public class ResponseBeanMeta {
Class<?> c = ClassUtils.toClass(t);
this.cm = BeanContext.DEFAULT.getClassMeta(c);
ClassInfo ci = cm.getInfo();
- for (MethodInfo m : ci.getAllMethods()) {
- if (m.isPublic()) {
- assertNoInvalidAnnotations(m,
Query.class, FormData.class);
- if (m.hasAnnotation(Header.class)) {
- assertNoArgs(m, Header.class);
+ for (MethodInfo m : ci.getPublicMethods()) {
+ assertNoInvalidAnnotations(m, Query.class,
FormData.class);
+ if (m.hasAnnotation(Header.class)) {
+ assertNoArgs(m, Header.class);
+ assertReturnNotVoid(m, Header.class);
+ HttpPartSchema s =
HttpPartSchema.create(m.getLastAnnotation(Header.class), m.getPropertyName());
+ headerMethods.put(s.getName(),
ResponseBeanPropertyMeta.create(RESPONSE_HEADER, s, m));
+ } else if (m.hasAnnotation(StatusCode.class)) {
+ assertNoArgs(m, Header.class);
+ assertReturnType(m, Header.class,
int.class, Integer.class);
+ statusMethod =
ResponseBeanPropertyMeta.create(RESPONSE_STATUS, m);
+ } else if (m.hasAnnotation(Body.class)) {
+ if (m.getParamCount() == 0)
assertReturnNotVoid(m,
Header.class);
- HttpPartSchema s =
HttpPartSchema.create(m.getLastAnnotation(Header.class), m.getPropertyName());
- headerMethods.put(s.getName(),
ResponseBeanPropertyMeta.create(RESPONSE_HEADER, s, m));
- } else if
(m.hasAnnotation(StatusCode.class)) {
- assertNoArgs(m, Header.class);
- assertReturnType(m,
Header.class, int.class, Integer.class);
- statusMethod =
ResponseBeanPropertyMeta.create(RESPONSE_STATUS, m);
- } else if (m.hasAnnotation(Body.class))
{
- if (m.getParamCount() == 0)
- assertReturnNotVoid(m,
Header.class);
- else
- assertArgType(m,
Header.class, OutputStream.class, Writer.class);
- bodyMethod =
ResponseBeanPropertyMeta.create(RESPONSE_BODY, m);
- }
+ else
+ assertArgType(m, Header.class,
OutputStream.class, Writer.class);
+ bodyMethod =
ResponseBeanPropertyMeta.create(RESPONSE_BODY, m);
}
}
return this;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
index e40c5c5..54d83f9 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/internal/ObjectUtils.java
@@ -262,7 +262,9 @@ public class ObjectUtils {
Map<String,MethodInfo> methods2 = new LinkedHashMap<>();
do {
String cname = ci.getShortName();
- ci.getDeclaredMethods().stream().filter(x ->
x.getName().equals("properties")).findFirst().ifPresent(x ->
methods2.put(cname, x.accessible()));
+ MethodInfo mi = ci.getDeclaredMethod(x ->
x.hasName("properties"));
+ if (mi != null)
+ methods2.put(cname, mi.accessible());
ci = ci.getParent();
} while (ci != null);
methods = methods2;
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
index 8f034c8..45eeb83 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/ClassInfo.java
@@ -317,36 +317,26 @@ public final class ClassInfo {
}
/**
- * Returns a list including this class and all parent classes.
- *
- * <p>
- * Does not include interfaces.
- *
- * @return An unmodifiable list including this class and all parent
classes.
- * <br>Results are in parent-to-child order.
- */
- public List<ClassInfo> getParentsParentFirst() {
- return new UnmodifiableArray<>(_getParents(), true);
- }
-
- /**
* Returns a list including this class and all parent classes and
interfaces.
*
* @return An unmodifiable list including this class and all parent
classes.
* <br>Results are ordered child-to-parent order with classes
listed before interfaces.
*/
- public List<ClassInfo> getAllParentsChildFirst() {
+ public List<ClassInfo> getAllParents() {
return new UnmodifiableArray<>(_getAllParents());
}
/**
- * Returns a list including this class and all parent classes and
interfaces.
+ * Returns the parent class or interface that matches the specified
predicate.
*
- * @return An unmodifiable list including this class and all parent
classes.
- * <br>Results are ordered parent-to-child order with interfaces
listed before classes.
+ * @param predicate The predicate to test for.
+ * @return The parent class or interface that matches the specified
predicate.
*/
- public List<ClassInfo> getAllParentsParentFirst() {
- return new UnmodifiableArray<>(_getAllParents(), true);
+ public ClassInfo getAllParent(Predicate<ClassInfo> predicate) {
+ for (ClassInfo ci : _getAllParents())
+ if (predicate.test(ci))
+ return ci;
+ return null;
}
ClassInfo[] _getInterfaces() {
@@ -436,7 +426,7 @@ public final class ClassInfo {
* All declared methods on this class and all parent classes.
* <br>Results are ordered child-to-parent, and then
alphabetically per class.
*/
- public List<MethodInfo> getAllMethods() {
+ public List<MethodInfo> getMethods() {
return new UnmodifiableArray<>(_getAllMethods());
}
@@ -729,6 +719,20 @@ public final class ClassInfo {
}
/**
+ * Consumes all declared fields on this class that match the specified
predicate.
+ *
+ * @param predicate The predicate to test against.
+ * @param consumer The consumer.
+ * @return This object.
+ */
+ public ClassInfo getDeclaredFields(Predicate<FieldInfo> predicate,
Consumer<FieldInfo> consumer) {
+ for (FieldInfo fi : _getDeclaredFields())
+ if (predicate.test(fi))
+ consumer.accept(fi);
+ return this;
+ }
+
+ /**
* Returns all declared fields on this class and all parent classes.
*
* @return
@@ -777,6 +781,19 @@ public final class ClassInfo {
}
/**
+ * Returns the declared field that passes the specified predicate.
+ *
+ * @param predicate The predicate to test against.
+ * @return The declared field, or <jk>null</jk> if not found.
+ */
+ public FieldInfo getDeclaredField(Predicate<FieldInfo> predicate) {
+ for (FieldInfo f : _getDeclaredFields())
+ if (predicate.test(f))
+ return f;
+ return null;
+ }
+
+ /**
* Returns the static public field with the specified name.
*
* @param name The field name.
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
index 883edb2..282fc41 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/FieldInfo.java
@@ -128,6 +128,16 @@ public final class FieldInfo implements
Comparable<FieldInfo> {
}
/**
+ * Returns <jk>true</jk> if the specified annotation is not present on
this field.
+ *
+ * @param a The annotation to check for.
+ * @return <jk>true</jk> if the specified annotation is not present on
this field.
+ */
+ public final boolean hasNoAnnotation(Class<? extends Annotation> a) {
+ return ! hasAnnotation(a);
+ }
+
+ /**
* Returns <jk>true</jk> if the specified annotation is present.
*
* @param a The annotation to check for.
@@ -138,6 +148,17 @@ public final class FieldInfo implements
Comparable<FieldInfo> {
return ! mp.getAnnotations(a, f).isEmpty();
}
+ /**
+ * Returns <jk>true</jk> if the specified annotation is not present.
+ *
+ * @param a The annotation to check for.
+ * @param mp The meta provider for looking up annotations on reflection
objects (classes, methods, fields, constructors).
+ * @return <jk>true</jk> if the specified annotation is not present.
+ */
+ public boolean hasNoAnnotation(Class<? extends Annotation> a,
MetaProvider mp) {
+ return ! hasAnnotation(a, mp);
+ }
+
//-----------------------------------------------------------------------------------------------------------------
// Characteristics
//-----------------------------------------------------------------------------------------------------------------
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
index 1c91d68..578ba7f 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/reflect/Mutaters.java
@@ -14,8 +14,6 @@ package org.apache.juneau.reflect;
import static org.apache.juneau.internal.StringUtils.*;
import static org.apache.juneau.internal.ThrowableUtils.*;
-import static org.apache.juneau.reflect.ReflectFlags.*;
-
import java.util.concurrent.*;
import java.lang.reflect.*;
@@ -153,11 +151,9 @@ public class Mutaters {
ClassInfo ici = ClassInfo.of(ic), oci = ClassInfo.of(oc);
- for (ClassInfo pic : ici.getAllParentsChildFirst()) {
- Mutater t = m.get(pic.inner());
- if (t != null)
- return t;
- }
+ ClassInfo pic = ici.getAllParent(x -> m.get(x.inner()) != null);
+ if (pic != null)
+ return m.get(pic.inner());
if (ic == String.class) {
Class<?> oc2 = oci.hasPrimitiveWrapper() ?
oci.getPrimitiveWrapper() : oc;
@@ -299,13 +295,11 @@ public class Mutaters {
private static MethodInfo findToXMethod(ClassInfo ic, ClassInfo oc) {
String tn = oc.getReadableName();
- for (MethodInfo m : ic.getAllMethods()) {
- if (m.isAll(PUBLIC, NOT_STATIC, HAS_NO_PARAMS,
NOT_DEPRECATED)
- && m.getSimpleName().startsWith("to")
- &&
m.getSimpleName().substring(2).equalsIgnoreCase(tn))
- return m;
- }
- return null;
+ return ic.getPublicMethod(
+ x -> x.isNotStatic()
+ && x.hasNoParams()
+ && x.getSimpleName().startsWith("to")
+ && x.getSimpleName().substring(2).equalsIgnoreCase(tn)
+ );
}
-
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
index 3208d08..848c890 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoListSwap.java
@@ -98,18 +98,18 @@ public class AutoListSwap<T> extends ObjectSwap<T,List<?>> {
return null;
// Find swap() method if present.
- for (MethodInfo m : ci.getAllMethods()) {
+ for (MethodInfo m : ci.getMethods()) {
if (isSwapMethod(bc, m)) {
ClassInfo rt = m.getReturnType();
- for (MethodInfo m2 : ci.getAllMethods())
- if (isUnswapMethod(bc, m2, ci, rt))
- return new AutoListSwap(bc, ci,
m, m2, null);
+ MethodInfo mi = ci.getMethod(x ->
isUnswapMethod(bc, x, ci, rt));
+ if (mi != null)
+ return new AutoListSwap(bc, ci, m, mi,
null);
- for (ConstructorInfo cs :
ci.getDeclaredConstructors())
- if (isUnswapConstructor(bc, cs, rt))
- return new AutoListSwap(bc, ci,
m, null, cs);
+ ConstructorInfo cs =
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+ if (cs != null)
+ return new AutoListSwap(bc, ci, m,
null, cs);
return new AutoListSwap(bc, ci, m, null, null);
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
index 628ba53..f0f613f 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoMapSwap.java
@@ -97,18 +97,18 @@ public class AutoMapSwap<T> extends ObjectSwap<T,Map<?,?>> {
return null;
// Find swap() method if present.
- for (MethodInfo m : ci.getAllMethods()) {
+ for (MethodInfo m : ci.getMethods()) {
if (isSwapMethod(bc, m)) {
ClassInfo rt = m.getReturnType();
- for (MethodInfo m2 : ci.getAllMethods())
- if (isUnswapMethod(bc, m2, ci, rt))
- return new AutoMapSwap(bc, ci,
m, m2, null);
+ MethodInfo mi = ci.getMethod(x ->
isUnswapMethod(bc, x, ci, rt));
+ if (mi != null)
+ return new AutoMapSwap(bc, ci, m, mi,
null);
- for (ConstructorInfo cs :
ci.getDeclaredConstructors())
- if (isUnswapConstructor(bc, cs, rt))
- return new AutoMapSwap(bc, ci,
m, null, cs);
+ ConstructorInfo cs =
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+ if (cs != null)
+ return new AutoMapSwap(bc, ci, m, null,
cs);
return new AutoMapSwap(bc, ci, m, null, null);
}
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 4a95cfd..ec1ec9e 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
@@ -121,19 +121,19 @@ public class AutoNumberSwap<T> extends
ObjectSwap<T,Number> {
return null;
// Find swap() method if present.
- for (MethodInfo m : ci.getAllMethods()) {
+ for (MethodInfo m : ci.getMethods()) {
if (isSwapMethod(bc, m)) {
ClassInfo rt = m.getReturnType();
- for (MethodInfo m2 : ci.getAllMethods())
- if (isUnswapMethod(bc, m2, ci, rt))
- return new AutoNumberSwap(bc,
ci, m, m2, null);
+ MethodInfo mi = ci.getMethod(x ->
isUnswapMethod(bc, x, ci, rt));
+ if (mi != null)
+ return new AutoNumberSwap(bc, ci, m,
mi, null);
- for (ConstructorInfo cs :
ci.getDeclaredConstructors())
- if (isUnswapConstructor(bc, cs, rt))
- return new AutoNumberSwap(bc,
ci, m, null, cs);
+ ConstructorInfo cs =
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+ if (cs != null)
+ return new AutoNumberSwap(bc, ci, m,
null, cs);
return new AutoNumberSwap(bc, ci, m, null,
null);
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
index ff5ff75..2b98fb7 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/AutoObjectSwap.java
@@ -100,18 +100,18 @@ public class AutoObjectSwap<T> extends
ObjectSwap<T,Object> {
return null;
// Find swap() method if present.
- for (MethodInfo m : ci.getAllMethods()) {
+ for (MethodInfo m : ci.getMethods()) {
if (isSwapMethod(bc, m)) {
ClassInfo rt = m.getReturnType();
- for (MethodInfo m2 : ci.getAllMethods())
- if (isUnswapMethod(bc, m2, ci, rt))
- return new AutoObjectSwap(bc,
ci, m, m2, null);
+ MethodInfo mi = ci.getMethod(x ->
isUnswapMethod(bc, x, ci, rt));
+ if (mi != null)
+ return new AutoObjectSwap(bc, ci, m,
mi, null);
- for (ConstructorInfo cs :
ci.getDeclaredConstructors())
- if (isUnswapConstructor(bc, cs, rt))
- return new AutoObjectSwap(bc,
ci, m, null, cs);
+ ConstructorInfo cs =
ci.getDeclaredConstructor(x -> isUnswapConstructor(bc, x, rt));
+ if (cs != null)
+ return new AutoObjectSwap(bc, ci, m,
null, cs);
return new AutoObjectSwap(bc, ci, m, null,
null);
}
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 eca3489..052851f 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
@@ -201,14 +201,14 @@ public class BuilderSwap<T,B> {
builderClass =
builderCreateMethod.getReturnType().inner();
if (builderClass == null) {
- for (ConstructorInfo cc : pci.getPublicConstructors()) {
- if (cc.isVisible(cVis) && cc.hasNumParams(1)) {
- ClassInfo pt = cc.getParamType(0);
- if (pt.isChildOf(Builder.class)) {
- objectConstructor = cc;
- builderClass = pt.inner();
- }
- }
+ ConstructorInfo cc = pci.getPublicConstructor(
+ x -> x.isVisible(cVis)
+ && x.hasNumParams(1)
+ && x.getParamType(0).isChildOf(Builder.class)
+ );
+ if (cc != null) {
+ objectConstructor = cc;
+ builderClass = cc.getParamType(0).inner();
}
}
diff --git
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
index 23596e3..ce112ee 100644
---
a/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
+++
b/juneau-core/juneau-marshall/src/main/java/org/apache/juneau/swap/DefaultSwaps.java
@@ -65,11 +65,7 @@ public class DefaultSwaps {
* @return The matched swap, or <jk>null</jk> if it couldn't be found.
*/
public static ObjectSwap<?,?> find(ClassInfo ci) {
- for (ClassInfo ci2 : ci.getAllParentsChildFirst()) {
- ObjectSwap<?,?> ps = SWAPS.get(ci2.inner());
- if (ps != null)
- return ps;
- }
- return null;
+ ClassInfo ci2 = ci.getAllParent(x -> SWAPS.get(x.inner()) !=
null);
+ return ci2 == null ? null : SWAPS.get(ci2.inner());
}
}
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/RestContext.java
index 7096732..d23492f 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
@@ -35,7 +35,6 @@ import java.lang.reflect.Method;
import java.nio.charset.*;
import java.time.*;
import java.util.*;
-import java.util.ArrayList;
import java.util.concurrent.*;
import java.util.concurrent.atomic.*;
import java.util.function.*;
diff --git
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
index 99e38ff..cbd83bf 100644
---
a/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
+++
b/juneau-rest/juneau-rest-server/src/main/java/org/apache/juneau/rest/swagger/BasicSwaggerProviderSession.java
@@ -392,7 +392,9 @@ public class BasicSwaggerProviderSession {
om.appendIf(true, true,
true, "schema", schema);
}
}
- for (MethodInfo ecmi :
eci.getAllMethodsParentFirst()) {
+ List<MethodInfo> methods =
eci.getMethods();
+ for (int i = methods.size()-1; i>=0;
i--) {
+ MethodInfo ecmi =
methods.get(i);
Header a =
ecmi.getLastAnnotation(Header.class);
if (a == null)
a =
ecmi.getReturnType().unwrap(Value.class,Optional.class).getLastAnnotation(Header.class);
@@ -425,7 +427,9 @@ public class BasicSwaggerProviderSession {
}
}
if
(mi.getReturnType().hasAnnotation(Response.class)) {
- for (MethodInfo ecmi :
mi.getReturnType().getAllMethodsParentFirst()) {
+ List<MethodInfo> methods =
mi.getReturnType().getMethods();
+ for (int i = methods.size()-1; i>=0;
i--) {
+ MethodInfo ecmi =
methods.get(i);
if
(ecmi.hasAnnotation(Header.class)) {
Header a =
ecmi.getLastAnnotation(Header.class);
String ha = a.name();
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
index b5976c9..62c735c 100644
--- a/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
+++ b/juneau-utest/src/test/java/org/apache/juneau/reflection/ClassInfoTest.java
@@ -256,30 +256,16 @@ public class ClassInfoTest {
}
@Test
- public void getParentsParentFirst() {
- check("BC1,BC2,BC3", bc3.getParentsParentFirst());
- check("", object.getParentsParentFirst());
- check("BI1", bi1.getParentsParentFirst());
- }
-
- @Test
public void getAllParents() {
- check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParentsChildFirst());
- check("", object.getAllParentsChildFirst());
- check("BI1", bi1.getAllParentsChildFirst());
+ check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParents());
+ check("", object.getAllParents());
+ check("BI1", bi1.getAllParents());
}
@Test
public void getAllParents_twice() {
- check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParentsChildFirst());
- check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParentsChildFirst());
- }
-
- @Test
- public void getAllParentsParentFirst() {
- check("BI2,BI1,BI3,BC1,BC2,BC3",
bc3.getAllParentsParentFirst());
- check("", object.getAllParentsParentFirst());
- check("BI1", bi1.getAllParentsParentFirst());
+ check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParents());
+ check("BC3,BC2,BC1,BI3,BI1,BI2", bc3.getAllParents());
}
@Test
@@ -359,24 +345,13 @@ public class ClassInfoTest {
@Test
public void getAllMethods() throws Exception {
-
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
cc3.getAllMethods());
+
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
cc3.getMethods());
}
@Test
public void getAllMethods_twice() throws Exception {
-
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
cc3.getAllMethods());
-
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
cc3.getAllMethods());
- }
-
- @Test
- public void getAllMethodsParentFirst() throws Exception {
-
check("CI2.i2a(),CI2.i2b(),CI1.i1a(),CI1.i1b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC3.c3a(),CC3.c3b(),CC3.i2b()",
cc3.getAllMethodsParentFirst());
- }
-
- @Test
- public void getAllMethodsParentFirst_twice() throws Exception {
-
check("CI2.i2a(),CI2.i2b(),CI1.i1a(),CI1.i1b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC3.c3a(),CC3.c3b(),CC3.i2b()",
cc3.getAllMethodsParentFirst());
-
check("CI2.i2a(),CI2.i2b(),CI1.i1a(),CI1.i1b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC3.c3a(),CC3.c3b(),CC3.i2b()",
cc3.getAllMethodsParentFirst());
+
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
cc3.getMethods());
+
check("CC3.c3a(),CC3.c3b(),CC3.i2b(),CC2.c2a(),CC2.c2b(),CC2.i1b(),CC2.i2a(),CC2.i2b(),CC1.c1a(),CC1.c1b(),CC1.i1a(),CI1.i1a(),CI1.i1b(),CI2.i2a(),CI2.i2b()",
cc3.getMethods());
}
@Test