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);