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/17 13:09:51 UTC

[isis] branch master updated: ISIS-2226: prepare autoComplete for dependent args feature

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 1bc0ce1  ISIS-2226: prepare autoComplete for dependent args feature
1bc0ce1 is described below

commit 1bc0ce1439589928386b1cf41297ff49b5eca1b0
Author: Andi Huber <ah...@apache.org>
AuthorDate: Tue Dec 17 14:09:40 2019 +0100

    ISIS-2226: prepare autoComplete for dependent args feature
---
 .../commons/MethodInvocationPreprocessor.java      |  19 ++--
 .../ActionParameterAutoCompleteFacet.java          |  10 +-
 .../ActionParameterAutoCompleteFacetViaMethod.java |   9 +-
 .../param/choices/ActionParameterChoicesFacet.java |   9 +-
 .../ActionParameterChoicesFacetAbstract.java       |   3 +-
 .../choices/ActionParameterChoicesFacetNone.java   |   5 +-
 ...rameterChoicesFacetDerivedFromChoicesFacet.java |   5 +-
 .../ActionParameterChoicesFacetViaMethod.java      |   7 +-
 .../defaults/ActionParameterDefaultsFacet.java     |   7 +-
 .../ActionParameterDefaultsFacetViaMethod.java     |  22 +++--
 .../ActionParameterDisabledFacetViaMethod.java     |   9 +-
 .../ActionParameterHiddenFacetViaMethod.java       |  10 +-
 ...arameterChoicesFacetFromParentedCollection.java |   3 +-
 ...meterDefaultsFacetFromAssociatedCollection.java |   4 +-
 .../apache/isis/metamodel/spec/ManagedObject.java  | 109 ++++++++++++++-------
 .../spec/feature/ObjectActionParameter.java        |   1 +
 .../specloader/specimpl/ObjectActionDefault.java   |   7 +-
 .../specimpl/ObjectActionParameterAbstract.java    |  41 ++++----
 .../ObjectActionParameterContributeeAbstract.java  |  29 ++++--
 .../ObjectActionParameterMixedInAbstract.java      |  10 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  34 ++++---
 .../ObjectAdapterMementoProviderAbstract.java      |  13 ++-
 ...tAdapterMementoProviderForReferenceChoices.java |   8 +-
 ...derForReferenceParamOrPropertyAutoComplete.java |   6 +-
 24 files changed, 239 insertions(+), 141 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/commons/MethodInvocationPreprocessor.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/commons/MethodInvocationPreprocessor.java
index 5939a5b..ed92b7d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/commons/MethodInvocationPreprocessor.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/commons/MethodInvocationPreprocessor.java
@@ -54,14 +54,13 @@ public class MethodInvocationPreprocessor {
             return method.invoke(targetPojo, executionParameters);
         }
 
-        final Class<?>[] parameterTypes = method.getParameterTypes();
-        final Object[] adaptedExecutionParameters = new Object[executionParameters.length];
+        val parameterTypes = method.getParameterTypes();
+        val paramCount = parameterTypes.length;
+        val adaptedExecutionParameters = new Object[paramCount];
 
-        int i=0;
-
-        for(Object param : executionParameters) {
-            adaptedExecutionParameters[i] = adapt(param, parameterTypes[i]);
-            ++i;
+        for(int i=0; i<paramCount; ++i) {
+            val origParam = _Arrays.get(executionParameters, i).orElse(null);
+            adaptedExecutionParameters[i] = adapt(origParam, parameterTypes[i]);
         }
 
         try {
@@ -129,8 +128,10 @@ public class MethodInvocationPreprocessor {
         val expectedParamCount = _NullSafe.size(parameterTypes);
         val actualParamCount = _NullSafe.size(adaptedExecutionParameters);
         if(expectedParamCount!=actualParamCount) {
-            sb.append(String.format("expected-param-count mismatch: expected %d, got %d\n", 
+            sb.append(String.format("param-count mismatch: expected %d, got %d\n", 
                     expectedParamCount, actualParamCount));
+        } else {
+            sb.append("expected param type mismatch\n");
         }
         
         for(int j=0;j<parameterTypes.length;++j) {
@@ -140,7 +141,7 @@ public class MethodInvocationPreprocessor {
                     .map(Class::getName)
                     .orElse("missing or null");
 
-            sb.append(String.format("expected-param-type[%d]: '%s', got '%s'\n", 
+            sb.append(String.format("param-type[%d]: '%s', got '%s'\n", 
                     j, parameterType.getName(), parameterValueTypeLiteral));
         }
         
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
index 4c92da1..709989a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/ActionParameterAutoCompleteFacet.java
@@ -19,12 +19,13 @@
 
 package org.apache.isis.metamodel.facets.param.autocomplete;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
 /**
- * Obtain autocompletion for each of the parameters of the action.
+ * Obtain auto-completion for each of the parameters of the action.
  *
  * <p>
  * In the standard Apache Isis Programming Model, corresponds to invoking the
@@ -34,9 +35,10 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 public interface ActionParameterAutoCompleteFacet extends Facet {
 
     public Object[] autoComplete(
-            final ManagedObject inObject,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy);
+            ManagedObject inObject,
+            Can<ManagedObject> dependentArgs,
+            String searchArg,
+            InteractionInitiatedBy interactionInitiatedBy);
     /**
      * The minimum number of characters that need to be entered.
      */
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
index d312d2c..10d8d4d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/autocomplete/method/ActionParameterAutoCompleteFacetViaMethod.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
@@ -37,7 +38,8 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 
 public class ActionParameterAutoCompleteFacetViaMethod 
-extends ActionParameterAutoCompleteFacetAbstract implements ImperativeFacet {
+extends ActionParameterAutoCompleteFacetAbstract 
+implements ImperativeFacet {
 
     private final Method method;
     private final Class<?> choicesType;
@@ -76,10 +78,13 @@ extends ActionParameterAutoCompleteFacetAbstract implements ImperativeFacet {
     @Override
     public Object[] autoComplete(
             final ManagedObject owningAdapter,
+            final Can<ManagedObject> dependentArgs,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        final Object collectionOrArray = ManagedObject.InvokeUtil.invoke(method, owningAdapter, searchArg);
+        final Object collectionOrArray = 
+                ManagedObject.InvokeUtil.invokeAutofit(
+                        method, owningAdapter, dependentArgs, Can.ofSingleton(searchArg));
         if (collectionOrArray == null) {
             return _Constants.emptyObjects;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
index 7f1ff44..ac089e2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacet.java
@@ -19,8 +19,7 @@
 
 package org.apache.isis.metamodel.facets.param.choices;
 
-import java.util.List;
-
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -36,7 +35,7 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 public interface ActionParameterChoicesFacet extends Facet {
 
     public Object[] getChoices(
-            final ManagedObject target,
-            final List<ManagedObject> arguments,
-            final InteractionInitiatedBy interactionInitiatedBy);
+            ManagedObject target,
+            Can<ManagedObject> dependentArgs,
+            InteractionInitiatedBy interactionInitiatedBy);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
index ac99551..c1be286 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetAbstract.java
@@ -31,8 +31,7 @@ implements ActionParameterChoicesFacet {
         return ActionParameterChoicesFacet.class;
     }
 
-    public ActionParameterChoicesFacetAbstract(
-            final FacetHolder holder) {
+    public ActionParameterChoicesFacetAbstract(FacetHolder holder) {
         super(type(), holder, Derivation.NOT_DERIVED);
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
index 46127a5..fcab08d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/ActionParameterChoicesFacetNone.java
@@ -19,8 +19,7 @@
 
 package org.apache.isis.metamodel.facets.param.choices;
 
-import java.util.List;
-
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -34,7 +33,7 @@ public class ActionParameterChoicesFacetNone extends ActionParameterChoicesFacet
     @Override
     public Object[] getChoices(
             final ManagedObject adapter,
-            final List<ManagedObject> arguments,
+            final Can<ManagedObject> dependentArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
         return new ManagedObject[0];
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
index 58c1982..b43ebf6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/enums/ActionParameterChoicesFacetDerivedFromChoicesFacet.java
@@ -19,8 +19,7 @@
 
 package org.apache.isis.metamodel.facets.param.choices.enums;
 
-import java.util.List;
-
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
@@ -39,7 +38,7 @@ public class ActionParameterChoicesFacetDerivedFromChoicesFacet extends ActionPa
     @Override
     public Object[] getChoices(
             final ManagedObject adapter,
-            final List<ManagedObject> arguments,
+            final Can<ManagedObject> dependentArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
         final FacetHolder facetHolder = getFacetHolder();
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
index ebcad92..e584ff0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/choices/methodnum/ActionParameterChoicesFacetViaMethod.java
@@ -24,6 +24,7 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
@@ -68,13 +69,13 @@ implements ImperativeFacet {
 
     @Override
     public Object[] getChoices(
-            final ManagedObject adapter,
-            final List<ManagedObject> argumentsIfAvailable,
+            final ManagedObject owningAdapter,
+            final Can<ManagedObject> dependentArgs, 
             final InteractionInitiatedBy interactionInitiatedBy) {
         
         final Object choices =
                 ManagedObject.InvokeUtil.invokeAutofit(
-                        method, adapter, argumentsIfAvailable);
+                        method, owningAdapter, dependentArgs);
         if (choices == null) {
             return _Constants.emptyObjects;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
index d0764ff..2c97147 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/ActionParameterDefaultsFacet.java
@@ -19,8 +19,7 @@
 
 package org.apache.isis.metamodel.facets.param.defaults;
 
-import java.util.List;
-
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.facetapi.Facet;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
@@ -36,6 +35,6 @@ public interface ActionParameterDefaultsFacet extends Facet {
 
     public abstract Object getDefault(
             ManagedObject target,
-            List<ManagedObject> parameters,
-            final Integer paramNumUpdated);
+            Can<ManagedObject> parameters,
+            Integer paramNumUpdated);
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
index 8952c57..501f07a 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/defaults/methodnum/ActionParameterDefaultsFacetViaMethod.java
@@ -24,11 +24,14 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.ImperativeFacet;
 import org.apache.isis.metamodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 import org.apache.isis.metamodel.spec.ManagedObject;
 
+import lombok.val;
+
 public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaultsFacetAbstract implements ImperativeFacet {
 
     private final Method method;
@@ -68,12 +71,12 @@ public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaul
     @Override
     public Object getDefault(
             final ManagedObject target,
-            final List<ManagedObject> argumentsIfAvailable,
+            final Can<ManagedObject> dependentArgs,
             final Integer paramNumUpdated) {
 
         // this isn't a dependent defaults situation, so just evaluate the default.
-        if (argumentsIfAvailable == null || paramNumUpdated == null) {
-            return ManagedObject.InvokeUtil.invokeAutofit(method, target, argumentsIfAvailable);
+        if (dependentArgs.isEmpty() || paramNumUpdated == null) {
+            return ManagedObject.InvokeUtil.invokeAutofit(method, target, dependentArgs);
         }
 
         // this could be a dependent defaults situation, but has a previous parameter been updated
@@ -85,16 +88,21 @@ public class ActionParameterDefaultsFacetViaMethod extends ActionParameterDefaul
             // eg, suppose the method is default2Foo(int, int), and the second param is updated... we want to re-evaluate
             // so numParams == 2, and paramNumUpdated == 1, and (paramNumUpdated < numParams) is TRUE
             //
-            // converesly, if method default2Foo(int), and the second param is updated... we don't want to re-evaluate
+            // conversely, if method default2Foo(int), and the second param is updated... we don't want to re-evaluate
             // so numParams == 1, and paramNumUpdated == 1, and (paramNumUpdated < numParams) is FALSE
             //
-            return ManagedObject.InvokeUtil.invokeAutofit(method, target, argumentsIfAvailable);
+            return ManagedObject.InvokeUtil.invokeAutofit(method, target, dependentArgs);
         }
 
         // otherwise, just return the arguments that are already known; we don't want to recompute the default
         // because if we did then this would trample over any pending changes already made by the end-user.
-        final ManagedObject objectAdapter = argumentsIfAvailable.get(paramNum);
-        return objectAdapter != null ? objectAdapter.getPojo() : null;
+        val argPojo = dependentArgs.stream()
+                .skip(paramNum)
+                .findFirst()
+                .map(ManagedObject::getPojo)
+                .orElse(null) ;
+                
+        return argPojo;
     }
 
     @Override
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 3dba5f4..a4ce437 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
@@ -20,13 +20,13 @@
 package org.apache.isis.metamodel.facets.param.disable.method;
 
 import java.lang.reflect.Method;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.isis.applib.services.i18n.TranslatableString;
 import org.apache.isis.applib.services.i18n.TranslationService;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.ImperativeFacet;
 import org.apache.isis.metamodel.facets.param.disable.ActionParameterDisabledFacetAbstract;
@@ -65,9 +65,12 @@ public class ActionParameterDisabledFacetViaMethod extends ActionParameterDisabl
     }
 
     @Override
-    public String disabledReason(final ManagedObject owningAdapter, final ManagedObject[] argumentAdapters) {
+    public String disabledReason(
+            final ManagedObject owningAdapter, 
+            final ManagedObject[] argumentAdapters) {
         
-        final Object returnValue = ManagedObject.InvokeUtil.invokeAutofit(method, owningAdapter, argumentAdapters != null ? Arrays.asList(argumentAdapters) : null);
+        final Object returnValue = ManagedObject.InvokeUtil
+                .invokeAutofit(method, owningAdapter, Can.ofArray(argumentAdapters));
         if(returnValue instanceof String) {
             return (String) returnValue;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
index 22dcc24..b529188 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/facets/param/hide/method/ActionParameterHiddenFacetViaMethod.java
@@ -20,11 +20,11 @@
 package org.apache.isis.metamodel.facets.param.hide.method;
 
 import java.lang.reflect.Method;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.ImperativeFacet;
 import org.apache.isis.metamodel.facets.param.hide.ActionParameterHiddenFacetAbstract;
@@ -57,8 +57,12 @@ public class ActionParameterHiddenFacetViaMethod extends ActionParameterHiddenFa
     }
 
     @Override
-    public boolean isHidden(final ManagedObject owningAdapter, final ManagedObject[] argumentAdapters) {
-        final Object returnValue = ManagedObject.InvokeUtil.invokeAutofit(method, owningAdapter, argumentAdapters != null ? Arrays.asList(argumentAdapters) : null);
+    public boolean isHidden(
+            final ManagedObject owningAdapter, 
+            final ManagedObject[] argumentAdapters) {
+        
+        final Object returnValue = ManagedObject.InvokeUtil
+                .invokeAutofit(method, owningAdapter, Can.ofArray(argumentAdapters));
         if(returnValue instanceof Boolean) {
             return (Boolean) returnValue;
         }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
index a2a9bb8..d835ce1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterChoicesFacetFromParentedCollection.java
@@ -22,6 +22,7 @@ package org.apache.isis.metamodel.postprocessors.param;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
@@ -46,7 +47,7 @@ public class ActionParameterChoicesFacetFromParentedCollection extends ActionPar
     @Override
     public Object[] getChoices(
             final ManagedObject target,
-            final List<ManagedObject> arguments,
+            final Can<ManagedObject> dependentArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
         final ManagedObject parentAdapter = determineParentAdapter(target);
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java
index b7f6aae..2413ef2 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/postprocessors/param/ActionParameterDefaultsFacetFromAssociatedCollection.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.concurrent.Callable;
 
 import org.apache.isis.applib.ApplicationException;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facets.param.defaults.ActionParameterDefaultsFacetAbstract;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -57,8 +58,9 @@ public class ActionParameterDefaultsFacetFromAssociatedCollection extends Action
     @Override
     public Object getDefault(
             final ManagedObject target,
-            List<ManagedObject> argumentsIfAvailable,
+            final Can<ManagedObject> dependentArgs,
             final Integer paramNumUpdated) {
+        
         return selectedPojos.get();
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index 97c1ad4..34f13c1 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -32,12 +32,11 @@ import javax.annotation.Nullable;
 
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.domain.DomainObjectList;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Tuples.Tuple2;
-import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.commons.ClassExtensions;
-import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.commons.MethodExtensions;
 import org.apache.isis.metamodel.commons.MethodUtil;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
@@ -389,32 +388,37 @@ public interface ManagedObject {
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
     static final class InvokeUtil {
     
-        public static void invokeAll(final Collection<Method> methods, final ManagedObject adapter) {
+        public static void invokeAll(Collection<Method> methods, final ManagedObject adapter) {
             MethodUtil.invoke(methods, unwrapPojo(adapter));
         }
     
-        public static Object invoke(final Method method, final ManagedObject adapter) {
+        public static Object invoke(Method method, ManagedObject adapter) {
             return MethodExtensions.invoke(method, unwrapPojo(adapter));
         }
     
-        public static Object invoke(final Method method, final ManagedObject adapter, final Object arg0) {
+        public static Object invoke(Method method, ManagedObject adapter, Object arg0) {
             return MethodExtensions.invoke(method, unwrapPojo(adapter), new Object[] {arg0});
         }
     
-        public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject arg0Adapter) {
+        public static Object invoke(Method method, ManagedObject adapter, ManagedObject arg0Adapter) {
             return invoke(method, adapter, unwrapPojo(arg0Adapter));
         }
     
-        public static Object invoke(final Method method, final ManagedObject adapter, final ManagedObject[] argumentAdapters) {
+        public static Object invoke(Method method, ManagedObject adapter, ManagedObject[] argumentAdapters) {
             return MethodExtensions.invoke(method, unwrapPojo(adapter), unwrapPojoArray(argumentAdapters));
         }
     
-        public static Object invokeC(final Method method, final ManagedObject adapter, 
-                final Stream<Tuple2<Integer, ? extends ManagedObject>> paramsAndIndexes) {
+        public static Object invokeC(
+                Method method, 
+                ManagedObject adapter, 
+                Stream<Tuple2<Integer, ? extends ManagedObject>> paramsAndIndexes) {
             return invoke(method, adapter, asArray(paramsAndIndexes, method.getParameterTypes().length));
         }
     
-        private static ManagedObject[] asArray(final Stream<Tuple2<Integer, ? extends ManagedObject>> paramsAndIndexes, int length) {
+        private static ManagedObject[] asArray(
+                Stream<Tuple2<Integer, ? extends ManagedObject>> paramsAndIndexes, 
+                int length) {
+            
             final ManagedObject[] args = new ManagedObject[length];
             paramsAndIndexes.forEach(entry->{
                 final Integer paramNum = entry.get_1();
@@ -427,47 +431,76 @@ public interface ManagedObject {
     
         /**
          * Invokes the method, adjusting arguments as required to make them fit the method's parameters.
-         *
          * <p>
          * That is:
          * <ul>
-         * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.
-         * <li>if the method does not declare all parameters for arguments, then truncates arguments.
+         * <li>if the method declares parameters but arguments are missing, then will provide 'null' defaults for these.</li>
+         * <li>if the method does not declare all parameters for arguments, then truncates arguments.</li>
+         * <li>any {@code additionalArgValues} must also fit at the end of the resulting parameter list</li>
          * </ul>
          */
         public static Object invokeAutofit(
                 final Method method, 
                 final ManagedObject target, 
-                List<? extends ManagedObject> argumentsIfAvailable/*, 
-                final SpecificationLoader specLoader*/) {
+                final Can<? extends ManagedObject> dependentArgs,
+                final Can<Object> additionalArgValues) {
     
-            final List<ManagedObject> args = _Lists.newArrayList();
-            if(argumentsIfAvailable != null) {
-                args.addAll(argumentsIfAvailable);
-            }
-    
-            adjust(method, args/*, specLoader*/);
-    
-            final ManagedObject[] argArray = args.toArray(new ManagedObject[]{});
-            return invoke(method, target, argArray);
+            val argArray = adjust(method, dependentArgs, additionalArgValues);
+            
+            return MethodExtensions.invoke(method, unwrapPojo(target), argArray);
+        }
+
+        /**
+         * same as {@link #invokeAutofit(Method, ManagedObject, Can, Can)} w/o additionalArgValues 
+         */
+        public static Object invokeAutofit(
+                final Method method, 
+                final ManagedObject target, 
+                final Can<? extends ManagedObject> dependentArgs) {
+            return invokeAutofit(method, target, dependentArgs, Can.empty());
         }
     
-        private static void adjust(
-                final Method method, final List<ManagedObject> args /*, final SpecificationLoader specLoader*/) {
-    
-            final Class<?>[] parameterTypes = method.getParameterTypes();
-            ListExtensions.adjust(args, parameterTypes.length);
-    
-            for(int i=0; i<parameterTypes.length; i++) {
-                final Class<?> cls = parameterTypes[i];
-                if(args.get(i) == null && cls.isPrimitive()) {
-                    final Object object = ClassExtensions.toDefault(cls);
-    
-                    final ManagedObject adapter = of((ObjectSpecification)null, object);
-                    args.set(i, adapter);
-                }
+        private static Object[] adjust(
+                final Method method, 
+                final Can<? extends ManagedObject> dependentArgs,
+                final Can<Object> additionalArgValues) {
+            
+            val parameterTypes = method.getParameterTypes();
+            val paramCount = parameterTypes.length;
+            val additionalArgCount = additionalArgValues.size();
+            val dependentArgsToConsiderCount = paramCount - additionalArgCount;
+            
+            val argIterator = dependentArgs.iterator();
+            val adjusted = new Object[paramCount];
+            for(int i=0; i<dependentArgsToConsiderCount; i++) {
+                
+                val paramType = parameterTypes[i];
+                val arg = argIterator.hasNext() ? unwrapPojo(argIterator.next()) : null;
+                
+                adjusted[i] = honorPrimitiveDefaults(paramType, arg);
+            }
+            
+            // add the additional parameter values (if any)
+            int paramIndex = dependentArgsToConsiderCount;
+            for(val additionalArg : additionalArgValues) {
+                adjusted[paramIndex] = additionalArg;
+                ++paramIndex;
             }
+            
+            return adjusted;
+
         }
+        
+        private static Object honorPrimitiveDefaults(
+                final Class<?> expectedType, 
+                final @Nullable Object value) {
+            
+            if(value == null && expectedType.isPrimitive()) {
+                return ClassExtensions.toDefault(expectedType);
+            }
+            return value;
+        }
+        
     
     }
     
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectActionParameter.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectActionParameter.java
index 8831440..b1c560f 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectActionParameter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/feature/ObjectActionParameter.java
@@ -92,6 +92,7 @@ public interface ObjectActionParameter extends ObjectFeature, CurrentHolder {
      */
     ManagedObject[] getAutoComplete(
             final ManagedObject adapter,
+            final ManagedObject[] argumentsIfAvailable,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy);
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
index ed0307c..9b3eda4 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -33,7 +33,6 @@ import org.apache.isis.applib.services.command.Command;
 import org.apache.isis.commons.exceptions.UnknownTypeException;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.consent.InteractionResultSet;
@@ -492,7 +491,11 @@ public class ObjectActionDefault extends ObjectMemberAbstract implements ObjectA
             for (int i = 0; i < parameterCount; i++) {
                 final ActionParameterDefaultsFacet paramFacet = parameters.get(i).getFacet(ActionParameterDefaultsFacet.class);
                 if (paramFacet != null && !paramFacet.isFallback()) {
-                    parameterDefaultPojos[i] = paramFacet.getDefault(target, null, null);
+                    parameterDefaultPojos[i] = paramFacet
+                            .getDefault(
+                                    target, 
+                                    /*parameters*/ null, 
+                                    /*paramNumUpdated*/null);
                 } else {
                     parameterDefaultPojos[i] = null;
                 }
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 76d8272..6b8ab42 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
@@ -19,22 +19,21 @@
 
 package org.apache.isis.metamodel.specloader.specimpl;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.function.Predicate;
 
 import org.apache.isis.applib.Identifier;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.commons.ClassExtensions;
-import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.commons.StringExtensions;
 import org.apache.isis.metamodel.consent.Allow;
 import org.apache.isis.metamodel.consent.Consent;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.consent.InteractionResult;
 import org.apache.isis.metamodel.consent.InteractionResultSet;
+import org.apache.isis.metamodel.context.MetaModelContext;
 import org.apache.isis.metamodel.facetapi.FacetHolder;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.facets.TypedHolder;
@@ -62,6 +61,8 @@ import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
+import lombok.val;
+
 public abstract class ObjectActionParameterAbstract 
 implements ObjectActionParameter, FacetHolder.Delegating {
 
@@ -230,6 +231,7 @@ implements ObjectActionParameter, FacetHolder.Delegating {
     @Override
     public ManagedObject[] getAutoComplete(
             final ManagedObject adapter,
+            final ManagedObject[] argumentsIfAvailable,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
@@ -237,19 +239,14 @@ implements ObjectActionParameter, FacetHolder.Delegating {
         final ActionParameterAutoCompleteFacet facet = getFacet(ActionParameterAutoCompleteFacet.class);
 
         if (facet != null) {
-
-            final Object[] choices = facet.autoComplete(adapter, searchArg,
-                    interactionInitiatedBy);
+            val dependentArgs = Can.ofArray(argumentsIfAvailable);
+            final Object[] choices = facet
+                    .autoComplete(adapter, dependentArgs, searchArg, interactionInitiatedBy);
             checkChoicesOrAutoCompleteType(getSpecificationLoader(), choices, getSpecification());
             for (final Object choice : choices) {
                 adapters.add(getObjectManager().adapt(choice));
             }
         }
-        /* // now incorporated into above choices processing (BoundedFacet is no more)
-        if (adapters.size() == 0 && ChoicesFacetUtils.hasChoices(getSpecification())) {
-            addAllInstancesForType(adapters);
-        }
-         */
         return adapters.toArray(new ManagedObject[0]);
     }
 
@@ -274,24 +271,23 @@ implements ObjectActionParameter, FacetHolder.Delegating {
             final ManagedObject adapter,
             final ManagedObject[] argumentsIfAvailable,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        final List<ManagedObject> argListIfAvailable = ListExtensions.mutableCopy(argumentsIfAvailable);
-
-        final ManagedObject target = targetForDefaultOrChoices(adapter);
-        final List<ManagedObject> args = argsForDefaultOrChoices(adapter, argListIfAvailable);
+        
+        val args = argsForDefaultOrChoices(adapter, Can.ofArray(argumentsIfAvailable));
+        val target = targetForDefaultOrChoices(adapter);
 
         return findChoices(target, args, interactionInitiatedBy);
     }
 
     private ManagedObject[] findChoices(
             final ManagedObject target,
-            final List<ManagedObject> args,
+            final Can<ManagedObject> args,
             final InteractionInitiatedBy interactionInitiatedBy) {
+        
         final List<ManagedObject> adapters = _Lists.newArrayList();
         final ActionParameterChoicesFacet facet = getFacet(ActionParameterChoicesFacet.class);
 
         if (facet != null) {
-            final Object[] choices = facet.getChoices(target, args,
-                    interactionInitiatedBy);
+            final Object[] choices = facet.getChoices(target, args, interactionInitiatedBy);
             checkChoicesOrAutoCompleteType(getSpecificationLoader(), choices, getSpecification());
             for (final Object choice : choices) {
                 ManagedObject adapter = choice != null? getObjectManager().adapt(choice) : null;
@@ -318,15 +314,16 @@ implements ObjectActionParameter, FacetHolder.Delegating {
             final Integer paramNumUpdated) {
 
         final ManagedObject target = targetForDefaultOrChoices(adapter);
-        final List<ManagedObject> args = argsForDefaultOrChoices(adapter, argumentsIfAvailable != null ? Arrays.asList(argumentsIfAvailable) : null);
+        val args = argsForDefaultOrChoices(adapter, Can.ofArray(argumentsIfAvailable));
 
         return findDefault(target, args, paramNumUpdated);
     }
 
     private ManagedObject findDefault(
             final ManagedObject target,
-            final List<ManagedObject> args,
+            final Can<ManagedObject> args,
             final Integer paramNumUpdated) {
+        
         final ActionParameterDefaultsFacet defaultsFacet = getFacet(ActionParameterDefaultsFacet.class);
         if (defaultsFacet != null) {
             final Object dflt = defaultsFacet.getDefault(target, args, paramNumUpdated);
@@ -350,9 +347,9 @@ implements ObjectActionParameter, FacetHolder.Delegating {
     /**
      * Hook method; {@link ObjectActionParameterContributee contributed action parameter}s override.
      */
-    protected List<ManagedObject> argsForDefaultOrChoices(
+    protected Can<ManagedObject> argsForDefaultOrChoices(
             final ManagedObject adapter,
-            final List<ManagedObject> argumentsIfAvailable) {
+            final Can<ManagedObject> argumentsIfAvailable) {
         return argumentsIfAvailable;
     }
 
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
index ed4a595..a77d47d 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
@@ -18,14 +18,23 @@
  */
 package org.apache.isis.metamodel.specloader.specimpl;
 
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.metamodel.commons.ListExtensions;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facetapi.FeatureType;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.feature.ObjectActionParameter;
 
+/**
+ * 
+ * @deprecated contributed actions from services are deprecated, use mixins instead
+ *
+ */
+@Deprecated
 public abstract class ObjectActionParameterContributeeAbstract
 extends ObjectActionParameterAbstract
 implements ObjectActionParameterContributee {
@@ -40,6 +49,7 @@ implements ObjectActionParameterContributee {
             final ObjectActionParameterAbstract serviceActionParameter,
             final int contributeeParamNumber,
             final ObjectActionContributee contributeeAction) {
+        
         super(featureType, contributeeParamNumber, contributeeAction, serviceActionParameter.getPeer());
         this.servicePojo = servicePojo;
         this.serviceActionParameter = serviceActionParameter;
@@ -49,9 +59,14 @@ implements ObjectActionParameterContributee {
     @Override
     public ManagedObject[] getAutoComplete(
             final ManagedObject adapter,
+            final ManagedObject[] argumentsIfAvailable,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
-        return serviceActionParameter.getAutoComplete(getServiceAdapter(), searchArg,
+        
+        return serviceActionParameter.getAutoComplete(
+                getServiceAdapter(),
+                argumentsIfAvailable,
+                searchArg,
                 interactionInitiatedBy);
     }
 
@@ -64,17 +79,17 @@ implements ObjectActionParameterContributee {
         return getServiceAdapter();
     }
 
+    
     @Override
-    protected List<ManagedObject> argsForDefaultOrChoices(
+    protected Can<ManagedObject> argsForDefaultOrChoices(
             final ManagedObject contributee,
-            final List<ManagedObject> argumentsIfAvailable) {
-
-        final List<ManagedObject> suppliedArgs = ListExtensions.mutableCopy(argumentsIfAvailable);
+            final Can<ManagedObject> dependentArgs) {
 
+        final List<ManagedObject> suppliedArgs = dependentArgs.stream()
+                .collect(Collectors.toCollection(ArrayList::new));
         final int contributeeParam = contributeeAction.getContributeeParam();
         ListExtensions.insert(suppliedArgs, contributeeParam, contributee);
-
-        return suppliedArgs;
+        return Can.ofCollection(suppliedArgs);
     }
 
 }
diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
index c3626ec..85f5f76 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
@@ -32,8 +32,10 @@ implements ObjectActionParameterMixedIn {
     private final ObjectActionMixedIn mixedInAction;
 
     public ObjectActionParameterMixedInAbstract(
-            final FeatureType featureType, final ObjectActionParameterAbstract mixinParameter,
+            final FeatureType featureType, 
+            final ObjectActionParameterAbstract mixinParameter,
             final ObjectActionMixedIn mixedInAction) {
+        
         super(featureType, mixinParameter.getNumber(), mixedInAction, mixinParameter.getPeer());
         this.mixinParameter = mixinParameter;
         this.mixedInAction = mixedInAction;
@@ -42,10 +44,14 @@ implements ObjectActionParameterMixedIn {
     @Override
     public ManagedObject[] getAutoComplete(
             final ManagedObject mixedInAdapter,
+            final ManagedObject[] argumentsIfAvailable,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
+        
         return mixinParameter.getAutoComplete(
-                mixinAdapterFor(mixedInAdapter), searchArg,
+                mixinAdapterFor(mixedInAdapter),
+                argumentsIfAvailable,
+                searchArg,
                 interactionInitiatedBy);
     }
 
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 1991b7f..6358505 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -229,6 +229,7 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
             @Override
             public List<ManagedObject> getAutoComplete(
                     final ScalarModel scalarModel,
+                    final ManagedObject[] argumentsIfAvailable, // ignored for properties
                     final String searchArg,
                     final AuthenticationSession authenticationSession) {
 
@@ -238,7 +239,8 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
                         scalarModel.getParentEntityModel().load();
                 final ManagedObject[] choices =
                         property.getAutoComplete(
-                                parentAdapter, searchArg,
+                                parentAdapter, 
+                                searchArg,
                                 InteractionInitiatedBy.USER);
                 return choicesAsList(choices);
             }
@@ -441,6 +443,7 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
                     final ScalarModel scalarModel,
                     final ManagedObject[] argumentsIfAvailable,
                     final AuthenticationSession authenticationSession) {
+                
                 final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
                 final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
 
@@ -449,7 +452,8 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
 
                 final ManagedObject[] choices =
                         actionParameter.getChoices(
-                                parentAdapter, argumentsIfAvailable,
+                                parentAdapter, 
+                                argumentsIfAvailable,
                                 InteractionInitiatedBy.USER);
                 return choicesAsList(choices);
             }
@@ -463,14 +467,18 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
             @Override
             public List<ManagedObject> getAutoComplete(
                     final ScalarModel scalarModel,
+                    final ManagedObject[] argumentsIfAvailable,
                     final String searchArg,
                     final AuthenticationSession authenticationSession) {
+                
                 final ActionParameterMemento parameterMemento = scalarModel.getParameterMemento();
                 final ObjectActionParameter actionParameter = parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
 
                 ManagedObject parentAdapter = scalarModel.getParentEntityModel().load();
                 final ManagedObject[] choices = actionParameter.getAutoComplete(
-                        parentAdapter, searchArg,
+                        parentAdapter,
+                        argumentsIfAvailable,
+                        searchArg,
                         InteractionInitiatedBy.USER);
                 return choicesAsList(choices);
             }
@@ -621,22 +629,23 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
         }
 
         public abstract ManagedObject getDefault(
-                final ScalarModel scalarModel,
-                final ManagedObject[] argsIfAvailable,
-                final int paramNumUpdated,
-                final AuthenticationSession authenticationSession);
+                ScalarModel scalarModel,
+                ManagedObject[] argsIfAvailable,
+                int paramNumUpdated,
+                AuthenticationSession authenticationSession);
 
         public abstract boolean hasChoices(ScalarModel scalarModel);
         public abstract List<ManagedObject> getChoices(
-                final ScalarModel scalarModel,
-                final ManagedObject[] argumentsIfAvailable,
-                final AuthenticationSession authenticationSession);
+                ScalarModel scalarModel,
+                ManagedObject[] argumentsIfAvailable,
+                AuthenticationSession authenticationSession);
 
         public abstract boolean hasAutoComplete(ScalarModel scalarModel);
         public abstract List<ManagedObject> getAutoComplete(
                 ScalarModel scalarModel,
+                ManagedObject[] argumentsIfAvailable,
                 String searchArg,
-                final AuthenticationSession authenticationSession);
+                AuthenticationSession authenticationSession);
 
         public abstract int getAutoCompleteOrChoicesMinLength(ScalarModel scalarModel);
 
@@ -923,9 +932,10 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
     }
 
     public List<ManagedObject> getAutoComplete(
+            final ManagedObject[] argumentsIfAvailable,
             final String searchTerm,
             final AuthenticationSession authenticationSession) {
-        return kind.getAutoComplete(this, searchTerm, authenticationSession);
+        return kind.getAutoComplete(this, argumentsIfAvailable, searchTerm, authenticationSession);
     }
 
     /**
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
index 681c644..1d5dafb 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -85,7 +85,8 @@ public abstract class ObjectAdapterMementoProviderAbstract extends ChoiceProvide
             return NULL_PLACEHOLDER;
         }
         final ObjectSpecId objectSpecId = choice.getObjectSpecId();
-        final ObjectSpecification spec = commonContext.getSpecificationLoader().lookupBySpecIdElseLoad(objectSpecId);
+        final ObjectSpecification spec = commonContext.getSpecificationLoader()
+                .lookupBySpecIdElseLoad(objectSpecId);
 
         // support enums that are implementing an interface; only know this late in the day
         // TODO: this is a hack, really should push this deeper so that Encodeable OAMs also prefix themselves with their objectSpecId
@@ -97,7 +98,10 @@ public abstract class ObjectAdapterMementoProviderAbstract extends ChoiceProvide
     }
 
     @Override
-    public void query(final String term, final int page, final org.wicketstuff.select2.Response<ObjectMemento> response) {
+    public void query(
+            final String term, 
+            final int page, 
+            final org.wicketstuff.select2.Response<ObjectMemento> response) {
 
         final List<ObjectMemento> mementos = _Lists.newArrayList(obtainMementos(term));
         // if not mandatory, and the list doesn't contain null already, then add it in.
@@ -117,7 +121,10 @@ public abstract class ObjectAdapterMementoProviderAbstract extends ChoiceProvide
      * @param choicesMementos The collections of choices to filter
      * @return A list of all matching choices
      */
-    protected final List<ObjectMemento> obtainMementos(String term, Collection<ObjectMemento> choicesMementos) {
+    protected final List<ObjectMemento> obtainMementos(
+            String term, 
+            Collection<ObjectMemento> choicesMementos) {
+        
         List<ObjectMemento> matches = _Lists.newArrayList();
         if (Strings.isEmpty(term)) {
             matches.addAll(choicesMementos);
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
index f1c0050..7d2f6e8 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceChoices.java
@@ -65,7 +65,7 @@ implements ObjectAdapterMementoProviderForChoices {
 
     @Override
     protected List<ObjectMemento> obtainMementos(String term) {
-        return obtainMementos(term, choiceMementos);
+        return super.obtainMementos(term, choiceMementos);
     }
 
     @Override
@@ -75,14 +75,16 @@ implements ObjectAdapterMementoProviderForChoices {
 
     @Override
     public Collection<ObjectMemento> toChoices(final Collection<String> ids) {
-        final Function<String, ObjectMemento> function = (final String input) -> {
+        final Function<String, ObjectMemento> idToMemento = (final String input) -> {
             if(NULL_PLACEHOLDER.equals(input)) {
                 return null;
             }
             val rootOid = RootOid.deString(input);
             return super.getCommonContext().mementoFor(rootOid);
         };
-        return _NullSafe.stream(ids).map(function).collect(Collectors.toList());
+        return _NullSafe.stream(ids)
+                .map(idToMemento)
+                .collect(Collectors.toList());
     }
 
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
index eea9829..b4d521d 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
@@ -66,8 +66,10 @@ extends ObjectAdapterMementoProviderAbstract {
         
         val autoCompleteChoices = _Lists.<ManagedObject>newArrayList();
         if (getScalarModel().hasAutoComplete()) {
-            val autoCompleteAdapters =
-                    getScalarModel().getAutoComplete(term, commonContext.getAuthenticationSession());
+            // this implementation will not recover any dependentArgs
+            val dependentArgs = (ManagedObject[])null; 
+            val autoCompleteAdapters = getScalarModel()
+                    .getAutoComplete(dependentArgs, term, commonContext.getAuthenticationSession());
             autoCompleteChoices.addAll(autoCompleteAdapters);
         }