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 7ba1392  ISIS-2340: remove support for (deprecated) service 
contributed actions
7ba1392 is described below

commit 7ba13927249dfa20fe5208b4b6e90035a9c904c6
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Fri May 1 09:37:52 2020 +0200

    ISIS-2340: remove support for (deprecated) service contributed actions
---
 ...nChoicesForCollectionParameterFacetFactory.java |   6 +-
 .../core/metamodel/spec/feature/ObjectAction.java  |  13 ++
 .../spec/feature/ObjectActionParameter.java        |  14 +-
 .../metamodel/specloader/specimpl/Factories.java   |  14 --
 .../specimpl/ObjectActionContributee.java          | 253 ---------------------
 .../specloader/specimpl/ObjectActionDefault.java   |   8 +
 .../specloader/specimpl/ObjectActionMixedIn.java   |   8 +
 .../specimpl/ObjectActionParameterAbstract.java    |  63 ++---
 .../ObjectActionParameterContributeeAbstract.java  |  92 --------
 .../ObjectActionParameterMixedInAbstract.java      |  35 +--
 .../specimpl/ObjectSpecificationAbstract.java      |  16 +-
 .../OneToManyActionParameterContributee.java       |  43 ----
 ...Contributee.java => PendingParameterModel.java} |  35 +--
 .../handlers/DomainObjectInvocationHandler.java    |   6 -
 .../domainobjects/ObjectActionReprRenderer.java    |   7 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  59 ++---
 16 files changed, 130 insertions(+), 542 deletions(-)

diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
index ca78e49..175dd7c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/facets/actions/action/ActionChoicesForCollectionParameterFacetFactory.java
@@ -32,7 +32,6 @@ import 
org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import 
org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionContributee;
 import org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionMixedIn;
 import org.apache.isis.core.metamodel.specloader.validator.MetaModelValidator;
 import 
org.apache.isis.core.metamodel.specloader.validator.MetaModelValidatorVisiting;
@@ -81,9 +80,8 @@ implements MetaModelRefiner {
                 
                 objectSpec.streamObjectActions(Contributed.INCLUDED)
                 .forEach(objectAction->{
-                    if(objectAction instanceof ObjectActionMixedIn 
-                            || objectAction instanceof 
ObjectActionContributee) {
-                        // we'll report only the mixin or contributor
+                    if(objectAction instanceof ObjectActionMixedIn) {
+                        // we'll report only the mixin
                         return;
                     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
index 3264957..8ad07d5 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectAction.java
@@ -55,9 +55,11 @@ import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.specloader.specimpl.MixedInMember;
+import 
org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 
 import static org.apache.isis.core.commons.internal.base._NullSafe.stream;
 
+import lombok.NonNull;
 import lombok.val;
 
 public interface ObjectAction extends ObjectMember {
@@ -157,7 +159,18 @@ public interface ObjectAction extends ObjectMember {
             InteractionInitiatedBy interactionInitiatedBy);
 
 
+    // -- Model for Parameter Negotiation
+    
+    
+    PendingParameterModel newPendingParameterModel(
+            @NonNull ManagedObject actionOwner,
+            @NonNull Can<ManagedObject> paramValues);
 
+    default PendingParameterModel newPendingParameterModel(
+            @NonNull ManagedObject actionOwner) {
+        return newPendingParameterModel(actionOwner, Can.empty()); // init 
defaults
+    }
+    
     // -- Parameters (declarative)
 
     /**
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
index 78a7404..db45efb 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/spec/feature/ObjectActionParameter.java
@@ -31,6 +31,7 @@ import 
org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import 
org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 
 /**
  * Analogous to {@link ObjectAssociation}.
@@ -91,8 +92,7 @@ public interface ObjectActionParameter extends ObjectFeature, 
CurrentHolder {
      * user can choose from, based on the input search argument.
      */
     Can<ManagedObject> getAutoComplete(
-            ManagedObject adapter,
-            Can<ManagedObject> pendingArgs,
+            PendingParameterModel pendingArgs,
             String searchArg,
             InteractionInitiatedBy interactionInitiatedBy);
 
@@ -110,16 +110,18 @@ public interface ObjectActionParameter extends 
ObjectFeature, CurrentHolder {
      * user can choose from.
      */
     Can<ManagedObject> getChoices(
-            ManagedObject adapter,
-            Can<ManagedObject> pendingArgs,
+            PendingParameterModel pendingArgs,
             InteractionInitiatedBy interactionInitiatedBy);
 
 
     ManagedObject getDefault(
-            ManagedObject adapter,
-            Can<ManagedObject> pendingArgs,
+            PendingParameterModel pendingArgs,
             Integer paramNumUpdated);
 
+    default ManagedObject getDefault(ManagedObject actionOnwer) {
+        return getDefault(getAction().newPendingParameterModel(actionOnwer), 
null);
+    }
+    
 
     /**
      * Whether this parameter is visible given the entered previous arguments
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/Factories.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/Factories.java
index 0811362..ebd10dc 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/Factories.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/Factories.java
@@ -48,20 +48,6 @@ final class Factories {
         };
     }
     
-    public static Function<ObjectActionDefault, ObjectActionContributee> 
contributeeAction(
-            final ObjectSpecification typeSpec,
-            final Object servicePojo) {
-
-        return contributedAction -> {
-            // see if qualifies by inspecting all parameters
-            val contributeeParam = Utils.contributeeParameterIndexOf(typeSpec, 
contributedAction);
-            if(contributeeParam == -1) {
-                return null; // should not happen if filtered correctly before
-            }
-            return new ObjectActionContributee(servicePojo, contributedAction, 
contributeeParam, typeSpec);
-        };
-    }
-    
     // -- MIXINS
     
     static Function<ObjectActionDefault, ObjectActionMixedIn> mixedInAction(
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
deleted file mode 100644
index ce9419e..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionContributee.java
+++ /dev/null
@@ -1,253 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import org.apache.isis.applib.Identifier;
-import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.commons.internal.collections._Lists;
-import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FacetHolder;
-import org.apache.isis.core.metamodel.facetapi.FacetHolderImpl;
-import org.apache.isis.core.metamodel.facetapi.FacetUtil;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.interactions.InteractionUtils;
-import org.apache.isis.core.metamodel.interactions.UsabilityContext;
-import org.apache.isis.core.metamodel.interactions.VisibilityContext;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-
-import lombok.val;
-
-public class ObjectActionContributee extends ObjectActionDefault implements 
ContributeeMember {
-
-    private final Object servicePojo;
-    private final ObjectActionDefault serviceAction;
-    private final int contributeeParamIndex;
-    private final ObjectSpecification contributeeType;
-
-    /**
-     * Hold facets rather than delegate to the contributed action (different 
types might
-     * use layout metadata to position the contributee in different ways)
-     */
-    private final FacetHolder facetHolder = new FacetHolderImpl();
-
-    private final Identifier identifier;
-
-    public ObjectActionContributee(
-            final Object servicePojo,
-            final ObjectActionDefault serviceAction,
-            final int contributeeParam,
-            final ObjectSpecification contributeeType) {
-
-        super(serviceAction.getFacetedMethod());
-
-        this.servicePojo = servicePojo;
-        this.serviceAction = serviceAction;
-        this.contributeeType = contributeeType;
-        this.contributeeParamIndex = contributeeParam;
-
-        // copy over facets from contributed to own.
-        FacetUtil.copyFacets(serviceAction.getFacetedMethod(), facetHolder);
-
-        // calculate the identifier
-        final Identifier contributorIdentifier = 
serviceAction.getFacetedMethod().getIdentifier();
-        final String memberName = contributorIdentifier.getMemberName();
-        List<String> memberParameterNames = 
contributorIdentifier.getMemberParameterNames();
-        identifier = 
Identifier.actionIdentifier(getOnType().getCorrespondingClass().getName(), 
memberName, memberParameterNames);
-    }
-
-    @Override
-    public ObjectSpecification getOnType() {
-        return contributeeType;
-    }
-
-    @Override
-    public int getParameterCount() {
-        return serviceAction.getParameterCount() - 1;
-    }
-
-    @Override
-    public boolean isContributedBy(final ObjectAction serviceAction) {
-        return serviceAction == this.serviceAction;
-    }
-
-    @Override
-    public int getContributeeParamIndex() {
-        return contributeeParamIndex;
-    }
-
-    @Override
-    protected synchronized Can<ObjectActionParameter> determineParameters() {
-
-        val serviceParameters = serviceAction.getParameters();
-        //final List<FacetedMethodParameter> paramPeers = 
getFacetedMethod().getParameters(); //side effects?
-
-        final List<ObjectActionParameter> contributeeParameters = 
_Lists.newArrayList();
-        int contributeeParamNum = 0;
-
-        for (int serviceParamNum = 0; serviceParamNum < 
serviceParameters.size(); serviceParamNum++ ) {
-            if(serviceParamNum == contributeeParamIndex) {
-                // skip so is omitted from the Contributed action
-                continue;
-            }
-
-            final ObjectActionParameterAbstract serviceParameter =
-                    (ObjectActionParameterAbstract) 
serviceParameters.getElseFail(serviceParamNum);
-
-            final ObjectActionParameterContributee contributedParam =
-                    serviceParameter.getPeer().getFeatureType() == 
FeatureType.ACTION_PARAMETER_SCALAR
-                    ? new OneToOneActionParameterContributee(
-                            servicePojo, serviceParameter, 
contributeeParamNum, this)
-                            : new OneToManyActionParameterContributee(
-                                    servicePojo, serviceParameter, 
contributeeParamNum, this);
-
-            contributeeParameters.add(contributedParam);
-
-            contributeeParamNum++;
-        }
-        return Can.ofCollection(contributeeParameters);
-    }
-
-    @Override
-    public Consent isVisible(
-            final ManagedObject contributee,
-            final InteractionInitiatedBy interactionInitiatedBy,
-            Where where) {
-        final VisibilityContext<?> ic = 
serviceAction.createVisibleInteractionContext(getServiceAdapter(),
-                interactionInitiatedBy, where);
-        ic.putContributee(this.contributeeParamIndex, contributee);
-        return InteractionUtils.isVisibleResult(this, ic).createConsent();
-    }
-
-    @Override
-    public Consent isUsable(
-            final ManagedObject contributee,
-            final InteractionInitiatedBy interactionInitiatedBy, final Where 
where) {
-        final UsabilityContext<?> ic = 
serviceAction.createUsableInteractionContext(getServiceAdapter(),
-                interactionInitiatedBy, where);
-        ic.putContributee(this.contributeeParamIndex, contributee);
-        return InteractionUtils.isUsableResult(this, ic).createConsent();
-    }
-
-    @Override
-    public Can<ManagedObject> getDefaults(final ManagedObject target) {
-        val contributorDefaults = 
serviceAction.getDefaults(getServiceAdapter());
-        return contributorDefaults.remove(contributeeParamIndex);
-    }
-
-    @Override
-    public Can<Can<ManagedObject>> getChoices(
-            final ManagedObject target,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        val serviceChoices = serviceAction.getChoices(getServiceAdapter(), 
interactionInitiatedBy);
-        return serviceChoices.remove(contributeeParamIndex);
-    }
-
-    @Override
-    public Consent isProposedArgumentSetValid(
-            final ManagedObject contributee,
-            final Can<ManagedObject> proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        val serviceArguments = argsPlusContributee(contributee, 
proposedArguments);
-        return serviceAction
-                .isProposedArgumentSetValid(getServiceAdapter(), 
serviceArguments, interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isEachIndividualArgumentValid(
-            final ManagedObject contributee,
-            final Can<ManagedObject> proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        val serviceArguments = argsPlusContributee(contributee, 
proposedArguments);
-        return serviceAction
-                .isEachIndividualArgumentValid(getServiceAdapter(), 
serviceArguments, interactionInitiatedBy);
-    }
-
-    @Override
-    public Consent isArgumentSetValid(
-            final ManagedObject contributee,
-            final Can<ManagedObject> proposedArguments,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        val serviceArguments = argsPlusContributee(contributee, 
proposedArguments);
-        return serviceAction
-                .isArgumentSetValid(getServiceAdapter(), serviceArguments, 
interactionInitiatedBy);
-    }
-
-    @Override
-    public ManagedObject execute(
-            final ManagedObject targetAdapter,
-            final ManagedObject mixedInAdapter,
-            final Can<ManagedObject> argumentAdapters,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-
-        setupCommand(targetAdapter, argumentAdapters);
-
-        val serviceArguments = argsPlusContributee(targetAdapter, 
argumentAdapters);
-        return serviceAction.executeInternal(
-                getServiceAdapter(), mixedInAdapter, serviceArguments, 
interactionInitiatedBy);
-    }
-
-
-    private Can<ManagedObject> argsPlusContributee(
-            final ManagedObject contributee, 
-            final Can<ManagedObject> arguments) {
-        
-        arguments.add(contributeeParamIndex, contributee);
-        return arguments;
-    }
-
-    // //////////////////////////////////////
-    // FacetHolder
-    // //////////////////////////////////////
-
-    @Override
-    public FacetHolder getFacetHolder() {
-        return facetHolder;
-    }
-
-    // //////////////////////////////////////
-
-    /* (non-Javadoc)
-     * @see ObjectMemberAbstract#getIdentifier()
-     */
-    @Override
-    public Identifier getIdentifier() {
-        return identifier;
-    }
-
-    // //////////////////////////////////////
-
-    public ManagedObject getServiceAdapter() {
-        return getObjectManager().adapt(servicePojo);
-    }
-
-    @Override
-    public ObjectSpecification getServiceContributedBy() {
-        return getServiceAdapter().getSpecification();
-    }
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
index bdb40d3..6f023c3 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionDefault.java
@@ -67,6 +67,7 @@ import 
org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
+import lombok.NonNull;
 import lombok.val;
 
 public class ObjectActionDefault extends ObjectMemberAbstract implements 
ObjectAction {
@@ -148,6 +149,13 @@ public class ObjectActionDefault extends 
ObjectMemberAbstract implements ObjectA
     }
 
 
+    @Override
+    public PendingParameterModel newPendingParameterModel(
+            @NonNull ManagedObject actionOwner,
+            @NonNull Can<ManagedObject> paramValues) {
+        return PendingParameterModel.of(this, actionOwner, actionOwner, 
paramValues);
+    }
+    
     // -- Parameters
 
     @Override
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
index 3dcf065..4354c1a 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionMixedIn.java
@@ -45,6 +45,7 @@ import 
org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 
 import lombok.Getter;
+import lombok.NonNull;
 import lombok.val;
 
 public class ObjectActionMixedIn extends ObjectActionDefault implements 
MixedInMember {
@@ -136,6 +137,13 @@ public class ObjectActionMixedIn extends 
ObjectActionDefault implements MixedInM
     }
 
     @Override
+    public PendingParameterModel newPendingParameterModel(
+            @NonNull ManagedObject actionOwner,
+            @NonNull Can<ManagedObject> paramValues) {
+        return PendingParameterModel.of(this, actionOwner, 
mixinAdapterFor(actionOwner), paramValues);
+    }
+    
+    @Override
     protected synchronized Can<ObjectActionParameter> determineParameters() {
         if (parameters != null) {
             // because possible race condition (caller isn't synchronized)
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
index 57acb44..26ba3f9 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterAbstract.java
@@ -207,17 +207,16 @@ implements ObjectActionParameter, FacetHolder.Delegating {
 
     @Override
     public Can<ManagedObject> getAutoComplete(
-            final ManagedObject adapter,
-            final Can<ManagedObject> pendingArgs,
+            final PendingParameterModel pendingArgs,
             final String searchArg,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        final List<ManagedObject> adapters = _Lists.newArrayList();
-        final ActionParameterAutoCompleteFacet facet = 
getFacet(ActionParameterAutoCompleteFacet.class);
+        val adapters = _Lists.<ManagedObject>newArrayList();
+        val autoCompleteFacet = 
getFacet(ActionParameterAutoCompleteFacet.class);
 
-        if (facet != null) {
-            final Object[] choices = facet
-                    .autoComplete(adapter, pendingArgs, searchArg, 
interactionInitiatedBy);
+        if (autoCompleteFacet != null) {
+            final Object[] choices = autoCompleteFacet
+                    .autoComplete(pendingArgs.getActionTarget(), 
pendingArgs.getParamValues(), searchArg, interactionInitiatedBy);
             checkChoicesOrAutoCompleteType(getSpecificationLoader(), choices, 
getSpecification());
             for (final Object choice : choices) {
                 adapters.add(getObjectManager().adapt(choice));
@@ -244,26 +243,21 @@ implements ObjectActionParameter, FacetHolder.Delegating {
 
     @Override
     public Can<ManagedObject> getChoices(
-            final ManagedObject adapter,
-            final Can<ManagedObject> pendingArgs,
+            final PendingParameterModel pendingArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
-        val args = argsForDefaultOrChoices(adapter, pendingArgs);
-        val target = targetForDefaultOrChoices(adapter);
-
-        return findChoices(target, args, interactionInitiatedBy);
+        return findChoices(pendingArgs, interactionInitiatedBy);
     }
 
     private Can<ManagedObject> findChoices(
-            final ManagedObject target,
-            final Can<ManagedObject> pendingArgs,
+            final PendingParameterModel pendingArgs,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
         final List<ManagedObject> adapters = _Lists.newArrayList();
         final ActionParameterChoicesFacet facet = 
getFacet(ActionParameterChoicesFacet.class);
 
         if (facet != null) {
-            final Object[] choices = facet.getChoices(target, pendingArgs, 
interactionInitiatedBy);
+            final Object[] choices = 
facet.getChoices(pendingArgs.getActionTarget(), pendingArgs.getParamValues(), 
interactionInitiatedBy);
             checkChoicesOrAutoCompleteType(getSpecificationLoader(), choices, 
getSpecification());
             for (final Object choice : choices) {
                 ManagedObject adapter = choice != null? 
getObjectManager().adapt(choice) : null;
@@ -277,51 +271,30 @@ implements ObjectActionParameter, FacetHolder.Delegating {
 
     @Override
     public ManagedObject getDefault(
-            final ManagedObject adapter,
-            final Can<ManagedObject> pendingArgs,
+            final PendingParameterModel pendingArgs,
             final Integer paramNumUpdated) {
 
-        final ManagedObject target = targetForDefaultOrChoices(adapter);
-        val args = argsForDefaultOrChoices(adapter, pendingArgs);
-
-        return findDefault(target, args, paramNumUpdated);
+        return findDefault(pendingArgs, paramNumUpdated);
     }
 
     private ManagedObject findDefault(
-            final ManagedObject target,
-            final Can<ManagedObject> args,
+            final PendingParameterModel pendingArgs,
             final Integer paramNumUpdated) {
         
-        final ActionParameterDefaultsFacet defaultsFacet = 
getFacet(ActionParameterDefaultsFacet.class);
+        val defaultsFacet = getFacet(ActionParameterDefaultsFacet.class);
         if (defaultsFacet != null) {
-            final Object dflt = defaultsFacet.getDefault(target, args, 
paramNumUpdated);
-            if (dflt == null) {
+            final Object defaultValue = defaultsFacet
+                    .getDefault(pendingArgs.getActionTarget(), 
pendingArgs.getParamValues(), paramNumUpdated);
+            if (defaultValue == null) {
                 // it's possible that even though there is a default facet, 
when
                 // invoked it is unable to return a default.
                 return null;
             }
-            return getObjectManager().adapt(dflt);
+            return getObjectManager().adapt(defaultValue);
         }
         return null;
     }
 
-    /**
-     * Hook method; {@link ObjectActionParameterContributee contributed action 
parameter}s override.
-     */
-    protected ManagedObject targetForDefaultOrChoices(final ManagedObject 
adapter) {
-        return adapter;
-    }
-
-    /**
-     * Hook method; {@link ObjectActionParameterContributee contributed action 
parameter}s override.
-     */
-    protected Can<ManagedObject> argsForDefaultOrChoices(
-            final ManagedObject adapter,
-            final Can<ManagedObject> argumentsIfAvailable) {
-        return argumentsIfAvailable;
-    }
-
-
     // helpers
     static void checkChoicesOrAutoCompleteType(
             final SpecificationLoader specificationLookup,
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
deleted file mode 100644
index 829a4ce..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterContributeeAbstract.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.specloader.specimpl;
-
-import java.util.List;
-
-import org.apache.isis.core.commons.collections.Can;
-import org.apache.isis.core.metamodel.commons.ListExtensions;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-
-/**
- * 
- * @deprecated contributed actions from services are deprecated, use mixins 
instead
- *
- */
-@Deprecated
-public abstract class ObjectActionParameterContributeeAbstract
-extends ObjectActionParameterAbstract
-implements ObjectActionParameterContributee {
-
-    private final Object servicePojo;
-    private final ObjectActionParameter serviceActionParameter;
-    private final ObjectActionContributee contributeeAction;
-
-    public ObjectActionParameterContributeeAbstract(
-            final FeatureType featureType,
-            final Object servicePojo,
-            final ObjectActionParameterAbstract serviceActionParameter,
-            final int contributeeParamNumber,
-            final ObjectActionContributee contributeeAction) {
-        
-        super(featureType, contributeeParamNumber, contributeeAction, 
serviceActionParameter.getPeer());
-        this.servicePojo = servicePojo;
-        this.serviceActionParameter = serviceActionParameter;
-        this.contributeeAction = contributeeAction;
-    }
-
-    @Override
-    public Can<ManagedObject> getAutoComplete(
-            final ManagedObject adapter,
-            final Can<ManagedObject> pendingArgs,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        return serviceActionParameter.getAutoComplete(
-                getServiceAdapter(),
-                pendingArgs,
-                searchArg,
-                interactionInitiatedBy);
-    }
-
-    protected ManagedObject getServiceAdapter() {
-        return getObjectManager().adapt(servicePojo);
-    }
-
-    @Override
-    protected ManagedObject targetForDefaultOrChoices(final ManagedObject 
adapter) {
-        return getServiceAdapter();
-    }
-
-    
-    @Override
-    protected Can<ManagedObject> argsForDefaultOrChoices(
-            final ManagedObject contributee,
-            final Can<ManagedObject> pendingArgs) {
-
-        final List<ManagedObject> suppliedArgs = pendingArgs.toList();
-        final int contributeeParam = 
contributeeAction.getContributeeParamIndex();
-        ListExtensions.insert(suppliedArgs, contributeeParam, contributee);
-        return Can.ofCollection(suppliedArgs);
-    }
-
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
index 5f866d9..9c0ef0c 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectActionParameterMixedInAbstract.java
@@ -23,13 +23,13 @@ import 
org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
 import org.apache.isis.core.metamodel.interactions.ActionArgValidityContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+
+import lombok.val;
 
 public abstract class ObjectActionParameterMixedInAbstract
 extends ObjectActionParameterAbstract
 implements ObjectActionParameterMixedIn {
 
-    private final ObjectActionParameter mixinParameter;
     private final ObjectActionMixedIn mixedInAction;
 
     public ObjectActionParameterMixedInAbstract(
@@ -38,44 +38,21 @@ implements ObjectActionParameterMixedIn {
             final ObjectActionMixedIn mixedInAction) {
         
         super(featureType, mixinParameter.getNumber(), mixedInAction, 
mixinParameter.getPeer());
-        this.mixinParameter = mixinParameter;
         this.mixedInAction = mixedInAction;
     }
 
     @Override
-    public Can<ManagedObject> getAutoComplete(
-            final ManagedObject mixedInAdapter,
-            final Can<ManagedObject> pendingArgs,
-            final String searchArg,
-            final InteractionInitiatedBy interactionInitiatedBy) {
-        
-        return mixinParameter.getAutoComplete(
-                mixinAdapterFor(mixedInAdapter),
-                pendingArgs,
-                searchArg,
-                interactionInitiatedBy);
-    }
-
-    @Override
-    protected ManagedObject targetForDefaultOrChoices(final ManagedObject 
mixedInAdapter) {
-        return mixinAdapterFor(mixedInAdapter);
-    }
-
-    private ManagedObject mixinAdapterFor(final ManagedObject mixedInAdapter) {
-        return mixedInAction.mixinAdapterFor(mixedInAdapter);
-    }
-
-    @Override
     public ActionArgValidityContext createProposedArgumentInteractionContext(
             final ManagedObject mixedInAdapter,
             final Can<ManagedObject> proposedArguments,
             final int position,
             final InteractionInitiatedBy interactionInitiatedBy) {
 
-        final ManagedObject targetObject = mixinAdapterFor(mixedInAdapter);
+        val targetObject = mixedInAction.mixinAdapterFor(mixedInAdapter);
 
-        final ActionArgValidityContext actionArgValidityContext = new 
ActionArgValidityContext(
-                targetObject, mixedInAction.mixinAction, getIdentifier(), 
proposedArguments, position, interactionInitiatedBy);
+        val actionArgValidityContext = new ActionArgValidityContext(
+                targetObject, mixedInAction.mixinAction, getIdentifier(), 
+                proposedArguments, position, interactionInitiatedBy);
         actionArgValidityContext.setMixedIn(mixedInAdapter);
         return actionArgValidityContext;
     }
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
index f617845..6133ec7 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/ObjectSpecificationAbstract.java
@@ -842,6 +842,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
      * If this specification {@link #isManagedBean() is actually for} a 
service,
      * then returns an empty list.
      */
+    @Deprecated
     private List<ObjectAction> createContributeeActions() {
         if (isManagedBean() || isValue()) {
             return Collections.emptyList();
@@ -853,7 +854,7 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
     }
 
 
-
+    @Deprecated
     private void forEachContributeeAction(
             final Object servicePojo,
             final Consumer<ObjectAction> onNewContributeeAction) {
@@ -875,10 +876,15 @@ public abstract class ObjectSpecificationAbstract extends 
FacetHolderImpl implem
 
         serviceActions
         .filter(Predicates.isContributeeAction(this))
-        .map(ObjectActionDefault.class::cast)
-        .map(Factories.contributeeAction(this, servicePojo))
-        .peek(facetProcessor::processMemberOrder)
-        .forEach(onNewContributeeAction);
+        
+        .findAny().ifPresent(action->_Exceptions
+                .unrecoverableFormatted("ContributeeActions like %s are no 
longer supported", action));
+        
+        
+//        .map(ObjectActionDefault.class::cast)
+//        .map(Factories.contributeeAction(this, servicePojo))
+//        .peek(facetProcessor::processMemberOrder)
+//        .forEach(onNewContributeeAction);
 
     }
 
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
deleted file mode 100644
index 20fe317..0000000
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToManyActionParameterContributee.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- */
-package org.apache.isis.core.metamodel.specloader.specimpl;
-
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import 
org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
-import 
org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemanticsFacet;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
-
-public class OneToManyActionParameterContributee
-extends ObjectActionParameterContributeeAbstract
-implements OneToManyActionParameter {
-
-    public OneToManyActionParameterContributee(
-            final Object servicePojo,
-            final ObjectActionParameterAbstract serviceActionParameter,
-            final int contributeeParamNumber,
-            final ObjectActionContributee contributeeAction) {
-        super(FeatureType.ACTION_PARAMETER_COLLECTION, servicePojo, 
-                serviceActionParameter, contributeeParamNumber, 
contributeeAction);
-    }
-
-    @Override
-    public CollectionSemantics getCollectionSemantics() {
-        return getFacet(CollectionSemanticsFacet.class).value();
-    }
-}
diff --git 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java
similarity index 53%
rename from 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
rename to 
core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java
index a452bb8..17c89cf 100644
--- 
a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/OneToOneActionParameterContributee.java
+++ 
b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/specloader/specimpl/PendingParameterModel.java
@@ -18,21 +18,28 @@
  */
 package org.apache.isis.core.metamodel.specloader.specimpl;
 
-import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneActionParameter;
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 
-public class OneToOneActionParameterContributee
-extends ObjectActionParameterContributeeAbstract
-implements OneToOneActionParameter {
-
-    public OneToOneActionParameterContributee(
-            final Object servicePojo,
-            final ObjectActionParameterAbstract serviceActionParameter,
-            final int contributeeParamNumber,
-            final ObjectActionContributee contributeeAction) {
-        super(FeatureType.ACTION_PARAMETER_SCALAR, servicePojo, 
-                serviceActionParameter, contributeeParamNumber, 
contributeeAction);
-    }
+import lombok.Getter;
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
 
+/**
+ * Model used to negotiate the paramValues of an action by means of a UI 
dialog.
+ *  
+ * @since 2.0.0
+ */
+@Getter 
+@RequiredArgsConstructor(staticName = "of")
+public class PendingParameterModel {
 
+    @NonNull private final ObjectAction action;
+    @NonNull private final ManagedObject actionOwner;
+    /** typically equal to {@code actionOwner}, except for mixins and 
contributees*/
+    @NonNull private final ManagedObject actionTarget; 
+    @NonNull private final Can<ManagedObject> paramValues;
+    
+    
 }
diff --git 
a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
 
b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
index 363f96d..907ddb2 100644
--- 
a/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
+++ 
b/core/runtimeservices/src/main/java/org/apache/isis/core/runtimeservices/wrapper/handlers/DomainObjectInvocationHandler.java
@@ -63,7 +63,6 @@ import 
org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.metamodel.specloader.specimpl.ContributeeMember;
 import org.apache.isis.core.metamodel.specloader.specimpl.MixedInMember;
-import 
org.apache.isis.core.metamodel.specloader.specimpl.ObjectActionContributee;
 import 
org.apache.isis.core.metamodel.specloader.specimpl.dflt.ObjectSpecificationDefault;
 
 import lombok.SneakyThrows;
@@ -634,11 +633,6 @@ public class DomainObjectInvocationHandler<T> extends 
DelegatingInvocationHandle
                 checkVisibility(contributeeAdapter, contributeeMember);
                 checkUsability(contributeeAdapter, contributeeMember);
                 
-                if(contributeeMember instanceof ObjectActionContributee) {
-                    val objectActionContributee = (ObjectActionContributee) 
contributeeMember;
-                    val contributeeArgAdapters = 
asObjectAdaptersUnderlying(contributeeArgs);
-                    checkValidity(contributeeAdapter, objectActionContributee, 
contributeeArgAdapters);
-                }
                 // nothing to do for contributed properties or collections
                 
             } else {
diff --git 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
index 5a908d7..db821da 100644
--- 
a/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
+++ 
b/viewers/restfulobjects/rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/domainobjects/ObjectActionReprRenderer.java
@@ -172,7 +172,9 @@ public class ObjectActionReprRenderer extends 
AbstractObjectMemberReprRenderer<O
             final ObjectActionParameter param,
             final InteractionInitiatedBy interactionInitiatedBy) {
         
-        val choiceAdapters = param.getChoices(objectAdapter, null, 
interactionInitiatedBy);
+        val pendingArgs = 
param.getAction().newPendingParameterModel(objectAdapter);
+        
+        val choiceAdapters = param.getChoices(pendingArgs, 
interactionInitiatedBy);
         if (choiceAdapters == null || choiceAdapters.isEmpty()) {
             return null;
         }
@@ -186,7 +188,8 @@ public class ObjectActionReprRenderer extends 
AbstractObjectMemberReprRenderer<O
     }
 
     private Object defaultFor(final ObjectActionParameter param) {
-        final ManagedObject defaultAdapter = param.getDefault(objectAdapter, 
null, null);
+        
+        final ManagedObject defaultAdapter = param.getDefault(objectAdapter);
         if (defaultAdapter == null) {
             return null;
         }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 96d5868..15d76e6 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -22,6 +22,7 @@ import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.BiFunction;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
@@ -48,6 +49,7 @@ import 
org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
+import 
org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.LinksProvider;
@@ -420,13 +422,11 @@ implements LinksProvider, FormExecutorContext, 
ActionArgumentModel {
                     final ScalarModel scalarModel,
                     final Can<ManagedObject> pendingArgs,
                     final int paramNumUpdated) {
-
-                final ActionParameterMemento parameterMemento = 
scalarModel.getParameterMemento();
-                final ObjectActionParameter actionParameter = 
parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
-
-                //XXX lombok issue, no val
-                ManagedObject parentAdapter = 
scalarModel.getParentEntityModel().load();
-                return actionParameter.getDefault(parentAdapter, pendingArgs, 
paramNumUpdated);
+                
+                return withPendingParamsDo(scalarModel, pendingArgs, 
(pendingParamsModel, actionParameter)->
+                actionParameter.getDefault(
+                        pendingParamsModel,
+                        paramNumUpdated));
             }
 
             @Override
@@ -440,18 +440,11 @@ implements LinksProvider, FormExecutorContext, 
ActionArgumentModel {
                     final ScalarModel scalarModel,
                     final Can<ManagedObject> pendingArgs) {
                 
-                final ActionParameterMemento parameterMemento = 
scalarModel.getParameterMemento();
-                final ObjectActionParameter actionParameter = 
parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
-
-                //XXX lombok issue, no val
-                ManagedObject parentAdapter = 
scalarModel.getParentEntityModel().load();
-
-                final Can<ManagedObject> choices =
-                        actionParameter.getChoices(
-                                parentAdapter, 
-                                pendingArgs,
-                                InteractionInitiatedBy.USER);
-                return choices;
+                return withPendingParamsDo(scalarModel, pendingArgs, 
(pendingParamsModel, actionParameter)->
+                actionParameter.getChoices(
+                        pendingParamsModel,
+                        InteractionInitiatedBy.USER));
+                
             }
 
             @Override
@@ -466,18 +459,26 @@ implements LinksProvider, FormExecutorContext, 
ActionArgumentModel {
                     final Can<ManagedObject> pendingArgs,
                     final String searchArg) {
                 
-                final ActionParameterMemento parameterMemento = 
scalarModel.getParameterMemento();
-                final ObjectActionParameter actionParameter = 
parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
-
-                ManagedObject parentAdapter = 
scalarModel.getParentEntityModel().load();
-                final Can<ManagedObject> choices = 
actionParameter.getAutoComplete(
-                        parentAdapter,
-                        pendingArgs,
+                return withPendingParamsDo(scalarModel, pendingArgs, 
(pendingParamsModel, actionParameter)->
+                actionParameter.getAutoComplete(
+                        pendingParamsModel,
                         searchArg,
-                        InteractionInitiatedBy.USER);
-                return choices;
+                        InteractionInitiatedBy.USER)); 
             }
 
+            // pending args helper
+            private <T> T withPendingParamsDo(
+                    final ScalarModel scalarModel,
+                    final Can<ManagedObject> pendingArgs,
+                    final BiFunction<PendingParameterModel, 
ObjectActionParameter, T> function) {
+                
+                val parameterMemento = scalarModel.getParameterMemento();
+                val actionParameter = 
parameterMemento.getActionParameter(scalarModel.getSpecificationLoader());
+                val actionOwner = scalarModel.getParentEntityModel().load();
+                val pendingParamsModel = 
actionParameter.getAction().newPendingParameterModel(actionOwner, pendingArgs);
+                return function.apply(pendingParamsModel, actionParameter);
+            }
+            
             @Override
             public int getAutoCompleteOrChoicesMinLength(ScalarModel 
scalarModel) {
                 if (scalarModel.hasAutoComplete()) {
@@ -541,7 +542,7 @@ implements LinksProvider, FormExecutorContext, 
ActionArgumentModel {
                         scalarModel.getSpecificationLoader());
                 final ManagedObject parentAdapter =
                         scalarModel.getParentEntityModel().load();
-                final ManagedObject defaultAdapter = 
actionParameter.getDefault(parentAdapter, Can.empty(), null);
+                final ManagedObject defaultAdapter = 
actionParameter.getDefault(parentAdapter);
                 scalarModel.setObject(defaultAdapter);
             }
 

Reply via email to