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/07 14:19:41 UTC

[isis] branch master updated: ISIS-2774: unify common search logic within ActionParameterSupportFacetAbstract

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 ca4f0ad  ISIS-2774: unify common search logic within ActionParameterSupportFacetAbstract
ca4f0ad is described below

commit ca4f0ad1ed4a5098000a308878fb1daa63bb2fcf
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Sep 7 16:19:31 2021 +0200

    ISIS-2774: unify common search logic within
    ActionParameterSupportFacetAbstract
---
 .../progmodel/ProgrammingModelConstants.java       | 28 ++++++---
 .../core/metamodel/facets/ParameterSupport.java    |  8 +--
 .../DescribedAsFacetForMemberViaMethodFactory.java |  3 +-
 ...ParameterAutoCompleteFacetViaMethodFactory.java | 72 +++++-----------------
 ...ctionParameterChoicesFacetViaMethodFactory.java | 65 +++++--------------
 ...tionParameterDefaultsFacetViaMethodFactory.java | 64 +++++--------------
 .../ActionParameterDisabledFacetViaMethod.java     | 10 +--
 ...tionParameterDisabledFacetViaMethodFactory.java | 69 ++++-----------------
 ...ActionParameterHiddenFacetViaMethodFactory.java | 65 ++++---------------
 .../ActionParameterSupportFacetAbstract.java}      | 67 ++++++++++----------
 ...onParameterValidationFacetViaMethodFactory.java |  5 +-
 11 files changed, 130 insertions(+), 326 deletions(-)

diff --git a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
index 118884e..914a632 100644
--- a/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
+++ b/core/config/src/main/java/org/apache/isis/core/config/progmodel/ProgrammingModelConstants.java
@@ -148,6 +148,15 @@ public final class ProgrammingModelConstants {
         }
     }
 
+    // -- PARAMETER SUPPORT
+
+    public static enum ReturnType {
+        NON_SCALAR,
+        TEXT,
+        BOOLEAN,
+        SAME_AS_PARAMETER_TYPE,
+    }
+
     // -- OBJECT SUPPORT
 
     @Getter
@@ -176,18 +185,21 @@ public final class ProgrammingModelConstants {
 
     @Getter
     public static enum MemberSupportPrefix {
-        DEFAULT("default"),
-        CHOICES("choices"),
-        AUTO_COMPLETE("autoComplete"),
-        HIDE("hide"),
-        DISABLE("disable"),
-        VALIDATE("validate"),
-        NAMED("named"), // imperative naming
-        DESCRIBED("described"); // imperative naming
+        DEFAULT(ReturnType.SAME_AS_PARAMETER_TYPE, "default"),
+        CHOICES(ReturnType.NON_SCALAR, "choices"),
+        AUTO_COMPLETE(ReturnType.NON_SCALAR, "autoComplete"),
+        HIDE(ReturnType.BOOLEAN, "hide"),
+        DISABLE(ReturnType.TEXT, "disable"),
+        VALIDATE(ReturnType.TEXT, "validate"),
+        NAMED(ReturnType.TEXT, "named"), // imperative naming
+        DESCRIBED(ReturnType.TEXT, "described"); // imperative naming
         MemberSupportPrefix(
+                final ReturnType parameterSearchReturnType,
                 final String ...methodNamePrefixes) {
+            this.parameterSearchReturnType = parameterSearchReturnType;
             this.methodNamePrefixes = Can.of(methodNamePrefixes);
         }
+        private final ReturnType parameterSearchReturnType;
         private final Can<String> methodNamePrefixes;
     }
 
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 3998f99..1f7049a 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
@@ -30,6 +30,7 @@ import org.springframework.lang.Nullable;
 
 import org.apache.isis.commons.collections.Can;
 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;
@@ -51,13 +52,6 @@ public final class ParameterSupport {
     @Value @Builder
     public static class ParamSupportingMethodSearchRequest {
 
-        public static enum ReturnType {
-            NON_SCALAR,
-            TEXT,
-            BOOLEAN,
-            SAME_AS_PARAMETER_TYPE,
-        }
-
         @NonNull FacetFactory.ProcessMethodContext processMethodContext;
         @NonNull Can<IntFunction<String>> paramIndexToMethodNameProviders;
         @NonNull EnumSet<SearchAlgorithm> searchAlgorithms;
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
index e95dd40..7ab6d7f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/members/described/method/DescribedAsFacetForMemberViaMethodFactory.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 import org.apache.isis.core.metamodel.methods.MethodFinder;
@@ -60,7 +59,7 @@ extends MemberSupportFacetFactoryAbstract {
         }
         processMethodContext.removeMethod(describedMethod);
 
-        FacetUtil.addFacet(
+        addFacet(
                 new DescribedAsFacetForMemberViaMethod(
                         describedMethod,
                         processMethodContext.getFacetHolder()));
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 841c2dc..1cfd557 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
@@ -18,76 +18,36 @@
  */
 package org.apache.isis.core.metamodel.facets.param.autocomplete.method;
 
-import java.util.EnumSet;
-
 import javax.inject.Inject;
 
-import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-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 org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
+import org.apache.isis.core.metamodel.facets.param.support.ActionParameterSupportFacetAbstract;
 
 import lombok.val;
 
 public class ActionParameterAutoCompleteFacetViaMethodFactory
-extends MemberSupportFacetFactoryAbstract {
+extends ActionParameterSupportFacetAbstract {
 
     @Inject
     public ActionParameterAutoCompleteFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.AUTO_COMPLETE);
+        super(mmc, MemberSupportPrefix.AUTO_COMPLETE, searchOptions->
+            searchOptions
+            .additionalParamType(String.class));
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val facetedMethod = processMethodContext.getFacetHolder();
-        val parameters = facetedMethod.getParameters();
-
-        if (parameters.isEmpty()) {
-            return;
-        }
-
-        // attach ActionParameterChoicesFacet if autoCompleteNumMethod is found ...
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::parameterSupportCandidates);
-
-        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
-                .processMethodContext(processMethodContext)
-                .returnType(ReturnType.NON_SCALAR)
-                .additionalParamType(String.class)
-                .paramIndexToMethodNameProviders(methodNameCandidates)
-                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
-                .build();
-
-        ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
-
-            val autoCompleteMethod = searchResult.getSupportingMethod();
-            val paramIndex = searchResult.getParamIndex();
-            val paramType = searchResult.getParamType();
-
-            processMethodContext.removeMethod(autoCompleteMethod);
-
-            if (facetedMethod.containsNonFallbackFacet(ActionParameterAutoCompleteFacet.class)) {
-                val cls = processMethodContext.getCls();
-                throw new MetaModelException(cls + " uses both old and new autoComplete syntax - "
-                        + "must use one or other");
-            }
-
-            // add facets directly to parameters, not to actions
-            val paramAsHolder = parameters.get(paramIndex);
-            val ppmFactory = searchResult.getPpmFactory();
-
-            addFacet(
-                    new ActionParameterAutoCompleteFacetViaMethod(
-                            autoCompleteMethod, paramType, ppmFactory, paramAsHolder));
-        });
-
+    protected void onSearchResult(
+            final FacetedMethodParameter paramAsHolder,
+            final ParamSupportingMethodSearchResult searchResult) {
+        val autoCompleteMethod = searchResult.getSupportingMethod();
+        val paramType = searchResult.getParamType();
+        val ppmFactory = searchResult.getPpmFactory();
+        addFacet(
+                new ActionParameterAutoCompleteFacetViaMethod(
+                        autoCompleteMethod, paramType, ppmFactory, paramAsHolder));
     }
 
 }
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 3885185..3720800 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
@@ -18,72 +18,35 @@
  */
 package org.apache.isis.core.metamodel.facets.param.choices.methodnum;
 
-import java.util.EnumSet;
-
 import javax.inject.Inject;
 
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-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.members.support.MemberSupportFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
+import org.apache.isis.core.metamodel.facets.param.support.ActionParameterSupportFacetAbstract;
 
 import lombok.val;
 
 public class ActionParameterChoicesFacetViaMethodFactory
-extends MemberSupportFacetFactoryAbstract {
+extends ActionParameterSupportFacetAbstract {
 
     @Inject
     public ActionParameterChoicesFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.CHOICES);
+        super(mmc, MemberSupportPrefix.CHOICES);
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val facetedMethod = processMethodContext.getFacetHolder();
-        val parameters = facetedMethod.getParameters();
-
-        if (parameters.isEmpty()) {
-            return;
-        }
-
-        // attach ActionChoicesFacet if choicesNumMethod is found ...
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::parameterSupportCandidates);
-
-        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
-                .processMethodContext(processMethodContext)
-                .returnType(ReturnType.NON_SCALAR)
-                .paramIndexToMethodNameProviders(methodNameCandidates)
-                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
-                .build();
-
-        ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
-
-            val choicesMethod = searchResult.getSupportingMethod();
-            val paramIndex = searchResult.getParamIndex();
-            val returnType = searchResult.getReturnType();
-
-            processMethodContext.removeMethod(choicesMethod);
-
-            // add facets directly to parameters, not to actions
-            val paramAsHolder = parameters.get(paramIndex);
-            val ppmFactory = searchResult.getPpmFactory();
-            addFacet(
-                    new ActionParameterChoicesFacetViaMethod(
-                            choicesMethod, returnType, ppmFactory, paramAsHolder));
-        });
-
+    protected void onSearchResult(
+            final FacetedMethodParameter paramAsHolder,
+            final ParamSupportingMethodSearchResult searchResult) {
+        val choicesMethod = searchResult.getSupportingMethod();
+        val returnType = searchResult.getReturnType();
+        val ppmFactory = searchResult.getPpmFactory();
+        addFacet(
+                new ActionParameterChoicesFacetViaMethod(
+                        choicesMethod, returnType, ppmFactory, paramAsHolder));
     }
 
 
-
 }
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 d99686c..dea1a97 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
@@ -18,18 +18,14 @@
  */
 package org.apache.isis.core.metamodel.facets.param.defaults.methodnum;
 
-import java.util.EnumSet;
-
 import javax.inject.Inject;
 
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.Facet;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-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.members.support.MemberSupportFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
+import org.apache.isis.core.metamodel.facets.param.support.ActionParameterSupportFacetAbstract;
 
 import lombok.val;
 
@@ -37,55 +33,23 @@ import lombok.val;
  * Sets up all the {@link Facet}s for an action in a single shot.
  */
 public class ActionParameterDefaultsFacetViaMethodFactory
-extends MemberSupportFacetFactoryAbstract {
+extends ActionParameterSupportFacetAbstract {
 
     @Inject
     public ActionParameterDefaultsFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.DEFAULT);
+        super(mmc, MemberSupportPrefix.DEFAULT);
     }
 
-    // ///////////////////////////////////////////////////////
-    // Actions
-    // ///////////////////////////////////////////////////////
-
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val facetedMethod = processMethodContext.getFacetHolder();
-        val parameters = facetedMethod.getParameters();
-
-        if (parameters.isEmpty()) {
-            return;
-        }
-
-        // attach DefaultFacetForParameters if defaultNumMethod is found ...
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::parameterSupportCandidates);
-
-        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
-                .processMethodContext(processMethodContext)
-                .returnType(ReturnType.SAME_AS_PARAMETER_TYPE)
-                .paramIndexToMethodNameProviders(methodNameCandidates)
-                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
-                .build();
-
-        ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
-
-            val defaultMethod = searchResult.getSupportingMethod();
-            val paramIndex = searchResult.getParamIndex();
-
-            processMethodContext.removeMethod(defaultMethod);
-
-            // add facets directly to parameters, not to actions
-            val paramAsHolder = parameters.get(paramIndex);
-            //val translationContext = paramAsHolder.getIdentifier().toFullIdentityString();
-            val ppmFactory = searchResult.getPpmFactory();
-
-            addFacet(new ActionParameterDefaultsFacetViaMethod(
-                    defaultMethod, paramIndex, ppmFactory, paramAsHolder));
-        });
+    protected void onSearchResult(
+            final FacetedMethodParameter paramAsHolder,
+            final ParamSupportingMethodSearchResult searchResult) {
+        val defaultMethod = searchResult.getSupportingMethod();
+        val paramIndex = searchResult.getParamIndex();
+        val ppmFactory = searchResult.getPpmFactory();
+        addFacet(
+                new ActionParameterDefaultsFacetViaMethod(
+                        defaultMethod, paramIndex, ppmFactory, paramAsHolder));
     }
 
-
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
index d13960d..27b96fe 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
@@ -25,7 +25,6 @@ import java.util.function.BiConsumer;
 
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationContext;
-import org.apache.isis.applib.services.i18n.TranslationService;
 import org.apache.isis.commons.collections.Can;
 import org.apache.isis.core.metamodel.facetapi.FacetHolder;
 import org.apache.isis.core.metamodel.facets.ImperativeFacet;
@@ -42,21 +41,18 @@ extends ActionParameterDisabledFacetAbstract
 implements ImperativeFacet {
 
     @Getter(onMethod_ = {@Override}) private final @NonNull Can<Method> methods;
-    private final TranslationService translationService;
     private final TranslationContext translationContext;
     private final Optional<Constructor<?>> ppmFactory;
 
     public ActionParameterDisabledFacetViaMethod(
             final Method method,
-            final TranslationService translationService,
-            final TranslationContext translationContext,
             final Optional<Constructor<?>> ppmFactory,
             final FacetHolder holder) {
 
         super(holder);
         this.methods = ImperativeFacet.singleMethod(method);
-        this.translationService = translationService;
-        this.translationContext = translationContext;
+        this.translationContext =
+                TranslationContext.forTranslationContextHolder(holder.getFeatureIdentifier());
         this.ppmFactory = ppmFactory;
     }
 
@@ -80,7 +76,7 @@ implements ImperativeFacet {
         }
         if(returnValue instanceof TranslatableString) {
             final TranslatableString ts = (TranslatableString) returnValue;
-            return ts.translate(translationService, translationContext);
+            return ts.translate(getTranslationService(), translationContext);
         }
         return null;
     }
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 344cba9..0acf5e9 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
@@ -18,20 +18,14 @@
  */
 package org.apache.isis.core.metamodel.facets.param.disable.method;
 
-import java.util.EnumSet;
-
 import javax.inject.Inject;
 
-import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
-import org.apache.isis.applib.services.i18n.TranslationContext;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-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.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
 import org.apache.isis.core.metamodel.facets.param.disable.ActionParameterDisabledFacet;
-import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.param.support.ActionParameterSupportFacetAbstract;
 
 import lombok.val;
 
@@ -39,59 +33,22 @@ import lombok.val;
  * Sets up {@link ActionParameterDisabledFacet}.
  */
 public class ActionParameterDisabledFacetViaMethodFactory
-extends MemberSupportFacetFactoryAbstract  {
+extends ActionParameterSupportFacetAbstract  {
 
     @Inject
     public ActionParameterDisabledFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.DISABLE);
+        super(mmc, MemberSupportPrefix.DISABLE);
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val facetedMethod = processMethodContext.getFacetHolder();
-        val parameters = facetedMethod.getParameters();
-
-        if (parameters.isEmpty()) {
-            return;
-        }
-
-        // attach ActionParameterDisabledFacet if disableNumMethod is found ...
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::parameterSupportCandidates);
-
-        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
-                .processMethodContext(processMethodContext)
-                .returnType(ReturnType.TEXT)
-                .paramIndexToMethodNameProviders(methodNameCandidates)
-                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
-                .build();
-
-        ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
-
-            val disableMethod = searchResult.getSupportingMethod();
-            val paramNum = searchResult.getParamIndex();
-
-            processMethodContext.removeMethod(disableMethod);
-
-            if (facetedMethod.containsNonFallbackFacet(ActionParameterDisabledFacet.class)) {
-                val cls = processMethodContext.getCls();
-                throw new MetaModelException(cls + " uses both old and new 'disable' syntax - "
-                        + "must use one or other");
-            }
-
-            // add facets directly to parameters, not to actions
-            val paramAsHolder = parameters.get(paramNum);
-            val translationContext = TranslationContext.forTranslationContextHolder(paramAsHolder.getFeatureIdentifier());
-            val ppmFactory = searchResult.getPpmFactory();
-            val translationService = getMetaModelContext().getTranslationService();
-
-            addFacet(
-                    new ActionParameterDisabledFacetViaMethod(
-                            disableMethod, translationService, translationContext, ppmFactory, paramAsHolder));
-        });
-
+    protected void onSearchResult(
+            final FacetedMethodParameter paramAsHolder,
+            final ParamSupportingMethodSearchResult searchResult) {
+        val disableMethod = searchResult.getSupportingMethod();
+        val ppmFactory = searchResult.getPpmFactory();
+        addFacet(
+                new ActionParameterDisabledFacetViaMethod(
+                        disableMethod, ppmFactory, paramAsHolder));
     }
 
 }
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 f9399a5..884158d 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
@@ -18,19 +18,14 @@
  */
 package org.apache.isis.core.metamodel.facets.param.hide.method;
 
-import java.util.EnumSet;
-
 import javax.inject.Inject;
 
-import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-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.FacetedMethodParameter;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
 import org.apache.isis.core.metamodel.facets.param.hide.ActionParameterHiddenFacet;
-import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.param.support.ActionParameterSupportFacetAbstract;
 
 import lombok.val;
 
@@ -38,56 +33,22 @@ import lombok.val;
  * Sets up {@link ActionParameterHiddenFacet}.
  */
 public class ActionParameterHiddenFacetViaMethodFactory
-extends MemberSupportFacetFactoryAbstract {
+extends ActionParameterSupportFacetAbstract {
 
     @Inject
     public ActionParameterHiddenFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.HIDE);
+        super(mmc, MemberSupportPrefix.HIDE);
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
-
-        val facetedMethod = processMethodContext.getFacetHolder();
-        val parameters = facetedMethod.getParameters();
-
-        if (parameters.isEmpty()) {
-            return;
-        }
-
-        // attach ActionParameterHiddenFacet if hideNumMethod is found ...
-
-        val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
-                .flatMap(processMethodContext::parameterSupportCandidates);
-
-        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
-                .processMethodContext(processMethodContext)
-                .returnType(ReturnType.BOOLEAN)
-                .paramIndexToMethodNameProviders(methodNameCandidates)
-                .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
-                .build();
-
-        ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
-
-            val hideMethod = searchResult.getSupportingMethod();
-            val paramIndex = searchResult.getParamIndex();
-
-            processMethodContext.removeMethod(hideMethod);
-
-            if (facetedMethod.containsNonFallbackFacet(ActionParameterHiddenFacet.class)) {
-                val cls = processMethodContext.getCls();
-                throw new MetaModelException(cls + " uses both old and new 'hide' syntax - "
-                        + "must use one or other");
-            }
-
-            // add facets directly to parameters, not to actions
-            val paramAsHolder = parameters.get(paramIndex);
-            val ppmFactory = searchResult.getPpmFactory();
-
-            addFacet(
-                    new ActionParameterHiddenFacetViaMethod(hideMethod, ppmFactory, paramAsHolder));
-        });
-
+    protected void onSearchResult(
+            final FacetedMethodParameter paramAsHolder,
+            final ParamSupportingMethodSearchResult searchResult) {
+        val hideMethod = searchResult.getSupportingMethod();
+        val ppmFactory = searchResult.getPpmFactory();
+        addFacet(
+                new ActionParameterHiddenFacetViaMethod(
+                        hideMethod, ppmFactory, paramAsHolder));
     }
 
 
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/support/ActionParameterSupportFacetAbstract.java
similarity index 55%
copy from core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
copy to core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/param/support/ActionParameterSupportFacetAbstract.java
index 841c2dc..a94b1f1 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/support/ActionParameterSupportFacetAbstract.java
@@ -16,34 +16,47 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.core.metamodel.facets.param.autocomplete.method;
+package org.apache.isis.core.metamodel.facets.param.support;
 
 import java.util.EnumSet;
+import java.util.function.UnaryOperator;
 
-import javax.inject.Inject;
-
-import org.apache.isis.applib.exceptions.unrecoverable.MetaModelException;
 import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSupportPrefix;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.FacetedMethodParameter;
 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.ParamSupportingMethodSearchRequest;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchRequest.ParamSupportingMethodSearchRequestBuilder;
+import org.apache.isis.core.metamodel.facets.ParameterSupport.ParamSupportingMethodSearchResult;
 import org.apache.isis.core.metamodel.facets.ParameterSupport.SearchAlgorithm;
-import org.apache.isis.core.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
 
+import lombok.NonNull;
 import lombok.val;
 
-public class ActionParameterAutoCompleteFacetViaMethodFactory
+public abstract class ActionParameterSupportFacetAbstract
 extends MemberSupportFacetFactoryAbstract {
 
-    @Inject
-    public ActionParameterAutoCompleteFacetViaMethodFactory(final MetaModelContext mmc) {
-        super(mmc, FeatureType.ACTIONS_ONLY, MemberSupportPrefix.AUTO_COMPLETE);
+    private final UnaryOperator<ParamSupportingMethodSearchRequest.ParamSupportingMethodSearchRequestBuilder>
+        searchRefiner;
+
+    protected ActionParameterSupportFacetAbstract(
+            final @NonNull MetaModelContext mmc,
+            final @NonNull MemberSupportPrefix memberSupportPrefix) {
+        this(mmc, memberSupportPrefix, UnaryOperator.identity());
+    }
+
+    protected ActionParameterSupportFacetAbstract(
+            final @NonNull MetaModelContext mmc,
+            final @NonNull MemberSupportPrefix memberSupportPrefix,
+            final @NonNull UnaryOperator<ParamSupportingMethodSearchRequestBuilder> searchRefiner) {
+        super(mmc, FeatureType.ACTIONS_ONLY, memberSupportPrefix);
+        this.searchRefiner = searchRefiner;
     }
 
     @Override
-    public void process(final ProcessMethodContext processMethodContext) {
+    public final void process(final ProcessMethodContext processMethodContext) {
 
         val facetedMethod = processMethodContext.getFacetHolder();
         val parameters = facetedMethod.getParameters();
@@ -52,42 +65,28 @@ extends MemberSupportFacetFactoryAbstract {
             return;
         }
 
-        // attach ActionParameterChoicesFacet if autoCompleteNumMethod is found ...
-
         val methodNameCandidates = memberSupportPrefix.getMethodNamePrefixes()
                 .flatMap(processMethodContext::parameterSupportCandidates);
 
-        val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
+        val searchRequest = searchRefiner.apply(ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
-                .returnType(ReturnType.NON_SCALAR)
-                .additionalParamType(String.class)
-                .paramIndexToMethodNameProviders(methodNameCandidates)
+                .paramIndexToMethodNameProviders(methodNameCandidates))
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SWEEP))
+                .returnType(memberSupportPrefix.getParameterSearchReturnType())
                 .build();
 
         ParameterSupport.findParamSupportingMethods(searchRequest, searchResult -> {
-
-            val autoCompleteMethod = searchResult.getSupportingMethod();
+            processMethodContext.removeMethod(searchResult.getSupportingMethod());
             val paramIndex = searchResult.getParamIndex();
-            val paramType = searchResult.getParamType();
-
-            processMethodContext.removeMethod(autoCompleteMethod);
-
-            if (facetedMethod.containsNonFallbackFacet(ActionParameterAutoCompleteFacet.class)) {
-                val cls = processMethodContext.getCls();
-                throw new MetaModelException(cls + " uses both old and new autoComplete syntax - "
-                        + "must use one or other");
-            }
-
             // add facets directly to parameters, not to actions
             val paramAsHolder = parameters.get(paramIndex);
-            val ppmFactory = searchResult.getPpmFactory();
-
-            addFacet(
-                    new ActionParameterAutoCompleteFacetViaMethod(
-                            autoCompleteMethod, paramType, ppmFactory, paramAsHolder));
+            onSearchResult(paramAsHolder, searchResult);
         });
 
     }
 
+    protected abstract void onSearchResult(
+            FacetedMethodParameter paramAsHolder,
+            ParamSupportingMethodSearchResult 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 f274f05..c80a6f9 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
@@ -28,10 +28,9 @@ import org.apache.isis.core.config.progmodel.ProgrammingModelConstants.MemberSup
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 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.validate.ActionParameterValidationFacet;
 import org.apache.isis.core.metamodel.facets.members.support.MemberSupportFacetFactoryAbstract;
+import org.apache.isis.core.metamodel.facets.param.validate.ActionParameterValidationFacet;
 
 import lombok.val;
 
@@ -63,7 +62,7 @@ extends MemberSupportFacetFactoryAbstract  {
 
         val searchRequest = ParameterSupport.ParamSupportingMethodSearchRequest.builder()
                 .processMethodContext(processMethodContext)
-                .returnType(ReturnType.TEXT)
+                .returnType(org.apache.isis.core.config.progmodel.ProgrammingModelConstants.ReturnType.TEXT)
                 .paramIndexToMethodNameProviders(methodNameCandidates)
                 .searchAlgorithms(EnumSet.of(SearchAlgorithm.PPM, SearchAlgorithm.SINGLEARG_BEING_PARAMTYPE))
                 .build();