You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2021/09/08 10:54:05 UTC

[isis] branch master updated: ISIS-2774: method finder overhaul (3)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new da1a4c1  ISIS-2774: method finder overhaul (3)
da1a4c1 is described below

commit da1a4c1f518b713698e92a1a869a9936b211cd49
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Sep 8 12:53:54 2021 +0200

    ISIS-2774: method finder overhaul (3)
---
 .../isis/core/metamodel/facets/ActionSupport.java  |  7 +-
 .../core/metamodel/facets/ParameterSupport.java    | 11 +--
 .../isis/core/metamodel/methods/MethodFinder.java  | 59 +---------------
 ...MethodFinderUtils.java => MethodFinderPPM.java} | 80 ++++++++++++++--------
 4 files changed, 63 insertions(+), 94 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
index 6e09bbc..11cebe4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ActionSupport.java
@@ -32,7 +32,8 @@ import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnType;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils.MethodAndPpmConstructor;
+import org.apache.isis.core.metamodel.methods.MethodFinderPPM;
+import org.apache.isis.core.metamodel.methods.MethodFinderPPM.MethodAndPpmConstructor;
 
 import lombok.Builder;
 import lombok.Getter;
@@ -116,7 +117,7 @@ public final class ActionSupport {
 
         switch(searchRequest.getReturnType()) {
         case BOOLEAN:
-            MethodFinder
+            MethodFinderPPM
                 .findMethodWithPPMArg_returningBoolean(
                         MethodFinderOptions
                         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
@@ -125,7 +126,7 @@ public final class ActionSupport {
                 .forEach(onMethodFound);
             break;
         case TEXT:
-            MethodFinder
+            MethodFinderPPM
                 .findMethodWithPPMArg_returningText(
                         MethodFinderOptions
                         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
index 008835a..17ac733 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/ParameterSupport.java
@@ -33,7 +33,8 @@ import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnType;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
 import org.apache.isis.core.metamodel.methods.MethodFinderOptions;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils.MethodAndPpmConstructor;
+import org.apache.isis.core.metamodel.methods.MethodFinderPPM;
+import org.apache.isis.core.metamodel.methods.MethodFinderPPM.MethodAndPpmConstructor;
 
 import lombok.Builder;
 import lombok.Getter;
@@ -133,7 +134,7 @@ public final class ParameterSupport {
 
         switch(searchRequest.getReturnType()) {
         case BOOLEAN:
-            MethodFinder
+            MethodFinderPPM
                 .findMethodWithPPMArg_returningBoolean(
                         MethodFinderOptions
                         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
@@ -142,7 +143,7 @@ public final class ParameterSupport {
                 .forEach(onMethodFound);
             break;
         case TEXT:
-            MethodFinder
+            MethodFinderPPM
                 .findMethodWithPPMArg_returningText(
                         MethodFinderOptions
                         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
@@ -151,7 +152,7 @@ public final class ParameterSupport {
                 .forEach(onMethodFound);
             break;
         case NON_SCALAR:
-            MethodFinder
+            MethodFinderPPM
                 .findMethodWithPPMArg_returningNonScalar(
                         MethodFinderOptions
                         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
@@ -160,7 +161,7 @@ public final class ParameterSupport {
                 .forEach(onMethodFound);
             break;
         case SAME_AS_PARAMETER_TYPE:
-            MethodFinder
+            MethodFinderPPM
                 .findMethodWithPPMArg(
                         MethodFinderOptions
                         .memberSupport(type, methodNames, processMethodContext.getIntrospectionPolicy()),
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
index 9e2b2fe..8a571ec 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinder.java
@@ -24,10 +24,9 @@ import java.util.stream.Stream;
 
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnTypeCategory;
-import org.apache.isis.core.metamodel.methods.MethodFinderUtils.MethodAndPpmConstructor;
 
 /**
- * An extension to {@link MethodFinderUtils} in support of multiple simultaneous naming conventions.
+ * An extension to {@link MethodFinderPPM} in support of multiple simultaneous naming conventions.
  * @apiNote each method name candidate is processed in sequence as given by {@code Can<String> names}
  */
 //@Log4j2
@@ -84,60 +83,4 @@ public final class MethodFinder {
                 .filter(hasReturnTypeAnyOf(ReturnTypeCategory.nonScalar(elementReturnType)));
     }
 
-    // -- SEARCH FOR MULTIPLE NAME CANDIDATES (PPM)
-
-    @Deprecated // redundant
-    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
-            final MethodFinderOptions options,
-            final Class<?> returnType,
-            final Class<?>[] paramTypes,
-            final Can<Class<?>> additionalParamTypes) {
-
-        return MethodFinderUtils
-                .findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes);
-    }
-
-    @Deprecated // redundant
-    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
-            final MethodFinderOptions options,
-            final Can<Class<?>> returnTypes,
-            final Class<?>[] paramTypes,
-            final Can<Class<?>> additionalParamTypes) {
-
-        return MethodFinderUtils
-                .findMethodWithPPMArg_returningAnyOf(
-                        options, returnTypes, paramTypes, additionalParamTypes);
-    }
-
-    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningBoolean(
-            final MethodFinderOptions options,
-            final Class<?>[] paramTypes,
-            final Can<Class<?>> additionalParamTypes) {
-
-        return MethodFinderUtils
-        .findMethodWithPPMArg_returningAnyOf(
-                options, ReturnTypeCategory.BOOLEAN.getReturnTypes(), paramTypes, additionalParamTypes);
-    }
-
-    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningText(
-            final MethodFinderOptions options,
-            final Class<?>[] paramTypes,
-            final Can<Class<?>> additionalParamTypes) {
-
-        return MethodFinderUtils
-        .findMethodWithPPMArg_returningAnyOf(
-                options, ReturnTypeCategory.TRANSLATABLE.getReturnTypes(), paramTypes, additionalParamTypes);
-    }
-
-    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningNonScalar(
-            final MethodFinderOptions options,
-            final Class<?> elementReturnType,
-            final Class<?>[] paramTypes,
-            final Can<Class<?>> additionalParamTypes) {
-
-        return MethodFinderUtils
-        .findMethodWithPPMArg_returningAnyOf(
-                options, ReturnTypeCategory.nonScalar(elementReturnType), paramTypes, additionalParamTypes);
-    }
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderPPM.java
similarity index 67%
rename from core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
rename to core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderPPM.java
index 5b22871..4fce0b7 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/methods/MethodFinderPPM.java
@@ -23,10 +23,9 @@ import java.lang.reflect.Method;
 import java.util.Optional;
 import java.util.stream.Stream;
 
-import org.springframework.lang.Nullable;
-
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.reflection._Reflect;
+import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnTypeCategory;
 import org.apache.isis.core.metamodel.commons.MethodUtil;
 
 import static org.apache.isis.commons.internal.reflection._Reflect.Filter.paramSignatureMatch;
@@ -34,9 +33,9 @@ import static org.apache.isis.commons.internal.reflection._Reflect.Filter.paramS
 import lombok.NonNull;
 import lombok.Value;
 
-public final class MethodFinderUtils {
+public final class MethodFinderPPM {
 
-    private MethodFinderUtils() {
+    private MethodFinderPPM() {
     }
 
     // -- PPM SUPPORT
@@ -47,27 +46,17 @@ public final class MethodFinderUtils {
         @NonNull Constructor<?> ppmFactory;
     }
 
-    @Value(staticConstructor = "of")
-    private static class MethodAndPpmCandidate {
-        @NonNull Method supportingMethod;
-        @NonNull Class<?> ppmCandidate;
-        Optional<MethodAndPpmConstructor> lookupConstructor(final Class<?>[] paramTypes) {
-            return _Reflect.getPublicConstructors(getPpmCandidate()).stream()
-            .filter(paramSignatureMatch(paramTypes))
-            .map(constructor->MethodAndPpmConstructor.of(supportingMethod, constructor))
-            .findFirst();
-        }
-    }
-
-    // -- HELPER
+    // -- SEARCH FOR MULTIPLE NAME CANDIDATES (PPM)
 
-    static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
+    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg(
             final MethodFinderOptions options,
             final Class<?> returnType,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return streamMethods(options, returnType)
+        return options.streamMethodsIgnoringSignature()
+            .filter(method -> returnType == null
+                || returnType.isAssignableFrom(method.getReturnType()))
             .filter(MethodUtil.Predicates.paramCount(additionalParamTypes.size()+1))
             .filter(MethodUtil.Predicates.matchParamTypes(1, additionalParamTypes))
             .map(method->MethodAndPpmCandidate.of(method, method.getParameterTypes()[0]))
@@ -75,24 +64,59 @@ public final class MethodFinderUtils {
             .flatMap(Optional::stream);
     }
 
-    static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
+    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningBoolean(
             final MethodFinderOptions options,
-            final Can<Class<?>> returnTypes,
             final Class<?>[] paramTypes,
             final Can<Class<?>> additionalParamTypes) {
 
-        return returnTypes.stream()
-        .flatMap(returnType->findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes));
+        return MethodFinderPPM
+        .findMethodWithPPMArg_returningAnyOf(
+                options, ReturnTypeCategory.BOOLEAN.getReturnTypes(), paramTypes, additionalParamTypes);
     }
 
-    private static Stream<Method> streamMethods(
+    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningText(
             final MethodFinderOptions options,
-            final @Nullable Class<?> returnType) {
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
 
-        return options.streamMethodsIgnoringSignature()
-            .filter(method -> returnType == null
-                || returnType.isAssignableFrom(method.getReturnType()));
+        return MethodFinderPPM
+        .findMethodWithPPMArg_returningAnyOf(
+                options, ReturnTypeCategory.TRANSLATABLE.getReturnTypes(), paramTypes, additionalParamTypes);
     }
 
+    public static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningNonScalar(
+            final MethodFinderOptions options,
+            final Class<?> elementReturnType,
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
+
+        return MethodFinderPPM
+        .findMethodWithPPMArg_returningAnyOf(
+                options, ReturnTypeCategory.nonScalar(elementReturnType), paramTypes, additionalParamTypes);
+    }
+
+    // -- HELPER
+
+    @Value(staticConstructor = "of")
+    private static class MethodAndPpmCandidate {
+        @NonNull Method supportingMethod;
+        @NonNull Class<?> ppmCandidate;
+        Optional<MethodAndPpmConstructor> lookupConstructor(final Class<?>[] paramTypes) {
+            return _Reflect.getPublicConstructors(getPpmCandidate()).stream()
+            .filter(paramSignatureMatch(paramTypes))
+            .map(constructor->MethodAndPpmConstructor.of(supportingMethod, constructor))
+            .findFirst();
+        }
+    }
+
+    static Stream<MethodAndPpmConstructor> findMethodWithPPMArg_returningAnyOf(
+            final MethodFinderOptions options,
+            final Can<Class<?>> returnTypes,
+            final Class<?>[] paramTypes,
+            final Can<Class<?>> additionalParamTypes) {
+
+        return returnTypes.stream()
+        .flatMap(returnType->findMethodWithPPMArg(options, returnType, paramTypes, additionalParamTypes));
+    }
 
 }