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);
 
 

Reply via email to