You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/05/07 15:05:27 UTC

[isis] branch master updated: ISIS-2340: refactor reusable logic into common UI model

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 073179b  ISIS-2340: refactor reusable logic into common UI model
073179b is described below

commit 073179ba4d8c03bad4be8a2005ea1bc6c85caae5
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 7 17:05:11 2020 +0200

    ISIS-2340: refactor reusable logic into common UI model
---
 .../common/model/feature/FeatureUiModel.java       |  14 ---
 .../common/model/feature/ParameterUiModel.java     |  50 +++++++--
 .../common/model/feature/PropertyUiModel.java      |  37 ++++++-
 .../viewer/common/model/feature/ScalarUiModel.java |  72 +++++++++++++
 .../viewer/wicket/model/models/ActionModel.java    |   2 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  61 ++---------
 .../wicket/model/models/ScalarParameterModel.java  | 112 ++-------------------
 .../wicket/model/models/ScalarPropertyModel.java   |  91 +----------------
 .../components/scalars/ScalarPanelAbstract2.java   |   7 ++
 .../scalars/ScalarPanelSelect2Abstract.java        |  26 ++---
 .../scalars/reference/ReferencePanel.java          |  19 ++--
 .../valuechoices/ValueChoicesSelect2Panel.java     |  10 +-
 ...derForReferenceParamOrPropertyAutoComplete.java |  46 +++++----
 13 files changed, 231 insertions(+), 316 deletions(-)

diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/FeatureUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/FeatureUiModel.java
deleted file mode 100644
index 3fefd2c..0000000
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/FeatureUiModel.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.apache.isis.viewer.common.model.feature;
-
-import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
-
-public interface FeatureUiModel {
-
-    ObjectFeature getMetaModel();
-    
-    /** property name */
-    default String getName() {
-        return getMetaModel().getName();
-    }
-    
-}
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java
index 3e85c6d..a46d6fe 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java
@@ -18,11 +18,14 @@
  */
 package org.apache.isis.viewer.common.model.feature;
 
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
 import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
+import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModelHead;
 
-public interface ParameterUiModel extends FeatureUiModel {
+public interface ParameterUiModel extends ScalarUiModel {
 
     /** param meta model */
     @Override
@@ -34,7 +37,15 @@ public interface ParameterUiModel extends FeatureUiModel {
     /** param value */
     void setValue(ManagedObject paramValue);
     
+    /** actions's owner */
+    ManagedObject getOwner();
+    
     String getCssClass();
+    
+    // -- PENDING PARAMETER MODEL
+
+    PendingParameterModel getPendingParameterModel();
+    void setPendingParameterModel(PendingParameterModel pendingArgs);
 
     // -- SHORTCUTS
     
@@ -43,15 +54,40 @@ public interface ParameterUiModel extends FeatureUiModel {
         return getMetaModel().getNumber();
     }
     
-    /** param name */
-    default String getName() {
-        return getMetaModel().getName();
+    @Override
+    default int getAutoCompleteMinLength() {
+        return hasAutoComplete() ? getMetaModel().getAutoCompleteMinLength() : 0;
+    }
+    
+    @Override
+    default boolean hasChoices() {
+        return getMetaModel().hasChoices();
+    }
+    
+    @Override
+    default boolean hasAutoComplete() {
+        return getMetaModel().hasAutoComplete();
+    }
+    
+    @Override
+    default ManagedObject getDefault() {
+        return getMetaModel().getDefault(getPendingParameterModel());
+    }
+    
+    @Override
+    default Can<ManagedObject> getChoices() {
+        return getMetaModel().getChoices(getPendingParameterModel(), InteractionInitiatedBy.USER);
     }
 
-    // -- DEPRECATIONS
+    @Override
+    default Can<ManagedObject> getAutoComplete(final String searchArg) {
+        return getMetaModel().getAutoComplete(getPendingParameterModel(), searchArg, InteractionInitiatedBy.USER);
+    }
+
+    default PendingParameterModelHead getPendingParamHead() {
+        return getMetaModel().getAction().newPendingParameterModelHead(getOwner());
+    }
     
-    // transient storage
-    void setActionArgsHint(PendingParameterModel pendingArgs);
 
 
 }
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java
index e3311a6..1c1554d 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java
@@ -18,12 +18,47 @@
  */
 package org.apache.isis.viewer.common.model.feature;
 
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 
-public interface PropertyUiModel extends FeatureUiModel {
+public interface PropertyUiModel extends ScalarUiModel {
 
     /** prop meta model */
     @Override
     OneToOneAssociation getMetaModel();
+    
+    // -- SHORTCUTS
+    
+    @Override
+    default int getAutoCompleteMinLength() {
+        return hasAutoComplete() ? getMetaModel().getAutoCompleteMinLength() : 0;
+    }
+    
+    @Override
+    default boolean hasChoices() {
+        return getMetaModel().hasChoices();
+    }
+
+    @Override
+    default boolean hasAutoComplete() {
+        return getMetaModel().hasAutoComplete();
+    }
+    
+    @Override
+    default ManagedObject getDefault() {
+        return getMetaModel().getDefault(getOwner());
+    }
+
+    @Override
+    default Can<ManagedObject> getChoices() { 
+        return getMetaModel().getChoices(getOwner(), InteractionInitiatedBy.USER);
+    }
 
+    @Override
+    default Can<ManagedObject> getAutoComplete(final String searchArg) {
+        return getMetaModel().getAutoComplete(getOwner(), searchArg, InteractionInitiatedBy.USER);
+    }
+    
 }
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
new file mode 100644
index 0000000..3ab8608
--- /dev/null
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ScalarUiModel.java
@@ -0,0 +1,72 @@
+package org.apache.isis.viewer.common.model.feature;
+
+import java.math.BigDecimal;
+
+import org.apache.isis.core.commons.collections.Can;
+import org.apache.isis.core.metamodel.facetapi.FeatureType;
+import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
+import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
+import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
+import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsProvider;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.feature.ObjectFeature;
+
+public interface ScalarUiModel {
+
+    ObjectFeature getMetaModel();
+    
+    /** action's or property's owner */
+    ManagedObject getOwner();
+    
+    /** feature name */
+    default String getName() {
+        return getMetaModel().getName();
+    }
+    
+    default boolean isCollection() {
+        return getMetaModel().getFeatureType() == FeatureType.ACTION_PARAMETER_COLLECTION
+                || getMetaModel().getFeatureType() == FeatureType.COLLECTION;
+    }
+    
+    default String getDescribedAs() {
+        return getMetaModel().getDescription();
+    }
+    
+    /**
+     * for {@link BigDecimal}s only.
+     *
+     * @see #getLength()
+     */
+    default Integer getLength() {
+        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
+        return facet != null? facet.getPrecision(): null;
+    }
+
+    /**
+     * for {@link BigDecimal}s only.
+     *
+     * @see #getScale()
+     */
+    default Integer getScale() {
+        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
+        return facet != null? facet.getScale(): null;
+    }
+
+    default int getTypicalLength() {
+        final TypicalLengthFacet facet = getMetaModel().getFacet(TypicalLengthFacet.class);
+        return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
+    }
+
+    default String getFileAccept() {
+        final FileAcceptFacet facet = getMetaModel().getFacet(FileAcceptFacet.class);
+        return facet != null? facet.value(): null;
+    }
+   
+    int getAutoCompleteMinLength();
+    boolean hasChoices();
+    boolean hasAutoComplete();
+    ManagedObject getDefault();
+    Can<ManagedObject> getChoices();
+    Can<ManagedObject> getAutoComplete(final String searchArg);
+    
+}
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 7a61149..44f79ce 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
@@ -476,7 +476,7 @@ implements FormExecutorContext {
         .streamActionArgumentModels()
         .map(actionArgumentModel->{
 
-            actionArgumentModel.setActionArgsHint(pendingArgs);
+            actionArgumentModel.setPendingParameterModel(pendingArgs);
 
             val objectActionParamter = actionArgumentModel.getMetaModel();
 
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 d6fd8b9..be9298a 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
@@ -18,14 +18,12 @@
  */
 package org.apache.isis.viewer.wicket.model.models;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.base._Casts;
 import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.commons.internal.collections._Lists;
@@ -41,9 +39,8 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 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.OneToOneAssociation;
-import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
-import org.apache.isis.viewer.common.model.feature.FeatureUiModel;
+import org.apache.isis.viewer.common.model.feature.ScalarUiModel;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.LinksProvider;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
@@ -52,7 +49,6 @@ import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
 import lombok.NonNull;
 import lombok.val;
 
-
 /**
  * Represents a scalar of an entity, either a {@link Kind#PROPERTY property} or
  * a {@link Kind#PARAMETER parameter}.
@@ -72,7 +68,7 @@ import lombok.val;
  * </p>
  */
 public abstract class ScalarModel extends EntityModel 
-implements FeatureUiModel, LinksProvider, FormExecutorContext {
+implements ScalarUiModel, LinksProvider, FormExecutorContext {
 
     private static final long serialVersionUID = 1L;
 
@@ -135,7 +131,15 @@ implements FeatureUiModel, LinksProvider, FormExecutorContext {
         return parentEntityModel;
     }
 
-
+    private transient ManagedObject owner;
+    @Override
+    public ManagedObject getOwner() {
+        if(owner==null) {
+            owner = getParentUiModel().load(); 
+        }
+        return owner;  
+    }
+    
 
     protected static void setObjectFromPropertyIfVisible(
             final ScalarModel scalarModel,
@@ -157,8 +161,6 @@ implements FeatureUiModel, LinksProvider, FormExecutorContext {
         scalarModel.setObject(associatedAdapter);
     }
 
-    public abstract boolean isCollection();
-
     /**
      * Whether the scalar represents a {@link Kind#PROPERTY property} or a
      * {@link Kind#PARAMETER}.
@@ -271,30 +273,6 @@ implements FeatureUiModel, LinksProvider, FormExecutorContext {
 
     public abstract <T extends Facet> T getFacet(Class<T> facetType);
 
-    public abstract String getDescribedAs();
-
-    public abstract String getFileAccept();
-
-    public abstract boolean hasChoices();
-    public abstract Can<ManagedObject> getChoices(PendingParameterModel pendingArgs);
-
-    public abstract boolean hasAutoComplete();
-    public abstract Can<ManagedObject> getAutoComplete(PendingParameterModel pendingArgs, String searchTerm);
-
-    /**
-     * for {@link BigDecimal}s only.
-     *
-     * @see #getScale()
-     */
-    public abstract Integer getLength();
-
-    /**
-     * for {@link BigDecimal}s only.
-     *
-     * @see #getLength()
-     */
-    public abstract Integer getScale();
-
     /**
      * Additional links to render (if any)
      */
@@ -359,8 +337,6 @@ implements FeatureUiModel, LinksProvider, FormExecutorContext {
         };
     }
 
-
-
     @Override
     public PromptStyle getPromptStyle() {
         final PromptStyleFacet facet = getFacet(PromptStyleFacet.class);
@@ -388,17 +364,12 @@ implements FeatureUiModel, LinksProvider, FormExecutorContext {
     }
 
 
-
-
-
     @Override
     protected void onDetach() {
         clearPending();
         super.onDetach();
     }
 
-
-
     // //////////////////////////////////////
 
     //    @Override
@@ -502,16 +473,6 @@ implements FeatureUiModel, LinksProvider, FormExecutorContext {
 
     protected abstract String parseAndValidate(String proposedPojoAsStr);
 
-    protected abstract int getTypicalLength();
-
-    public abstract int getAutoCompleteOrChoicesMinLength();
-
-    public abstract ManagedObject getDefault(PendingParameterModel pendingArgs);
-
-    public int getAutoCompleteMinLength() {
-        return getAutoCompleteOrChoicesMinLength();
-    }
-
     public AssociatedActions getAssociatedActions() {
         if (associatedActions == null) {
             associatedActions = new AssociatedActions(calcAssociatedActions());
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java
index 5155117..818e132 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarParameterModel.java
@@ -22,51 +22,40 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsProvider;
 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 org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
-import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModelHead;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
 import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 
 import lombok.Getter;
-import lombok.NonNull;
 import lombok.Setter;
-import lombok.val;
 
 public class ScalarParameterModel extends ScalarModel
 implements ParameterUiModel {
 
     private static final long serialVersionUID = 1L;
     
-    private final ActionParameterMemento parameterMemento;
-    /**
-     * The initial call of choicesXxx() for any given scalar argument needs the current values
-     * of all args (possibly as initialized through a defaultNXxx().
-     * @implNote transient because only temporary hint.
-     */
-    @Getter @Setter
-    private transient PendingParameterModel actionArgsHint;
+    private final ActionParameterMemento paramMemento;
+    
+    @Getter(onMethod = @__(@Override)) 
+    @Setter(onMethod = @__(@Override))
+    private transient PendingParameterModel pendingParameterModel;
 
     /**
      * Creates a model representing an action parameter of an action of a parent
      * object, with the {@link #getObject() value of this model} to be default
      * value (if any) of that action parameter.
      */
-    public ScalarParameterModel(EntityModel parentEntityModel, ActionParameterMemento apm) {
-        super(parentEntityModel, apm);
-        this.parameterMemento = apm;
+    public ScalarParameterModel(EntityModel parentEntityModel, ActionParameterMemento paramMemento) {
+        super(parentEntityModel, paramMemento);
+        this.paramMemento = paramMemento;
     }
     
     private transient ObjectActionParameter actionParameter;
@@ -74,14 +63,14 @@ implements ParameterUiModel {
     @Override
     public ObjectActionParameter getMetaModel() {
         if(actionParameter==null) {
-            actionParameter = parameterMemento.getActionParameter(getSpecificationLoader()); 
+            actionParameter = paramMemento.getActionParameter(getSpecificationLoader()); 
         }
         return actionParameter;  
     }
 
     @Override
     public ObjectSpecification getScalarTypeSpec() {
-        return parameterMemento.getSpecification(getSpecificationLoader());
+        return paramMemento.getSpecification(getSpecificationLoader());
     }
 
     @Override
@@ -153,76 +142,8 @@ implements ParameterUiModel {
     public <T extends Facet> T getFacet(final Class<T> facetType) {
         return getMetaModel().getFacet(facetType);
     }
-
-    @Override
-    public ManagedObject getDefault(
-            @NonNull final PendingParameterModel pendingArgs) {
-        
-        return getMetaModel().getDefault(pendingArgs);
-    }
-
-    @Override
-    public boolean hasChoices() {
-        return getMetaModel().hasChoices();
-    }
-    @Override
-    public Can<ManagedObject> getChoices(
-            @NonNull final PendingParameterModel pendingArgs) {
-        return getMetaModel().getChoices(pendingArgs, InteractionInitiatedBy.USER);
-    }
-
-    @Override
-    public boolean hasAutoComplete() {
-        return getMetaModel().hasAutoComplete();
-    }
-    @Override
-    public Can<ManagedObject> getAutoComplete(
-            @NonNull final PendingParameterModel pendingArgs,
-            final String searchArg) {
-        
-        return getMetaModel().getAutoComplete(pendingArgs, searchArg, InteractionInitiatedBy.USER);
-    }
     
     @Override
-    public int getAutoCompleteOrChoicesMinLength() {
-        if (hasAutoComplete()) {
-            return getMetaModel().getAutoCompleteMinLength();
-        } else {
-            return 0;
-        }
-    }
-
-    @Override
-    public String getDescribedAs() {
-        return getMetaModel().getDescription();
-    }
-
-    @Override
-    public Integer getLength() {
-        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
-        return facet != null? facet.getPrecision(): null;
-    }
-
-    @Override
-    public Integer getScale() {
-        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
-        return facet != null? facet.getScale(): null;
-    }
-
-    @Override
-    public int getTypicalLength() {
-        final TypicalLengthFacet facet = getMetaModel().getFacet(TypicalLengthFacet.class);
-        return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
-    }
-
-
-    @Override
-    public String getFileAccept() {
-        final FileAcceptFacet facet = getMetaModel().getFacet(FileAcceptFacet.class);
-        return facet != null? facet.value(): null;
-    }
-
-    @Override
     public ManagedObject load() {
         final ManagedObject objectAdapter = loadFromSuper();
 
@@ -250,25 +171,14 @@ implements ParameterUiModel {
     }
 
     @Override
-    public boolean isCollection() {
-        return getMetaModel().getFeatureType() == FeatureType.ACTION_PARAMETER_COLLECTION;
-    }
-
-    @Override
     public String toStringOf() {
-        return getName() + ": " + parameterMemento.toString();
+        return getName() + ": " + paramMemento.toString();
     }
     
     @Override
     protected List<ObjectAction> calcAssociatedActions() {
         return Collections.emptyList();
     }
-    
-    public PendingParameterModelHead getPendingParamHead() {
-        val actionParameter = getMetaModel();
-        val actionOwner = getParentUiModel().load();
-        return actionParameter.getAction().newPendingParameterModelHead(actionOwner);
-    }
 
     @Override
     public ManagedObject getValue() {
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java
index 976257c..60b1676 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarPropertyModel.java
@@ -21,23 +21,17 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.util.List;
 
 import org.apache.isis.applib.annotation.Where;
-import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.metamodel.consent.Consent;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
-import org.apache.isis.core.metamodel.facets.objectvalue.typicallen.TypicalLengthFacet;
-import org.apache.isis.core.metamodel.facets.value.bigdecimal.BigDecimalValueFacet;
-import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsProvider;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ManagedObjects;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
 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.OneToOneAssociation;
-import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
 import org.apache.isis.viewer.common.model.feature.PropertyUiModel;
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
@@ -96,10 +90,7 @@ implements PropertyUiModel {
         return property;  
     }
 
-    @Override
-    public String getName() {
-        return getMetaModel().getName();
-    }
+        
 
     @Override
     public ObjectSpecification getScalarTypeSpec() {
@@ -188,84 +179,6 @@ implements PropertyUiModel {
         return getMetaModel().getFacet(facetType);
     }
 
-    @Override
-    public ManagedObject getDefault(
-            final PendingParameterModel pendingArgs /*not used*/) {
-        val parentAdapter = getParentUiModel().load();
-        return getMetaModel().getDefault(parentAdapter);
-    }
-
-    @Override
-    public boolean hasChoices() {
-        return getMetaModel().hasChoices();
-    }
-
-    @Override
-    public Can<ManagedObject> getChoices(
-            final PendingParameterModel pendingArgs /*not used on properties*/) { 
-
-        val parentAdapter = getParentUiModel().load();
-        return getMetaModel().getChoices(
-                parentAdapter,
-                InteractionInitiatedBy.USER);
-    }
-
-    @Override
-    public boolean hasAutoComplete() {
-        return getMetaModel().hasAutoComplete();
-    }
-
-    @Override
-    public Can<ManagedObject> getAutoComplete(
-            final PendingParameterModel pendingArgs, /*not used on properties*/
-            final String searchArg) {
-
-        val parentAdapter = getParentUiModel().load();
-        return getMetaModel().getAutoComplete(
-                        parentAdapter, 
-                        searchArg,
-                        InteractionInitiatedBy.USER);
-    }
-
-    @Override
-    public int getAutoCompleteOrChoicesMinLength() {
-
-        if (hasAutoComplete()) {
-            return getMetaModel().getAutoCompleteMinLength();
-        } else {
-            return 0;
-        }
-    }
-
-    @Override
-    public String getDescribedAs() {
-        return getMetaModel().getDescription();
-    }
-
-    @Override
-    public Integer getLength() {
-        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
-        return facet != null? facet.getPrecision(): null;
-    }
-
-    @Override
-    public Integer getScale() {
-        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
-        return facet != null? facet.getScale(): null;
-    }
-
-    @Override
-    public int getTypicalLength() {
-        final TypicalLengthFacet facet = getMetaModel().getFacet(TypicalLengthFacet.class);
-        return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
-    }
-
-    @Override
-    public String getFileAccept() {
-        final FileAcceptFacet facet = getMetaModel().getFacet(FileAcceptFacet.class);
-        return facet != null? facet.value(): null;
-    }
-
     public void reset() {
         val parentAdapter = getParentUiModel().load();
         setObjectFromPropertyIfVisible(this, getMetaModel(), parentAdapter);
@@ -340,5 +253,7 @@ implements PropertyUiModel {
         val parentAdapter = getParentUiModel().load();
         return ObjectAction.Util.findForAssociation(parentAdapter, getMetaModel());
     }
+
+
     
 }
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 085d47a..78c75d8 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
@@ -37,6 +37,7 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.markup.html.form.LabeledWebMarkupContainer;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.model.Model;
+import org.wicketstuff.select2.ChoiceProvider;
 
 import org.apache.isis.applib.annotation.ActionLayout;
 import org.apache.isis.applib.annotation.PromptStyle;
@@ -50,6 +51,7 @@ import org.apache.isis.core.metamodel.facets.objectvalue.labelat.LabelAtFacet;
 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.webapp.context.memento.ObjectMemento;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.models.ActionModel.ActionArgumentModelAndConsents;
 import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
@@ -919,6 +921,11 @@ implements ScalarModelSubscriber2 {
         target.add(this);
     }
 
+    protected ChoiceProvider<ObjectMemento> buildChoiceProvider() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
 
 
 
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 72ce315..93f41ab 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
@@ -33,11 +33,9 @@ import org.apache.wicket.validation.IValidator;
 import org.apache.wicket.validation.ValidationError;
 import org.wicketstuff.select2.ChoiceProvider;
 
-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.models.ActionModel.ActionArgumentModelAndConsents;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.bootstrap.FormGroup;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.Select2;
 import org.apache.isis.viewer.wicket.ui.components.widgets.select2.providers.ObjectAdapterMementoProviderAbstract;
@@ -60,10 +58,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
 
     protected Select2 createSelect2(final String id) {
         final Select2 select2 = Select2.createSelect2(id, scalarModel);
-        setProviderAndCurrAndPending(select2, 
-                (scalarModel instanceof ScalarParameterModel)
-                    ? ((ScalarParameterModel)scalarModel).getActionArgsHint()
-                    : null);
+        setProviderAndCurrAndPending(select2);
         select2.setRequired(scalarModel.isRequired());
         return select2;
     }
@@ -119,10 +114,9 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
      * sets up the choices, also ensuring that any currently held value is compatible.
      */
     private void setProviderAndCurrAndPending(
-            final Select2 select2, 
-            final PendingParameterModel pendingArgs) {
+            final Select2 select2) {
 
-        final ChoiceProvider<ObjectMemento> choiceProvider = buildChoiceProvider(pendingArgs);
+        final ChoiceProvider<ObjectMemento> choiceProvider = buildChoiceProvider();
 
         select2.setProvider(choiceProvider);
         getModel().clearPending();
@@ -137,12 +131,12 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
     }
 
     /**
-     * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, List<ManagedObject>)})
+     * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2)})
      */
-    protected abstract ChoiceProvider<ObjectMemento> buildChoiceProvider(PendingParameterModel pendingArgs);
+    protected abstract ChoiceProvider<ObjectMemento> buildChoiceProvider();
 
     /**
-     * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2, List<ManagedObject>)})
+     * Mandatory hook (is called by {@link #setProviderAndCurrAndPending(Select2)})
      */
     protected abstract void syncIfNull(Select2 select2);
 
@@ -187,8 +181,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
             @NonNull final Optional<AjaxRequestTarget> target) {
 
         val repaint = super.updateIfNecessary(argsAndConsents, target);
-
-        final boolean choicesUpdated = updateChoices(argsAndConsents.getPendingArgs());
+        final boolean choicesUpdated = updateChoices();
 
         if (repaint == Repaint.NOTHING) {
             if (choicesUpdated) {
@@ -201,12 +194,11 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
         }
     }
 
-    private boolean updateChoices(final PendingParameterModel pendingArgs) {
+    private boolean updateChoices() {
         if (select2 == null) {
             return false;
         }
-        setProviderAndCurrAndPending(select2, pendingArgs);
-
+        setProviderAndCurrAndPending(select2);
         return true;
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 3104547..eadec6a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -35,7 +35,6 @@ import org.wicketstuff.select2.Settings;
 
 import org.apache.isis.core.metamodel.facets.object.autocomplete.AutoCompleteFacet;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-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.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModelForReference;
@@ -337,22 +336,20 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
     // //////////////////////////////////////
 
     @Override
-    protected ChoiceProvider<ObjectMemento> buildChoiceProvider(
-            final PendingParameterModel pendingArgs) {
+    protected ChoiceProvider<ObjectMemento> buildChoiceProvider() {
         
         val commonContext = super.getCommonContext();
         
-        if (getModel().hasChoices()) {
-            val choices = getModel().getChoices(pendingArgs);
+        val scalarModel = getModel();
+        
+        if (scalarModel.hasChoices()) {
+            val choices = scalarModel.getChoices();
             val choiceMementos = choices.map(commonContext::mementoForParameter);
-            return new ObjectAdapterMementoProviderForReferenceChoices(getModel(), choiceMementos);
+            return new ObjectAdapterMementoProviderForReferenceChoices(scalarModel, choiceMementos);
         }
 
-        if(getModel().hasAutoComplete()) {
-            val autoCompleteMementos = pendingArgs.getParamValues()
-                    .map(commonContext::mementoForParameter);
-            return new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(
-                    getModel(), autoCompleteMementos);
+        if(scalarModel.hasAutoComplete()) {
+            return new ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(scalarModel);
         }
 
         return new ObjectAdapterMementoProviderForReferenceObjectAutoComplete(getModel());
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
index 0307ae0..2d3c63f 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/valuechoices/ValueChoicesSelect2Panel.java
@@ -31,7 +31,6 @@ import org.wicketstuff.select2.ChoiceProvider;
 
 import org.apache.isis.core.commons.collections.Can;
 import org.apache.isis.core.commons.internal.base._Strings;
-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.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelSelect2Abstract;
@@ -73,11 +72,11 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
     }
 
 
-    private Can<ObjectMemento> getChoiceMementos(final PendingParameterModel pendingArgs) {
+    private Can<ObjectMemento> getChoiceMementos() {
         
         val commonContext = super.getCommonContext();
         
-        val choices = scalarModel.getChoices(pendingArgs);
+        val choices = scalarModel.getChoices();
 
         return choices.map(commonContext::mementoFor);
     }
@@ -163,9 +162,8 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
     // in corresponding code in ReferencePanelFactory, these is a branch for different types of providers
     // (choice vs autoComplete).  Here though - because values don't currently support autoComplete - no branch is required
     @Override
-    protected ChoiceProvider<ObjectMemento> buildChoiceProvider(
-            final PendingParameterModel pendingArgs) {
-        final Can<ObjectMemento> choicesMementos = getChoiceMementos(pendingArgs);
+    protected ChoiceProvider<ObjectMemento> buildChoiceProvider() {
+        final Can<ObjectMemento> choicesMementos = getChoiceMementos();
         return new ObjectAdapterMementoProviderForValueChoices(scalarModel, choicesMementos);
     }
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
index f816748..982e7b5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete.java
@@ -23,10 +23,9 @@ import org.apache.isis.core.commons.internal.base._NullSafe;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.specloader.specimpl.PendingParameterModel;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
+import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
-import org.apache.isis.viewer.wicket.model.models.ScalarParameterModel;
 
-import lombok.NonNull;
 import lombok.val;
 
 public class ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete
@@ -34,43 +33,50 @@ extends ObjectAdapterMementoProviderAbstract {
 
     private static final long serialVersionUID = 1L;
     
-    private final Can<ObjectMemento> dependentArgMementos;
+    private final Can<ObjectMemento> pendingArgMementos;
 
-    public ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(
-            @NonNull ScalarModel model,
-            @NonNull Can<ObjectMemento> dependentArgMementos) { 
+    public ObjectAdapterMementoProviderForReferenceParamOrPropertyAutoComplete(ScalarModel scalarModel) {
+        super(scalarModel);
+        val commonContext = scalarModel.getCommonContext();
+        val pendingArgs = scalarModel.isParameter() 
+                ? ((ParameterUiModel)scalarModel).getPendingParameterModel().getParamValues()
+                : Can.<ManagedObject>empty();
+        val pendingArgMementos = pendingArgs
+                .map(commonContext::mementoForParameter);
         
-        super(model);
-        this.dependentArgMementos = dependentArgMementos;
+        this.pendingArgMementos = pendingArgMementos;
     }
 
     @Override
     protected Can<ObjectMemento> obtainMementos(String term) {
         
-        val parameterModel = (ScalarParameterModel)getScalarModel();
+        val scalarModel = getScalarModel();
         
-        if (parameterModel.hasAutoComplete()) {
+        if (scalarModel.hasAutoComplete()) {
         
-            val commonContext = super.getCommonContext();
+            if(scalarModel.isParameter()) {
+                // recover any pendingArgs
+                val paramModel = (ParameterUiModel)scalarModel;
+                val pendingArgs = reconstructPendingArgs(paramModel, pendingArgMementos);
+                paramModel.setPendingParameterModel(pendingArgs);
+            }
             
-            // recover any pendingArgs
-            val pendingArgs = reconstructDependentArgs(parameterModel, dependentArgMementos); 
-            return parameterModel
-                    .getAutoComplete(pendingArgs, term)
+            val commonContext = super.getCommonContext();
+            return scalarModel
+                    .getAutoComplete(term)
                     .map(commonContext::mementoFor);
-            
         }
         
         return Can.empty();
         
     }
     
-    private PendingParameterModel reconstructDependentArgs(
-            final ScalarParameterModel parameterModel, 
-            final Can<ObjectMemento> dependentArgMementos) {
+    private PendingParameterModel reconstructPendingArgs(
+            final ParameterUiModel parameterModel, 
+            final Can<ObjectMemento> pendingArgMementos) {
         
         val commonContext = super.getCommonContext();
-        val pendingArgsList = _NullSafe.stream(dependentArgMementos)
+        val pendingArgsList = _NullSafe.stream(pendingArgMementos)
             .map(commonContext::reconstructObject)
             .map(ManagedObject.class::cast)
             .collect(Can.toCan());