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/15 05:27:37 UTC

[isis] 02/02: ISIS-2340: some model hierarchy cleanup

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

commit ebef5029b87ecb8ff10b95312aa3140e6e3f8820
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 15 07:27:19 2020 +0200

    ISIS-2340: some model hierarchy cleanup
---
 .../pdfjs/ui/components/PdfJsViewerPanel.java      |   2 +-
 .../viewer/wicket/model/models/ActionModel.java    |  12 +-
 .../wicket/model/models/BookmarkedPagesModel.java  |  13 +-
 .../wicket/model/models/EntityCollectionModel.java |   6 +-
 .../viewer/wicket/model/models/EntityModel.java    | 132 +--------------------
 .../model/models/HintPageParameterSerializer.java  |  30 +----
 .../wicket/model/models/ManagedObjectModel.java    |  73 +++++++-----
 .../viewer/wicket/model/models/ScalarModel.java    |  11 +-
 .../model/models/ScalarModelWithMultiPending.java  |   4 +-
 .../model/models/ScalarModelWithPending.java       |   2 +-
 .../entityactions/EntityActionLinkFactory.java     |   2 +-
 .../ui/components/collection/CollectionPanel.java  |   2 +-
 .../selector/CollectionSelectorHelper.java         |   9 +-
 .../selector/CollectionSelectorPanel.java          |   4 +-
 .../columns/ObjectAdapterToggleboxColumn.java      |   2 +-
 .../entity/EntityComponentFactoryAbstract.java     |   2 +-
 .../components/entity/fieldset/PropertyGroup.java  |   4 +-
 .../components/layout/bs3/tabs/TabGroupPanel.java  |   4 +-
 .../PropertyEditPromptHeaderPanel.java             |   2 +-
 .../ui/components/scalars/ScalarPanelAbstract.java |   2 +-
 .../components/scalars/ScalarPanelAbstract2.java   |   2 +-
 .../valuechoices/ValueChoicesSelect2Panel.java     |   2 +-
 .../widgets/breadcrumbs/BreadcrumbModel.java       |   2 +-
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |   4 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   4 +-
 25 files changed, 99 insertions(+), 233 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 9860305..14d7ce5 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
@@ -208,7 +208,7 @@ class PdfJsViewerPanel extends ScalarPanelAbstract<ScalarPropertyModel> implemen
 
         val model = getModel();
         val propertyId = model.getIdentifier();
-        val bookmark = model.getParentUiModel().getObjectAdapterMemento().asBookmarkIfSupported();
+        val bookmark = model.getParentUiModel().asBookmarkIfSupported();
         val objectType = bookmark.getObjectType();
         val identifier = bookmark.getIdentifier();
 
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 d7ca6a7..193473a 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
@@ -123,12 +123,12 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel<ManagedObject> {
     
     @Override
     public EntityModel getParentUiModel() {
-        return entityModel;
+        return ownerModel;
     }
 
     // -- HELPERS
 
-    private final EntityModel entityModel;
+    private final EntityModel ownerModel;
     private final ActionMemento actionMemento;
 
     // lazy in support of serialization of this class
@@ -140,14 +140,14 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel<ManagedObject> {
     }
     private ActionArgumentCache createActionArgumentCache() {
         return new ActionArgumentCache(
-                entityModel, 
+                ownerModel, 
                 actionMemento, 
                 getMetaModel());
     }
 
     private ActionModel(EntityModel entityModel, ActionMemento actionMemento) {
         super(entityModel.getCommonContext());
-        this.entityModel = entityModel;
+        this.ownerModel = entityModel;
         this.actionMemento = actionMemento;
     }
 
@@ -156,14 +156,14 @@ implements FormUiModel, FormExecutorContext, BookmarkableModel<ManagedObject> {
      */
     private ActionModel(ActionModel actionModel) {
         super(actionModel.getCommonContext());
-        this.entityModel = actionModel.entityModel;
+        this.ownerModel = actionModel.ownerModel;
         this.actionMemento = actionModel.actionMemento;
         this.argCache = actionModel.argCache().copy(); 
     }
 
     @Override
     public ManagedObject getOwner() {
-        return entityModel.load();
+        return ownerModel.load();
     }
 
     @Override
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkedPagesModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkedPagesModel.java
index 0f6af9e..2c2c7d7 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkedPagesModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkedPagesModel.java
@@ -30,6 +30,8 @@ import org.apache.isis.core.commons.internal.collections._Lists;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 
+import lombok.val;
+
 
 public class BookmarkedPagesModel extends ModelAbstract<List<BookmarkTreeNode>> {
 
@@ -128,15 +130,8 @@ public class BookmarkedPagesModel extends ModelAbstract<List<BookmarkTreeNode>>
     }
 
     public void remove(EntityModel entityModel) {
-        BookmarkTreeNode rootNode = null;
-        for (BookmarkTreeNode eachNode : rootNodes) {
-            if(eachNode.getOidNoVerStr().equals((entityModel).getObjectAdapterMemento().toString())) {
-                rootNode = eachNode;
-            }
-        }
-        if(rootNode != null) {
-            rootNodes.remove(rootNode);
-        }
+        val str = entityModel.oidStringIfSupported();
+        rootNodes.removeIf(node->node.getOidNoVerStr().equals(str));
     }
 
 
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 6230008..d281e23 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -358,7 +358,7 @@ implements LinksProvider, UiHintContainer {
 
     private static OneToManyAssociation collectionFor(EntityModel entityModel) {
 
-        final ObjectMemento parentObjectAdapterMemento = entityModel.getObjectAdapterMemento();
+        final ObjectMemento parentObjectAdapterMemento = entityModel.memento();
         final CollectionLayoutData collectionLayoutData = entityModel.getCollectionLayoutData();
         final SpecificationLoader specificationLoader = entityModel.getSpecificationLoader();
 
@@ -456,13 +456,15 @@ implements LinksProvider, UiHintContainer {
     /**
      * Populated only if {@link Variant#PARENTED}.
      */
+    @Deprecated // don't expose this implementation detail
     public ObjectMemento getParentObjectAdapterMemento() {
-        return entityModel != null? entityModel.getObjectAdapterMemento(): null;
+        return entityModel != null? entityModel.memento(): null;
     }
 
     /**
      * Populated only if {@link Variant#PARENTED}.
      */
+    @Deprecated // don't expose this implementation detail
     public CollectionMemento getCollectionMemento() {
         return collectionMemento;
     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 75e9da6..20a0a09 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -21,7 +21,6 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import java.io.Serializable;
 import java.util.Map;
-import java.util.Optional;
 import java.util.stream.Collectors;
 
 import javax.annotation.Nullable;
@@ -97,7 +96,6 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
 
     private final Map<PropertyMemento, ScalarModel> propertyScalarModels;
     
-    private ObjectMemento adapterMemento;
     private ObjectMemento contextAdapterIfAny;
 
     private Mode mode;
@@ -166,8 +164,7 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
             Mode mode,
             RenderingHint renderingHint) {
         
-        super(requires(commonContext, "commonContext"));
-        this.adapterMemento = adapterMemento;
+        super(requires(commonContext, "commonContext"), adapterMemento);
         this.pendingModel = new PendingModel(this);
         this.propertyScalarModels = propertyScalarModels!=null ? propertyScalarModels : _Maps.<PropertyMemento, ScalarModel>newHashMap();
         this.mode = mode;
@@ -213,7 +210,7 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
     public String getHint(final Component component, final String keyName) {
         final ComponentHintKey componentHintKey = ComponentHintKey.create(super.getCommonContext(), component, keyName);
         if(componentHintKey != null) {
-            return componentHintKey.get(getObjectAdapterMemento().asHintingBookmarkIfSupported());
+            return componentHintKey.get(super.asHintingBookmarkIfSupported());
         }
         return null;
     }
@@ -221,7 +218,7 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
     @Override
     public void setHint(Component component, String keyName, String hintValue) {
         ComponentHintKey componentHintKey = ComponentHintKey.create(super.getCommonContext(), component, keyName);
-        componentHintKey.set(this.getObjectAdapterMemento().asHintingBookmarkIfSupported(), hintValue);
+        componentHintKey.set(super.asHintingBookmarkIfSupported(), hintValue);
     }
 
     @Override
@@ -236,87 +233,6 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
     }
 
     @Override
-    public boolean hasAsRootPolicy() {
-        return hasBookmarkPolicy(BookmarkPolicy.AS_ROOT);
-    }
-
-    public boolean hasAsChildPolicy() {
-        return hasBookmarkPolicy(BookmarkPolicy.AS_CHILD);
-    }
-
-    private boolean hasBookmarkPolicy(final BookmarkPolicy policy) {
-        final BookmarkPolicyFacet facet = getBookmarkPolicyFacetIfAny();
-        return facet != null && facet.value() == policy;
-    }
-
-    private BookmarkPolicyFacet getBookmarkPolicyFacetIfAny() {
-        final ObjectSpecId specId = getObjectAdapterMemento().getObjectSpecId();
-        final ObjectSpecification objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId);
-        return objectSpec.getFacet(BookmarkPolicyFacet.class);
-    }
-
-
-
-    // //////////////////////////////////////////////////////////
-    // ObjectAdapterMemento, typeOfSpecification
-    // //////////////////////////////////////////////////////////
-
-    public ObjectMemento getObjectAdapterMemento() {
-        return adapterMemento;
-    }
-
-    /**
-     * Overridable for submodels (eg {@link ScalarModel}) that know the type of
-     * the adapter without there being one.
-     */
-    @Override
-    public ObjectSpecification getTypeOfSpecification() {
-        return getTypeOfSpecificationId()
-                .map(this::getSpecificationFor)
-                .orElse(null);
-    }
-    
-    /**
-     * @implNote free of side-effects, used for serialization
-     */
-    public Optional<ObjectSpecId> getTypeOfSpecificationId() {
-        return Optional.ofNullable(adapterMemento)
-                .map(ObjectMemento::getObjectSpecId);
-    }
-
-    private ObjectSpecification getSpecificationFor(ObjectSpecId objectSpecId) {
-        return super.getSpecificationLoader().lookupBySpecIdElseLoad(objectSpecId);
-    }
-
-    // //////////////////////////////////////////////////////////
-    // loadObject, load, setObject
-    // //////////////////////////////////////////////////////////
-
-    /**
-     * Callback from {@link #getObject()}.
-     */
-    @Override
-    public ManagedObject load() {
-        if (adapterMemento == null) {
-            return null;
-        }
-        val adapter = super.getCommonContext().reconstructObject(adapterMemento);
-        return adapter;
-    }
-
-    @Override
-    public void setObject(ManagedObject adapter) {
-        super.setObject(adapter);
-        adapterMemento = super.getMementoService().mementoForObject(adapter); 
-    }
-
-    public void setObjectMemento(final ObjectMemento adapterMemento) {
-        val adapter = super.getCommonContext().reconstructObject(adapterMemento);
-        super.setObject(adapter);
-        this.adapterMemento = adapterMemento;
-    }
-
-    @Override
     public ManagedObject getManagedObject() {
         return getObject();
     }
@@ -461,8 +377,8 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
                 return pending;
             }
             
-            if(entityModel.getObjectAdapterMemento()!=null) {
-                return entityModel.getObjectAdapterMemento();
+            if(entityModel.memento()!=null) {
+                return entityModel.memento();
             }
             
             //XXX [a.huber] as I don't understand the big picture here, given newly introduced branch above,
@@ -546,42 +462,4 @@ implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel
     }
 
 
-    // //////////////////////////////////////////////////////////
-    // equals, hashCode
-    // //////////////////////////////////////////////////////////
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((adapterMemento == null) ? 0 : adapterMemento.hashCode());
-        return result;
-    }
-
-    /**
-     * In order that <tt>IsisAjaxFallbackDataTable</tt> can use a
-     * <tt>ReuseIfModelsEqualStrategy</tt> to preserve any concurrency exception
-     * information in original model.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        EntityModel other = (EntityModel) obj;
-        if (adapterMemento == null) {
-            if (other.adapterMemento != null)
-                return false;
-        } else if (!adapterMemento.equals(other.adapterMemento))
-            return false;
-        return true;
-
-    }
-
-
-
-
 }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/HintPageParameterSerializer.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/HintPageParameterSerializer.java
index e4e5281..6610283 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/HintPageParameterSerializer.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/HintPageParameterSerializer.java
@@ -42,7 +42,7 @@ class HintPageParameterSerializer implements Serializable {
             final EntityModel entityModel) {
         
         val hintStore = entityModel.getCommonContext().lookupServiceElseFail(HintStore.class);
-        val objectAdapterMemento = entityModel.getObjectAdapterMemento();
+        val objectAdapterMemento = entityModel.memento();
         hintStoreToPageParameters(pageParameters, objectAdapterMemento, hintStore);
     }
 
@@ -61,32 +61,4 @@ class HintPageParameterSerializer implements Serializable {
         }
     }
 
-//XXX not used
-//    private static void updateHintStoreUNUSED(
-//            final PageParameters pageParameters,
-//            final ObjectAdapterMemento objectAdapterMemento,
-//            final HintStore hintStore) {
-//        
-//        if(objectAdapterMemento == null) {
-//            return;
-//        }
-//        Set<String> namedKeys = pageParameters.getNamedKeys();
-//        if (namedKeys.contains("no-hints")) {
-//            hintStore.removeAll(objectAdapterMemento.asHintingBookmarkIfSupported());
-//            return;
-//        }
-//        List<ComponentHintKey> newComponentHintKeys = _Lists.newArrayList();
-//        for (String namedKey : namedKeys) {
-//            if (namedKey.startsWith(PREFIX)) {
-//                String value = pageParameters.get(namedKey).toString(null);
-//                String key = namedKey.substring(5);
-//                final ComponentHintKey componentHintKey = ComponentHintKey.create(key);
-//                newComponentHintKeys.add(componentHintKey);
-//                final Bookmark bookmark = objectAdapterMemento.asHintingBookmarkIfSupported();
-//                componentHintKey.set(bookmark, value);
-//            }
-//        }
-//    }
-
-
 }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
index 2b6cb54..6926687 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
@@ -26,6 +26,7 @@ import javax.annotation.Nullable;
 import org.apache.isis.applib.annotation.BookmarkPolicy;
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.core.commons.internal.base._Casts;
+import org.apache.isis.core.metamodel.facetapi.Facet;
 import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.metamodel.spec.ObjectSpecId;
@@ -91,32 +92,48 @@ extends ModelAbstract<ManagedObject> {
         }
     }
     
-    public Bookmark asHintingBookmarkIfSupported() {
+    public final Bookmark asHintingBookmarkIfSupported() {
         return memento!=null
                 ? memento.asHintingBookmarkIfSupported()
                 : null;
     }
 
-    public Bookmark asBookmarkIfSupported() {
+    public final Bookmark asBookmarkIfSupported() {
         return memento!=null
                 ? memento.asBookmarkIfSupported()
                 : null;
     }
     
-    public String oidStringIfSupported() {
+    public final String oidStringIfSupported() {
         return memento!=null
                 ? memento.toString()
                 : null;
     }
     
     /**
-     * @implNote free of side-effects, used for serialization
+     * free of side-effects, used for serialization
+     * @implNote overriding this must be consistent with {@link #getTypeOfSpecificationId()}
      */
     public Optional<ObjectSpecId> getTypeOfSpecificationId() {
         return Optional.ofNullable(memento)
                 .map(ObjectMemento::getObjectSpecId);
     }
     
+    private transient ObjectSpecification objectSpec;
+    /**
+     * @implNote can be overridden by sub-models (eg {@link ScalarModel}) that know the type of
+     * the adapter without there being one. Overriding this must be consistent 
+     * with {@link #getTypeOfSpecificationId()} 
+     */
+    public ObjectSpecification getTypeOfSpecification() {
+        if(objectSpec==null) {
+            val specId = getTypeOfSpecificationId().orElse(null);
+            objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId); 
+        }
+        return objectSpec;
+    }
+
+    
     public boolean hasAsRootPolicy() {
         return hasBookmarkPolicy(BookmarkPolicy.AS_ROOT);
     }
@@ -126,26 +143,33 @@ extends ModelAbstract<ManagedObject> {
     }
 
     private boolean hasBookmarkPolicy(final BookmarkPolicy policy) {
-        final BookmarkPolicyFacet facet = getBookmarkPolicyFacetIfAny();
-        return facet != null && facet.value() == policy;
+        return lookupFacet(BookmarkPolicyFacet.class)
+                .map(facet->facet.value() == policy)
+                .orElse(false);
     }
 
-    private BookmarkPolicyFacet getBookmarkPolicyFacetIfAny() {
-        final ObjectSpecId specId = getTypeOfSpecificationId().orElse(null);
-        final ObjectSpecification objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId);
-        return objectSpec.getFacet(BookmarkPolicyFacet.class);
+    private <T extends Facet> Optional<T> lookupFacet(Class<T> facetClass) {
+        return Optional.ofNullable(getTypeOfSpecification())
+                .map(objectSpec->objectSpec.getFacet(facetClass));
     }
     
+    // -- CONTRACT
     
-    private transient ObjectSpecification objectSpec; 
-    public ObjectSpecification getTypeOfSpecification() {
-        if(objectSpec==null) {
-            val specId = getTypeOfSpecificationId().orElse(null);
-            objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId); 
+    @Override
+    public final int hashCode() {
+        return Objects.hashCode(memento);
+    }
+
+    @Override
+    public final boolean equals(Object obj) {
+        if(obj instanceof ManagedObjectModel) {
+            val other = (ManagedObjectModel) obj;
+            return Objects.equals(this.memento, other.memento);
         }
-        return objectSpec;
+        return false;
     }
     
+    // -- DEPRECATIONS
     
     @Deprecated //TODO do not expose this implementation detail
     public ObjectMemento memento() {
@@ -154,22 +178,11 @@ extends ModelAbstract<ManagedObject> {
     
     @Deprecated //TODO do not expose this implementation detail
     public void memento(ObjectMemento memento) {
+        val manageObject = super.getCommonContext().reconstructObject(memento);
+        super.setObject(manageObject);
         this.memento = memento;
-    }
-    
-    
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(memento);
+        this.objectSpec = null; // invalidate
     }
 
-    @Override
-    public boolean equals(Object obj) {
-        if(obj instanceof ManagedObjectModel) {
-            val other = (ManagedObjectModel) obj;
-            return Objects.equals(this.memento, other.memento);
-        }
-        return false;
-    }
 
 }
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 f3d9475..6d0274e 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
@@ -21,6 +21,7 @@ package org.apache.isis.viewer.wicket.model.models;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
@@ -140,7 +141,7 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
     /**
      * Overrides superclass' implementation, because a {@link ScalarModel} can
      * know the {@link ObjectSpecification of} the {@link ManagedObject adapter}
-     * without there necessarily being any adapter being
+     * without there necessarily having any adapter 
      * {@link #setObject(ManagedObject) set}.
      */
     @Override
@@ -148,6 +149,12 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
         return getScalarTypeSpec();
     }
 
+    @Override
+    public Optional<ObjectSpecId> getTypeOfSpecificationId() {
+        return Optional.of(getScalarTypeSpec().getSpecId());
+    }
+    
+
     public boolean isScalarTypeAnyOf(final Class<?>... requiredClass) {
         final String fullName = getTypeOfSpecification().getFullIdentifier();
         return _NullSafe.stream(requiredClass)
@@ -186,7 +193,7 @@ implements ScalarUiModel, LinksProvider, FormExecutorContext {
             val memento = super.getMementoService()
                     .mementoForPojos(_Casts.uncheckedCast(pojo), getTypeOfSpecification().getSpecId());
                     
-            super.setObjectMemento(memento); // associated value
+            super.memento(memento); // associated value
         } else {
             super.setObject(adapter); // associated value
         }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
index 495fb04..2f4ac90 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
@@ -64,7 +64,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
                     log.debug("pending is null");
 
                     val scalarModel = owner.getScalarModel();
-                    val objectAdapterMemento = scalarModel.getObjectAdapterMemento();
+                    val objectAdapterMemento = scalarModel.memento();
                     return ObjectMemento.unwrapList(objectAdapterMemento)
                             .orElse(null);
                 }
@@ -83,7 +83,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
                         if (ownerPending != null) {
                             log.debug("setting to pending: {}", ownerPending.toString());
                             final ObjectSpecId objectSpecId = ownerScalarModel.getTypeOfSpecification().getSpecId();
-                            ownerScalarModel.setObjectMemento(
+                            ownerScalarModel.memento(
                                     ObjectMemento.wrapMementoList(adapterMemento, objectSpecId));
                         }
                     }
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index 2e1b001..686d785 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -59,7 +59,7 @@ public interface ScalarModelWithPending extends Serializable {
                     }
                     log.debug("pending is null");
 
-                    final ObjectMemento objectAdapterMemento = owner.getScalarModel().getObjectAdapterMemento();
+                    final ObjectMemento objectAdapterMemento = owner.getScalarModel().memento();
                     owner.setPending(objectAdapterMemento);
 
                     return objectAdapterMemento;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
index ad00d04..385f790 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionmenu/entityactions/EntityActionLinkFactory.java
@@ -46,7 +46,7 @@ public final class EntityActionLinkFactory extends LinkAndLabelFactoryAbstract {
             final ObjectAction objectAction, 
             final String named) {
 
-        val objectAdapter = this.targetEntityModel.load();
+        val objectAdapter = this.targetEntityModel.getManagedObject();
 
         val isIdentifiable = ManagedObject.isIdentifiable(objectAdapter);
         if (!isIdentifiable) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
index 03d8b41..25e0ebe 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/CollectionPanel.java
@@ -79,7 +79,7 @@ implements CollectionSelectorProvider, BulkActionsProvider {
 
         final OneToManyAssociation otma = collectionModel.getCollectionMemento().getCollection(collectionModel.getSpecificationLoader());
         final EntityModel entityModel = collectionModel.getEntityModel();
-        val adapter = entityModel.load();
+        val adapter = entityModel.getManagedObject();
 
         final List<ObjectAction> associatedActions =
                 ObjectAction.Util.findForAssociation(adapter, otma);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
index 85efe13..b363a2b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorHelper.java
@@ -65,7 +65,9 @@ public class CollectionSelectorHelper implements Serializable {
             final ComponentHintKey componentHintKey) {
         this.model = model;
         this.componentFactories = locateComponentFactories(componentFactoryRegistry);
-        this.componentHintKey = componentHintKey != null ? componentHintKey : ComponentHintKey.noop();
+        this.componentHintKey = componentHintKey != null 
+                ? componentHintKey 
+                : ComponentHintKey.noop();
     }
 
     private List<ComponentFactory> locateComponentFactories(ComponentFactoryRegistry componentFactoryRegistry) {
@@ -146,8 +148,7 @@ public class CollectionSelectorHelper implements Serializable {
     private Bookmark bookmarkHintIfAny() {
         final EntityModel entityModel = this.model.getEntityModel();
         return entityModel != null
-                ? entityModel.getObjectAdapterMemento().asHintingBookmarkIfSupported()
-                        : null;
+                ? entityModel.asHintingBookmarkIfSupported(): null;
     }
 
     private static List<ComponentFactory> ordered(List<ComponentFactory> componentFactories) {
@@ -231,7 +232,7 @@ public class CollectionSelectorHelper implements Serializable {
         final String fallback;
         fallback = entityCollectionModel.isParented()
                 ? CollectionContentsHiddenPanelFactory.NAME
-                        : CollectionContentsAsAjaxTablePanelFactory.NAME;
+                : CollectionContentsAsAjaxTablePanelFactory.NAME;
         componentFactory = doFind(fallback);
         if(componentFactory == null) {
             throw new IllegalStateException(String.format(
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
index 37a21d6..609cf8b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/selector/CollectionSelectorPanel.java
@@ -151,8 +151,8 @@ public class CollectionSelectorPanel extends PanelAbstract<EntityCollectionModel
                             final EntityCollectionModel entityCollectionModel = CollectionSelectorPanel.this.getModel();
                             final EntityModel entityModel = entityCollectionModel.getEntityModel();
                             return entityModel != null
-                                    ? entityModel.getObjectAdapterMemento().asHintingBookmarkIfSupported()
-                                            : null;
+                                    ? entityModel.asHintingBookmarkIfSupported()
+                                    : null;
                         }
 
                         @Override
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
index a4440c1..4804cd1 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/columns/ObjectAdapterToggleboxColumn.java
@@ -110,7 +110,7 @@ public final class ObjectAdapterToggleboxColumn extends ColumnAbstract<ManagedOb
             public void onSubmit(AjaxRequestTarget target) {
                 
                 val entityModel = (EntityModel) rowModel;
-                val selectedAdapter = entityModel.load();
+                val selectedAdapter = entityModel.getManagedObject();
                 
                 if(onSelectionHandler != null) {
                     onSelectionHandler.onSelected(this, selectedAdapter, target);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
index ebb59cd..8850bb7 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/EntityComponentFactoryAbstract.java
@@ -65,7 +65,7 @@ public abstract class EntityComponentFactoryAbstract extends ComponentFactoryAbs
         // is therefore not called. resulting in a concurrency exception.
         //
         // Therefore, we do the same processing here instead.
-        val adapter = entityModel.load();
+        val adapter = entityModel.getManagedObject();
         if (adapter == null) {
             // is ok;
         }
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
index 5642c5a..551021b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/fieldset/PropertyGroup.java
@@ -150,7 +150,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
         final List<PropertyLayoutData> properties = this.fieldSet.getProperties();
         // changed to NO_CHECK because more complex BS3 layouts trip concurrency exception
         // (haven't investigated as to why).
-        val adapter = getModel().load();
+        val adapter = getModel().getManagedObject();
         return getObjectAssociations(properties, adapter);
     }
 
@@ -204,7 +204,7 @@ public class PropertyGroup extends PanelAbstract<EntityModel> implements HasDyna
         final Component component = getComponentFactoryRegistry()
                 .addOrReplaceComponent(container, ID_PROPERTY, ComponentType.SCALAR_NAME_AND_VALUE, scalarModel);
 
-        val adapter = entityModel.load();
+        val adapter = entityModel.getManagedObject();
         final List<ObjectAction> associatedActions =
                 ObjectAction.Util.findForAssociation(adapter, otoa);
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
index 695ab24..4d3a55f 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/layout/bs3/tabs/TabGroupPanel.java
@@ -99,13 +99,13 @@ implements HasDynamicallyVisibleContent {
 
     @Override
     public TabbedPanel<ITab> setSelectedTab(final int index) {
-        selectedTabHintKey.set(entityModel.getObjectAdapterMemento().asHintingBookmarkIfSupported(), ""+index);
+        selectedTabHintKey.set(entityModel.asHintingBookmarkIfSupported(), ""+index);
         return super.setSelectedTab(index);
     }
 
     private void setSelectedTabFromSessionIfAny(
             final AjaxBootstrapTabbedPanel<ITab> ajaxBootstrapTabbedPanel) {
-        final String selectedTabStr = selectedTabHintKey.get(entityModel.getObjectAdapterMemento().asHintingBookmarkIfSupported());
+        final String selectedTabStr = selectedTabHintKey.get(entityModel.asHintingBookmarkIfSupported());
         final Integer tabIndex = parse(selectedTabStr);
         if (tabIndex != null) {
             final int numTabs = ajaxBootstrapTabbedPanel.getTabs().size();
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 3042a93..eabae87 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
@@ -37,7 +37,7 @@ public class PropertyEditPromptHeaderPanel extends PanelAbstract<ScalarPropertyM
     public PropertyEditPromptHeaderPanel(String id, final ScalarPropertyModel model) {
         super(id, model);
 
-        val targetAdapter = model.getParentUiModel().load();
+        val targetAdapter = model.getParentUiModel().getManagedObject();
 
         getComponentFactoryRegistry().addOrReplaceComponent(
                 this, 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
index 1408c23..a8b8b06 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelAbstract.java
@@ -269,7 +269,7 @@ implements ScalarModelProvider {
         ScalarModel model = getModel();
         final CssClassFacet facet = model.getFacet(CssClassFacet.class);
         if(facet != null) {
-            val parentAdapter = model.getParentUiModel().load();
+            val parentAdapter = model.getParentUiModel().getManagedObject();
             final String cssClass = facet.cssClass(parentAdapter);
             CssClassAppender.appendCssClassTo(this, cssClass);
         }
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 e1372b8..637d899 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
@@ -460,7 +460,7 @@ implements ScalarModelSubscriber2 {
         if(facet != null) {
 
             val parentAdapter =
-                    model.getParentUiModel().load();
+                    model.getParentUiModel().getManagedObject();
 
             final String cssClass = facet.cssClass(parentAdapter);
             CssClassAppender.appendCssClassTo(this, cssClass);
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 2d3c63f..5196042 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
@@ -169,7 +169,7 @@ public class ValueChoicesSelect2Panel extends ScalarPanelSelect2Abstract {
 
     @Override
     protected void syncIfNull(final Select2 select2) {
-        final ObjectMemento curr = getModel().getObjectAdapterMemento();
+        final ObjectMemento curr = getModel().memento();
 
         if(curr == null) {
             select2.getModel().setObject(null);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbModel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbModel.java
index 5b0a012..10631d3 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbModel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbModel.java
@@ -166,7 +166,7 @@ public class BreadcrumbModel implements Serializable {
     }
 
     protected Bookmark toBookmark(final EntityModel entityModel) {
-        return entityModel.getObjectAdapterMemento().asBookmarkIfSupported();
+        return entityModel.asBookmarkIfSupported();
     }
 
     protected EntityModel toEntityModel(final Bookmark bookmark) {
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
index 62925b1..e31f1ae 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
@@ -74,9 +74,7 @@ public class BreadcrumbPanel extends PanelAbstract<IModel<Void>> {
             }
 
             private String titleFor(final EntityModel model) {
-                return getCommonContext()
-                        .reconstructObject(model.getObjectAdapterMemento())
-                        .titleString(null);
+                return model.getManagedObject().titleString(null);
             }
 
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
index a78e541..c70bd0b 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorDefault.java
@@ -155,7 +155,7 @@ implements FormExecutor {
             }
 
             // update target, since version updated (concurrency checks)
-            targetAdapter = targetEntityModel.load();
+            targetAdapter = targetEntityModel.getManagedObject();
             if(!ManagedObject._isDestroyed(targetAdapter)) {
                 targetEntityModel.resetPropertyModels();
             }
@@ -183,7 +183,7 @@ implements FormExecutor {
                 // the OID might have changed if a view model.
                 if (resultAdapter != null && targetAdapter != resultAdapter) {
                     targetEntityModel.setObject(resultAdapter);
-                    targetAdapter = targetEntityModel.load();
+                    targetAdapter = targetEntityModel.getManagedObject();
                 }
                 if(!ManagedObject._isDestroyed(targetAdapter)) {
                     targetEntityModel.resetPropertyModels();