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

commit 4a4518ccb64005cb5ca6a9ea9b64d0a8d9dbe54e
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Wed May 6 15:46:42 2020 +0200

    ISIS-2361: makes the supporting method search algorithms plugable
---
 .../core/metamodel/facets/ParameterSupport.java    | 82 +++++++++++++++++++---
 ...ParameterAutoCompleteFacetViaMethodFactory.java |  4 ++
 ...ctionParameterChoicesFacetViaMethodFactory.java |  4 ++
 ...tionParameterDefaultsFacetViaMethodFactory.java |  4 ++
 ...tionParameterDisabledFacetViaMethodFactory.java |  4 ++
 ...ActionParameterHiddenFacetViaMethodFactory.java |  4 ++
 ...onParameterValidationFacetViaMethodFactory.java | 13 ++--
 7 files changed, 98 insertions(+), 17 deletions(-)

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 5ab6864..5c64a19 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
@@ -21,6 +21,7 @@ package org.apache.isis.core.metamodel.facets;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.util.Arrays;
+import java.util.EnumSet;
 import java.util.Optional;
 import java.util.function.Consumer;
 import java.util.function.IntFunction;
@@ -37,6 +38,7 @@ import 
org.apache.isis.core.metamodel.facets.MethodFinderUtils.MethodAndPpmConst
 import lombok.Builder;
 import lombok.Getter;
 import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 import lombok.Value;
 import lombok.val;
 import lombok.experimental.UtilityClass;
@@ -63,7 +65,9 @@ public class ParameterSupport {
         
         @NonNull FacetFactory.ProcessMethodContext processMethodContext;
         @NonNull IntFunction<String> paramIndexToMethodName;
+        @NonNull EnumSet<SearchAlgorithm> searchAlgorithms; 
         @NonNull ReturnType returnType;
+        
         Class<?> additionalParamType;
         
         @Getter(lazy = true)
@@ -78,6 +82,28 @@ public class ParameterSupport {
         Class<?> returnType;
         Optional<Constructor<?>> ppmFactory;
     }
+    
+    @FunctionalInterface
+    public static interface SearchFunction {
+        ParameterSupport.ParamSupportingMethodSearchResult search(
+                final ParameterSupport.ParamSupportingMethodSearchRequest 
searchRequest,
+                final int paramNum);
+    }
+    
+    @RequiredArgsConstructor
+    public static enum SearchAlgorithm
+    implements SearchFunction {
+        PPM(ParameterSupport::findParamSupportingMethodWithPPMArg),
+        SWEEP(ParameterSupport::findParamSupportingMethod),
+        SINGLEARG_BEING_PARAMTYPE(ParameterSupport::singleArgBeingParamType)
+        ;
+        private final SearchFunction searchFunction;
+        public ParameterSupport.ParamSupportingMethodSearchResult search(
+                final ParameterSupport.ParamSupportingMethodSearchRequest 
searchRequest,
+                final int paramNum) {
+            return searchFunction.search(searchRequest, paramNum);
+        }
+    }
 
     public static void findParamSupportingMethods(
             final ParameterSupport.ParamSupportingMethodSearchRequest 
searchRequest, 
@@ -87,19 +113,16 @@ public class ParameterSupport {
         val paramCount = actionMethod.getParameterCount();
         
         for (int i = 0; i < paramCount; i++) {
-            for (int j = 0; j < 2; j++) { // account for 2 different search 
algorithms
+            for (val searchAlgorithm : searchRequest.searchAlgorithms) { 
 
-                val algorithmIndex = j;
-                val paramIndex = i;
-                val searchResult = algorithmIndex==0
-                        ? findParamSupportingMethodWithPPMArg(searchRequest, 
paramIndex)
-                        : findParamSupportingMethod(searchRequest, paramIndex);
+                val paramNum = i;
+                val searchResult = searchAlgorithm.search(searchRequest, 
paramNum); 
                 
                 if(log.isDebugEnabled()) {
                     log.debug("search algorithm={} {}{}",
-                            algorithmIndex,
+                            searchAlgorithm.name(),
                             searchResult != null ? "FOUND " : "",
-                            toString(searchRequest, paramIndex));
+                            toString(searchRequest, paramNum));
                 }
     
                 if (searchResult != null) {
@@ -166,6 +189,49 @@ public class ParameterSupport {
         
     }
     
+    private static ParameterSupport.ParamSupportingMethodSearchResult 
singleArgBeingParamType(
+            final ParameterSupport.ParamSupportingMethodSearchRequest 
searchRequest,
+            final int paramIndex) {
+        
+        val processMethodContext = searchRequest.getProcessMethodContext();
+        val type = processMethodContext.getCls();
+        val paramTypes = searchRequest.getParamTypes();
+        val methodName = 
searchRequest.getParamIndexToMethodName().apply(paramIndex);
+        val paramType = paramTypes[paramIndex];
+        val singleArg = new Class<?>[]{paramType};
+        
+        final Method supportingMethod;
+        
+        switch(searchRequest.getReturnType()) {
+        case BOOLEAN:
+            supportingMethod = MethodFinderUtils
+                .findMethod_returningBoolean(type, methodName, singleArg);
+            break;
+        case TEXT:
+            supportingMethod = MethodFinderUtils
+                .findMethod_returningText(type, methodName, singleArg);
+            break;
+        case NON_SCALAR:
+            supportingMethod = MethodFinderUtils
+                .findMethod_returningNonScalar(type, methodName, paramType, 
singleArg);
+            break;
+        case SAME_AS_PARAMETER_TYPE:
+            supportingMethod = MethodFinderUtils
+                .findMethod(type, methodName, paramType, singleArg);
+            break;
+        default:
+            supportingMethod = null;
+        }
+
+        if(supportingMethod != null) {
+            val searchResult = ParamSupportingMethodSearchResult
+                    .of(paramIndex, paramType, supportingMethod, 
supportingMethod.getReturnType(), Optional.empty());
+            return searchResult;
+        }
+     
+        return null;
+    }
+    
     /*
      * search successively for the supporting method, trimming number of param 
types each loop
      */
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index fb1c2db..2dbea29 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.param.autocomplete.method;
 
+import java.util.EnumSet;
+
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
@@ -26,6 +28,7 @@ import 
org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import 
org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
 import 
org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import 
org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
 
 import lombok.val;
@@ -58,6 +61,7 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory 
extends MethodPref
                 .returnType(ReturnType.NON_SCALAR)
                 .additionalParamType(String.class)
                 .paramIndexToMethodName(namingConvention)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, 
SearchAlgorithm.SWEEP))
                 .build();
 
         ParameterSupport.findParamSupportingMethods(searchRequest, 
searchResult -> {
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index 4c83fc6..b2167cf 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -19,12 +19,15 @@
 
 package org.apache.isis.core.metamodel.facets.param.choices.methodnum;
 
+import java.util.EnumSet;
+
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import 
org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import 
org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import org.apache.isis.core.metamodel.facets.param.choices.ActionChoicesFacet;
 
@@ -62,6 +65,7 @@ extends MethodPrefixBasedFacetFactoryAbstract {
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.NON_SCALAR)
                 .paramIndexToMethodName(namingConvention)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, 
SearchAlgorithm.SWEEP))
                 .build();
 
         ParameterSupport.findParamSupportingMethods(searchRequest, 
searchResult -> {
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
index c69f4a9..417ecc6 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethodFactory.java
@@ -19,6 +19,8 @@
 
 package org.apache.isis.core.metamodel.facets.param.defaults.methodnum;
 
+import java.util.EnumSet;
+
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.Facet;
@@ -26,6 +28,7 @@ import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import 
org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import 
org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import 
org.apache.isis.core.metamodel.facets.actions.defaults.ActionDefaultsFacet;
 
@@ -65,6 +68,7 @@ public class ActionParameterDefaultsFacetViaMethodFactory 
extends MethodPrefixBa
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.SAME_AS_PARAMETER_TYPE)
                 .paramIndexToMethodName(namingConvention)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, 
SearchAlgorithm.SWEEP))
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, 
searchResult -> {
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
index 9c4666b..5de0cb9 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
@@ -19,12 +19,15 @@
 
 package org.apache.isis.core.metamodel.facets.param.disable.method;
 
+import java.util.EnumSet;
+
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import 
org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import 
org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import 
org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacet;
 
@@ -61,6 +64,7 @@ extends MethodPrefixBasedFacetFactoryAbstract  {
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.TEXT)
                 .paramIndexToMethodName(namingConvention)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, 
SearchAlgorithm.SWEEP))
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, 
searchResult -> {
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
index 16304d8..909800e 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
@@ -19,12 +19,15 @@
 
 package org.apache.isis.core.metamodel.facets.param.hide.method;
 
+import java.util.EnumSet;
+
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import 
org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import 
org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
 import 
org.apache.isis.core.metamodel.facets.param.hide.ActionParameterHiddenFacet;
 
@@ -60,6 +63,7 @@ public class ActionParameterHiddenFacetViaMethodFactory 
extends MethodPrefixBase
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.BOOLEAN)
                 .paramIndexToMethodName(namingConvention)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, 
SearchAlgorithm.SWEEP))
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, 
searchResult -> {
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
index a3bebb4..8887017 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/validate/method/ActionParameterValidationFacetViaMethodFactory.java
@@ -19,23 +19,16 @@
 
 package org.apache.isis.core.metamodel.facets.param.validate.method;
 
-import java.lang.reflect.Method;
+import java.util.EnumSet;
 
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.StringExtensions;
 import org.apache.isis.core.metamodel.exceptions.MetaModelException;
-import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.core.metamodel.facets.MethodFinderUtils;
 import org.apache.isis.core.metamodel.facets.MethodLiteralConstants;
 import 
org.apache.isis.core.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.facets.ParameterSupport;
-import org.apache.isis.core.metamodel.facets.FacetFactory.ProcessMethodContext;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
 import 
org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ReturnType;
-import 
org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacet;
-import 
org.apache.isis.core.metamodel.facets.param.disable.method.ActionParameterDisabledFacetViaMethod;
 import 
org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacet;
 
 import lombok.val;
@@ -62,6 +55,7 @@ public class ActionParameterValidationFacetViaMethodFactory 
extends MethodPrefix
         }
 
         // attach ActionParameterValidationFacet if validateNumMethod is found 
...
+        // in any case single-arg, either same as param-type or PPM style 
         
         val actionMethod = processMethodContext.getMethod();
         val namingConvention = 
PREFIX_BASED_NAMING.providerForParam(actionMethod, PREFIX);
@@ -70,6 +64,7 @@ public class ActionParameterValidationFacetViaMethodFactory 
extends MethodPrefix
                 .processMethodContext(processMethodContext)
                 .returnType(ReturnType.TEXT)
                 .paramIndexToMethodName(namingConvention)
+                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, 
SearchAlgorithm.SINGLEARG_BEING_PARAMTYPE))
                 .build();
         
         ParameterSupport.findParamSupportingMethods(searchRequest, 
searchResult -> {

Reply via email to