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 2018/09/01 10:02:56 UTC

[isis] branch ISIS-1976-rethink-object-adapters created (now fee934d)

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

ahuber pushed a change to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git.


      at fee934d  ISIS-1976: add layer of abstraction as first step to deprecate ObjectAdapter caching

This branch includes the following new commits:

     new fee934d  ISIS-1976: add layer of abstraction as first step to deprecate ObjectAdapter caching

The 1 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.



[isis] 01/01: ISIS-1976: add layer of abstraction as first step to deprecate ObjectAdapter caching

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit fee934da2e3b0f95f6e0d30d00db28c55f098ee4
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sat Sep 1 12:02:32 2018 +0200

    ISIS-1976: add layer of abstraction as first step to deprecate
    ObjectAdapter caching
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../system/persistence/PersistenceSession4.java    | 182 +++-------------
 .../system/persistence/PersistenceSession5.java    | 193 +++--------------
 .../adaptermanager/ObjectAdapterLegacy.java        | 234 +++++++++++++++++++++
 .../adaptermanager/OidAdapterHashMap.java          |   4 +-
 .../adaptermanager/PojoAdapterHashMap.java         |   6 +-
 5 files changed, 292 insertions(+), 327 deletions(-)

diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index 3f99a1a..fe9d89f 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -59,7 +59,6 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.ensure.IsisAssertException;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -69,7 +68,6 @@ import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.ElementSpecificationProviderFromTypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
@@ -91,7 +89,6 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFa
 import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.FreeStandingList;
@@ -113,9 +110,8 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.Persiste
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.services.RequestScopedService;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.OidAdapterHashMap;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.PojoAdapterHashMap;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.RootAndCollectionAdapters;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy.ObjectAdapterContext;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
@@ -136,6 +132,7 @@ public class PersistenceSession4 extends PersistenceSessionBase
 implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession4.class);
+    private ObjectAdapterContext objectAdapterContext;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -164,8 +161,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
             LOG.debug("opening {}", this);
         }
 
-        oidAdapterMap.open();
-        pojoAdapterMap.open();
+        objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector);
 
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
@@ -233,7 +229,10 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     /**
      * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
      * and have the same OIDs as in any previous sessions.
+     * 
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
      */
+    @Deprecated
     private void initServices() {
         final List<Object> registeredServices = servicesInjector.getRegisteredServices();
         for (final Object service : registeredServices) {
@@ -244,7 +243,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void remapAsPersistentIfRequired(final ObjectAdapter serviceAdapter) {
         if (serviceAdapter.getOid().isTransient()) {
-            remapAsPersistent(serviceAdapter, null);
+            objectAdapterContext.remapAsPersistent(serviceAdapter, null, this);
         }
     }
 
@@ -310,19 +309,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
                     "close: failed to close JDO persistenceManager; continuing to avoid memory leakage");
         }
 
-        try {
-            oidAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
-
-        try {
-            pojoAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
+        objectAdapterContext.close();
 
         this.state = State.CLOSED;
     }
@@ -1123,14 +1110,11 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     // -- AdapterManager implementation
 
-    private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
-    private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
-
     @Override
     public ObjectAdapter getAdapterFor(final Object pojo) {
         Objects.requireNonNull(pojo);
 
-        return pojoAdapterMap.getAdapter(pojo);
+        return objectAdapterContext.lookupPojoAdapter(pojo);  
     }
 
     @Override
@@ -1138,7 +1122,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         Objects.requireNonNull(oid);
         ensureMapsConsistent(oid);
 
-        return oidAdapterMap.getAdapter(oid);
+        return objectAdapterContext.lookupOidAdapter(oid);
     }
 
 
@@ -1194,11 +1178,13 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     /**
      * Fail early if any problems.
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
      */
+    @Deprecated
     private void ensureMapsConsistent(final Oid oid) {
         Objects.requireNonNull(oid);
 
-        final ObjectAdapter adapter = oidAdapterMap.getAdapter(oid);
+        final ObjectAdapter adapter = objectAdapterContext.lookupOidAdapter(oid);
         if (adapter == null) {
             return;
         }
@@ -1208,7 +1194,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
         final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = pojoAdapterMap.getAdapter(adapterPojo);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupPojoAdapter(adapterPojo);
 
         if(adapterPojo == null) {
             // nothing to check
@@ -1219,7 +1205,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
         final Oid adapterOid = adapter.getOid();
-        final ObjectAdapter adapterAccordingToMap = oidAdapterMap.getAdapter(adapterOid);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupOidAdapter(adapterOid);
 
         if(adapterOid == null) {
             // nothing to check
@@ -1554,119 +1540,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
 
     /**
-     * {@inheritDoc}
-     *
-     * <p>
-     * Note that there is no management of {@link Version}s here. That is
-     * because the {@link PersistenceSession4} is expected to manage this.
-     *
-     * @param hintRootOid - allow a different persistent root oid to be provided.
-     */
-    private void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid) {
-
-        final ObjectAdapter rootAdapter = adapter.getAggregateRoot();  // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway.
-        final RootOid transientRootOid = (RootOid) rootAdapter.getOid();
-
-        // no longer true, because isTransient now looks directly at the underlying pojo's state (for entities)
-        // and doesn't apply for services.
-        //        Ensure.ensureThatArg(rootAdapter.isTransient(), is(true), "root adapter should be transient; oid:" + transientRootOid);
-        //        Ensure.ensureThatArg(transientRootOid.isTransient(), is(true), "root adapter's OID should be transient; oid:" + transientRootOid);
-
-        final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, this);
-
-        LOG.debug("remapAsPersistent: {}", transientRootOid);
-        LOG.debug("removing root adapter from oid map");
-
-        boolean removed = oidAdapterMap.remove(transientRootOid);
-        if (!removed) {
-            LOG.warn("could not remove oid: {}", transientRootOid);
-            // should we fail here with a more serious error?
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("removing collection adapter(s) from oid map");
-        }
-        for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
-            final Oid collectionOid = collectionAdapter.getOid();
-            removed = oidAdapterMap.remove(collectionOid);
-            if (!removed) {
-                LOG.warn("could not remove collectionOid: {}", collectionOid);
-                // should we fail here with a more serious error?
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("updating the Oid");
-        }
-
-        // intended for testing (bit nasty)
-        final RootOid persistedRootOid;
-        if(hintRootOid != null) {
-            if(hintRootOid.isTransient()) {
-                throw new IsisAssertException("hintRootOid must be persistent");
-            }
-            final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId();
-            final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId();
-            if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
-                throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " +
-                        "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
-            }
-            // ok
-            persistedRootOid = hintRootOid;
-        } else {
-            // normal flow - delegate to OidGenerator to obtain a persistent root oid
-            persistedRootOid = createPersistentOrViewModelOid(adapter.getObject());
-        }
-
-        // associate root adapter with the new Oid, and remap
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("replacing Oid for root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
-        }
-        adapter.replaceOid(persistedRootOid);
-        oidAdapterMap.add(persistedRootOid, adapter);
-
-        // associate the collection adapters with new Oids, and re-map
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
-        }
-        for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
-            final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
-            final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
-            oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
-        }
-
-
-        // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
-        // proxy equivalent.  So, ensure that the collection adapters still wrap the correct pojos.
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
-        }
-        for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
-            final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
-
-            final Object collectionPojoWrappedByAdapter = collectionAdapter.getObject();
-            final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapter);
-
-            if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
-                pojoAdapterMap.remove(collectionAdapter);
-                collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
-                pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("made persistent {}; was {}", adapter, transientRootOid);
-        }
-    }
-
-    private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
-        final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
-        return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
-    }
-
-
-
-    /**
      * Either returns an existing {@link ObjectAdapter adapter} (as per
      * {@link #getAdapterFor(Object)} or {@link #getAdapterFor(Oid)}), otherwise
      * re-creates an adapter with the specified (persistent) {@link Oid}.
@@ -1729,13 +1602,13 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     private void unmap(final ObjectAdapter adapter) {
         ensureMapsConsistent(adapter);
 
-        final Oid oid = adapter.getOid();
-        if (oid != null) {
-            oidAdapterMap.remove(oid);
-        }
-        pojoAdapterMap.remove(adapter);
+        objectAdapterContext.removeAdapter(adapter);
     }
 
+    /**
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+     */
+    @Deprecated
     private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
         removeAdapter(adapter);
         adapter.replacePojo(pojo);
@@ -1815,7 +1688,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
         Assert.assertNotNull(adapter);
         final Object pojo = adapter.getObject();
-        Assert.assertFalse("POJO Map already contains object", pojo, pojoAdapterMap.containsPojo(pojo));
+        Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsPojoAdapter(pojo));
 
         if (LOG.isDebugEnabled()) {
             // don't interact with the underlying object because may be a ghost
@@ -1834,14 +1707,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
             return adapter;
         }
 
-        // add all aggregated collections
-        final ObjectSpecification objSpec = adapter.getSpecification();
-        if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
-            pojoAdapterMap.add(pojo, adapter);
-        }
-
-        // order is important - add to pojo map first, then identity map
-        oidAdapterMap.add(adapter.getOid(), adapter);
+        objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
 
         // must inject after mapping, otherwise infinite loop
         servicesInjector.injectServicesInto(pojo);
@@ -2046,7 +1912,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
             // persisting
             final RootOid persistentOid = createPersistentOrViewModelOid(pojo);
 
-            remapAsPersistent(adapter, persistentOid);
+            objectAdapterContext.remapAsPersistent(adapter, persistentOid, this);
 
             CallbackFacet.Util.callCallback(adapter, PersistedCallbackFacet.class);
             postLifecycleEventIfRequired(adapter, PersistedLifecycleEventFacet.class);
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index 1f3c89a..1f78654 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -59,7 +59,6 @@ import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.collections._Maps;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.ensure.Assert;
-import org.apache.isis.core.commons.ensure.IsisAssertException;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.commons.factory.InstanceUtil;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -69,7 +68,6 @@ import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.Version;
-import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.ElementSpecificationProviderFromTypeOfFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
@@ -91,7 +89,6 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingCallbackFa
 import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatingLifecycleEventFacet;
 import org.apache.isis.core.metamodel.facets.object.value.ValueFacet;
 import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
 import org.apache.isis.core.metamodel.spec.FreeStandingList;
@@ -113,9 +110,8 @@ import org.apache.isis.core.runtime.persistence.objectstore.transaction.Persiste
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindAllInstances;
 import org.apache.isis.core.runtime.persistence.query.PersistenceQueryFindUsingApplibQueryDefault;
 import org.apache.isis.core.runtime.services.RequestScopedService;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.OidAdapterHashMap;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.PojoAdapterHashMap;
-import org.apache.isis.core.runtime.system.persistence.adaptermanager.RootAndCollectionAdapters;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy;
+import org.apache.isis.core.runtime.system.persistence.adaptermanager.ObjectAdapterLegacy.ObjectAdapterContext;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.core.runtime.system.transaction.TransactionalClosure;
@@ -136,6 +132,7 @@ public class PersistenceSession5 extends PersistenceSessionBase
 implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private static final Logger LOG = LoggerFactory.getLogger(PersistenceSession5.class);
+    private ObjectAdapterContext objectAdapterContext;
 
     /**
      * Initialize the object store so that calls to this object store access
@@ -163,9 +160,8 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         if (LOG.isDebugEnabled()) {
             LOG.debug("opening {}", this);
         }
-
-        oidAdapterMap.open();
-        pojoAdapterMap.open();
+        
+        objectAdapterContext = ObjectAdapterLegacy.openContext(servicesInjector);
 
         persistenceManager = jdoPersistenceManagerFactory.getPersistenceManager();
 
@@ -233,7 +229,10 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     /**
      * Creates {@link ObjectAdapter adapters} for the service list, ensuring that these are mapped correctly,
      * and have the same OIDs as in any previous sessions.
+     * 
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
      */
+    @Deprecated
     private void initServices() {
         final List<Object> registeredServices = servicesInjector.getRegisteredServices();
         for (final Object service : registeredServices) {
@@ -244,7 +243,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void remapAsPersistentIfRequired(final ObjectAdapter serviceAdapter) {
         if (serviceAdapter.getOid().isTransient()) {
-            remapAsPersistent(serviceAdapter, null);
+            objectAdapterContext.remapAsPersistent(serviceAdapter, null, this);
         }
     }
 
@@ -255,8 +254,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         return command;
     }
 
-
-
     // -- close
 
     /**
@@ -310,19 +307,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
                     "close: failed to close JDO persistenceManager; continuing to avoid memory leakage");
         }
 
-        try {
-            oidAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
-
-        try {
-            pojoAdapterMap.close();
-        } catch(final Throwable ex) {
-            // ignore
-            LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
-        }
+        objectAdapterContext.close();
 
         this.state = State.CLOSED;
     }
@@ -1122,15 +1107,12 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     }
 
     // -- AdapterManager implementation
-
-    private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
-    private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
-
+    
     @Override
     public ObjectAdapter getAdapterFor(final Object pojo) {
         Objects.requireNonNull(pojo);
 
-        return pojoAdapterMap.getAdapter(pojo);
+        return objectAdapterContext.lookupPojoAdapter(pojo);  
     }
 
     @Override
@@ -1138,7 +1120,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         Objects.requireNonNull(oid);
         ensureMapsConsistent(oid);
 
-        return oidAdapterMap.getAdapter(oid);
+        return objectAdapterContext.lookupOidAdapter(oid);
     }
 
 
@@ -1194,11 +1176,13 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     /**
      * Fail early if any problems.
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
      */
+    @Deprecated
     private void ensureMapsConsistent(final Oid oid) {
         Objects.requireNonNull(oid);
 
-        final ObjectAdapter adapter = oidAdapterMap.getAdapter(oid);
+        final ObjectAdapter adapter = objectAdapterContext.lookupOidAdapter(oid);
         if (adapter == null) {
             return;
         }
@@ -1208,7 +1192,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
         final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = pojoAdapterMap.getAdapter(adapterPojo);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupPojoAdapter(adapterPojo);
 
         if(adapterPojo == null) {
             // nothing to check
@@ -1219,7 +1203,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
         final Oid adapterOid = adapter.getOid();
-        final ObjectAdapter adapterAccordingToMap = oidAdapterMap.getAdapter(adapterOid);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupOidAdapter(adapterOid);
 
         if(adapterOid == null) {
             // nothing to check
@@ -1554,120 +1538,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         return collectionAdapter;
     }
 
-
-    /**
-     * {@inheritDoc}
-     *
-     * <p>
-     * Note that there is no management of {@link Version}s here. That is
-     * because the {@link PersistenceSession5} is expected to manage this.
-     *
-     * @param hintRootOid - allow a different persistent root oid to be provided.
-     */
-    private void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid) {
-
-        final ObjectAdapter rootAdapter = adapter.getAggregateRoot();  // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway.
-        final RootOid transientRootOid = (RootOid) rootAdapter.getOid();
-
-        // no longer true, because isTransient now looks directly at the underlying pojo's state (for entities)
-        // and doesn't apply for services.
-        //        Ensure.ensureThatArg(rootAdapter.isTransient(), is(true), "root adapter should be transient; oid:" + transientRootOid);
-        //        Ensure.ensureThatArg(transientRootOid.isTransient(), is(true), "root adapter's OID should be transient; oid:" + transientRootOid);
-
-        final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, this);
-
-        LOG.debug("remapAsPersistent: {}", transientRootOid);
-        LOG.debug("removing root adapter from oid map");
-
-        boolean removed = oidAdapterMap.remove(transientRootOid);
-        if (!removed) {
-            LOG.warn("could not remove oid: {}", transientRootOid);
-            // should we fail here with a more serious error?
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("removing collection adapter(s) from oid map");
-        }
-        for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
-            final Oid collectionOid = collectionAdapter.getOid();
-            removed = oidAdapterMap.remove(collectionOid);
-            if (!removed) {
-                LOG.warn("could not remove collectionOid: {}", collectionOid);
-                // should we fail here with a more serious error?
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("updating the Oid");
-        }
-
-        // intended for testing (bit nasty)
-        final RootOid persistedRootOid;
-        if(hintRootOid != null) {
-            if(hintRootOid.isTransient()) {
-                throw new IsisAssertException("hintRootOid must be persistent");
-            }
-            final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId();
-            final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId();
-            if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
-                throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " +
-                        "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
-            }
-            // ok
-            persistedRootOid = hintRootOid;
-        } else {
-            // normal flow - delegate to OidGenerator to obtain a persistent root oid
-            persistedRootOid = createPersistentOrViewModelOid(adapter.getObject());
-        }
-
-        // associate root adapter with the new Oid, and remap
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("replacing Oid for root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
-        }
-        adapter.replaceOid(persistedRootOid);
-        oidAdapterMap.add(persistedRootOid, adapter);
-
-        // associate the collection adapters with new Oids, and re-map
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
-        }
-        for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
-            final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
-            final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
-            oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
-        }
-
-
-        // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
-        // proxy equivalent.  So, ensure that the collection adapters still wrap the correct pojos.
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
-        }
-        for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
-            final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
-
-            final Object collectionPojoWrappedByAdapter = collectionAdapter.getObject();
-            final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapter);
-
-            if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
-                pojoAdapterMap.remove(collectionAdapter);
-                collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
-                pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
-            }
-        }
-
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("made persistent {}; was {}", adapter, transientRootOid);
-        }
-    }
-
-    private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
-        final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
-        return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
-    }
-
-
-
     /**
      * Either returns an existing {@link ObjectAdapter adapter} (as per
      * {@link #getAdapterFor(Object)} or {@link #getAdapterFor(Oid)}), otherwise
@@ -1731,13 +1601,13 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     private void unmap(final ObjectAdapter adapter) {
         ensureMapsConsistent(adapter);
 
-        final Oid oid = adapter.getOid();
-        if (oid != null) {
-            oidAdapterMap.remove(oid);
-        }
-        pojoAdapterMap.remove(adapter);
+        objectAdapterContext.removeAdapter(adapter);
     }
 
+    /**
+     * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+     */
+    @Deprecated
     private void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
         removeAdapter(adapter);
         adapter.replacePojo(pojo);
@@ -1817,7 +1687,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
         Assert.assertNotNull(adapter);
         final Object pojo = adapter.getObject();
-        Assert.assertFalse("POJO Map already contains object", pojo, pojoAdapterMap.containsPojo(pojo));
+        Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsPojoAdapter(pojo));
 
         if (LOG.isDebugEnabled()) {
             // don't interact with the underlying object because may be a ghost
@@ -1836,14 +1706,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
             return adapter;
         }
 
-        // add all aggregated collections
-        final ObjectSpecification objSpec = adapter.getSpecification();
-        if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
-            pojoAdapterMap.add(pojo, adapter);
-        }
-
-        // order is important - add to pojo map first, then identity map
-        oidAdapterMap.add(adapter.getOid(), adapter);
+        objectAdapterContext.addAdapterHonoringSpecImmutability(pojo, adapter);
 
         // must inject after mapping, otherwise infinite loop
         servicesInjector.injectServicesInto(pojo);
@@ -1851,10 +1714,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         return adapter;
     }
 
-
-
-
-
     // -- TransactionManager delegate methods
     protected IsisTransaction getCurrentTransaction() {
         return transactionManager.getCurrentTransaction();
@@ -2048,7 +1907,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
             // persisting
             final RootOid persistentOid = createPersistentOrViewModelOid(pojo);
 
-            remapAsPersistent(adapter, persistentOid);
+            objectAdapterContext.remapAsPersistent(adapter, persistentOid, this);
 
             CallbackFacet.Util.callCallback(adapter, PersistedCallbackFacet.class);
             postLifecycleEventIfRequired(adapter, PersistedLifecycleEventFacet.class);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
new file mode 100644
index 0000000..d89524f
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterLegacy.java
@@ -0,0 +1,234 @@
+/*
+ *  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.core.runtime.system.persistence.adaptermanager;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.isis.core.commons.ensure.IsisAssertException;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.oid.Oid;
+import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
+import org.apache.isis.core.metamodel.adapter.oid.RootOid;
+import org.apache.isis.core.metamodel.adapter.version.Version;
+import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
+import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
+import org.apache.isis.core.metamodel.services.ServicesInjector;
+import org.apache.isis.core.metamodel.spec.ObjectSpecId;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+
+public class ObjectAdapterLegacy {
+    
+    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterLegacy.class);
+    
+    public static ObjectAdapterContext openContext(ServicesInjector servicesInjector) {
+        final ObjectAdapterContext objectAdapterContext = new ObjectAdapterContext(servicesInjector);
+        objectAdapterContext.open();
+        return objectAdapterContext;
+    }
+    
+    public static class ObjectAdapterContext /*implements AdapterManager*/ {
+        private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
+        private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
+        private final ServicesInjector servicesInjector;
+        
+        private ObjectAdapterContext(ServicesInjector servicesInjector) {
+            this.servicesInjector = servicesInjector;
+        }
+
+        // -- LIFE-CYCLING
+        
+        public void open() {
+            oidAdapterMap.open();
+            pojoAdapterMap.open();
+        }
+        
+        public void close() {
+            
+            try {
+                oidAdapterMap.close();
+            } catch(final Throwable ex) {
+                // ignore
+                LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
+            }
+
+            try {
+                pojoAdapterMap.close();
+            } catch(final Throwable ex) {
+                // ignore
+                LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
+            }
+        }
+
+        public boolean containsPojoAdapter(Object pojo) {
+            return pojoAdapterMap.containsPojo(pojo);
+        }
+        
+        public ObjectAdapter lookupPojoAdapter(Object pojo) {
+            return pojoAdapterMap.getAdapter(pojo);
+        }
+
+        public ObjectAdapter lookupOidAdapter(Oid oid) {
+            return oidAdapterMap.getAdapter(oid);
+        }
+        
+        public void removeAdapter(ObjectAdapter adapter) {
+            final Oid oid = adapter.getOid();
+            if (oid != null) {
+                oidAdapterMap.remove(oid);
+            }
+            pojoAdapterMap.remove(adapter);
+        }
+        
+        // ------------------------------------------------------------------------------------------------
+        
+        public void addAdapterHonoringSpecImmutability(Object pojo, ObjectAdapter adapter) {
+            // add all aggregated collections
+            final ObjectSpecification objSpec = adapter.getSpecification();
+            if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
+                pojoAdapterMap.add(pojo, adapter);
+            }
+
+            // order is important - add to pojo map first, then identity map
+            oidAdapterMap.add(adapter.getOid(), adapter);
+        }
+        
+        /**
+         * was in PersisenceSessionX, temporarily moved here to successfully compile
+         *
+         * <p>
+         * Note that there is no management of {@link Version}s here. That is
+         * because the {@link PersistenceSession5} is expected to manage this.
+         *
+         * @param hintRootOid - allow a different persistent root oid to be provided.
+         * @param session 
+         */
+        public void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid, PersistenceSession session) {
+
+            final ObjectAdapter rootAdapter = adapter.getAggregateRoot();  // TODO: REVIEW: think this is redundant; would seem this method is only ever called for roots anyway.
+            final RootOid transientRootOid = (RootOid) rootAdapter.getOid();
+
+            // no longer true, because isTransient now looks directly at the underlying pojo's state (for entities)
+            // and doesn't apply for services.
+            //        Ensure.ensureThatArg(rootAdapter.isTransient(), is(true), "root adapter should be transient; oid:" + transientRootOid);
+            //        Ensure.ensureThatArg(transientRootOid.isTransient(), is(true), "root adapter's OID should be transient; oid:" + transientRootOid);
+
+            final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, session);
+
+            LOG.debug("remapAsPersistent: {}", transientRootOid);
+            LOG.debug("removing root adapter from oid map");
+
+            boolean removed = oidAdapterMap.remove(transientRootOid);
+            if (!removed) {
+                LOG.warn("could not remove oid: {}", transientRootOid);
+                // should we fail here with a more serious error?
+            }
+
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("removing collection adapter(s) from oid map");
+            }
+            for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
+                final Oid collectionOid = collectionAdapter.getOid();
+                removed = oidAdapterMap.remove(collectionOid);
+                if (!removed) {
+                    LOG.warn("could not remove collectionOid: {}", collectionOid);
+                    // should we fail here with a more serious error?
+                }
+            }
+
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("updating the Oid");
+            }
+
+            // intended for testing (bit nasty)
+            final RootOid persistedRootOid;
+            if(hintRootOid != null) {
+                if(hintRootOid.isTransient()) {
+                    throw new IsisAssertException("hintRootOid must be persistent");
+                }
+                final ObjectSpecId hintRootOidObjectSpecId = hintRootOid.getObjectSpecId();
+                final ObjectSpecId adapterObjectSpecId = adapter.getSpecification().getSpecId();
+                if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
+                    throw new IsisAssertException("hintRootOid's objectType must be same as that of adapter " +
+                            "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
+                }
+                // ok
+                persistedRootOid = hintRootOid;
+            } else {
+                // normal flow - delegate to OidGenerator to obtain a persistent root oid
+                persistedRootOid = session.createPersistentOrViewModelOid(adapter.getObject());
+            }
+
+            // associate root adapter with the new Oid, and remap
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("replacing Oid for root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
+            }
+            adapter.replaceOid(persistedRootOid);
+            oidAdapterMap.add(persistedRootOid, adapter);
+
+            // associate the collection adapters with new Oids, and re-map
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("replacing Oids for collection adapter(s) and re-adding into maps");
+            }
+            for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
+                final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
+                final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
+                oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
+            }
+
+
+            // some object store implementations may replace collection instances (eg ORM may replace with a cglib-enhanced
+            // proxy equivalent.  So, ensure that the collection adapters still wrap the correct pojos.
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("synchronizing collection pojos, remapping in pojo map if required");
+            }
+            for (final OneToManyAssociation otma : rootAndCollectionAdapters.getCollections()) {
+                final ObjectAdapter collectionAdapter = rootAndCollectionAdapters.getCollectionAdapter(otma);
+
+                final Object collectionPojoWrappedByAdapter = collectionAdapter.getObject();
+                final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapter);
+
+                if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
+                    pojoAdapterMap.remove(collectionAdapter);
+                    collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
+                    pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
+                }
+            }
+
+            if (LOG.isDebugEnabled()) {
+                LOG.debug("made persistent {}; was {}", adapter, transientRootOid);
+            }
+        }
+        
+        private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
+            final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
+            return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
+        }
+
+
+
+
+       
+    }
+    
+
+
+}
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java
index f94633d..da321e1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java
@@ -33,8 +33,10 @@ import org.apache.isis.core.metamodel.adapter.oid.Oid;
 
 /**
  * A map of the objects' identities and the adapters' of the objects.
+ * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
  */
-public class OidAdapterHashMap implements Iterable<Oid>, SessionScopedComponent {
+@Deprecated
+class OidAdapterHashMap implements Iterable<Oid>, SessionScopedComponent {
 
     private static final Logger LOG = LoggerFactory.getLogger(OidAdapterHashMap.class);
     public static final int DEFAULT_OID_ADAPTER_MAP_SIZE = 100;
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/PojoAdapterHashMap.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/PojoAdapterHashMap.java
index 2710f3a..e256a49 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/PojoAdapterHashMap.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/PojoAdapterHashMap.java
@@ -30,7 +30,11 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.components.SessionScopedComponent;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 
-public class PojoAdapterHashMap implements Iterable<ObjectAdapter>, SessionScopedComponent {
+/**
+ * @deprecated https://issues.apache.org/jira/browse/ISIS-1976
+ */
+@Deprecated
+class PojoAdapterHashMap implements Iterable<ObjectAdapter>, SessionScopedComponent {
 
     private static class IdentityHashKey {
         private final Object pojo;