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 -> {