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 12:47:08 UTC

[isis] branch master updated: ISIS-2340: introduces a common PropertyUiModel

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 abd703a  ISIS-2340: introduces a common PropertyUiModel
abd703a is described below

commit abd703a8126737df41ab9ab05c8f706774ae7f62
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu May 7 14:46:52 2020 +0200

    ISIS-2340: introduces a common PropertyUiModel
---
 .../pdfjs/ui/components/PdfJsViewerPanel.java      |  21 ++--
 .../common/model/feature/FeatureUiModel.java       |  14 +++
 .../ParameterUiModel.java}                         |  10 +-
 .../PropertyUiModel.java}                          |  34 +-----
 .../wicket/model/models/ActionArgumentCache.java   |  14 +--
 .../viewer/wicket/model/models/ActionModel.java    |  19 ++-
 .../wicket/model/models/InlinePromptContext.java   |  26 +---
 .../viewer/wicket/model/models/ScalarModel.java    |   5 +-
 .../wicket/model/models/ScalarParameterModel.java  |   9 +-
 .../wicket/model/models/ScalarPropertyModel.java   | 131 +++++++++------------
 .../components/actions/ActionParametersForm.java   |   4 +-
 .../ui/components/property/PropertyEditPanel.java  |  32 ++---
 .../PropertyEditPromptHeaderPanel.java             |   7 +-
 13 files changed, 141 insertions(+), 185 deletions(-)

diff --git a/extensions/vw/pdfjs/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/ui/components/PdfJsViewerPanel.java b/extensions/vw/pdfjs/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/ui/components/PdfJsViewerPanel.java
index 7fc2c9b..9860305 100644
--- a/extensions/vw/pdfjs/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/ui/components/PdfJsViewerPanel.java
+++ b/extensions/vw/pdfjs/ui/src/main/java/org/apache/isis/extensions/viewer/wicket/pdfjs/ui/components/PdfJsViewerPanel.java
@@ -113,8 +113,9 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
         // so we have a callback URL
 
 
-        updatePageNum = new AbstractDefaultAjaxBehavior()
-        {
+        updatePageNum = new AbstractDefaultAjaxBehavior() {
+            private static final long serialVersionUID = 1L;
+            
             @Override
             protected void respond(AjaxRequestTarget _target)
             {
@@ -136,8 +137,9 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
             }
         };
 
-        updateScale = new AbstractDefaultAjaxBehavior()
-        {
+        updateScale = new AbstractDefaultAjaxBehavior() {
+            private static final long serialVersionUID = 1L;
+
             @Override
             protected void respond(AjaxRequestTarget _target)
             {
@@ -160,8 +162,9 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
             }
         };
 
-        updateHeight = new AbstractDefaultAjaxBehavior()
-        {
+        updateHeight = new AbstractDefaultAjaxBehavior() {
+            private static final long serialVersionUID = 1L;
+
             @Override
             protected void respond(AjaxRequestTarget _target)
             {
@@ -204,7 +207,7 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
         String userName = userService.getUser().getName();
 
         val model = getModel();
-        val propertyId = model.getPropertyMemento().getIdentifier();
+        val propertyId = model.getIdentifier();
         val bookmark = model.getParentUiModel().getObjectAdapterMemento().asBookmarkIfSupported();
         val objectType = bookmark.getObjectType();
         val identifier = bookmark.getIdentifier();
@@ -288,6 +291,8 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
 
     private MarkupContainer createComponent(final String id, final PdfJsConfig config) {
         return new WebMarkupContainer(id) {
+            private static final long serialVersionUID = 1L;
+
             @Override
             protected void onComponentTag(final ComponentTag tag) {
                 super.onComponentTag(tag);
@@ -330,6 +335,8 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
         if (pdfBlob != null) {
             final byte[] bytes = pdfBlob.getBytes();
             final ByteArrayResource resource = new ByteArrayResource("application/pdf", bytes) {
+                private static final long serialVersionUID = 1L;
+
                 @Override protected void configureResponse(
                         final ResourceResponse response, final Attributes attributes) {
                     super.configureResponse(response, attributes);
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
new file mode 100644
index 0000000..3fefd2c
--- /dev/null
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/FeatureUiModel.java
@@ -0,0 +1,14 @@
+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/action/form/ActionParameterUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java
similarity index 86%
copy from viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/form/ActionParameterUiModel.java
copy to viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java
index 7ce0f9a..3e85c6d 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/form/ActionParameterUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/ParameterUiModel.java
@@ -16,15 +16,16 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.common.model.action.form;
+package org.apache.isis.viewer.common.model.feature;
 
 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;
 
-public interface ActionParameterUiModel {
+public interface ParameterUiModel extends FeatureUiModel {
 
     /** param meta model */
+    @Override
     ObjectActionParameter getMetaModel();
     
     /** param value */
@@ -41,6 +42,11 @@ public interface ActionParameterUiModel {
     default int getNumber() {
         return getMetaModel().getNumber();
     }
+    
+    /** param name */
+    default String getName() {
+        return getMetaModel().getName();
+    }
 
     // -- DEPRECATIONS
     
diff --git a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/form/ActionParameterUiModel.java b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java
similarity index 51%
rename from viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/form/ActionParameterUiModel.java
rename to viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java
index 7ce0f9a..e3311a6 100644
--- a/viewers/common/src/main/java/org/apache/isis/viewer/common/model/action/form/ActionParameterUiModel.java
+++ b/viewers/common/src/main/java/org/apache/isis/viewer/common/model/feature/PropertyUiModel.java
@@ -16,36 +16,14 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.viewer.common.model.action.form;
+package org.apache.isis.viewer.common.model.feature;
 
-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.spec.feature.OneToOneAssociation;
 
-public interface ActionParameterUiModel {
-
-    /** param meta model */
-    ObjectActionParameter getMetaModel();
-    
-    /** param value */
-    ManagedObject getValue();
-    
-    /** param value */
-    void setValue(ManagedObject paramValue);
-    
-    String getCssClass();
-
-    // -- SHORTCUTS
-    
-    /** param index */
-    default int getNumber() {
-        return getMetaModel().getNumber();
-    }
-
-    // -- DEPRECATIONS
-    
-    // transient storage
-    void setActionArgsHint(PendingParameterModel pendingArgs);
+public interface PropertyUiModel extends FeatureUiModel {
 
+    /** prop meta model */
+    @Override
+    OneToOneAssociation getMetaModel();
 
 }
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
index e4f7040..fc09325 100644
--- 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
@@ -29,8 +29,8 @@ 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.common.model.action.form.ActionParameterUiModel;
 import org.apache.isis.viewer.common.model.action.form.PendingParameterManager;
+import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 
@@ -45,7 +45,7 @@ class ActionArgumentCache implements PendingParameterManager {
     @NonNull private final ActionMemento actionMemento;
     @NonNull private final ObjectAction action;
 
-    private final Map<Integer, ActionParameterUiModel> arguments = _Maps.newHashMap();
+    private final Map<Integer, ParameterUiModel> arguments = _Maps.newHashMap();
     
     public ActionArgumentCache copy() {
         val copy = new ActionArgumentCache(
@@ -67,7 +67,7 @@ class ActionArgumentCache implements PendingParameterManager {
         .mapToObj(paramIndex->{
             val actionArgumentModel = Optional.ofNullable(arguments.get(paramIndex));
             val adapter = actionArgumentModel
-                    .map(ActionParameterUiModel::getValue)
+                    .map(ParameterUiModel::getValue)
                     .orElse(ManagedObject.empty(paramTypes.getElseFail(paramIndex)));
             return adapter;
         
@@ -87,7 +87,7 @@ class ActionArgumentCache implements PendingParameterManager {
         });
     }
     
-    public Stream<ActionParameterUiModel> streamActionArgumentModels() {
+    public Stream<ParameterUiModel> streamActionArgumentModels() {
         return streamParamNumbers()
                 .mapToObj(paramIndex->
                     arguments.computeIfAbsent(paramIndex, this::createArgumentModel));
@@ -112,7 +112,7 @@ class ActionArgumentCache implements PendingParameterManager {
         return IntStream.range(0, paramCount);
     }
 
-    private ActionParameterUiModel createArgumentModel(int paramIndex) {
+    private ParameterUiModel createArgumentModel(int paramIndex) {
         val param = action.getParameters().getElseFail(paramIndex);
         val paramMemento =  new ActionParameterMemento(param);
         val actionArgumentModel = new ScalarParameterModel(entityModel, paramMemento);
@@ -125,9 +125,9 @@ class ActionArgumentCache implements PendingParameterManager {
                 (int)streamActionArgumentModels().count());
     }
     
-    private ActionParameterUiModel computeIfAbsent(final ActionParameterMemento apm) {
+    private ParameterUiModel computeIfAbsent(final ActionParameterMemento apm) {
         final int i = apm.getNumber();
-        ActionParameterUiModel actionArgumentModel = arguments.get(i);
+        ParameterUiModel actionArgumentModel = arguments.get(i);
         if (actionArgumentModel == null) {
             actionArgumentModel = new ScalarParameterModel(entityModel, apm);
             final int number = actionArgumentModel.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 482aac2..7a61149 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
@@ -58,7 +58,7 @@ 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.IsisWebAppCommonContext;
-import org.apache.isis.viewer.common.model.action.form.ActionParameterUiModel;
+import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
 
 import lombok.Value;
@@ -92,9 +92,7 @@ implements FormExecutorContext {
     }
   
 
-    //////////////////////////////////////////////////
-    // BookmarkableModel
-    //////////////////////////////////////////////////
+    // -- BOOKMARKABLE
 
     @Override
     public PageParameters getPageParametersWithoutUiHints() {
@@ -108,6 +106,7 @@ implements FormExecutorContext {
         return getPageParametersWithoutUiHints();
     }
 
+    // --
 
     @Override
     public String getTitle() {
@@ -129,6 +128,11 @@ implements FormExecutorContext {
     public boolean hasAsRootPolicy() {
         return true;
     }
+    
+    @Override
+    public EntityModel getParentUiModel() {
+        return entityModel;
+    }
 
     // -- HELPERS
 
@@ -163,11 +167,6 @@ implements FormExecutorContext {
         this.actionMemento = actionMemento;
     }
 
-    @Override
-    public EntityModel getParentUiModel() {
-        return entityModel;
-    }
-
     /**
      * Copy constructor, as called by {@link #copy()}.
      */
@@ -461,7 +460,7 @@ implements FormExecutorContext {
     @Value(staticConstructor = "of")
     public static class ActionArgumentModelAndConsents {
         final PendingParameterModel pendingArgs;
-        final ActionParameterUiModel paramModel;
+        final ParameterUiModel paramModel;
         final Consent visibilityConsent;
         final Consent usabilityConsent;
     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/InlinePromptContext.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/InlinePromptContext.java
index 872ab3b..cf19a27 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/InlinePromptContext.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/InlinePromptContext.java
@@ -24,6 +24,11 @@ import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.markup.html.WebMarkupContainer;
 
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+@Getter
+@RequiredArgsConstructor
 public class InlinePromptContext implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -32,29 +37,10 @@ public class InlinePromptContext implements Serializable {
     private final WebMarkupContainer scalarIfRegularInlinePromptForm;
     private final MarkupContainer scalarTypeContainer;
 
-    public InlinePromptContext(
-            final Component scalarIfRegular,
-            final WebMarkupContainer scalarIfRegularInlinePromptForm,
-            final MarkupContainer scalarTypeContainer) {
-        this.scalarIfRegular = scalarIfRegular;
-        this.scalarIfRegularInlinePromptForm = scalarIfRegularInlinePromptForm;
-        this.scalarTypeContainer = scalarTypeContainer;
-    }
-
-    public Component getScalarIfRegular() {
-        return scalarIfRegular;
-    }
-
-    public WebMarkupContainer getScalarIfRegularInlinePromptForm() {
-        return scalarIfRegularInlinePromptForm;
-    }
-
     public void onCancel() {
         scalarIfRegular.setVisible(true);
         scalarIfRegularInlinePromptForm.setVisible(false);
     }
 
-    public MarkupContainer getScalarTypeContainer() {
-        return scalarTypeContainer;
-    }
+
 }
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 0a0f8b1..d6fd8b9 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
@@ -43,6 +43,7 @@ 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.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.LinksProvider;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
@@ -71,7 +72,7 @@ import lombok.val;
  * </p>
  */
 public abstract class ScalarModel extends EntityModel 
-implements LinksProvider, FormExecutorContext {
+implements FeatureUiModel, LinksProvider, FormExecutorContext {
 
     private static final long serialVersionUID = 1L;
 
@@ -166,8 +167,6 @@ implements LinksProvider, FormExecutorContext {
         return kind;
     }
 
-    public abstract String getName();
-
     /**
      * Overrides superclass' implementation, because a {@link ScalarModel} can
      * know the {@link ObjectSpecification of} the {@link ManagedObject adapter}
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 63aaaa1..5155117 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
@@ -37,7 +37,7 @@ 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.action.form.ActionParameterUiModel;
+import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 
 import lombok.Getter;
@@ -46,7 +46,7 @@ import lombok.Setter;
 import lombok.val;
 
 public class ScalarParameterModel extends ScalarModel
-implements ActionParameterUiModel {
+implements ParameterUiModel {
 
     private static final long serialVersionUID = 1L;
     
@@ -80,11 +80,6 @@ implements ActionParameterUiModel {
     }
 
     @Override
-    public String getName() {
-        return getMetaModel().getName();
-    }
-
-    @Override
     public ObjectSpecification getScalarTypeSpec() {
         return parameterMemento.getSpecification(getSpecificationLoader());
     }
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 43b68a4..976257c 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
@@ -25,7 +25,6 @@ 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.facetapi.FacetHolder;
 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;
@@ -40,16 +39,18 @@ 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;
 
-import lombok.Getter;
 import lombok.val;
 
-public class ScalarPropertyModel extends ScalarModel {
+public class ScalarPropertyModel 
+extends ScalarModel 
+implements PropertyUiModel {
     
     private static final long serialVersionUID = 1L;
     
-    @Getter private final PropertyMemento propertyMemento;
+    private final PropertyMemento propertyMemento;
 
     /**
      * Creates a model representing a property of a parent object, with the
@@ -68,6 +69,16 @@ public class ScalarPropertyModel extends ScalarModel {
         getAndStore(parentEntityModel);
     }
     
+    public ScalarPropertyModel copyHaving(
+            EntityModel.Mode mode, 
+            EntityModel.RenderingHint renderingHint) {
+        return new ScalarPropertyModel(
+                getParentUiModel(), 
+                propertyMemento,
+                mode,
+                renderingHint);
+    }
+    
     private void getAndStore(final EntityModel parentEntityModel) {
         final ObjectMemento parentAdapterMemento = parentEntityModel.getObjectAdapterMemento();
         final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
@@ -75,21 +86,30 @@ public class ScalarPropertyModel extends ScalarModel {
         setObjectFromPropertyIfVisible(ScalarPropertyModel.this, property, parentAdapter);
     }
     
+    private transient OneToOneAssociation property;
+    
+    @Override
+    public OneToOneAssociation getMetaModel() {
+        if(property==null) {
+            property = propertyMemento.getProperty(getSpecificationLoader()); 
+        }
+        return property;  
+    }
 
     @Override
     public String getName() {
-        return getPropertyMemento().getProperty(getSpecificationLoader()).getName();
+        return getMetaModel().getName();
     }
 
     @Override
     public ObjectSpecification getScalarTypeSpec() {
-        ObjectSpecId type = getPropertyMemento().getType();
+        ObjectSpecId type = propertyMemento.getType();
         return getSpecificationLoader().lookupBySpecIdElseLoad(type);
     }
 
     @Override
     public String getIdentifier() {
-        return getPropertyMemento().getIdentifier();
+        return propertyMemento.getIdentifier();
     }
 
     @Override
@@ -103,9 +123,8 @@ public class ScalarPropertyModel extends ScalarModel {
     @Override
     public boolean whetherHidden(final Where where) {
         final ManagedObject parentAdapter = getParentUiModel().load();
-        final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader());
         try {
-            final Consent visibility = property.isVisible(parentAdapter, InteractionInitiatedBy.USER, where);
+            final Consent visibility = getMetaModel().isVisible(parentAdapter, InteractionInitiatedBy.USER, where);
             return visibility.isVetoed();
         } catch (final Exception ex) {
             return true; // will be hidden
@@ -115,9 +134,8 @@ public class ScalarPropertyModel extends ScalarModel {
     @Override
     public String whetherDisabled(final Where where) {
         final ManagedObject parentAdapter = getParentUiModel().load();
-        final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader());
         try {
-            final Consent usable = property.isUsable(parentAdapter, InteractionInitiatedBy.USER, where);
+            final Consent usable = getMetaModel().isUsable(parentAdapter, InteractionInitiatedBy.USER, where);
             return usable.isAllowed() ? null : usable.getReason();
         } catch (final Exception ex) {
             return ex.getLocalizedMessage();
@@ -126,7 +144,7 @@ public class ScalarPropertyModel extends ScalarModel {
 
     @Override
     public String parseAndValidate(final String proposedPojoAsStr) {
-        final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader());
+        final OneToOneAssociation property = getMetaModel();
         ParseableFacet parseableFacet = property.getFacet(ParseableFacet.class);
         if (parseableFacet == null) {
             parseableFacet = property.getSpecification().getFacet(ParseableFacet.class);
@@ -151,9 +169,8 @@ public class ScalarPropertyModel extends ScalarModel {
     @Override
     public String validate(final ManagedObject proposedAdapter) {
         final ManagedObject parentAdapter = getParentUiModel().load();
-        final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader());
         try {
-            final Consent valid = property.isAssociationValid(parentAdapter, proposedAdapter,
+            final Consent valid = getMetaModel().isAssociationValid(parentAdapter, proposedAdapter,
                     InteractionInitiatedBy.USER);
             return valid.isAllowed() ? null : valid.getReason();
         } catch (final Exception ex) {
@@ -163,54 +180,39 @@ public class ScalarPropertyModel extends ScalarModel {
 
     @Override
     public boolean isRequired() {
-        final FacetHolder facetHolder = getPropertyMemento().getProperty(getSpecificationLoader());
-        return isRequired(facetHolder);
+        return isRequired(getMetaModel());
     }
 
     @Override
     public <T extends Facet> T getFacet(final Class<T> facetType) {
-        final FacetHolder facetHolder = getPropertyMemento().getProperty(getSpecificationLoader());
-        return facetHolder.getFacet(facetType);
+        return getMetaModel().getFacet(facetType);
     }
 
     @Override
     public ManagedObject getDefault(
             final PendingParameterModel pendingArgs /*not used*/) {
-
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento
-                .getProperty(getSpecificationLoader());
-        ManagedObject parentAdapter = getParentUiModel().load();
-        return property.getDefault(parentAdapter);
+        val parentAdapter = getParentUiModel().load();
+        return getMetaModel().getDefault(parentAdapter);
     }
 
     @Override
     public boolean hasChoices() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        return property.hasChoices();
+        return getMetaModel().hasChoices();
     }
 
     @Override
     public Can<ManagedObject> getChoices(
             final PendingParameterModel pendingArgs /*not used on properties*/) { 
 
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento
-                .getProperty(getSpecificationLoader());
-        ManagedObject parentAdapter = getParentUiModel().load();
-        final Can<ManagedObject> choices = property.getChoices(
+        val parentAdapter = getParentUiModel().load();
+        return getMetaModel().getChoices(
                 parentAdapter,
                 InteractionInitiatedBy.USER);
-
-        return choices;
     }
 
     @Override
     public boolean hasAutoComplete() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        return property.hasAutoComplete();
+        return getMetaModel().hasAutoComplete();
     }
 
     @Override
@@ -218,25 +220,18 @@ public class ScalarPropertyModel extends ScalarModel {
             final PendingParameterModel pendingArgs, /*not used on properties*/
             final String searchArg) {
 
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        final ManagedObject parentAdapter =
-                getParentUiModel().load();
-        final Can<ManagedObject> choices =
-                property.getAutoComplete(
+        val parentAdapter = getParentUiModel().load();
+        return getMetaModel().getAutoComplete(
                         parentAdapter, 
                         searchArg,
                         InteractionInitiatedBy.USER);
-        return choices;
     }
 
     @Override
     public int getAutoCompleteOrChoicesMinLength() {
 
         if (hasAutoComplete()) {
-            final PropertyMemento propertyMemento = getPropertyMemento();
-            final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-            return property.getAutoCompleteMinLength();
+            return getMetaModel().getAutoCompleteMinLength();
         } else {
             return 0;
         }
@@ -244,49 +239,36 @@ public class ScalarPropertyModel extends ScalarModel {
 
     @Override
     public String getDescribedAs() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        return property.getDescription();
+        return getMetaModel().getDescription();
     }
 
     @Override
     public Integer getLength() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        final BigDecimalValueFacet facet = property.getFacet(BigDecimalValueFacet.class);
+        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
         return facet != null? facet.getPrecision(): null;
     }
 
     @Override
     public Integer getScale() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        final BigDecimalValueFacet facet = property.getFacet(BigDecimalValueFacet.class);
+        final BigDecimalValueFacet facet = getMetaModel().getFacet(BigDecimalValueFacet.class);
         return facet != null? facet.getScale(): null;
     }
 
     @Override
     public int getTypicalLength() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        final TypicalLengthFacet facet = property.getFacet(TypicalLengthFacet.class);
+        final TypicalLengthFacet facet = getMetaModel().getFacet(TypicalLengthFacet.class);
         return facet != null? facet.value() : StringValueSemanticsProvider.TYPICAL_LENGTH;
     }
 
     @Override
     public String getFileAccept() {
-        final PropertyMemento propertyMemento = getPropertyMemento();
-        final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        final FileAcceptFacet facet = property.getFacet(FileAcceptFacet.class);
+        final FileAcceptFacet facet = getMetaModel().getFacet(FileAcceptFacet.class);
         return facet != null? facet.value(): null;
     }
 
     public void reset() {
-        final OneToOneAssociation property = getPropertyMemento().getProperty(getSpecificationLoader());
-
         val parentAdapter = getParentUiModel().load();
-
-        setObjectFromPropertyIfVisible(this, property, parentAdapter);
+        setObjectFromPropertyIfVisible(this, getMetaModel(), parentAdapter);
     }
 
     @Override
@@ -301,14 +283,13 @@ public class ScalarPropertyModel extends ScalarModel {
 
     @Override
     public String toStringOf() {
-        return getName() + ": " + getPropertyMemento().toString();
+        return getName() + ": " + propertyMemento.toString();
     }
     
     public String getReasonInvalidIfAny() {
-        val property = getPropertyMemento().getProperty(getSpecificationLoader());
         val adapter = getParentUiModel().load();
         val associate = getObject();
-        Consent validity = property.isAssociationValid(adapter, associate, InteractionInitiatedBy.USER);
+        Consent validity = getMetaModel().isAssociationValid(adapter, associate, InteractionInitiatedBy.USER);
         return validity.isAllowed() ? null : validity.getReason();
     }
     
@@ -318,7 +299,7 @@ public class ScalarPropertyModel extends ScalarModel {
      * @return adapter, which may be different from the original (if a {@link ViewModelFacet#isCloneable(Object) cloneable} view model, for example.
      */
     public ManagedObject applyValue(ManagedObject adapter) {
-        val property = getPropertyMemento().getProperty(getSpecificationLoader());
+        val property = getMetaModel();
 
         //
         // previously there was a guard here to only apply changes provided:
@@ -356,14 +337,8 @@ public class ScalarPropertyModel extends ScalarModel {
     
     @Override
     protected List<ObjectAction> calcAssociatedActions() {
-
-        final EntityModel parentEntityModel1 = this.getParentUiModel();
-        final ManagedObject parentAdapter = parentEntityModel1.load();
-
-        final OneToOneAssociation oneToOneAssociation =
-                this.getPropertyMemento().getProperty(this.getSpecificationLoader());
-
-        return ObjectAction.Util.findForAssociation(parentAdapter, oneToOneAssociation);
+        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/actions/ActionParametersForm.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersForm.java
index 13104d7..bf71ee2 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
@@ -30,9 +30,9 @@ import org.apache.wicket.markup.repeater.RepeatingView;
 
 import org.apache.isis.core.commons.internal.base._Strings;
 import org.apache.isis.core.commons.internal.exceptions._Exceptions;
-import org.apache.isis.viewer.common.model.action.form.ActionParameterUiModel;
 import org.apache.isis.viewer.common.model.decorator.confirm.ConfirmUiModel;
 import org.apache.isis.viewer.common.model.decorator.confirm.ConfirmUiModel.Placement;
+import org.apache.isis.viewer.common.model.feature.ParameterUiModel;
 import org.apache.isis.viewer.wicket.model.hints.IsisActionCompletedEvent;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
@@ -152,7 +152,7 @@ class ActionParametersForm extends PromptFormAbstract<ActionModel> {
     public void onUpdate(final AjaxRequestTarget target, final ScalarPanelAbstract2 scalarPanelUpdated) {
 
         val actionModel = getActionModel();
-        val paramModel = (ActionParameterUiModel)scalarPanelUpdated.getModel();
+        val paramModel = (ParameterUiModel)scalarPanelUpdated.getModel();
         final int paramNumberUpdated = paramModel.getNumber();
         // only updates subsequent parameter panels starting from (paramNumberUpdated + 1)
         final int skipCount = paramNumberUpdated + 1;   
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
index e93f2ac..3920af5 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/property/PropertyEditPanel.java
@@ -24,7 +24,6 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.Model;
 
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
@@ -32,6 +31,8 @@ import org.apache.isis.viewer.wicket.ui.ComponentType;
 import org.apache.isis.viewer.wicket.ui.components.actions.ActionParametersPanel;
 import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
 
+import lombok.val;
+
 /**
  * Corresponding component to prompt for action (parameters) is {@link ActionParametersPanel}.
  */
@@ -51,8 +52,10 @@ public class PropertyEditPanel extends PanelAbstract<ScalarPropertyModel> {
     public PropertyEditPanel(
             final String id,
             final ScalarPropertyModel scalarModel) {
-        super(id, new ScalarPropertyModel(scalarModel.getParentUiModel(), scalarModel.getPropertyMemento(),
-                EntityModel.Mode.EDIT, EntityModel.RenderingHint.REGULAR));
+        
+        super(id, scalarModel.copyHaving(
+                EntityModel.Mode.EDIT, 
+                EntityModel.RenderingHint.REGULAR));
 
         buildGui(scalarModel);
     }
@@ -81,22 +84,19 @@ public class PropertyEditPanel extends PanelAbstract<ScalarPropertyModel> {
 
         WebMarkupContainer header = addHeader();
 
-        {
-            getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.PROPERTY_EDIT_FORM, getScalarModel());
-            getComponentFactoryRegistry().addOrReplaceComponent(header, ComponentType.ENTITY_ICON_AND_TITLE, scalarModel.getParentUiModel());
-
-            final OneToOneAssociation property = getScalarModel().getPropertyMemento().getProperty(scalarModel.getSpecificationLoader());
-            final String propertyName = property.getName();
-            final Label label = new Label(ID_PROPERTY_NAME, Model.of(propertyName));
+        getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.PROPERTY_EDIT_FORM, getScalarModel());
+        getComponentFactoryRegistry().addOrReplaceComponent(header, ComponentType.ENTITY_ICON_AND_TITLE, scalarModel.getParentUiModel());
 
-            NamedFacet namedFacet = property.getFacet(NamedFacet.class);
-            if (namedFacet != null) {
-                label.setEscapeModelStrings(namedFacet.escaped());
-            }
-
-            header.add(label);
+        val property = getScalarModel().getMetaModel();
+        val propertyName = property.getName();
+        val label = new Label(ID_PROPERTY_NAME, Model.of(propertyName));
 
+        val namedFacet = property.getFacet(NamedFacet.class);
+        if (namedFacet != null) {
+            label.setEscapeModelStrings(namedFacet.escaped());
         }
+
+        header.add(label);
     }
 
     private WebMarkupContainer addHeader() {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
index e7e6768..3042a93 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/propertyheader/PropertyEditPromptHeaderPanel.java
@@ -22,7 +22,6 @@ import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
-import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.ScalarPropertyModel;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -50,12 +49,10 @@ public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarPropertyM
 
             @Override
             public String getObject() {
-                final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
-                return property.getName();
+                return model.getName();
             }
         });
-        final OneToOneAssociation property = model.getPropertyMemento().getProperty(getSpecificationLoader());
-        final NamedFacet namedFacet = property.getFacet(NamedFacet.class);
+        val namedFacet = model.getMetaModel().getFacet(NamedFacet.class);
         if(namedFacet != null) {
             label.setEscapeModelStrings(namedFacet.escaped());
         }