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 e58af62  ISIS-2340: tackle the ActionModel monster
e58af62 is described below

commit e58af62ca0b5706dd72d24fc2eeeb8dd7b155409
Author: Andi Huber <ahu...@apache.org>
AuthorDate: Sat May 2 18:46:53 2020 +0200

    ISIS-2340: tackle the ActionModel monster
---
 .../wicket/model/models/ActionArgumentCache.java   | 134 +++++++++++++++++
 .../wicket/model/models/ActionArgumentModel.java   |  14 ++
 .../viewer/wicket/model/models/ActionModel.java    | 159 ++++++++-------------
 .../components/actions/ActionParametersForm.java   |  37 ++---
 .../actions/ActionParametersFormPanel.java         |   1 -
 .../components/scalars/ScalarPanelAbstract2.java   |   9 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |   3 +-
 7 files changed, 230 insertions(+), 127 deletions(-)

diff --git 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
new file mode 100644
index 0000000..b105330
--- /dev/null
+++ 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentCache.java
@@ -0,0 +1,134 @@
+/*
+ *  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.viewer.wicket.model.models;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.commons.internal.assertions._Assert;
+import org.apache.isis.core.commons.internal.collections._Maps;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
+import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
+
+import lombok.NonNull;
+import lombok.RequiredArgsConstructor;
+import lombok.val;
+
+@RequiredArgsConstructor
+class ActionArgumentCache {
+    
+    @NonNull private final EntityModel entityModel;
+    @NonNull private final ActionMemento actionMemento;
+    @NonNull private final ObjectAction action;
+
+    private final Map<Integer, ActionArgumentModel> arguments = 
_Maps.newHashMap();
+    
+    public ActionArgumentModel computeIfAbsent(final ActionParameterMemento 
apm) {
+        final int i = apm.getNumber();
+        ActionArgumentModel actionArgumentModel = arguments.get(i);
+        if (actionArgumentModel == null) {
+            actionArgumentModel = new ScalarParameterModel(entityModel, apm);
+            final int number = 
actionArgumentModel.getParameterMemento().getNumber();
+            arguments.put(number, actionArgumentModel);
+        }
+        return actionArgumentModel;
+    }
+    
+    public void putArgumentValue(final int paramNum, final ManagedObject 
argumentAdapter) {
+        final ObjectActionParameter actionParam = 
action.getParameters().getElseFail(paramNum);
+        final ActionParameterMemento apm = new 
ActionParameterMemento(actionParam);
+        final ActionArgumentModel actionArgumentModel = computeIfAbsent(apm);
+        actionArgumentModel.setObject(argumentAdapter);
+    }
+    
+    public ActionArgumentCache copy() {
+        val copy = new ActionArgumentCache(
+                entityModel, 
+                actionMemento, 
+                action);
+        primeArgumentModels();
+        for (val argumentEntry : arguments.entrySet()) {
+            putArgumentValue(argumentEntry.getKey(), 
argumentEntry.getValue().getObject());
+        }
+        return copy;
+    }
+    
+    public Can<ManagedObject> snapshot() {
+        
+        val paramTypes = action.getParameterTypes();
+        
+        return streamParamNumbers()
+        .mapToObj(paramIndex->{
+            val actionArgumentModel = 
Optional.ofNullable(arguments.get(paramIndex));
+            val adapter = actionArgumentModel
+                    .map(ActionArgumentModel::getObject)
+                    
.orElse(ManagedObject.empty(paramTypes.getElseFail(paramIndex)));
+            return adapter;
+        
+        })
+        .collect(Can.toCan());
+    }
+    
+    public void resetTo(Can<ManagedObject> defaultsFixedPoint) {
+        
+        arguments.clear();
+        
+        streamActionArgumentModels()
+        .forEach(actionArgumentModel -> {
+            int paramIndex = 
actionArgumentModel.getParameterMemento().getNumber();
+            val paramDefaultValue = defaultsFixedPoint.getElseFail(paramIndex);
+            actionArgumentModel.setObject(paramDefaultValue);
+        });
+    }
+    
+    public Stream<ActionArgumentModel> streamActionArgumentModels() {
+        return streamParamNumbers()
+                .mapToObj(paramIndex->
+                    arguments.computeIfAbsent(paramIndex, 
this::createArgumentModel));
+    }
+    
+    // //////////////////////////////////////
+    
+    private IntStream streamParamNumbers() {
+        val paramCount = action.getParameterCount();
+        return IntStream.range(0, paramCount);
+    }
+
+    private ActionArgumentModel createArgumentModel(int paramIndex) {
+        val param = action.getParameters().getElseFail(paramIndex);
+        val paramMemento =  new ActionParameterMemento(param);
+        val actionArgumentModel = new ScalarParameterModel(entityModel, 
paramMemento);
+        return actionArgumentModel;
+    }
+    
+    private void primeArgumentModels() {
+        _Assert.assertEquals(
+                action.getParameterCount(),
+                (int)streamActionArgumentModels().count());
+    }
+
+
+    
+}
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
index a75f203..2b5dd55 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionArgumentModel.java
@@ -22,6 +22,8 @@ import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 
 public interface ActionArgumentModel extends IModel<ManagedObject> {
@@ -29,4 +31,16 @@ public interface ActionArgumentModel extends 
IModel<ManagedObject> {
     ActionParameterMemento getParameterMemento();
 
     void setActionArgsHint(Can<ManagedObject> arguments);
+    
+    // -- SHORTCUTS
+    
+    default ObjectActionParameter getActionParameter(SpecificationLoader 
specificationLoader) {
+        return getParameterMemento().getActionParameter(specificationLoader);
+    }
+    
+    default int getNumber() {
+        return getParameterMemento().getNumber();
+    }
+
+
 }
diff --git 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index 8f656d9..7cea4c1 100644
--- 
a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ 
b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -22,13 +22,10 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
-import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 import org.apache.wicket.request.IRequestHandler;
 import org.apache.wicket.request.handler.resource.ResourceStreamRequestHandler;
@@ -51,7 +48,6 @@ import org.apache.isis.applib.value.LocalResourcePath;
 import org.apache.isis.applib.value.NamedWithMimeType;
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.base._NullSafe;
-import org.apache.isis.core.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
 import org.apache.isis.core.commons.internal.primitives._Ints;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
@@ -185,7 +181,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
         val pageParameters = createPageParameters(adapter, objectAction);
 
         // capture argument values
-        for(val argumentAdapter: getArgumentsAsImmutable()) {
+        for(val argumentAdapter: argCache().snapshot()) {
             val encodedArg = encodeArg(argumentAdapter);
             PageParameterNames.ACTION_ARGS.addStringTo(pageParameters, 
encodedArg);
         }
@@ -205,7 +201,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
         final ObjectAction objectAction = getAction();
 
         final StringBuilder buf = new StringBuilder();
-        for(val argumentAdapter: getArgumentsAsImmutable()) {
+        for(val argumentAdapter: argCache().snapshot()) {
             if(buf.length() > 0) {
                 buf.append(",");
             }
@@ -245,12 +241,17 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
 
     private final EntityModel entityModel;
     private final ActionMemento actionMemento;
-
-    /**
-     * Lazily populated in {@link #getArgumentModel(ActionParameterMemento)}
-     */
-    private final Map<Integer, ActionArgumentModel> arguments = 
_Maps.newHashMap();
-
+    
+    // lazy in support of serialization of this class
+    private transient ActionArgumentCache argCache;
+    private ActionArgumentCache argCache() {
+        return argCache!=null
+                ? argCache
+                : (argCache = new ActionArgumentCache(
+                        entityModel, 
+                        actionMemento, 
+                        
getActionMemento().getAction(getSpecificationLoader())));
+    }
     
     private static ActionMemento newActionMementoFrom(
             IsisWebAppCommonContext commonContext,
@@ -296,12 +297,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
         super(actionModel.getCommonContext());
         this.entityModel = actionModel.entityModel;
         this.actionMemento = actionModel.actionMemento;
-
-        primeArgumentModels();
-        val argumentModelByIdx = actionModel.arguments;
-        for (val argumentModel : argumentModelByIdx.entrySet()) {
-            setArgument(argumentModel.getKey(), 
argumentModel.getValue().getObject());
-        }
+        this.argCache = actionModel.argCache().copy(); 
     }
 
     private void setArgumentsIfPossible(final PageParameters pageParameters) {
@@ -353,7 +349,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
 
     private void setArgument(final int paramNum, final ObjectSpecification 
argSpec, final String encoded) {
         val argumentAdapter = decodeArg(argSpec, encoded);
-        setArgument(paramNum, argumentAdapter);
+        argCache().putArgumentValue(paramNum, argumentAdapter);
     }
 
     private String encodeArg(ManagedObject adapter) {
@@ -388,26 +384,6 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
         }
     }
 
-    private void setArgument(int paramNum, ManagedObject argumentAdapter) {
-        
-        final ObjectAction action = 
actionMemento.getAction(getSpecificationLoader());
-        final ObjectActionParameter actionParam = 
action.getParameters().getElseFail(paramNum);
-        final ActionParameterMemento apm = new 
ActionParameterMemento(actionParam);
-        final ActionArgumentModel actionArgumentModel = getArgumentModel(apm);
-        actionArgumentModel.setObject(argumentAdapter);
-    }
-
-
-    public ActionArgumentModel getArgumentModel(final ActionParameterMemento 
apm) {
-        final int i = apm.getNumber();
-        ActionArgumentModel actionArgumentModel = arguments.get(i);
-        if (actionArgumentModel == null) {
-            actionArgumentModel = new ScalarParameterModel(entityModel, apm);
-            final int number = 
actionArgumentModel.getParameterMemento().getNumber();
-            arguments.put(number, actionArgumentModel);
-        }
-        return actionArgumentModel;
-    }
 
     public ManagedObject getTargetAdapter() {
         return entityModel.load();
@@ -439,7 +415,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
     private ManagedObject executeAction() {
 
         val targetAdapter = getTargetAdapter();
-        final Can<ManagedObject> arguments = getArgumentsAsImmutable();
+        final Can<ManagedObject> arguments = argCache().snapshot();
         final ObjectAction action = getAction();
 
         // if this action is a mixin, then it will fill in the details 
automatically.
@@ -496,7 +472,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
 
     public String getReasonInvalidIfAny() {
         val targetAdapter = getTargetAdapter();
-        final Can<ManagedObject> proposedArguments = getArgumentsAsImmutable();
+        final Can<ManagedObject> proposedArguments = argCache().snapshot();
         final ObjectAction objectAction = getAction();
         final Consent validity = objectAction
                 .isProposedArgumentSetValid(targetAdapter, proposedArguments, 
InteractionInitiatedBy.USER);
@@ -510,33 +486,9 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
 
     public PendingParameterModel getArgumentsAsParamModel() {
         return getAction().newPendingParameterModelHead(getTargetAdapter())
-                .model(getArgumentsAsImmutable());
+                .model(argCache().snapshot());
     }
 
-    @Deprecated // make private (use getArgumentsAsParamModel instead)
-    public Can<ManagedObject> getArgumentsAsImmutable() {
-        
-        val objectAction = getAction();
-        val paramCount = objectAction.getParameterCount();
-        val paramTypes = objectAction.getParameterTypes();
-        
-        if(this.arguments.size() < paramCount) {
-            primeArgumentModels();
-        }
-        
-        return IntStream.range(0, paramCount)
-        .mapToObj(paramIndex->{
-        
-            val actionArgumentModel = this.arguments.get(paramIndex);
-            val adapter = Optional.ofNullable(actionArgumentModel.getObject())
-                    
.orElse(ManagedObject.empty(paramTypes.getElseFail(paramIndex)));
-            
-            return adapter;
-        
-        })
-        .collect(Can.toCan());
-        
-    }
 
     /** Resets arguments to their fixed point default values
      * @see {@link PendingParameterModelHead#defaults()}
@@ -548,11 +500,7 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
                 .defaults()
                 .getParamValues();
         
-        for (final ActionArgumentModel actionArgumentModel : 
arguments.values()) {
-            int paramIndex = 
actionArgumentModel.getParameterMemento().getNumber();
-            val paramDefaultValue = defaultsFixedPoint.getElseFail(paramIndex);
-            actionArgumentModel.setObject(paramDefaultValue);
-        }
+        argCache().resetTo(defaultsFixedPoint);
     }
 
     /**
@@ -640,31 +588,6 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
         return handler;
     }
 
-    // //////////////////////////////////////
-
-    public List<ActionParameterMemento> primeArgumentModels() {
-        val objectAction = getAction();
-        val parameters = objectAction.getParameters();
-        val actionParameterMementos = buildParameterMementos(parameters);
-        for (val actionParameterMemento : actionParameterMementos) {
-            getArgumentModel(actionParameterMemento);
-        }
-
-        return actionParameterMementos;
-    }
-
-
-    private static List<ActionParameterMemento> buildParameterMementos(
-            final Can<ObjectActionParameter> parameters) {
-
-        // we copy into a new array list otherwise we get lazy evaluation =
-        // reference to a non-serializable object
-        return parameters.stream()
-                .map(ActionParameterMemento::new)
-                .collect(Collectors.toCollection(ArrayList::new));
-    }
-
-
     //////////////////////////////////////////////////
 
     @Override
@@ -726,5 +649,47 @@ public class ActionModel extends 
BookmarkableModel<ManagedObject> implements For
         this.inlinePromptContext = inlinePromptContext;
     }
 
+    public void setParameterValue(ObjectActionParameter actionParameter, 
ManagedObject defaultIfAny) {
+        val actionParameterMemento = new 
ActionParameterMemento(actionParameter);
+        val actionArgumentModel = 
argCache().computeIfAbsent(actionParameterMemento);
+        actionArgumentModel.setObject(defaultIfAny);
+    }
+
+    public void clearParameterValue(ObjectActionParameter actionParameter) {
+        setParameterValue(actionParameter, null);
+    }
+    
+    @Value(staticConstructor = "of")
+    public static class ActionArgumentModelAndVisibilityConsent {
+        final ActionArgumentModel actionArgumentModel;
+        final Consent visibilityConsent;
+    }
+
+    public Stream<ActionArgumentModelAndVisibilityConsent> 
streamActionArgumentModels() {
+
+        val specificationLoader = getSpecificationLoader();
+        val targetAdapter = this.getTargetAdapter();
+        val realTargetAdapter = 
this.getActionMemento().getAction(specificationLoader)
+                .realTargetAdapter(targetAdapter);
+        val actionArgsHint = argCache().snapshot();
+        
+        return argCache().streamActionArgumentModels()
+        .map(actionArgumentModel->{
+        
+            actionArgumentModel.setActionArgsHint(actionArgsHint);
+            
+            // visibility
+            val visibilityConsent = 
actionArgumentModel.getActionParameter(specificationLoader)
+                    .isVisible(realTargetAdapter, Can.empty(), 
InteractionInitiatedBy.USER);
+            
+            return 
ActionArgumentModelAndVisibilityConsent.of(actionArgumentModel, 
visibilityConsent);
+            
+        });
+        
+
+    }
+
+    
+
 
 }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
index a0572ac..4aa2738 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
@@ -28,9 +28,7 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.form.Form;
 import org.apache.wicket.markup.repeater.RepeatingView;
 
-import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.viewer.common.model.decorator.confirm.ConfirmUiModel;
@@ -75,37 +73,33 @@ class ActionParametersForm extends 
PromptFormAbstract<ActionModel> {
         add(repeatingView);
 
         paramPanels.clear();
-        val parameterMementos = actionModel.primeArgumentModels();
-        for (val actionParameterMemento : parameterMementos) {
+        
+        actionModel.streamActionArgumentModels()
+        .forEach(tuple->{
+            
+            val actionArgumentModel = tuple.getActionArgumentModel(); 
+            val visibilityConsent = tuple.getVisibilityConsent();
+            
             val container = new WebMarkupContainer(repeatingView.newChildId());
             repeatingView.add(container);
-
-            val actionArgumentModel = 
actionModel.getArgumentModel(actionParameterMemento);
-            
actionArgumentModel.setActionArgsHint(actionModel.getArgumentsAsImmutable());
+            
             newParamPanel(container, actionArgumentModel)
             .ifPresent(paramPanel->{
-            
                 paramPanels.add(paramPanel);
-
-                // TODO: maybe this logic should move instead to 
ScalarModel.Kind#whether{Hidden/Disabled}
-                val targetAdapter = actionModel.getTargetAdapter();
-                val realTargetAdapter = 
actionModel.getActionMemento().getAction(getSpecificationLoader())
-                        .realTargetAdapter(targetAdapter);
-                val consent = 
actionParameterMemento.getActionParameter(getSpecificationLoader())
-                        .isVisible(realTargetAdapter, Can.empty(), 
InteractionInitiatedBy.USER);
-                val allowed = consent.isAllowed();
-                paramPanel.setVisible(allowed);
-                
+                paramPanel.setVisible(visibilityConsent.isAllowed());
             });
             
-        }
+        });
 
         setOutputMarkupId(true);
 
 
     }
 
-    private Optional<ScalarPanelAbstract2> newParamPanel(final 
WebMarkupContainer container, final ActionArgumentModel model) {
+    private Optional<ScalarPanelAbstract2> newParamPanel(
+            final WebMarkupContainer container, 
+            final ActionArgumentModel model) {
+        
         final Component component = getComponentFactoryRegistry()
                 .addOrReplaceComponent(container, 
ComponentType.SCALAR_NAME_AND_VALUE, model);
 
@@ -113,8 +107,7 @@ class ActionParametersForm extends 
PromptFormAbstract<ActionModel> {
             final MarkupContainer markupContainer = (MarkupContainer) 
component;
 
             // TODO: copy-n-paste of 
ScalarModel.Kind#getCssClass(ScalarModel), so could perhaps unify
-            final ObjectActionParameter actionParameter = 
model.getParameterMemento()
-                    .getActionParameter(getSpecificationLoader());
+            final ObjectActionParameter actionParameter = 
model.getActionParameter(getSpecificationLoader());
 
             final ObjectAction action = actionParameter.getAction();
             final String objectSpecId = 
action.getOnType().getSpecId().asString().replace(".", "-");
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
index 960a659..b9b49b3 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersFormPanel.java
@@ -47,7 +47,6 @@ public class ActionParametersFormPanel extends 
PromptFormPanelAbstract<ActionMod
 
     private void buildGui() {
         ActionModel model = getModel();
-        model.primeArgumentModels();
         model.clearArguments();  // in case previously used, eg prompt 
displayed then cancelled
         final ActionParametersForm inputForm =
                 new ActionParametersForm("inputForm", this, 
this.getWicketViewerSettings(), model);
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
index 68e2c6f..3027f79 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract2.java
@@ -55,7 +55,6 @@ 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.PendingParameterModel;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
-import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
 import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
@@ -173,15 +172,13 @@ implements ScalarModelSubscriber2 {
         final ScalarModel model = getModel();
         val defaultIfAny = model.getDefault(pendingArgumentsReadonly);
 
-        val actionParameterMemento = new 
ActionParameterMemento(actionParameter);
-        val actionArgumentModel = 
actionModel.getArgumentModel(actionParameterMemento);
-
         val pendingArg = 
pendingArgumentsReadonly.getElseFail(paramNumToPossiblyUpdate);
         
         if (defaultIfAny != null) {
             scalarModel.setObject(defaultIfAny);
             scalarModel.setPendingAdapter(defaultIfAny);
-            actionArgumentModel.setObject(defaultIfAny);
+            actionModel.setParameterValue(actionParameter, defaultIfAny);
+
         } else {
 
             boolean shouldBlankout = false;
@@ -205,7 +202,7 @@ implements ScalarModelSubscriber2 {
             if(shouldBlankout) {
                 scalarModel.setObject(null);
                 scalarModel.setPending(null);
-                actionArgumentModel.setObject(null);
+                actionModel.clearParameterValue(actionParameter);
             }
             
         }
diff --git 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
index be8a972..ca63480 100644
--- 
a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
+++ 
b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -185,7 +185,8 @@ public abstract class ScalarPanelSelect2Abstract extends 
ScalarPanelAbstract2 {
             final int paramNumToPossiblyUpdate,
             final AjaxRequestTarget target) {
 
-        final Can<ManagedObject> arguments = 
actionModel.getArgumentsAsImmutable();
+        final Can<ManagedObject> arguments = 
actionModel.getArgumentsAsParamModel()
+                .getParamValues();
 
         val repaint = super.updateIfNecessary(actionModel, paramNumUpdated, 
paramNumToPossiblyUpdate, target);
 

Reply via email to