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 6d77062 BeanStore refactoring.
6d77062 is described below
commit 6d77062556a270db40f14c70ce3916027a485e6f
Author: JamesBognar <[email protected]>
AuthorDate: Sat Jan 22 14:02:16 2022 -0500
BeanStore refactoring.
---
.../java/org/apache/juneau/cp/BeanCreator.java | 5 +-
.../main/java/org/apache/juneau/cp/BeanStore.java | 18 ++---
.../java/org/apache/juneau/reflect/ClassInfo.java | 86 ++++------------------
.../java/org/apache/juneau/swap/BuilderSwap.java | 19 ++++-
.../apache/juneau/reflection/ClassInfoTest.java | 7 --
.../juneau/reflection/ConstructorInfoTest.java | 2 +-
6 files changed, 43 insertions(+), 94 deletions(-)
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 277c118..4e69cbb 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
@@ -13,8 +13,6 @@
package org.apache.juneau.cp;
import static java.util.stream.Collectors.*;
-import static org.apache.juneau.reflect.ReflectFlags.*;
-
import java.util.*;
import java.util.function.*;
@@ -327,7 +325,8 @@ public class BeanCreator<T> {
}
private boolean isStaticCreateMethod(MethodInfo m, Class<?> type) {
- return m.isAll(STATIC, NOT_DEPRECATED)
+ return m.isStatic()
+ && m.isNotDeprecated()
&& m.hasReturnType(type)
&& m.hasNoAnnotation(BeanIgnore.class)
&& m.hasName("create");
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 309f22c..547fcab 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
@@ -158,21 +158,21 @@ public class BeanStore {
ClassInfo c = ClassInfo.ofc(type);
MethodInfo m = c.getDeclaredMethod(
- x -> x.isPublic()
- && x.hasNoParams()
- && x.isStatic()
+ x -> x.isPublic()
+ && x.hasNoParams()
+ && x.isStatic()
&& x.hasName("getInstance")
);
if (m != null)
return m.invoke(null);
- Optional<ConstructorInfo> ci =
c.publicConstructors().filter(x -> x.canAccept(this)).findFirst();
- if (ci.isPresent())
- return ci.get().invoke(this);
+ ConstructorInfo ci = c.getPublicConstructor(x ->
x.canAccept(this));
+ if (ci != null)
+ return ci.invoke(this);
- ci = c.protectedConstructors().filter(x ->
x.canAccept(this)).findFirst();
- if (ci.isPresent())
- return ci.get().accessible().invoke(this);
+ ci = c.getDeclaredConstructor(x -> x.isProtected() &&
x.canAccept(this));
+ if (ci != null)
+ return ci.accessible().invoke(this);
throw runtimeException("Could not find a way to
instantiate class {0}", type);
}
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 8ced4bf..c8fbd39 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
@@ -18,14 +18,12 @@ import static org.apache.juneau.assertions.Assertions.*;
import static org.apache.juneau.internal.ThrowableUtils.*;
import static org.apache.juneau.internal.ObjectUtils.*;
import static org.apache.juneau.reflect.ReflectionFilters.*;
-import static java.util.Arrays.*;
import java.lang.annotation.*;
import java.lang.reflect.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.*;
-import java.util.stream.*;
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
@@ -74,7 +72,7 @@ public final class ClassInfo {
private ClassInfo[] interfaces, declaredInterfaces, parents, allParents;
private MethodInfo[] publicMethods, declaredMethods, allMethods,
allMethodsParentFirst;
private MethodInfo repeatedAnnotationMethod;
- private ConstructorInfo[] publicConstructors, protectedConstructors,
declaredConstructors;
+ private ConstructorInfo[] publicConstructors, declaredConstructors;
private FieldInfo[] publicFields, declaredFields, allFields,
allFieldsParentFirst;
private int dim = -1;
private ClassInfo componentType;
@@ -538,22 +536,6 @@ public final class ClassInfo {
}
/**
- * Returns the method with the specified method name and fuzzy argument
types.
- *
- * @param name The method name (e.g. <js>"toString"</js>).
- * @param args The exact argument types.
- * @return
- * The method with the specified method name and argument types, or
<jk>null</jk> if not found.
- */
- public MethodInfo getMethodFuzzy(String name, Object...args) {
- Class<?>[] ac = ClassUtils.getClasses(args);
- for (MethodInfo mi : _getAllMethods())
- if (mi.hasName(name) && mi.argsOnlyOfType(ac))
- return mi;
- return null;
- }
-
- /**
* Returns all declared methods on this class and all parent classes.
*
*
@@ -671,30 +653,16 @@ public final class ClassInfo {
}
/**
- * Returns all the public constructors defined on this class.
- *
- * @return All public constructors defined on this class.
- */
- public Stream<ConstructorInfo> publicConstructors() {
- return stream(_getPublicConstructors());
- }
-
- /**
- * Returns all the public constructors defined on this class.
- *
- * @return All public constructors defined on this class.
- */
- public List<ConstructorInfo> getProtectedConstructors() {
- return new UnmodifiableArray<>(_getProtectedConstructors());
- }
-
- /**
- * Returns all the public constructors defined on this class.
+ * Returns the public constructor that matches the specified predicate.
*
- * @return All public constructors defined on this class.
+ * @param predicate The predicate.
+ * @return The public constructor that matches the specified predicate.
*/
- public Stream<ConstructorInfo> protectedConstructors() {
- return stream(_getProtectedConstructors());
+ public ConstructorInfo getPublicConstructor(Predicate<ConstructorInfo>
predicate) {
+ for (ConstructorInfo ci : _getPublicConstructors())
+ if (predicate.test(ci))
+ return ci;
+ return null;
}
/**
@@ -717,33 +685,19 @@ public final class ClassInfo {
* @param test The test that the public constructor must pass.
* @return The first matching public constructor.
*/
- public Optional<ConstructorInfo>
getPublicConstructor(Predicate<ExecutableInfo> test) {
- return
Arrays.stream(_getPublicConstructors()).filter(test).findFirst();
- }
-
- /**
- * Returns the public constructor that passes the specified predicate
test.
- *
- * <p>
- * The {@link ReflectionFilters} class has predefined predicates that
can be used for testing.
- *
- * @param test The test that the public constructor must pass.
- * @return The first matching public constructor.
- */
public Optional<ConstructorInfo>
getConstructor(Predicate<ExecutableInfo> test) {
return
Arrays.stream(_getDeclaredConstructors()).filter(test).findFirst();
}
/**
- * Returns the declared constructor with the specified argument types.
+ * Returns the declared constructor that matches the specified
predicate.
*
- * @param args The exact argument types.
- * @return
- * The declared constructor with the specified argument types, or
<jk>null</jk> if not found.
+ * @param predicate The predicate to match.
+ * @return The declared constructor that matches the specified
predicate.
*/
- public ConstructorInfo getDeclaredConstructor(Class<?>...args) {
+ public ConstructorInfo
getDeclaredConstructor(Predicate<ConstructorInfo> predicate) {
for (ConstructorInfo ci : _getDeclaredConstructors())
- if (ci.hasParamTypes(args))
+ if (predicate.test(ci))
return ci;
return null;
}
@@ -831,18 +785,6 @@ public final class ClassInfo {
return publicConstructors;
}
- private ConstructorInfo[] _getProtectedConstructors() {
- if (protectedConstructors == null) {
- Constructor<?>[] cc = c == null ? new Constructor[0] :
c.getDeclaredConstructors();
- List<ConstructorInfo> l = new ArrayList<>(cc.length);
- for (Constructor<?> ccc : cc)
- if (Modifier.isProtected(ccc.getModifiers()))
- l.add(ConstructorInfo.of(this, ccc));
- l.sort(null);
- protectedConstructors = l.toArray(new
ConstructorInfo[l.size()]);
- }
- return protectedConstructors;
- }
private ConstructorInfo[] _getDeclaredConstructors() {
if (declaredConstructors == null) {
Constructor<?>[] cc = c == null ? new Constructor[0] :
c.getDeclaredConstructors();
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 41e855c..92ba2a8 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
@@ -13,7 +13,6 @@
package org.apache.juneau.swap;
import java.lang.reflect.*;
-
import org.apache.juneau.*;
import org.apache.juneau.annotation.*;
import org.apache.juneau.reflect.*;
@@ -196,7 +195,7 @@ public class BuilderSwap<T,B> {
ClassInfo pci = ClassInfo.of(objectClass);
- builderCreateMethod = pci.getBuilderCreateMethod().orElse(null);
+ builderCreateMethod = getBuilderCreateMethod(pci);
if (builderClass == null && builderCreateMethod != null)
builderClass =
builderCreateMethod.getReturnType().inner();
@@ -230,4 +229,20 @@ public class BuilderSwap<T,B> {
return new BuilderSwap(objectClass, builderClass,
objectConstructor == null ? null : objectConstructor.inner(),
builderConstructor == null ? null : builderConstructor.inner(),
builderCreateMethod, objectCreateMethod);
}
+
+ private static MethodInfo getBuilderCreateMethod(ClassInfo c) {
+ return c.getPublicMethod(
+ x -> x.isStatic()
+ && x.hasName("create")
+ && ! x.hasReturnType(c)
+ && hasConstructorThatTakesType(c, x.getReturnType())
+ );
+ }
+
+ private static boolean hasConstructorThatTakesType(ClassInfo c,
ClassInfo argType) {
+ return c.getPublicConstructor(
+ x -> x.hasNumParams(1)
+ && x.hasParamTypes(argType)
+ ) != null;
+ }
}
\ No newline at end of file
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 3743836..ed3c1bc 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
@@ -582,13 +582,6 @@ public class ClassInfoTest {
check("E5()", e5.getConstructor(Visibility.PUBLIC));
}
- @Test
- public void getDeclaredConstructor() {
- check("E1()", e1.getDeclaredConstructor());
- check("E1(int)", e1.getDeclaredConstructor(int.class));
- check(null, e1.getDeclaredConstructor(Object.class));
- }
-
//-----------------------------------------------------------------------------------------------------------------
// Fields
//-----------------------------------------------------------------------------------------------------------------
diff --git
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
index 53d6d33..859cee4 100644
---
a/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
+++
b/juneau-utest/src/test/java/org/apache/juneau/reflection/ConstructorInfoTest.java
@@ -111,7 +111,7 @@ public class ConstructorInfoTest {
static ConstructorInfo
b_c1 = b.getPublicConstructor(),
b_c2 = b.getPublicConstructor(String.class),
- b_c3 = b.getDeclaredConstructor(int.class),
+ b_c3 = b.getDeclaredConstructor(x ->
x.hasParamTypes(int.class)),
b_c4 = b.getPublicConstructor(String.class, String.class);