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:35 UTC

[isis] branch master updated (1f1b832 -> ebef502)

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 1f1b832  ISIS-2340: simplify ScalarPropertyModel (also fixes regression)
     new 7c6997d  ISIS-2340: converts BookmarkableModel class->interface, introduces ManagedObjectModel
     new ebef502  ISIS-2340: some model hierarchy cleanup

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../webapp/context/IsisWebAppCommonContext.java    |   2 +-
 .../pdfjs/ui/components/PdfJsViewerPanel.java      |   2 +-
 .../viewer/wicket/model/models/ActionModel.java    |  18 +-
 .../wicket/model/models/BookmarkableModel.java     |  17 +-
 .../wicket/model/models/BookmarkedPagesModel.java  |  13 +-
 .../wicket/model/models/EntityCollectionModel.java |   6 +-
 .../viewer/wicket/model/models/EntityModel.java    | 136 +--------------
 .../wicket/model/models/FormExecutorContext.java   |   3 +-
 .../model/models/HintPageParameterSerializer.java  |  30 +---
 .../wicket/model/models/ManagedObjectModel.java    | 188 +++++++++++++++++++++
 .../viewer/wicket/model/models/ModelAbstract.java  |   3 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  11 +-
 .../model/models/ScalarModelWithMultiPending.java  |   4 +-
 .../model/models/ScalarModelWithPending.java       |   2 +-
 .../viewer/wicket/ui/components/LabelBase.java     |   4 +-
 .../wicket/ui/components/WebComponentBase.java     |   3 +-
 .../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 +-
 .../isis/viewer/wicket/ui/pages/WebPageBase.java   |   5 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   9 +-
 .../wicket/ui/panels/FormExecutorStrategy.java     |   6 +-
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |   5 +-
 .../AuthenticatedWebSessionForIsis.java            |   6 +-
 35 files changed, 276 insertions(+), 240 deletions(-)
 create mode 100644 viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java


[isis] 01/02: ISIS-2340: converts BookmarkableModel class->interface, introduces ManagedObjectModel

Posted by ah...@apache.org.
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 7c6997d9819f87bf2016fe2b823b2b119699971c
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri May 15 05:55:13 2020 +0200

    ISIS-2340: converts BookmarkableModel class->interface, introduces
    ManagedObjectModel
---
 .../webapp/context/IsisWebAppCommonContext.java    |   2 +-
 .../viewer/wicket/model/models/ActionModel.java    |   6 +-
 .../wicket/model/models/BookmarkableModel.java     |  17 +-
 .../viewer/wicket/model/models/EntityModel.java    |   4 +-
 .../wicket/model/models/FormExecutorContext.java   |   3 +-
 .../wicket/model/models/ManagedObjectModel.java    | 175 +++++++++++++++++++++
 .../viewer/wicket/model/models/ModelAbstract.java  |   3 +-
 .../viewer/wicket/ui/components/LabelBase.java     |   4 +-
 .../wicket/ui/components/WebComponentBase.java     |   3 +-
 .../isis/viewer/wicket/ui/pages/WebPageBase.java   |   5 +-
 .../wicket/ui/panels/FormExecutorDefault.java      |   5 +-
 .../wicket/ui/panels/FormExecutorStrategy.java     |   6 +-
 .../isis/viewer/wicket/ui/panels/PanelBase.java    |   5 +-
 .../AuthenticatedWebSessionForIsis.java            |   6 +-
 14 files changed, 207 insertions(+), 37 deletions(-)

diff --git a/core/webapp/src/main/java/org/apache/isis/core/webapp/context/IsisWebAppCommonContext.java b/core/webapp/src/main/java/org/apache/isis/core/webapp/context/IsisWebAppCommonContext.java
index d9be52b..7038cf5 100644
--- a/core/webapp/src/main/java/org/apache/isis/core/webapp/context/IsisWebAppCommonContext.java
+++ b/core/webapp/src/main/java/org/apache/isis/core/webapp/context/IsisWebAppCommonContext.java
@@ -136,7 +136,7 @@ public class IsisWebAppCommonContext implements MetaModelContext.Delegating {
     
     // -- FOR THOSE THAT IMPLEMENT BY DELEGATION
     
-    public static interface Delegating {
+    public static interface HasCommonContext {
         
         IsisWebAppCommonContext getCommonContext();
         
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 63e996e..d7ca6a7 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
@@ -63,9 +63,9 @@ import org.apache.isis.viewer.wicket.model.mementos.ActionMemento;
 
 import lombok.val;
 
-public class ActionModel 
-extends BookmarkableModel<ManagedObject> 
-implements FormUiModel, FormExecutorContext {
+public final class ActionModel 
+extends ManagedObjectModel 
+implements FormUiModel, FormExecutorContext, BookmarkableModel<ManagedObject> {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
index cbbdf90..d5c3514 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
@@ -21,23 +21,10 @@ package org.apache.isis.viewer.wicket.model.models;
 
 import org.apache.wicket.request.mapper.parameter.PageParameters;
 
-import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 import org.apache.isis.viewer.common.model.HasTitle;
 
-public abstract class BookmarkableModel<T> 
-extends ModelAbstract<T>  
-implements HasTitle {
-
-    private static final long serialVersionUID = 1L;
-
-    public BookmarkableModel(IsisWebAppCommonContext commonContext) {
-        super(commonContext);
-    }
-
-    public BookmarkableModel(IsisWebAppCommonContext commonContext, T t) {
-        super(commonContext, t);
-    }
-
+public interface BookmarkableModel<T> 
+extends HasTitle {
 
     /**
      * So can be bookmarked / added to <tt>BookmarkedPagesModel</tt>.
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 013df02..75e9da6 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
@@ -68,8 +68,8 @@ import lombok.extern.log4j.Log4j2;
  */
 @Log4j2
 public class EntityModel 
-extends BookmarkableModel<ManagedObject> 
-implements ObjectAdapterModel, UiHintContainer, ObjectUiModel {
+extends ManagedObjectModel 
+implements ObjectAdapterModel, UiHintContainer, ObjectUiModel, BookmarkableModel<ManagedObject> {
 
     private static final long serialVersionUID = 1L;
     
diff --git a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
index 2f4a8da..b4c8ab7 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
@@ -20,10 +20,11 @@
 package org.apache.isis.viewer.wicket.model.models;
 
 import org.apache.isis.applib.annotation.PromptStyle;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.common.model.HasParentUiModel;
 
 public interface FormExecutorContext 
-extends HasParentUiModel<EntityModel> {
+extends HasParentUiModel<EntityModel>, HasCommonContext {
 
     PromptStyle getPromptStyle();
 
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
new file mode 100644
index 0000000..2b6cb54
--- /dev/null
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ManagedObjectModel.java
@@ -0,0 +1,175 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.viewer.wicket.model.models;
+
+import java.util.Objects;
+import java.util.Optional;
+
+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.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
+import org.apache.isis.core.metamodel.spec.ManagedObject;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.memento.ObjectMemento;
+
+import lombok.NonNull;
+import lombok.val;
+
+/**
+ * 
+ * @since 2.0
+ *
+ */
+public abstract class ManagedObjectModel
+extends ModelAbstract<ManagedObject> {
+
+    private static final long serialVersionUID = 1L;
+
+    private ObjectMemento memento;
+    
+    protected ManagedObjectModel(
+            @NonNull IsisWebAppCommonContext commonContext) {
+        this(commonContext, null);
+    }
+    
+    protected ManagedObjectModel(
+            @NonNull IsisWebAppCommonContext commonContext, 
+            @Nullable ObjectMemento initialMemento) {
+
+        super(commonContext);
+        this.memento = initialMemento;
+    }
+
+
+    @Override
+    protected ManagedObject load() {
+        if (memento == null) {
+            return null;
+        }
+        return super.getCommonContext().reconstructObject(memento);
+    }
+
+    @Override
+    public void setObject(final ManagedObject adapter) {
+
+        if(ManagedObject.isNullOrUnspecifiedOrEmpty(adapter)) {
+            super.setObject(null);
+            return;
+        }
+
+        super.setObject(adapter);
+
+        if(adapter.getSpecification().isParentedOrFreeCollection()) {
+            val pojo = adapter.getPojo();
+            memento = super.getMementoService()
+                    .mementoForPojos(_Casts.uncheckedCast(pojo), getTypeOfSpecificationId()
+                            .orElseGet(()->adapter.getElementSpecification().get().getSpecId()));
+        } else {
+
+            memento = super.getMementoService().mementoForObject(adapter);
+        }
+    }
+    
+    public Bookmark asHintingBookmarkIfSupported() {
+        return memento!=null
+                ? memento.asHintingBookmarkIfSupported()
+                : null;
+    }
+
+    public Bookmark asBookmarkIfSupported() {
+        return memento!=null
+                ? memento.asBookmarkIfSupported()
+                : null;
+    }
+    
+    public String oidStringIfSupported() {
+        return memento!=null
+                ? memento.toString()
+                : null;
+    }
+    
+    /**
+     * @implNote free of side-effects, used for serialization
+     */
+    public Optional<ObjectSpecId> getTypeOfSpecificationId() {
+        return Optional.ofNullable(memento)
+                .map(ObjectMemento::getObjectSpecId);
+    }
+    
+    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 = getTypeOfSpecificationId().orElse(null);
+        final ObjectSpecification objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId);
+        return objectSpec.getFacet(BookmarkPolicyFacet.class);
+    }
+    
+    
+    private transient ObjectSpecification objectSpec; 
+    public ObjectSpecification getTypeOfSpecification() {
+        if(objectSpec==null) {
+            val specId = getTypeOfSpecificationId().orElse(null);
+            objectSpec = super.getSpecificationLoader().lookupBySpecIdElseLoad(specId); 
+        }
+        return objectSpec;
+    }
+    
+    
+    @Deprecated //TODO do not expose this implementation detail
+    public ObjectMemento memento() {
+        return memento;
+    }
+    
+    @Deprecated //TODO do not expose this implementation detail
+    public void memento(ObjectMemento memento) {
+        this.memento = memento;
+    }
+    
+    
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(memento);
+    }
+
+    @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/ModelAbstract.java b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
index 8fd7a49..06c0aab 100644
--- a/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
+++ b/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
@@ -23,6 +23,7 @@ import org.apache.wicket.model.LoadableDetachableModel;
 
 import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 
 import lombok.NonNull;
 
@@ -32,7 +33,7 @@ import lombok.NonNull;
  */
 public abstract class ModelAbstract<T> 
 extends LoadableDetachableModel<T> 
-implements IsisWebAppCommonContext.Delegating {
+implements HasCommonContext {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/LabelBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/LabelBase.java
index 88988b8..8b2fe47 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/LabelBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/LabelBase.java
@@ -18,13 +18,13 @@
  */
 package org.apache.isis.viewer.wicket.ui.components;
 
-import org.apache.wicket.markup.html.WebComponent;
 import org.apache.wicket.markup.html.basic.Label;
 import org.apache.wicket.model.IModel;
 
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.viewer.wicket.WebAppContextPath;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
 
 /**
@@ -33,7 +33,7 @@ import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
  */
 public abstract class LabelBase
 extends Label
-implements IsisWebAppCommonContext.Delegating {
+implements HasCommonContext {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/WebComponentBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/WebComponentBase.java
index 9aea7b6..91828f6 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/WebComponentBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/WebComponentBase.java
@@ -24,6 +24,7 @@ import org.apache.wicket.model.IModel;
 import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.viewer.wicket.WebAppContextPath;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
 
 /**
@@ -32,7 +33,7 @@ import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
  */
 public abstract class WebComponentBase
 extends WebComponent
-implements IsisWebAppCommonContext.Delegating {
+implements HasCommonContext {
 
     public WebComponentBase(final String id) {
         super(id);
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java
index 4ecfec5..345657d 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/WebPageBase.java
@@ -26,13 +26,16 @@ import org.apache.isis.core.config.IsisConfiguration;
 import org.apache.isis.core.config.viewer.wicket.WebAppContextPath;
 import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
 
 /**
  * Provides all the system dependencies for sub-classes.
  * @since 2.0
  */
-public abstract class WebPageBase extends WebPage implements IsisWebAppCommonContext.Delegating {
+public abstract class WebPageBase
+extends WebPage 
+implements HasCommonContext {
 
     private static final long serialVersionUID = 1L;
     
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 7265d6d..a78e541 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
@@ -56,12 +56,11 @@ import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.core.security.authentication.MessageBroker;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
 import org.apache.isis.core.webapp.context.memento.ObjectMemento;
-import org.apache.isis.viewer.common.model.HasParentUiModel;
 import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
 import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
 import org.apache.isis.viewer.wicket.model.models.EntityModel;
 import org.apache.isis.viewer.wicket.model.models.FormExecutor;
+import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
 import org.apache.isis.viewer.wicket.model.models.ScalarModel;
 import org.apache.isis.viewer.wicket.ui.components.scalars.isisapplib.IsisBlobOrClobPanelAbstract;
 import org.apache.isis.viewer.wicket.ui.errors.JGrowlUtil;
@@ -72,7 +71,7 @@ import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
 @Log4j2
-public final class FormExecutorDefault<M extends BookmarkableModel<ManagedObject> & HasParentUiModel<EntityModel>>
+public final class FormExecutorDefault<M extends FormExecutorContext>
 implements FormExecutor {
 
     private static final long serialVersionUID = 1L;
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorStrategy.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorStrategy.java
index 633840c..4977c8a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorStrategy.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorStrategy.java
@@ -21,11 +21,9 @@ package org.apache.isis.viewer.wicket.ui.panels;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 
 import org.apache.isis.core.metamodel.spec.ManagedObject;
-import org.apache.isis.viewer.common.model.HasParentUiModel;
-import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
+import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
 
-public interface FormExecutorStrategy<M extends BookmarkableModel<ManagedObject> & HasParentUiModel<EntityModel>> {
+public interface FormExecutorStrategy<M extends FormExecutorContext> {
 
     M getModel();
 
diff --git a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
index 2bd6f7c..fea5f5a 100644
--- a/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
+++ b/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelBase.java
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.runtime.iactn.IsisInteractionFactory;
 import org.apache.isis.core.security.authentication.MessageBroker;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.common.model.header.HeaderUiModel;
 import org.apache.isis.viewer.common.model.header.HeaderUiModelProvider;
 import org.apache.isis.viewer.wicket.model.common.CommonContextUtils;
@@ -52,7 +53,9 @@ import org.apache.isis.viewer.wicket.ui.pages.PageNavigationService;
  * Provides the <em>common context</em> for all implementing sub-classes.
  * @since 2.0
  */
-public class PanelBase<T> extends GenericPanel<T> implements IsisWebAppCommonContext.Delegating {
+public class PanelBase<T> 
+extends GenericPanel<T>
+implements HasCommonContext {
 
     private static final long serialVersionUID = 1L;
 
diff --git a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
index 6b02ef5..212e246 100644
--- a/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
+++ b/viewers/wicket/viewer/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/AuthenticatedWebSessionForIsis.java
@@ -39,6 +39,7 @@ import org.apache.isis.core.security.authentication.AuthenticationRequestPasswor
 import org.apache.isis.core.security.authentication.AuthenticationSession;
 import org.apache.isis.core.security.authentication.manager.AuthenticationManager;
 import org.apache.isis.core.webapp.context.IsisWebAppCommonContext;
+import org.apache.isis.core.webapp.context.IsisWebAppCommonContext.HasCommonContext;
 import org.apache.isis.viewer.wicket.model.models.BookmarkedPagesModel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel;
 import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModelProvider;
@@ -53,8 +54,9 @@ import lombok.val;
  * also tracks thread usage (so that multiple concurrent requests are all
  * associated with the same session).
  */
-public class AuthenticatedWebSessionForIsis extends AuthenticatedWebSession 
-implements BreadcrumbModelProvider, BookmarkedPagesModelProvider, IsisWebAppCommonContext.Delegating {
+public class AuthenticatedWebSessionForIsis 
+extends AuthenticatedWebSession 
+implements BreadcrumbModelProvider, BookmarkedPagesModelProvider, HasCommonContext {
 
     private static final long serialVersionUID = 1L;
 


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

Posted by ah...@apache.org.
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();