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 2019/12/04 18:15:37 UTC

[isis] branch master updated: ISIS-2177: starting to decouple ObjectAdapterMemento from Persistence

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

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


The following commit(s) were added to refs/heads/master by this push:
     new e44bd04  ISIS-2177: starting to decouple ObjectAdapterMemento from Persistence
e44bd04 is described below

commit e44bd04736eabf5657409552f8a08858a1aa4dec
Author: Andi Huber <ah...@apache.org>
AuthorDate: Wed Dec 4 19:15:27 2019 +0100

    ISIS-2177: starting to decouple ObjectAdapterMemento from Persistence
---
 .../jdo/objectadapter/ObjectAdapterContext.java    | 26 +++----
 .../ObjectAdapterContext_DependencyInjection.java  | 20 +++---
 .../isis/jdo/persistence/PersistenceSession5.java  |  8 ---
 .../org/apache/isis/runtime/memento/Memento.java   |  5 +-
 .../apache/isis/runtime/memento/MementoStore.java  | 17 +++++
 .../isis/runtime/memento/MementoStoreLegacy.java}  | 62 ++++++++++-------
 .../java/org/apache/isis/runtime/memento/Null.java |  2 +-
 .../isis/runtime/memento/ObjectAdapterMemento.java | 12 ++--
 .../memento/ObjectAdapterMementoCollection.java    | 33 +++------
 .../memento/ObjectAdapterMementoDefault.java       | 61 +++++++++--------
 .../memento/ObjectAdapterMementoSupport.java       |  2 +-
 .../ObjectAdapterMementoSupport_usingDefault.java  | 55 +++++++++------
 .../system/persistence/PersistenceSession.java     |  5 --
 .../wicket/ConverterForObjectAdapterMemento.java   |  2 +-
 .../wicket/model/models/EntityCollectionModel.java |  6 +-
 .../viewer/wicket/model/models/EntityModel.java    | 18 ++---
 .../viewer/wicket/model/models/ScalarModel.java    |  3 +-
 .../model/models/ScalarModelWithPending.java       |  2 +-
 .../viewer/wicket/model/models/ValueModel.java     |  2 +-
 .../collection/AssociatedWithActionsHelper.java    |  2 +-
 .../CollectionContentsAsAjaxTablePanel.java        | 79 +++++++++++-----------
 .../entity/icontitle/EntityIconAndTitlePanel.java  |  4 +-
 .../scalars/ScalarPanelSelect2Abstract.java        |  3 +-
 .../scalars/reference/ReferencePanel.java          |  7 +-
 .../widgets/breadcrumbs/BreadcrumbPanel.java       |  4 +-
 .../linkandlabel/ActionLinkFactoryAbstract.java    |  2 +-
 .../ObjectAdapterMementoProviderAbstract.java      |  4 +-
 .../webapp/context/IsisWebAppCommonContext.java    |  4 ++
 .../bootstrapping/builtin-domain-services.list     |  1 -
 .../bootstrapping/builtin-singleton.list           |  2 +-
 30 files changed, 229 insertions(+), 224 deletions(-)

diff --git a/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java b/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java
index 1be6dcb..213eecc 100644
--- a/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java
+++ b/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext.java
@@ -31,12 +31,13 @@ import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.ParentedOid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.facets.object.callbacks.LifecycleEventFacet;
+import org.apache.isis.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.memento.Data;
 import org.apache.isis.runtime.system.context.session.RuntimeContextBase;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.security.authentication.AuthenticationSession;
@@ -67,12 +68,12 @@ final public class ObjectAdapterContext {
     private final IsisPersistenceSessionJdo persistenceSession; 
     @Getter private final SpecificationLoader specificationLoader;
     private final ObjectAdapterContext_ObjectAdapterProvider objectAdapterProviderMixin;
-    private final ObjectAdapterContext_MementoSupport mementoSupportMixin;
     private final ObjectAdapterContext_NewIdentifier newIdentifierMixin;
     private final ObjectAdapterContext_DependencyInjection dependencyInjectionMixin;
     private final ServiceInjector serviceInjector;
     final ObjectAdapterContext_ObjectCreation objectCreationMixin;
     private final ObjectAdapterContext_LifecycleEventSupport lifecycleEventMixin;
+    private final ObjectManager objectManager;
 
     private ObjectAdapterContext(
             MetaModelContext mmc,
@@ -82,12 +83,13 @@ final public class ObjectAdapterContext {
         val runtimeContext = new RuntimeContextBase(mmc) {};
 
         this.objectAdapterProviderMixin = new ObjectAdapterContext_ObjectAdapterProvider(this, runtimeContext);
-        this.mementoSupportMixin = new ObjectAdapterContext_MementoSupport(this, persistenceSession);
         this.newIdentifierMixin = new ObjectAdapterContext_NewIdentifier(persistenceSession, runtimeContext.getSpecificationLoader());
         this.dependencyInjectionMixin = new ObjectAdapterContext_DependencyInjection(runtimeContext);
         this.objectCreationMixin = new ObjectAdapterContext_ObjectCreation(this, runtimeContext);
         this.lifecycleEventMixin = new ObjectAdapterContext_LifecycleEventSupport(runtimeContext);
 
+        this.objectManager = mmc.getObjectManager();
+        
         this.persistenceSession = persistenceSession;
         this.specificationLoader = mmc.getSpecificationLoader();
         this.serviceInjector = mmc.getServiceInjector();
@@ -125,7 +127,12 @@ final public class ObjectAdapterContext {
 
     // package private
     Object instantiateAndInjectServices(ObjectSpecification objectSpec) {
-        return dependencyInjectionMixin.instantiateAndInjectServices(objectSpec);
+        
+        val objectCreateRequest = ObjectCreator.Request.of(objectSpec);
+        return objectManager.createObject(objectCreateRequest);
+        
+        // legacy of
+        //return dependencyInjectionMixin.instantiateAndInjectServices(objectSpec);
     }
 
     // -- FACTORIES
@@ -161,7 +168,6 @@ final public class ObjectAdapterContext {
 
     private final ObjectAdapterFactories objectAdapterFactories;
 
-
     // package private
     ObjectAdapterFactories getFactories() {
         return objectAdapterFactories;
@@ -214,16 +220,6 @@ final public class ObjectAdapterContext {
         return objectAdapterProviderMixin;
     }
 
-    // -- MEMENTO SUPPORT
-
-    public static interface MementoRecreateObjectSupport {
-        ObjectAdapter recreateObject(ObjectSpecification spec, Oid oid, Data data);
-    }
-
-    public MementoRecreateObjectSupport mementoSupport() {
-        return mementoSupportMixin;
-    }
-
     // -- LIFECYCLE EVENT SUPPORT
 
     public void postLifecycleEventIfRequired(
diff --git a/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_DependencyInjection.java b/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_DependencyInjection.java
index 87b0198..991f49c 100644
--- a/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_DependencyInjection.java
+++ b/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_DependencyInjection.java
@@ -26,6 +26,7 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.runtime.system.context.session.RuntimeContext;
 
 import lombok.RequiredArgsConstructor;
+import lombok.val;
 
 /**
  * package private mixin for ObjectAdapterContext
@@ -34,29 +35,28 @@ import lombok.RequiredArgsConstructor;
  * </p> 
  * @since 2.0
  */
-//@Log4j2
+@Deprecated // use ObjectManager.createObject instead
 @RequiredArgsConstructor
 class ObjectAdapterContext_DependencyInjection {
 
     private final RuntimeContext runtimeContext;
 
-    Object instantiateAndInjectServices(final ObjectSpecification objectSpec) {
+    Object instantiateAndInjectServices(ObjectSpecification spec) {
 
-        final Class<?> correspondingClass = objectSpec.getCorrespondingClass();
-        if (correspondingClass.isArray()) {
-            return Array.newInstance(correspondingClass.getComponentType(), 0);
+        val type = spec.getCorrespondingClass();
+        if (type.isArray()) {
+            return Array.newInstance(type.getComponentType(), 0);
         }
 
-        final Class<?> cls = correspondingClass;
-        if (Modifier.isAbstract(cls.getModifiers())) {
-            throw new IsisException("Cannot create an instance of an abstract class: " + cls);
+        if (Modifier.isAbstract(type.getModifiers())) {
+            throw new IsisException("Cannot create an instance of an abstract class: " + type);
         }
 
         final Object newInstance;
         try {
-            newInstance = cls.newInstance();
+            newInstance = type.newInstance();
         } catch (final IllegalAccessException | InstantiationException e) {
-            throw new IsisException("Failed to create instance of type " + objectSpec.getFullIdentifier(), e);
+            throw new IsisException("Failed to create instance of type " + spec.getFullIdentifier(), e);
         }
 
         runtimeContext.getServiceInjector().injectServicesInto(newInstance);
diff --git a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSession5.java b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSession5.java
index 1e1fe38..6ff2792 100644
--- a/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSession5.java
+++ b/core/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/jdo/persistence/PersistenceSession5.java
@@ -81,7 +81,6 @@ import org.apache.isis.metamodel.spec.EntityState;
 import org.apache.isis.metamodel.spec.FreeStandingList;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.runtime.memento.Data;
 import org.apache.isis.runtime.persistence.FixturesInstalledStateHolder;
 import org.apache.isis.runtime.persistence.NotPersistableException;
 import org.apache.isis.runtime.persistence.UnsupportedFindException;
@@ -873,13 +872,6 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
         return false;
     }
 
-    // -- MEMENTO SUPPORT
-
-    @Override
-    public ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data) {
-        return objectAdapterContext.mementoSupport().recreateObject(spec, oid, data);
-    }
-
     @Override
     public ObjectAdapter adapterFor(Object pojo) {
         return objectAdapterContext.getObjectAdapterProvider().adapterFor(pojo);
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java
index def63ac..677161a 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Memento.java
@@ -37,7 +37,6 @@ import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.spec.feature.Contributed;
 import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 import lombok.Getter;
 import lombok.val;
@@ -67,14 +66,14 @@ public class Memento implements Serializable {
     
     public ObjectAdapter recreateObject(
             SpecificationLoader specLoader, 
-            PersistenceSession persistenceSession) {
+            MementoStore mementoStore) {
         
         if (data == null) {
             return null;
         }
         val spec = specLoader.lookupBySpecIdElseLoad(ObjectSpecId.of(data.getClassName()));
         val oid = data.getOid();
-        return persistenceSession.adapterOfMemento(spec, oid, data);
+        return mementoStore.adapterOfMemento(spec, oid, data);
     }
 
     @Override
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java
new file mode 100644
index 0000000..c21e0c7
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStore.java
@@ -0,0 +1,17 @@
+package org.apache.isis.runtime.memento;
+
+import org.apache.isis.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.spec.ObjectSpecification;
+
+/**
+ * 
+ * @deprecated introduced as refactoring step, to decouple memento code from PersistenceSession
+ *
+ */
+public interface MementoStore {
+
+    // -- TODO remove ObjectAdapter references from API
+    ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data);
+
+}
diff --git a/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_MementoSupport.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
similarity index 85%
rename from core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_MementoSupport.java
rename to core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
index 8870b5d..9bf7084 100644
--- a/core/persistence/jdo/common/src/main/java/org/apache/isis/jdo/objectadapter/ObjectAdapterContext_MementoSupport.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  */
-package org.apache.isis.jdo.objectadapter;
+package org.apache.isis.runtime.memento;
 
 import java.util.LinkedHashSet;
 import java.util.Set;
@@ -27,29 +27,31 @@ import java.util.stream.Stream;
 import org.apache.isis.commons.exceptions.IsisException;
 import org.apache.isis.commons.internal.assertions._Assert;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.jdo.objectadapter.ObjectAdapterContext.MementoRecreateObjectSupport;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
+import org.apache.isis.metamodel.adapter.oid.ParentedOid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.metamodel.facets.properties.update.modify.PropertySetterFacet;
+import org.apache.isis.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.metamodel.objectmanager.create.ObjectCreator;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.Contributed;
 import org.apache.isis.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
-import org.apache.isis.runtime.memento.CollectionData;
-import org.apache.isis.runtime.memento.Data;
-import org.apache.isis.runtime.memento.ObjectData;
-import org.apache.isis.runtime.memento.StandaloneData;
+import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.runtime.persistence.adapter.PojoAdapter;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.runtime.system.session.IsisSession;
 
 import static org.apache.isis.commons.internal.functions._Predicates.not;
 
+import lombok.RequiredArgsConstructor;
 import lombok.val;
 import lombok.extern.log4j.Log4j2;
 
@@ -60,36 +62,39 @@ import lombok.extern.log4j.Log4j2;
  * </p>
  * @since 2.0
  */
-@Log4j2
-class ObjectAdapterContext_MementoSupport implements MementoRecreateObjectSupport {
+@Log4j2 @RequiredArgsConstructor
+class MementoStoreLegacy implements MementoStore {
 
-
-    private final ObjectAdapterContext objectAdapterContext;
+    private final ObjectManager objectManager;
     private final PersistenceSession persistenceSession;
-
-    ObjectAdapterContext_MementoSupport(ObjectAdapterContext objectAdapterContext,
-            PersistenceSession persistenceSession) {
-        this.objectAdapterContext = objectAdapterContext;
-        this.persistenceSession = persistenceSession;
-    }
+    private final SpecificationLoader specificationLoader;
 
     @Override
-    public ObjectAdapter recreateObject(ObjectSpecification spec, Oid oid, Data data) {
+    public ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data) {
+        
         ObjectAdapter adapter;
 
         if (spec.isParentedOrFreeCollection()) {
 
             final Supplier<Object> emptyCollectionPojoFactory = 
-                    ()->objectAdapterContext.instantiateAndInjectServices(spec);
-
-                    final Object collectionPojo = populateCollection(emptyCollectionPojoFactory, spec, (CollectionData) data);
-                    adapter = objectAdapterContext.recreatePojo(oid, collectionPojo);
+                    ()->instantiateAndInjectServices(spec);
 
+            final Object collectionPojo = populateCollection(
+                    emptyCollectionPojoFactory, 
+                    spec, 
+                    (CollectionData) data);
+            
+            
+            final ParentedOid collectionOid = (ParentedOid) oid;
+            adapter = PojoAdapter.of(
+                    collectionPojo, collectionOid,
+                    IsisSession.currentOrElseNull(),
+                    persistenceSession);
 
         } else {
             _Assert.assertTrue("oid must be a RootOid representing an object because spec is not a collection and cannot be a value", oid instanceof RootOid);
             RootOid typedOid = (RootOid) oid;
-            // recreate an adapter for the original OID (with correct version)
+            // recreate an adapter for the original OID
             adapter = persistenceSession.adapterFor(typedOid);
 
             updateObject(adapter, data);
@@ -100,12 +105,23 @@ class ObjectAdapterContext_MementoSupport implements MementoRecreateObjectSuppor
         }
         return adapter;
     }
+    
+    // -- HELPER
+    
+    private Object instantiateAndInjectServices(ObjectSpecification spec) {
+        
+        val objectCreateRequest = ObjectCreator.Request.of(spec);
+        return objectManager.createObject(objectCreateRequest);
+        
+        // legacy of
+        //return dependencyInjectionMixin.instantiateAndInjectServices(objectSpec);
+    }
 
     private ManagedObject recreateReference(Data data) {
         // handle values
         if (data instanceof StandaloneData) {
             val standaloneData = (StandaloneData) data;
-            return standaloneData.getAdapter(persistenceSession, objectAdapterContext.getSpecificationLoader());
+            return standaloneData.getAdapter(persistenceSession, specificationLoader);
         }
 
         // reference to entity
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java
index dfc8c08..be23a54 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java
@@ -25,7 +25,7 @@ import org.apache.isis.commons.internal.encoding.DataInputExtended;
 import org.apache.isis.commons.internal.encoding.DataOutputExtended;
 import org.apache.isis.commons.internal.encoding.Encodable;
 
-public class Null implements Encodable, Serializable {
+class Null implements Encodable, Serializable {
     private static final long serialVersionUID = 1L;
 
     public Null() {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
index 3786f32..9612aa3 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
@@ -23,14 +23,12 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Optional;
-import java.util.UUID;
 import java.util.stream.Collectors;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.collections.Cardinality;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.commons.internal.ioc.BeanSort;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
@@ -44,10 +42,6 @@ import lombok.val;
  */
 public interface ObjectAdapterMemento extends Serializable {
 
-    UUID getStoreKey();
-    BeanSort getBeanSort();
-    RootOid getRootOid();
-
     String asString();
 
     /**
@@ -67,8 +61,8 @@ public interface ObjectAdapterMemento extends Serializable {
     Bookmark asHintingBookmarkIfSupported();
 
     ObjectSpecId getObjectSpecId();
-
-    ManagedObject getObjectAdapter(SpecificationLoader specificationLoader); 
+    
+    ManagedObject reconstructObject(MementoStore mementoStore, SpecificationLoader specificationLoader);
 
     // -- FACTORIES
 
@@ -129,5 +123,7 @@ public interface ObjectAdapterMemento extends Serializable {
         return memento;
     }
 
+    
+
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java
index 34fcfc8..d8c4732 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoCollection.java
@@ -19,14 +19,11 @@
 package org.apache.isis.runtime.memento;
 
 import java.util.ArrayList;
-import java.util.UUID;
 import java.util.stream.Collectors;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
-import org.apache.isis.commons.internal.ioc.BeanSort;
-import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
@@ -50,15 +47,16 @@ final class ObjectAdapterMementoCollection implements ObjectAdapterMemento {
     @Getter(onMethod = @__({@Override})) private final ObjectSpecId objectSpecId;
 
     @Override
-    public ManagedObject getObjectAdapter(SpecificationLoader specificationLoader) {
-
+    public ManagedObject reconstructObject(MementoStore mementoStore, SpecificationLoader specificationLoader) {
+        
         //TODO[2112] we don't need the persistence layer to do that!
         val listOfPojos = getContainer().stream()
-                .map(memento->memento.getObjectAdapter(specificationLoader))
-                .filter(_NullSafe::isPresent)
-                .map(ManagedObject::getPojo)
-                .filter(_NullSafe::isPresent)
-                .collect(Collectors.toCollection(ArrayList::new));
+              .map(memento->((ObjectAdapterMementoDefault)memento).getObjectAdapter(mementoStore, specificationLoader))
+              .filter(_NullSafe::isPresent)
+              .map(ManagedObject::getPojo)
+              .filter(_NullSafe::isPresent)
+              .collect(Collectors.toCollection(ArrayList::new));
+        
         return IsisContext.getPersistenceSession().get().adapterFor(listOfPojos);
     }
 
@@ -81,21 +79,6 @@ final class ObjectAdapterMementoCollection implements ObjectAdapterMemento {
         return getContainer();
     }
 
-    @Override
-    public BeanSort getBeanSort() {
-        return BeanSort.COLLECTION;
-    }
-
-    @Override
-    public UUID getStoreKey() {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
-    @Override
-    public RootOid getRootOid() {
-        // TODO Auto-generated method stub
-        return null;
-    }
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
index 0cb7d86..4a8fc60 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
@@ -41,6 +41,7 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 import static org.apache.isis.commons.internal.base._With.requires;
@@ -49,6 +50,7 @@ import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 import lombok.val;
 
+
 public class ObjectAdapterMementoDefault implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -119,10 +121,10 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             public ManagedObject asAdapter(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession,
+                    MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
-                return memento.recreateStrategy.getAdapter(memento, persistenceSession, specificationLoader);
+                return memento.recreateStrategy.getAdapter(memento, mementoStore, specificationLoader);
             }
 
             @Override
@@ -155,12 +157,14 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             public ManagedObject asAdapter(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession,
+                    MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
                 final List<Object> listOfPojos =
-                        _Lists.map(memento.list, Functions.toPojo(persistenceSession, specificationLoader));
+                        _Lists.map(memento.list, Functions.toPojo(mementoStore, specificationLoader));
 
+                PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
+                
                 return persistenceSession.adapterFor(listOfPojos);
             }
 
@@ -196,7 +200,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
         public abstract ManagedObject asAdapter(
                 ObjectAdapterMementoDefault memento,
-                PersistenceSession persistenceSession,
+                MementoStore mementoStore,
                 SpecificationLoader specificationLoader);
 
         public abstract int hashCode(ObjectAdapterMementoDefault memento);
@@ -216,7 +220,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             ManagedObject recreateAdapter(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession,
+                    MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
                 ObjectSpecId specId = memento.objectSpecId;
@@ -247,7 +251,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             public void resetVersion(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession, 
+                    MementoStore mementoStore, 
                     SpecificationLoader specificationLoader) {
             }
         },
@@ -259,7 +263,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             ManagedObject recreateAdapter(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession, 
+                    MementoStore mementoStore, 
                     SpecificationLoader specificationLoader) {
                 
                 RootOid rootOid = Oid.unmarshaller().unmarshal(memento.persistentOidStr, RootOid.class);
@@ -281,12 +285,13 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             public void resetVersion(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession,
+                    MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
                 //XXX REVIEW: this may be redundant because recreateAdapter also guarantees the version will be reset.
                 final ManagedObject adapter = recreateAdapter(
-                        memento, persistenceSession, specificationLoader);
+                        memento, mementoStore, specificationLoader);
+                
                 Oid oid = ManagedObject._identify(adapter);
                 memento.persistentOidStr = oid.enString();
             }
@@ -318,10 +323,10 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             ManagedObject recreateAdapter(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession, 
+                    MementoStore mementoStore, 
                     SpecificationLoader specificationLoader) {
                 
-                return memento.transientMemento.recreateObject(specificationLoader, persistenceSession);
+                return memento.transientMemento.recreateObject(specificationLoader, mementoStore);
             }
 
             @Override
@@ -342,22 +347,22 @@ public class ObjectAdapterMementoDefault implements Serializable {
             @Override
             public void resetVersion(
                     ObjectAdapterMementoDefault memento,
-                    PersistenceSession persistenceSession,
+                    MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
             }
         };
 
         public ManagedObject getAdapter(
                 ObjectAdapterMementoDefault memento,
-                PersistenceSession persistenceSession,
+                MementoStore mementoStore,
                 SpecificationLoader specificationLoader) {
             
-            return recreateAdapter(memento, persistenceSession, specificationLoader);
+            return recreateAdapter(memento, mementoStore, specificationLoader);
         }
 
         abstract ManagedObject recreateAdapter(
                 ObjectAdapterMementoDefault memento,
-                PersistenceSession persistenceSession, 
+                MementoStore mementoStore, 
                 SpecificationLoader specificationLoader);
 
         public abstract boolean equals(
@@ -370,7 +375,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
         public abstract void resetVersion(
                 ObjectAdapterMementoDefault memento,
-                PersistenceSession persistenceSession, 
+                MementoStore mementoStore, 
                 SpecificationLoader specificationLoader);
     }
 
@@ -525,11 +530,11 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
 
     public void resetVersion(
-            PersistenceSession persistenceSession,
+            MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
         
         ensureScalar();
-        recreateStrategy.resetVersion(this, persistenceSession, specificationLoader);
+        recreateStrategy.resetVersion(this, mementoStore, specificationLoader);
     }
 
 
@@ -556,7 +561,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
      * can call {@link #setAdapter(ManagedObject)} to keep this memento in sync.
      */
     public ManagedObject getObjectAdapter(
-            PersistenceSession persistenceSession,
+            MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
         
         val spec = specificationLoader.loadSpecification(objectSpecId);
@@ -570,7 +575,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
             return spec.getMetaModelContext().lookupServiceAdapterById(objectSpecId.asString());
         }
         
-        return cardinality.asAdapter(this, persistenceSession, specificationLoader);
+        return cardinality.asAdapter(this, mementoStore, specificationLoader);
     }
 
     /**
@@ -593,20 +598,20 @@ public class ObjectAdapterMementoDefault implements Serializable {
      */
     public boolean containedIn(
             List<ObjectAdapterMementoDefault> mementos,
-            PersistenceSession persistenceSession,
+            MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
 
         ensureScalar();
 
         //XXX REVIEW: heavy handed, ought to be possible to just compare the OIDs
         // ignoring the concurrency checking
-        val currAdapter = getObjectAdapter(persistenceSession, specificationLoader);
+        val currAdapter = getObjectAdapter(mementoStore, specificationLoader);
         
         for (val memento : mementos) {
             if(memento == null) {
                 continue;
             }
-            val otherAdapter = memento.getObjectAdapter(persistenceSession, specificationLoader);
+            val otherAdapter = memento.getObjectAdapter(mementoStore, specificationLoader);
             if(currAdapter == otherAdapter) {
                 return true;
             }
@@ -645,12 +650,12 @@ public class ObjectAdapterMementoDefault implements Serializable {
         }
 
         public static Function<ObjectAdapterMementoDefault, ManagedObject> fromMemento(
-                final PersistenceSession persistenceSession,
+                final MementoStore mementoStore,
                 final SpecificationLoader specificationLoader) {
 
             return memento->{
                 try {
-                    return memento.getObjectAdapter(persistenceSession, specificationLoader);
+                    return memento.getObjectAdapter(mementoStore, specificationLoader);
                 } catch (ObjectNotFoundException e) {
                     // this can happen if for example the object is not visible (due to the security tenanted facet)
                     return null;
@@ -659,14 +664,14 @@ public class ObjectAdapterMementoDefault implements Serializable {
         }
 
         public static Function<ObjectAdapterMementoDefault, Object> toPojo(
-                final PersistenceSession persistenceSession,
+                final MementoStore mementoStore,
                 final SpecificationLoader specificationLoader) {
             
             return memento->{
                 if(memento == null) {
                     return null;
                 }
-                val objectAdapter = memento.getObjectAdapter(persistenceSession, specificationLoader);
+                val objectAdapter = memento.getObjectAdapter(mementoStore, specificationLoader);
                 if(objectAdapter == null) {
                     return null;
                 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java
index 238f20d..9c409ae 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java
@@ -34,6 +34,6 @@ public interface ObjectAdapterMementoSupport {
 
     ObjectAdapterMemento mementoForPojo(Object pojo);
 
-    ManagedObject reconstructObjectAdapter(ObjectAdapterMemento memento);
+    ManagedObject reconstructObject(ObjectAdapterMemento memento);
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
index 5b3a7bf..5252021 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
@@ -26,13 +26,15 @@ import javax.inject.Singleton;
 import org.springframework.stereotype.Service;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.ioc.BeanSort;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
+import org.apache.isis.metamodel.objectmanager.ObjectManager;
+import org.apache.isis.metamodel.objectmanager.load.ObjectLoader;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.context.IsisContext;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -48,6 +50,8 @@ public class ObjectAdapterMementoSupport_usingDefault
 implements ObjectAdapterMementoSupport {
     
     @Inject @Getter private SpecificationLoader specificationLoader;
+    @Inject private ObjectManager objectManager;
+    private MementoStore mementoStore;
 
     @Override
     public ObjectAdapterMemento mementoForRootOid(RootOid rootOid) {
@@ -72,8 +76,27 @@ implements ObjectAdapterMementoSupport {
     }
 
     @Override
-    public ManagedObject reconstructObjectAdapter(ObjectAdapterMemento memento) {
-        return memento.getObjectAdapter(specificationLoader);
+    public ManagedObject reconstructObject(ObjectAdapterMemento memento) {
+        if(memento==null) {
+            return null;
+        }
+        if(mementoStore==null) {
+            val ps = IsisContext.getPersistenceSession().get();
+            mementoStore = new MementoStoreLegacy(objectManager, ps, specificationLoader);
+        }
+        
+        
+        return memento.reconstructObject(mementoStore, specificationLoader);
+        
+//        val specId = memento.getObjectSpecId();
+//        val spec = specificationLoader.loadSpecification(specId);
+//        
+//        if(memento.getIdentifier()==null) {
+//            System.out.println("#### has no id: " + memento);
+//        }
+//        
+//        val objectLoadRequest = ObjectLoader.Request.of(spec, memento.getIdentifier());
+//        return objectManager.loadObject(objectLoadRequest);         
     }
 
     @RequiredArgsConstructor(staticName = "of")
@@ -84,21 +107,6 @@ implements ObjectAdapterMementoSupport {
         private final ObjectAdapterMementoDefault delegate;
 
         @Override
-        public UUID getStoreKey() {
-            return null;
-        }
-
-        @Override
-        public BeanSort getBeanSort() {
-            return null;
-        }
-
-        @Override
-        public RootOid getRootOid() {
-            return null;
-        }
-
-        @Override
         public String asString() {
             return delegate.asString();
         }
@@ -119,12 +127,15 @@ implements ObjectAdapterMementoSupport {
         }
 
         @Override
-        public ManagedObject getObjectAdapter(SpecificationLoader specificationLoader) {
-            return delegate.getObjectAdapter(persistenceSession(), specificationLoader);
+        public ManagedObject reconstructObject(
+                MementoStore mementoStore, SpecificationLoader specificationLoader) {
+            
+            return delegate.getObjectAdapter(mementoStore, specificationLoader);
         }
         
-        private PersistenceSession persistenceSession() {
-            return IsisContext.getPersistenceSession().orElse(null);
+        @Override
+        public String toString() {
+            return delegate.toString();
         }
 
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java
index 25c1714..5057f90 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/system/persistence/PersistenceSession.java
@@ -29,11 +29,8 @@ import org.apache.isis.commons.internal.components.SessionScopedComponent;
 import org.apache.isis.commons.internal.context._Context;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
-import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.EntityState;
-import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.runtime.memento.Data;
 import org.apache.isis.runtime.persistence.objectstore.transaction.PersistenceCommand;
 import org.apache.isis.runtime.persistence.objectstore.transaction.TransactionalResource;
 
@@ -105,8 +102,6 @@ SessionScopedComponent {
     // -------------------------------------------------------------------------------------------------
     
     // -- TODO remove ObjectAdapter references from API
-    
-    ObjectAdapter adapterOfMemento(ObjectSpecification spec, Oid oid, Data data);
 
     <T> List<ObjectAdapter> allMatchingQuery(final Query<T> query);
     <T> ObjectAdapter firstMatchingQuery(final Query<T> query);
diff --git a/core/viewers/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java b/core/viewers/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
index 3424853..558c470 100644
--- a/core/viewers/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
+++ b/core/viewers/wicket/impl/src/main/java/org/apache/isis/viewer/wicket/viewer/integration/wicket/ConverterForObjectAdapterMemento.java
@@ -67,7 +67,7 @@ public class ConverterForObjectAdapterMemento implements IConverter<ObjectAdapte
         if (memento == null) {
             return null;
         }
-        val adapter = memento.getObjectAdapter(commonContext.getSpecificationLoader());
+        val adapter = commonContext.reconstructObject(memento);
         val spec = adapter.getSpecification();
         if(spec!=null && spec.isValue()) {
             return memento.toString();
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 225e96a..142a641 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -190,7 +190,7 @@ implements LinksProvider, UiHintContainer {
             private Stream<ManagedObject> loadElementsOneByOne(final EntityCollectionModel model) {
 
                 return stream(model.mementoList)
-                        .map(memento->memento.getObjectAdapter(model.getSpecificationLoader()))
+                        .map(model.getCommonContext()::reconstructObject)
                         .filter(_NullSafe::isPresent);
             }
 
@@ -236,8 +236,8 @@ implements LinksProvider, UiHintContainer {
             @Override
             List<ManagedObject> load(EntityCollectionModel colModel) {
 
-                final ManagedObject adapter = colModel.getParentObjectAdapterMemento()
-                        .getObjectAdapter(colModel.getSpecificationLoader());
+                val adapter = colModel.getCommonContext()
+                        .reconstructObject(colModel.getParentObjectAdapterMemento()); 
 
                 final OneToManyAssociation collection = colModel.collectionMemento
                         .getCollection(colModel.getSpecificationLoader());
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index baff894..73f163b 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -334,7 +334,7 @@ implements ObjectAdapterModel, UiHintContainer {
         if (adapterMemento == null) {
             return null;
         }
-        val adapter = adapterMemento.getObjectAdapter(super.getSpecificationLoader());
+        val adapter = super.getCommonContext().reconstructObject(adapterMemento);
         return adapter;
     }
 
@@ -344,12 +344,10 @@ implements ObjectAdapterModel, UiHintContainer {
         adapterMemento = ObjectAdapterMemento.ofAdapter(adapter, super.getMementoSupport());
     }
 
-    public void setObjectMemento(final ObjectAdapterMemento memento) {
-        super.setObject(
-                memento != null
-                ? memento.getObjectAdapter(super.getSpecificationLoader())
-                        : null);
-        adapterMemento = memento;
+    public void setObjectMemento(final ObjectAdapterMemento adapterMemento) {
+        val adapter = super.getCommonContext().reconstructObject(adapterMemento);
+        super.setObject(adapter);
+        this.adapterMemento = adapterMemento;
     }
 
 
@@ -508,10 +506,8 @@ implements ObjectAdapterModel, UiHintContainer {
         }
 
         private ManagedObject getPendingAdapter() {
-            final ObjectAdapterMemento memento = getObject();
-            return memento != null
-                    ? memento.getObjectAdapter(entityModel.getSpecificationLoader())
-                            : null;
+            val memento = getObject();
+            return entityModel.getCommonContext().reconstructObject(memento);
         }
 
         public ManagedObject getPendingElseCurrentAdapter() {
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index afd0ca7..8af101e 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -735,8 +735,7 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
     private void getAndStore(final EntityModel parentEntityModel) {
         final ObjectAdapterMemento parentAdapterMemento = parentEntityModel.getObjectAdapterMemento();
         final OneToOneAssociation property = propertyMemento.getProperty(getSpecificationLoader());
-        final ManagedObject parentAdapter = parentAdapterMemento.getObjectAdapter(getSpecificationLoader());
-
+        final ManagedObject parentAdapter = super.getCommonContext().reconstructObject(parentAdapterMemento); 
         setObjectFromPropertyIfVisible(ScalarModel.this, property, parentAdapter);
     }
 
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
index 6239bbc..342d269 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithPending.java
@@ -78,7 +78,7 @@ public interface ScalarModelWithPending extends Serializable {
                             if (ownerPending != null) {
                                 log.debug("setting to pending: {}", ownerPending.toString());
                                 ownerScalarModel.setObject(
-                                        ownerPending.getObjectAdapter(ownerScalarModel.getSpecificationLoader()));
+                                        ownerScalarModel.getCommonContext().reconstructObject(ownerPending));
                             }
                         }
                     }
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index 4b2bb78..ffa585b 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -40,7 +40,7 @@ public class ValueModel extends ModelAbstract<ManagedObject> {
 
     @Override
     protected ManagedObject load() {
-        return adapterMemento.getObjectAdapter(super.getSpecificationLoader());
+        return super.getCommonContext().reconstructObject(adapterMemento);
     }
 
     // //////////////////////////////////////
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
index 48662ef..8a5bdcb 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collection/AssociatedWithActionsHelper.java
@@ -68,7 +68,7 @@ public class AssociatedWithActionsHelper implements Serializable {
 
     private ObjectSpecification getObjectSpecification() {
         val parentMemento = collectionModel.getParentObjectAdapterMemento();
-        val parentAdapter = parentMemento.getObjectAdapter(collectionModel.getSpecificationLoader());
+        val parentAdapter = collectionModel.getCommonContext().reconstructObject(parentMemento);
         return parentAdapter.getSpecification();
     }
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
index 4d33ed0..0255fa0 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/collectioncontents/ajaxtable/CollectionContentsAsAjaxTablePanel.java
@@ -189,54 +189,55 @@ implements CollectionCountProvider {
 
         final ObjectSpecification parentSpecIfAny =
                 getModel().isParented()
-                ? getModel().getParentObjectAdapterMemento().getObjectAdapter(getCommonContext().getSpecificationLoader()).getSpecification()
+                    ? getCommonContext().reconstructObject(getModel().getParentObjectAdapterMemento())
+                            .getSpecification()
                         : null;
 
-                final Predicate<ObjectAssociation> predicate = ObjectAssociation.Predicates.PROPERTIES
-                        .and((final ObjectAssociation association)->{
-                            final Stream<Facet> facets = association.streamFacets()
-                                    .filter((final Facet facet)->
-                                    facet instanceof WhereValueFacet && facet instanceof HiddenFacet);
-                            return !facets
-                                    .map(facet->(WhereValueFacet) facet)
-                                    .anyMatch(wawF->wawF.where().includes(whereContext));
+        final Predicate<ObjectAssociation> predicate = ObjectAssociation.Predicates.PROPERTIES
+                .and((final ObjectAssociation association)->{
+                    final Stream<Facet> facets = association.streamFacets()
+                            .filter((final Facet facet)->
+                            facet instanceof WhereValueFacet && facet instanceof HiddenFacet);
+                    return !facets
+                            .map(facet->(WhereValueFacet) facet)
+                            .anyMatch(wawF->wawF.where().includes(whereContext));
 
-                        })
-                        .and(associationDoesNotReferenceParent(parentSpecIfAny));
+                })
+                .and(associationDoesNotReferenceParent(parentSpecIfAny));
 
-                final Stream<? extends ObjectAssociation> propertyList = 
-                        typeOfSpec.streamAssociations(Contributed.INCLUDED)
-                        .filter(predicate);
+        final Stream<? extends ObjectAssociation> propertyList = 
+                typeOfSpec.streamAssociations(Contributed.INCLUDED)
+                .filter(predicate);
 
-                final Map<String, ObjectAssociation> propertyById = _Maps.newLinkedHashMap();
-                propertyList.forEach(property->
-                propertyById.put(property.getId(), property));
+        final Map<String, ObjectAssociation> propertyById = _Maps.newLinkedHashMap();
+        propertyList.forEach(property->
+        propertyById.put(property.getId(), property));
 
-                List<String> propertyIds = _Lists.newArrayList(propertyById.keySet());
+        List<String> propertyIds = _Lists.newArrayList(propertyById.keySet());
 
-                if(propertyIdComparator!=null) {
-                    propertyIds.sort(propertyIdComparator);   
-                }
+        if(propertyIdComparator!=null) {
+            propertyIds.sort(propertyIdComparator);   
+        }
 
-                // optional SPI to reorder
-                final Can<TableColumnOrderService> tableColumnOrderServices =
-                        getServiceRegistry().select(TableColumnOrderService.class);
+        // optional SPI to reorder
+        final Can<TableColumnOrderService> tableColumnOrderServices =
+                getServiceRegistry().select(TableColumnOrderService.class);
 
-                for (final TableColumnOrderService tableColumnOrderService : tableColumnOrderServices) {
-                    final List<String> propertyReorderedIds = reordered(tableColumnOrderService, propertyIds);
-                    if(propertyReorderedIds != null) {
-                        propertyIds = propertyReorderedIds;
-                        break;
-                    }
-                }
+        for (final TableColumnOrderService tableColumnOrderService : tableColumnOrderServices) {
+            final List<String> propertyReorderedIds = reordered(tableColumnOrderService, propertyIds);
+            if(propertyReorderedIds != null) {
+                propertyIds = propertyReorderedIds;
+                break;
+            }
+        }
 
-                for (final String propertyId : propertyIds) {
-                    final ObjectAssociation property = propertyById.get(propertyId);
-                    if(property != null) {
-                        final ColumnAbstract<ManagedObject> nopc = createObjectAdapterPropertyColumn(property);
-                        columns.add(nopc);
-                    }
-                }
+        for (final String propertyId : propertyIds) {
+            final ObjectAssociation property = propertyById.get(propertyId);
+            if(property != null) {
+                final ColumnAbstract<ManagedObject> nopc = createObjectAdapterPropertyColumn(property);
+                columns.add(nopc);
+            }
+        }
     }
 
     private List<String> reordered(
@@ -247,7 +248,7 @@ implements CollectionCountProvider {
 
         final ObjectAdapterMemento parentObjectAdapterMemento = getModel().getParentObjectAdapterMemento();
         if(parentObjectAdapterMemento != null) {
-            val parentObjectAdapter = parentObjectAdapterMemento.getObjectAdapter(getCommonContext().getSpecificationLoader());
+            val parentObjectAdapter = getCommonContext().reconstructObject(parentObjectAdapterMemento);
             final Object parent = parentObjectAdapter.getPojo();
             final String collectionId = getModel().getCollectionMemento().getId();
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
index a188d18..c7cea13 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/entity/icontitle/EntityIconAndTitlePanel.java
@@ -222,9 +222,7 @@ public class EntityIconAndTitlePanel extends PanelAbstract<ObjectAdapterModel> {
     public ManagedObject getContextAdapterIfAny() {
         ObjectAdapterModel model = getModel();
         ObjectAdapterMemento contextAdapterMementoIfAny = model.getContextAdapterIfAny();
-        return contextAdapterMementoIfAny != null
-                ? contextAdapterMementoIfAny.getObjectAdapter(getCommonContext().getSpecificationLoader())
-                        : null;
+        return getCommonContext().reconstructObject(contextAdapterMementoIfAny);
     }
 
     static String abbreviated(final String str, final int maxLength) {
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
index 327d934..79b81ae 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/ScalarPanelSelect2Abstract.java
@@ -247,8 +247,7 @@ public abstract class ScalarPanelSelect2Abstract extends ScalarPanelAbstract2 {
                 proposedValue = (ObjectAdapterMemento) proposedValueObj;
             }
 
-            val proposedAdapter = proposedValue.getObjectAdapter(scalarModel.getSpecificationLoader());
-
+            val proposedAdapter = scalarModel.getCommonContext().reconstructObject(proposedValue); 
             final String reasonIfAny = scalarModel.validate(proposedAdapter);
             if (reasonIfAny != null) {
                 final ValidationError error = new ValidationError();
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index c137a04..5159429 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -171,7 +171,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
                 if(memento == null) {
                     return null;
                 }
-                val adapter = memento.getObjectAdapter(getSpecificationLoader());
+                val adapter = ReferencePanel.super.getCommonContext().reconstructObject(memento);
                 return adapter != null ? adapter.titleString(null) : null;
             }
 
@@ -410,10 +410,7 @@ public class ReferencePanel extends ScalarPanelSelect2Abstract {
                 select2.getModel().setObject(convertedInput);
             }
 
-            val adapter = convertedInput!=null
-                    ? convertedInput.getObjectAdapter(super.getSpecificationLoader())
-                            :null;
-                    
+            val adapter = super.getCommonContext().reconstructObject(convertedInput); 
             getModel().setObject(adapter);
         }
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
index 46cc86e..6e2a89c 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/breadcrumbs/BreadcrumbPanel.java
@@ -73,7 +73,9 @@ public class BreadcrumbPanel extends PanelAbstract<IModel<Void>> {
             }
 
             private String titleFor(final EntityModel model) {
-                return model.getObjectAdapterMemento().getObjectAdapter(getCommonContext().getSpecificationLoader()).titleString(null);
+                return getCommonContext()
+                        .reconstructObject(model.getObjectAdapterMemento())
+                        .titleString(null);
             }
 
 
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
index 440e7a5..2e57f20 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/linkandlabel/ActionLinkFactoryAbstract.java
@@ -108,7 +108,7 @@ public abstract class ActionLinkFactoryAbstract implements ActionLinkFactory {
 
                     final List<Object> selectedPojos = selectedMementos.stream()
                     .filter(_NullSafe::isPresent)
-                    .map(memento -> memento.getObjectAdapter(commonContext.getSpecificationLoader()))
+                    .map(commonContext::reconstructObject)
                     .filter(_NullSafe::isPresent)
                     .map(ManagedObject::getPojo)
                     .filter(_NullSafe::isPresent)
diff --git a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
index ef989e1..ff9a1d4 100644
--- a/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
+++ b/core/viewers/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/select2/providers/ObjectAdapterMementoProviderAbstract.java
@@ -64,7 +64,7 @@ public abstract class ObjectAdapterMementoProviderAbstract extends ChoiceProvide
             return NULL_DISPLAY_TEXT;
         }
 
-        val objectAdapter = choice.getObjectAdapter(commonContext.getSpecificationLoader());
+        val objectAdapter = commonContext.reconstructObject(choice); 
         final IConverter<Object> converter = findConverter(objectAdapter);
         return converter != null
                 ? converter.convertToString(objectAdapter.getPojo(), getLocale())
@@ -123,7 +123,7 @@ public abstract class ObjectAdapterMementoProviderAbstract extends ChoiceProvide
             matches.addAll(choicesMementos);
         } else {
             for (ObjectAdapterMemento candidate : choicesMementos) {
-                val objectAdapter = candidate.getObjectAdapter(commonContext.getSpecificationLoader());
+                val objectAdapter = commonContext.reconstructObject(candidate); 
                 String title = objectAdapter.titleString(objectAdapter);
                 if (title.toLowerCase().contains(term.toLowerCase())) {
                     matches.add(candidate);
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java b/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java
index 77ff67f..5a16b78 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java
@@ -100,6 +100,10 @@ public class IsisWebAppCommonContext implements MetaModelContext.Delegating {
         return ObjectAdapterMemento.ofRootOid(rootOid, getMementoSupport());
     }
     
+    public ManagedObject reconstructObject(ObjectAdapterMemento memento) {
+        return getMementoSupport().reconstructObject(memento);
+    }
+    
     // -- COMMON CONTEXT PROVIDER INTERFACE
     
     public static interface Provider {
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
index 99a194d..8e91651 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-domain-services.list
@@ -17,7 +17,6 @@ org.apache.isis.metamodel.services.user.UserServiceDefault$SudoServiceSpi
 org.apache.isis.runtime.services.command.CommandDtoServiceInternalDefault
 org.apache.isis.runtime.services.confmenu.ConfigurationViewServiceDefault
 org.apache.isis.runtime.services.email.EmailServiceDefault
-org.apache.isis.extensions.hsqldbmgr.services.HsqlDbManagerMenu
 org.apache.isis.runtime.services.i18n.po.TranslationServicePoMenu
 org.apache.isis.runtime.services.ixn.InteractionDtoServiceInternalDefault
 org.apache.isis.runtime.services.publish.PublishingServiceInternalDefault
diff --git a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
index 430045f..2c9e98b 100644
--- a/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
+++ b/examples/smoketests/src/test/resources/org/apache/isis/testdomain/bootstrapping/builtin-singleton.list
@@ -59,7 +59,7 @@ org.apache.isis.runtime.services.email.EmailServiceDefault
 org.apache.isis.runtime.services.eventbus.EventBusServiceSpring
 org.apache.isis.runtime.services.factory.FactoryServiceInternalDefault
 org.apache.isis.runtime.services.homepage.HomePageResolverServiceDefault
-org.apache.isis.extensions.hsqldbmgr.services.HsqlDbManagerMenu
+#org.apache.isis.extensions.hsqldbmgr.services.HsqlDbManagerMenu
 org.apache.isis.runtime.services.i18n.po.TranslationServicePo
 org.apache.isis.runtime.services.i18n.po.TranslationServicePoMenu
 org.apache.isis.runtime.services.ixn.InteractionDtoServiceInternalDefault