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