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 2019/12/18 17:19:32 UTC
[isis] branch master updated: ISIS-2226 consolidate
Parameter-Facet-Factories to use DependendArgUtils
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 c5ca6c4 ISIS-2226 consolidate Parameter-Facet-Factories to use DependendArgUtils
c5ca6c4 is described below
commit c5ca6c42f271457055344062032ef25a987d0d60
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Dec 18 18:19:23 2019 +0100
ISIS-2226 consolidate Parameter-Facet-Factories to use DependendArgUtils
fixes dependent arg feature for DISABLE and HIDE
---
.../isis/metamodel/facets/DependentArgUtils.java | 88 +++++++++++--
.../metamodel/facets/FacetedMethodParameter.java | 8 +-
.../isis/metamodel/facets/MethodFinderUtils.java | 13 +-
.../isis/metamodel/facets/TypedHolderDefault.java | 5 +
...ParameterAutoCompleteFacetViaMethodFactory.java | 83 ++-----------
...ctionParameterChoicesFacetViaMethodFactory.java | 30 ++---
.../ActionParameterDisabledFacetViaMethod.java | 4 +-
...tionParameterDisabledFacetViaMethodFactory.java | 136 ++++++++++++++-------
.../hide/ActionParameterHiddenFacetAbstract.java | 4 +-
...ActionParameterHiddenFacetViaMethodFactory.java | 123 +++++++++++++------
.../specimpl/ObjectActionParameterAbstract.java | 6 +-
.../handlers/DomainObjectInvocationHandler.java | 3 +-
.../components/actions/ActionParametersForm.java | 3 +-
.../DependentArgsActionDemo_useDisable.java | 2 +-
.../depargs/DependentArgsActionDemo_useHide.java | 2 +-
.../testdomain/model/good/ProperMemberSupport.java | 12 +-
.../model/good/ProperMemberSupport_action.java | 7 +-
.../DomainModelTest_usingGoodDomain.java | 2 +
.../SupportingMethodValidatorRefinerFactory.java | 2 +-
19 files changed, 326 insertions(+), 207 deletions(-)
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DependentArgUtils.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DependentArgUtils.java
index 7ff5361..8ee8e17 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DependentArgUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/DependentArgUtils.java
@@ -22,30 +22,44 @@ import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.function.Consumer;
import java.util.function.IntFunction;
+import java.util.stream.Collectors;
import javax.annotation.Nullable;
+import org.apache.isis.commons.collections.Can;
+import org.apache.isis.commons.internal.base._NullSafe;
import org.apache.isis.commons.internal.collections._Arrays;
import org.apache.isis.metamodel.facets.FacetFactory.ProcessMethodContext;
+import lombok.Builder;
import lombok.Getter;
+import lombok.NonNull;
import lombok.Value;
import lombok.val;
import lombok.experimental.UtilityClass;
+import lombok.extern.log4j.Log4j2;
/**
*
* @since 2.0
*
*/
-@UtilityClass
+@UtilityClass @Log4j2
public class DependentArgUtils {
- @Value(staticConstructor = "of")
+ @Value @Builder
public static class ParamSupportingMethodSearchRequest {
- ProcessMethodContext processMethodContext;
+
+ public static enum ReturnType {
+ NON_SCALAR,
+ TEXT,
+ BOOLEAN
+ }
+
+ @NonNull ProcessMethodContext processMethodContext;
+ @NonNull IntFunction<String> paramIndexToMethodName;
+ @NonNull ReturnType returnType;
Class<?> additionalParamType;
- IntFunction<String> paramIndexToMethodName;
@Getter(lazy = true)
Class<?>[] paramTypes = getProcessMethodContext().getMethod().getParameterTypes();
@@ -59,7 +73,7 @@ public class DependentArgUtils {
Class<?> returnType;
}
- public void findParamSupportingMethods(
+ public static void findParamSupportingMethods(
final DependentArgUtils.ParamSupportingMethodSearchRequest searchRequest,
final Consumer<DependentArgUtils.ParamSupportingMethodSearchResult> onMethodFound) {
@@ -70,6 +84,12 @@ public class DependentArgUtils {
val paramIndex = i;
val searchResult = findParamSupportingMethod(searchRequest, paramIndex);
+
+ if(log.isDebugEnabled()) {
+ log.debug("search {}{}",
+ searchResult != null ? "FOUND " : "",
+ toString(searchRequest, paramIndex));
+ }
if (searchResult != null) {
onMethodFound.accept(searchResult);
@@ -91,29 +111,52 @@ public class DependentArgUtils {
val methodName = searchRequest.getParamIndexToMethodName().apply(paramIndex);
val paramType = paramTypes[paramIndex];
val additionalParamType = searchRequest.getAdditionalParamType();
+ val additionalParamCount = additionalParamType!=null ? 1 : 0;
- int paramsConsidered = paramTypes.length - 1;
- while(paramsConsidered>=0) {
+ int paramsConsideredCount = paramIndex + additionalParamCount;
+ while(paramsConsideredCount>=0) {
- val paramTypesToLookFor = concat(paramTypes, paramsConsidered, additionalParamType);
+ val paramTypesToLookFor = concat(paramTypes, paramsConsideredCount, additionalParamType);
- val supportingMethod = MethodFinderUtils
+ final Method supportingMethod;
+
+ switch(searchRequest.getReturnType()) {
+ case BOOLEAN:
+ supportingMethod = MethodFinderUtils
+ .findMethod_returningBoolean(type, methodName, paramTypesToLookFor);
+ break;
+ case TEXT:
+ supportingMethod = MethodFinderUtils
+ .findMethod_returningText(type, methodName, paramTypesToLookFor);
+ break;
+ case NON_SCALAR:
+ supportingMethod = MethodFinderUtils
.findMethod_returningNonScalar(type, methodName, paramType, paramTypesToLookFor);
+ break;
+ default:
+ supportingMethod = null;
+ }
+
+ if(log.isDebugEnabled()) {
+ log.debug(". signature ({}) {}",
+ toString(paramTypesToLookFor),
+ supportingMethod != null ? "found -> " + supportingMethod : "");
+ }
if(supportingMethod != null) {
- val searchResult = ParamSupportingMethodSearchResult.of(
- paramIndex, paramType, supportingMethod, supportingMethod.getReturnType());
+ val searchResult = ParamSupportingMethodSearchResult
+ .of(paramIndex, paramType, supportingMethod, supportingMethod.getReturnType());
return searchResult;
}
// remove last, and search again
- paramsConsidered--;
+ paramsConsideredCount--;
}
return null;
}
- public static Class<?>[] concat(
+ private static Class<?>[] concat(
final Class<?>[] paramTypes,
final int paramsConsidered,
@Nullable final Class<?> additionalParamType) {
@@ -135,4 +178,23 @@ public class DependentArgUtils {
return withAdditional;
}
+ private String toString(
+ DependentArgUtils.ParamSupportingMethodSearchRequest searchRequest,
+ int paramIndex) {
+
+ return String.format("%s.%s(%s) : %s",
+ searchRequest.getProcessMethodContext().getCls().getSimpleName(),
+ searchRequest.getParamIndexToMethodName().apply(paramIndex),
+ toString(searchRequest.getParamTypes()),
+ searchRequest.getReturnType().name()
+ );
+ }
+
+ private String toString(Class<?>[] types) {
+ return _NullSafe.stream(types)
+ .map(Class::getSimpleName)
+ .collect(Collectors.joining(","));
+ }
+
+
}
\ No newline at end of file
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetedMethodParameter.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetedMethodParameter.java
index 43b7de2..1a44e45 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetedMethodParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/FacetedMethodParameter.java
@@ -24,7 +24,9 @@ import org.apache.isis.applib.Identifier;
import org.apache.isis.metamodel.facetapi.FeatureType;
import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-public class FacetedMethodParameter extends TypedHolderDefault implements IdentifiedHolder {
+public class FacetedMethodParameter
+extends TypedHolderDefault
+implements IdentifiedHolder {
private final Identifier identifier;
@@ -33,8 +35,9 @@ public class FacetedMethodParameter extends TypedHolderDefault implements Identi
final Class<?> declaringType,
final Method method,
final Class<?> type) {
+
super(featureType, type);
-
+
// best we can do...
this.identifier = FeatureType.ACTION.identifierFor(declaringType, method);
}
@@ -44,5 +47,4 @@ public class FacetedMethodParameter extends TypedHolderDefault implements Identi
return identifier;
}
-
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodFinderUtils.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodFinderUtils.java
index e0b4563..343f277 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodFinderUtils.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/MethodFinderUtils.java
@@ -198,11 +198,20 @@ public final class MethodFinderUtils {
return nullableMethod;
}
+ // -- SHORTCUTS
+ private static final Class<?>[] BOOLEAN_TYPES = new Class<?>[]{
+ boolean.class};
+
- // -- SHORTCUTS
+ public static Method findMethod_returningBoolean(
+ final Class<?> type,
+ final String name,
+ final Class<?>[] paramTypes) {
+ return findMethod_returningAnyOf(BOOLEAN_TYPES, type, name, paramTypes);
+ }
- public static final Class<?>[] TEXT_TYPES = new Class<?>[]{
+ private static final Class<?>[] TEXT_TYPES = new Class<?>[]{
String.class,
TranslatableString.class};
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/TypedHolderDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/TypedHolderDefault.java
index a946e35..014f866 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/TypedHolderDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/TypedHolderDefault.java
@@ -49,5 +49,10 @@ public class TypedHolderDefault extends FacetHolderImpl implements TypedHolder {
public void setType(final Class<?> type) {
this.type = type;
}
+
+ @Override // as used for logging, not strictly required
+ public String toString() {
+ return type.getSimpleName();
+ }
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
index df7742e..cb73b63 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethodFactory.java
@@ -19,17 +19,14 @@
package org.apache.isis.metamodel.facets.param.autocomplete.method;
-import java.util.List;
-
import org.apache.isis.commons.collections.Can;
import org.apache.isis.metamodel.commons.StringExtensions;
import org.apache.isis.metamodel.exceptions.MetaModelException;
import org.apache.isis.metamodel.facetapi.FeatureType;
import org.apache.isis.metamodel.facets.DependentArgUtils;
-import org.apache.isis.metamodel.facets.FacetedMethod;
-import org.apache.isis.metamodel.facets.FacetedMethodParameter;
import org.apache.isis.metamodel.facets.MethodLiteralConstants;
import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.metamodel.facets.DependentArgUtils.ParamSupportingMethodSearchRequest.ReturnType;
import org.apache.isis.metamodel.facets.param.autocomplete.ActionParameterAutoCompleteFacet;
import lombok.val;
@@ -42,35 +39,28 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
}
- // ///////////////////////////////////////////////////////
- // Actions
- // ///////////////////////////////////////////////////////
-
@Override
public void process(final ProcessMethodContext processMethodContext) {
- final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
- final List<FacetedMethodParameter> holderList = facetedMethod.getParameters();
-
- attachAutoCompleteFacetForParametersIfAutoCompleteNumMethodIsFound(processMethodContext, holderList);
-
- }
-
- private void attachAutoCompleteFacetForParametersIfAutoCompleteNumMethodIsFound(
- final ProcessMethodContext processMethodContext,
- final List<FacetedMethodParameter> parameters) {
+ val facetedMethod = processMethodContext.getFacetHolder();
+ val parameters = facetedMethod.getParameters();
if (parameters.isEmpty()) {
return;
}
+ // attach ActionParameterChoicesFacet if autoCompleteNumMethod is found ...
+
val actionMethod = processMethodContext.getMethod();
val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
- val searchRequest = DependentArgUtils.ParamSupportingMethodSearchRequest.of(
- processMethodContext,
- String.class,
- paramIndex -> MethodLiteralConstants.AUTO_COMPLETE_PREFIX + paramIndex + capitalizedName);
+ val searchRequest = DependentArgUtils.ParamSupportingMethodSearchRequest.builder()
+ .processMethodContext(processMethodContext)
+ .returnType(ReturnType.NON_SCALAR)
+ .additionalParamType(String.class)
+ .paramIndexToMethodName(paramIndex ->
+ MethodLiteralConstants.AUTO_COMPLETE_PREFIX + paramIndex + capitalizedName)
+ .build();
DependentArgUtils.findParamSupportingMethods(searchRequest, searchResult -> {
@@ -80,7 +70,6 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
processMethodContext.removeMethod(autoCompleteMethod);
- val facetedMethod = processMethodContext.getFacetHolder();
if (facetedMethod.containsNonFallbackFacet(ActionParameterAutoCompleteFacet.class)) {
val cls = processMethodContext.getCls();
throw new MetaModelException(cls + " uses both old and new autoComplete syntax - "
@@ -95,53 +84,5 @@ public class ActionParameterAutoCompleteFacetViaMethodFactory extends MethodPref
});
}
-
-// legacy of ...
-// private void attachAutoCompleteFacetForParametersIfAutoCompleteNumMethodIsFound(
-// final ProcessMethodContext processMethodContext,
-// final List<FacetedMethodParameter> parameters) {
-//
-// if (parameters.isEmpty()) {
-// return;
-// }
-//
-// val actionMethod = processMethodContext.getMethod();
-// val paramTypes = actionMethod.getParameterTypes();
-//
-// for (int i = 0; i < paramTypes.length; i++) {
-//
-// final Class<?> paramType = paramTypes[i];
-// final Class<?> arrayOfParamType = Array.newInstance(paramType, 0).getClass();
-// final Class<?>[] returnTypes = { arrayOfParamType, List.class, Set.class, Collection.class };
-//
-// val autoCompleteMethod = findAutoCompleteNumMethodReturning(processMethodContext, i, returnTypes);
-// if (autoCompleteMethod == null) {
-// continue;
-// }
-// processMethodContext.removeMethod(autoCompleteMethod);
-//
-// // add facets directly to parameters, not to actions
-// final FacetedMethodParameter paramAsHolder = parameters.get(i);
-// super.addFacet(
-// new ActionParameterAutoCompleteFacetViaMethod(
-// autoCompleteMethod, paramType, paramAsHolder));
-// }
-// }
-//
-// private Method findAutoCompleteNumMethodReturning(
-// final ProcessMethodContext processMethodContext,
-// final int paramNum,
-// final Class<?>[] returnTypes) {
-//
-// final Class<?> cls = processMethodContext.getCls();
-// final Method actionMethod = processMethodContext.getMethod();
-// final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
-// final String name = MethodLiteralConstants.AUTO_COMPLETE_PREFIX + paramNum + capitalizedName;
-// return MethodFinderUtils.findMethod_returningAnyOf(
-// returnTypes,
-// cls,
-// name,
-// STRING_ARG);
-// }
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
index ea4ce37..1c60ebf 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethodFactory.java
@@ -19,18 +19,15 @@
package org.apache.isis.metamodel.facets.param.choices.methodnum;
-import java.util.List;
-
import org.apache.isis.commons.collections.Can;
import org.apache.isis.metamodel.commons.StringExtensions;
import org.apache.isis.metamodel.exceptions.MetaModelException;
import org.apache.isis.metamodel.facetapi.Facet;
import org.apache.isis.metamodel.facetapi.FeatureType;
import org.apache.isis.metamodel.facets.DependentArgUtils;
-import org.apache.isis.metamodel.facets.FacetedMethod;
-import org.apache.isis.metamodel.facets.FacetedMethodParameter;
import org.apache.isis.metamodel.facets.MethodLiteralConstants;
import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
+import org.apache.isis.metamodel.facets.DependentArgUtils.ParamSupportingMethodSearchRequest.ReturnType;
import org.apache.isis.metamodel.facets.param.choices.ActionChoicesFacet;
import lombok.val;
@@ -55,28 +52,24 @@ extends MethodPrefixBasedFacetFactoryAbstract {
@Override
public void process(final ProcessMethodContext processMethodContext) {
- final FacetedMethod facetedMethod = processMethodContext.getFacetHolder();
- final List<FacetedMethodParameter> holderList = facetedMethod.getParameters();
-
- attachChoicesFacetForParametersIfChoicesNumMethodIsFound(processMethodContext, holderList);
-
- }
-
- private void attachChoicesFacetForParametersIfChoicesNumMethodIsFound(
- final ProcessMethodContext processMethodContext,
- final List<FacetedMethodParameter> parameters) {
+ val facetedMethod = processMethodContext.getFacetHolder();
+ val parameters = facetedMethod.getParameters();
if (parameters.isEmpty()) {
return;
}
+
+ // attach ActionChoicesFacet if choicesNumMethod is found ...
val actionMethod = processMethodContext.getMethod();
val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
- val searchRequest = DependentArgUtils.ParamSupportingMethodSearchRequest.of(
- processMethodContext,
- null,
- paramIndex -> MethodLiteralConstants.CHOICES_PREFIX + paramIndex + capitalizedName);
+ val searchRequest = DependentArgUtils.ParamSupportingMethodSearchRequest.builder()
+ .processMethodContext(processMethodContext)
+ .returnType(ReturnType.NON_SCALAR)
+ .paramIndexToMethodName(paramIndex ->
+ MethodLiteralConstants.CHOICES_PREFIX + paramIndex + capitalizedName)
+ .build();
DependentArgUtils.findParamSupportingMethods(searchRequest, searchResult -> {
@@ -86,7 +79,6 @@ extends MethodPrefixBasedFacetFactoryAbstract {
processMethodContext.removeMethod(choicesMethod);
- val facetedMethod = processMethodContext.getFacetHolder();
if (facetedMethod.containsNonFallbackFacet(ActionChoicesFacet.class)) {
val cls = processMethodContext.getCls();
throw new MetaModelException(cls + " uses both old and new choices syntax - "
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
index 39e29ab..de35541 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethod.java
@@ -32,7 +32,9 @@ import org.apache.isis.metamodel.facets.ImperativeFacet;
import org.apache.isis.metamodel.facets.param.disable.ActionParameterDisabledFacetAbstract;
import org.apache.isis.metamodel.spec.ManagedObject;
-public class ActionParameterDisabledFacetViaMethod extends ActionParameterDisabledFacetAbstract implements ImperativeFacet {
+public class ActionParameterDisabledFacetViaMethod
+extends ActionParameterDisabledFacetAbstract
+implements ImperativeFacet {
private final Method method;
private final TranslationService translationService;
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
index a1ed4eb..b5d9619 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/disable/method/ActionParameterDisabledFacetViaMethodFactory.java
@@ -19,17 +19,12 @@
package org.apache.isis.metamodel.facets.param.disable.method;
-import java.lang.reflect.Method;
-import java.util.List;
-
-import org.apache.isis.applib.services.i18n.TranslationService;
import org.apache.isis.commons.collections.Can;
-import org.apache.isis.metamodel.commons.ListExtensions;
import org.apache.isis.metamodel.commons.StringExtensions;
-import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.exceptions.MetaModelException;
import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.metamodel.facets.DependentArgUtils;
+import org.apache.isis.metamodel.facets.DependentArgUtils.ParamSupportingMethodSearchRequest.ReturnType;
import org.apache.isis.metamodel.facets.MethodLiteralConstants;
import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
import org.apache.isis.metamodel.facets.param.disable.ActionParameterDisabledFacet;
@@ -39,55 +34,106 @@ import lombok.val;
/**
* Sets up {@link ActionParameterDisabledFacet}.
*/
-public class ActionParameterDisabledFacetViaMethodFactory extends MethodPrefixBasedFacetFactoryAbstract {
+public class ActionParameterDisabledFacetViaMethodFactory
+extends MethodPrefixBasedFacetFactoryAbstract {
private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.DISABLE_PREFIX);
public ActionParameterDisabledFacetViaMethodFactory() {
- super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+ //super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+ super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
}
-
@Override
- public void processParams(final ProcessParameterContext processParameterContext) {
-
- final Class<?> cls = processParameterContext.getCls();
- final Method actionMethod = processParameterContext.getMethod();
- final int paramNum = processParameterContext.getParamNum();
- final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
-
- final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
- final List<Class<?>> paramTypes = ListExtensions.mutableCopy(actionMethod.getParameterTypes());
-
- final String hideName = MethodLiteralConstants.DISABLE_PREFIX + paramNum + capitalizedName;
-
- final int numParamTypes = paramTypes.size();
-
- final TranslationService translationService = getMetaModelContext().getTranslationService();
+ public void process(final ProcessMethodContext processMethodContext) {
- for(int i=0; i< numParamTypes+1; i++) {
- val disableMethod = MethodFinderUtils.findMethod_returningText(
- cls,
- hideName,
- NO_ARG);
+ val facetedMethod = processMethodContext.getFacetHolder();
+ val parameters = facetedMethod.getParameters();
- if (disableMethod != null) {
- processParameterContext.removeMethod(disableMethod);
-
- // sadness: same as in TranslationFactory
- final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
+ if (parameters.isEmpty()) {
+ return;
+ }
- final Facet facet = new ActionParameterDisabledFacetViaMethod(disableMethod,
- translationService, translationContext, facetHolder);
- super.addFacet(facet);
- return;
+ // attach ActionParameterDisabledFacet if disableNumMethod is found ...
+
+ val translationService = getMetaModelContext().getTranslationService();
+ val actionMethod = processMethodContext.getMethod();
+ val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+
+ val searchRequest = DependentArgUtils.ParamSupportingMethodSearchRequest.builder()
+ .processMethodContext(processMethodContext)
+ .returnType(ReturnType.TEXT)
+ .paramIndexToMethodName(paramIndex ->
+ MethodLiteralConstants.DISABLE_PREFIX + paramIndex + capitalizedName)
+ .build();
+
+ DependentArgUtils.findParamSupportingMethods(searchRequest, searchResult -> {
+
+ val disableMethod = searchResult.getSupportingMethod();
+ val paramIndex = 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(paramIndex);
+ val translationContext = paramAsHolder.getIdentifier().toFullIdentityString();
+
+ super.addFacet(
+ new ActionParameterDisabledFacetViaMethod(
+ disableMethod, translationService, translationContext, paramAsHolder));
+ });
+
+ }
+
- // remove last, and search again
- if(!paramTypes.isEmpty()) {
- paramTypes.remove(paramTypes.size()-1);
- }
- }
+ @Override
+ public void processParams(final ProcessParameterContext processParameterContext) {
+
+ //FIXME remove
+
+// final Class<?> cls = processParameterContext.getCls();
+// final Method actionMethod = processParameterContext.getMethod();
+// final int paramNum = processParameterContext.getParamNum();
+// final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
+//
+// final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+// final List<Class<?>> paramTypes = ListExtensions.mutableCopy(actionMethod.getParameterTypes());
+//
+// final String hideName = MethodLiteralConstants.DISABLE_PREFIX + paramNum + capitalizedName;
+//
+// final int numParamTypes = paramTypes.size();
+//
+// val translationService = getMetaModelContext().getTranslationService();
+//
+// for(int i=0; i< numParamTypes+1; i++) {
+// val disableMethod = MethodFinderUtils.findMethod_returningText(
+// cls,
+// hideName,
+// NO_ARG);
+//
+// if (disableMethod != null) {
+// processParameterContext.removeMethod(disableMethod);
+//
+// // sadness: same as in TranslationFactory
+// final String translationContext = facetHolder.getIdentifier().toFullIdentityString();
+//
+// final Facet facet = new ActionParameterDisabledFacetViaMethod(disableMethod,
+// translationService, translationContext, facetHolder);
+// super.addFacet(facet);
+// return;
+// }
+//
+// // remove last, and search again
+// if(!paramTypes.isEmpty()) {
+// paramTypes.remove(paramTypes.size()-1);
+// }
+// }
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
index 1979696..9b4e2ac 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/ActionParameterHiddenFacetAbstract.java
@@ -26,6 +26,8 @@ import org.apache.isis.metamodel.facetapi.FacetHolder;
import org.apache.isis.metamodel.interactions.ActionArgVisibilityContext;
import org.apache.isis.metamodel.interactions.VisibilityContext;
+import lombok.val;
+
public abstract class ActionParameterHiddenFacetAbstract
extends FacetAbstract
implements ActionParameterHiddenFacet {
@@ -43,7 +45,7 @@ implements ActionParameterHiddenFacet {
if (!(context instanceof ActionArgVisibilityContext)) {
return null;
}
- final ActionArgVisibilityContext actionArgVisibilityContext = (ActionArgVisibilityContext) context;
+ val actionArgVisibilityContext = (ActionArgVisibilityContext) context;
return isHidden(
actionArgVisibilityContext.getTarget(),
actionArgVisibilityContext.getArgs())
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
index b6b0b91..704c69e 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethodFactory.java
@@ -19,22 +19,18 @@
package org.apache.isis.metamodel.facets.param.hide.method;
-import lombok.val;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
import org.apache.isis.commons.collections.Can;
-import org.apache.isis.metamodel.commons.ListExtensions;
import org.apache.isis.metamodel.commons.StringExtensions;
-import org.apache.isis.metamodel.facetapi.Facet;
+import org.apache.isis.metamodel.exceptions.MetaModelException;
import org.apache.isis.metamodel.facetapi.FeatureType;
-import org.apache.isis.metamodel.facetapi.IdentifiedHolder;
-import org.apache.isis.metamodel.facets.MethodFinderUtils;
+import org.apache.isis.metamodel.facets.DependentArgUtils;
+import org.apache.isis.metamodel.facets.DependentArgUtils.ParamSupportingMethodSearchRequest.ReturnType;
import org.apache.isis.metamodel.facets.MethodLiteralConstants;
import org.apache.isis.metamodel.facets.MethodPrefixBasedFacetFactoryAbstract;
import org.apache.isis.metamodel.facets.param.hide.ActionParameterHiddenFacet;
+import lombok.val;
+
/**
* Sets up {@link ActionParameterHiddenFacet}.
*/
@@ -43,46 +39,93 @@ public class ActionParameterHiddenFacetViaMethodFactory extends MethodPrefixBase
private static final Can<String> PREFIXES = Can.ofSingleton(MethodLiteralConstants.HIDE_PREFIX);
public ActionParameterHiddenFacetViaMethodFactory() {
- super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+ //super(FeatureType.PARAMETERS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
+ super(FeatureType.ACTIONS_ONLY, OrphanValidation.VALIDATE, PREFIXES);
}
-
@Override
- public void processParams(final ProcessParameterContext processParameterContext) {
-
- final Class<?> cls = processParameterContext.getCls();
- final Method actionMethod = processParameterContext.getMethod();
- final int paramNum = processParameterContext.getParamNum();
- final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
-
- final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
- final List<Class<?>> paramTypes = ListExtensions.mutableCopy(actionMethod.getParameterTypes());
+ public void process(final ProcessMethodContext processMethodContext) {
- final String hideName = MethodLiteralConstants.HIDE_PREFIX + paramNum + capitalizedName;
+ val facetedMethod = processMethodContext.getFacetHolder();
+ val parameters = facetedMethod.getParameters();
- final int numParamTypes = paramTypes.size();
-
- for(int i=0; i< numParamTypes+1; i++) {
- val hideMethod = MethodFinderUtils.findMethod(
- cls,
- hideName,
- boolean.class,
- NO_ARG);
-
- if (hideMethod != null) {
- processParameterContext.removeMethod(hideMethod);
+ if (parameters.isEmpty()) {
+ return;
+ }
- final Facet facet = new ActionParameterHiddenFacetViaMethod(hideMethod, facetHolder);
- super.addFacet(facet);
- return;
+ // attach ActionParameterHiddenFacet if hideNumMethod is found ...
+
+ val actionMethod = processMethodContext.getMethod();
+ val capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+
+ val searchRequest = DependentArgUtils.ParamSupportingMethodSearchRequest.builder()
+ .processMethodContext(processMethodContext)
+ .returnType(ReturnType.BOOLEAN)
+ .paramIndexToMethodName(paramIndex ->
+ MethodLiteralConstants.HIDE_PREFIX + paramIndex + capitalizedName)
+ .build();
+
+ DependentArgUtils.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);
+
+ super.addFacet(
+ new ActionParameterHiddenFacetViaMethod(hideMethod, paramAsHolder));
+ });
+
+ }
+
- // remove last, and search again
- if(!paramTypes.isEmpty()) {
- paramTypes.remove(paramTypes.size()-1);
- }
- }
+ @Override
+ public void processParams(final ProcessParameterContext processParameterContext) {
+ //FIXME remove
+
+// final Class<?> cls = processParameterContext.getCls();
+// final Method actionMethod = processParameterContext.getMethod();
+// final int paramNum = processParameterContext.getParamNum();
+// final IdentifiedHolder facetHolder = processParameterContext.getFacetHolder();
+//
+// final String capitalizedName = StringExtensions.asCapitalizedName(actionMethod.getName());
+// final List<Class<?>> paramTypes = ListExtensions.mutableCopy(actionMethod.getParameterTypes());
+//
+// final String hideName = MethodLiteralConstants.HIDE_PREFIX + paramNum + capitalizedName;
+//
+// final int numParamTypes = paramTypes.size();
+//
+// for(int i=0; i< numParamTypes+1; i++) {
+// val hideMethod = MethodFinderUtils.findMethod(
+// cls,
+// hideName,
+// boolean.class,
+// NO_ARG);
+//
+// if (hideMethod != null) {
+// processParameterContext.removeMethod(hideMethod);
+//
+// final Facet facet = new ActionParameterHiddenFacetViaMethod(hideMethod, facetHolder);
+// super.addFacet(facet);
+// return;
+// }
+//
+// // remove last, and search again
+// if(!paramTypes.isEmpty()) {
+// paramTypes.remove(paramTypes.size()-1);
+// }
+// }
+//
}
}
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 9545022..783842c 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -373,8 +373,7 @@ implements ObjectActionParameter, FacetHolder.Delegating {
final InteractionInitiatedBy interactionInitiatedBy) {
final VisibilityContext<?> ic = createArgumentVisibilityContext(
- targetAdapter, pendingArgs, getNumber(), interactionInitiatedBy
- );
+ targetAdapter, pendingArgs, getNumber(), interactionInitiatedBy);
final InteractionResult visibleResult = InteractionUtils.isVisibleResult(this, ic);
return visibleResult.createConsent();
@@ -406,8 +405,7 @@ implements ObjectActionParameter, FacetHolder.Delegating {
final InteractionInitiatedBy interactionInitiatedBy) {
final UsabilityContext<?> ic = createArgumentUsabilityContext(
- targetAdapter, pendingArgs, getNumber(), interactionInitiatedBy
- );
+ targetAdapter, pendingArgs, getNumber(), interactionInitiatedBy);
final InteractionResult usableResult = InteractionUtils.isUsableResult(this, ic);
return usableResult.createConsent();
diff --git a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
index bd4735e..bb1b511 100644
--- a/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
+++ b/core/runtime-services/src/main/java/org/apache/isis/runtime/services/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -626,8 +626,7 @@ public class DomainObjectInvocationHandler<T> extends DelegatingInvocationHandle
if(contributeeMember instanceof ObjectActionContributee) {
val objectActionContributee = (ObjectActionContributee) contributeeMember;
val contributeeArgAdapters = asObjectAdaptersUnderlying(contributeeArgs);
- //TODO remove cast after refactored
- checkValidity(contributeeAdapter, (ObjectAction) objectActionContributee, contributeeArgAdapters);
+ checkValidity(contributeeAdapter, objectActionContributee, contributeeArgAdapters);
}
// nothing to do for contributed properties or collections
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
index aadc638..6f9340a 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
@@ -29,6 +29,7 @@ import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.repeater.RepeatingView;
import org.apache.isis.applib.annotation.SemanticsOf;
+import org.apache.isis.commons.collections.Can;
import org.apache.isis.commons.internal.exceptions._Exceptions;
import org.apache.isis.metamodel.consent.Consent;
import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
@@ -88,7 +89,7 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> {
val realTargetAdapter = actionModel.getActionMemento().getAction(getSpecificationLoader())
.realTargetAdapter(targetAdapter);
final Consent consent = apm.getActionParameter(getSpecificationLoader())
- .isVisible(realTargetAdapter, null, InteractionInitiatedBy.USER);
+ .isVisible(realTargetAdapter, Can.empty(), InteractionInitiatedBy.USER);
final boolean allowed = consent.isAllowed();
paramPanel.setVisible(allowed);
}
diff --git a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDisable.java b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDisable.java
index f10e056..ebe512e 100644
--- a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDisable.java
+++ b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useDisable.java
@@ -62,7 +62,7 @@ public class DependentArgsActionDemo_useDisable {
// -- PARAM 1 (String message)
- //@Model //TODO waits for dep args to be implemented
+ @Model
public String disable1$$(boolean disableMessageField) {
return disableMessageField
? "disabled by dependent argument"
diff --git a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useHide.java b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useHide.java
index 5cb5cf8..ddf5769 100644
--- a/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useHide.java
+++ b/examples/demo/src/main/java/demoapp/dom/actions/depargs/DependentArgsActionDemo_useHide.java
@@ -62,7 +62,7 @@ public class DependentArgsActionDemo_useHide {
// -- PARAM 1 (String message)
- //@Model //TODO waits for dep args to be implemented
+ @Model
public boolean hide1$$(boolean hideMessageField) {
return hideMessageField;
}
diff --git a/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java
index fce1563..06c679c 100644
--- a/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport.java
@@ -64,11 +64,21 @@ public class ProperMemberSupport {
return null;
}
+ @Model // variant with dependent args
+ public String disable1MyAction(String p0) {
+ return null;
+ }
+
@Model
public boolean hideMyAction() {
return false;
}
+ @Model // variant with dependent args
+ public boolean hide1MyAction(String p0) {
+ return false;
+ }
+
@Model
public String validateMyAction(String p0, String p1) {
return null;
@@ -94,7 +104,7 @@ public class ProperMemberSupport {
return null;
}
-// variant with dependent arg
+// variant with dependent args
// @Model
// public Set<String> choices1MyAction(String p0) {
// return null;
diff --git a/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action.java b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action.java
index d75edc7..d4b974d 100644
--- a/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action.java
+++ b/examples/smoketests/src/main/java/org/apache/isis/testdomain/model/good/ProperMemberSupport_action.java
@@ -65,8 +65,13 @@ public class ProperMemberSupport_action {
return null;
}
+// @Model
+// public Set<String> autoComplete1Act(String p0, @MinLength(3) String search) {
+// return null;
+// }
+
@Model
- public Set<String> choices0Act(String p0) {
+ public Set<String> choices0Act() {
return null;
}
diff --git a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
index 12dbed3..5abda28 100644
--- a/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
+++ b/examples/smoketests/src/test/java/org/apache/isis/testdomain/domainmodel/DomainModelTest_usingGoodDomain.java
@@ -28,6 +28,7 @@ import org.apache.isis.applib.services.jaxb.JaxbService;
import org.apache.isis.applib.services.metamodel.MetaModelService;
import org.apache.isis.config.presets.IsisPresets;
import org.apache.isis.integtestsupport.validate.ValidateDomainModel;
+import org.apache.isis.metamodel.facets.DependentArgUtils;
import org.apache.isis.metamodel.specloader.SpecificationLoader;
import org.apache.isis.metamodel.specloader.specimpl.IntrospectionState;
import org.apache.isis.schema.metamodel.v1.DomainClassDto;
@@ -54,6 +55,7 @@ import lombok.val;
properties = {
"isis.reflector.introspector.mode=FULL",
"isis.reflector.validator.explicitObjectType=FALSE", // does not override any of the imports
+ "logging.level.org.apache.isis.metamodel.facets.DependentArgUtils=DEBUG"
})
@TestPropertySource({
//IsisPresets.DebugMetaModel,
diff --git a/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java b/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java
index 463c7ed..128fba0 100644
--- a/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java
+++ b/incubator/core/model/src/main/java/org/apache/isis/incubator/model/metamodel/facets/SupportingMethodValidatorRefinerFactory.java
@@ -64,7 +64,7 @@ implements MetaModelRefiner {
val type = spec.getCorrespondingClass();
//XXX for debugging ...
- if(spec.getSpecId().asString().contains("DependentArgsActionDemo_useDisable")) {
+ if(spec.getSpecId().asString().contains("ProperMemberSupport")) {
val sb = new StringBuffer();