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/04 20:25:45 UTC

[isis] 03/24: ISIS-1976: make ObjectAdapter's Oid final

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 d43ad073227e0911cb8f731ef032723b16a8ba46
Author: a.huber@corax.at <a....@luna>
AuthorDate: Sun Sep 2 18:46:45 2018 +0200

    ISIS-1976: make ObjectAdapter's Oid final
---
 .../isis/core/metamodel/adapter/ObjectAdapter.java |  19 +-
 .../runtime/persistence/adapter/PojoAdapter.java   |  26 +--
 .../system/persistence/PersistenceSession4.java    |  14 +-
 .../runtime/persistence/adapter/PojoAdapter.java   |  31 +--
 .../system/persistence/PersistenceSession5.java    |  28 +--
 .../adaptermanager/ObjectAdapterContext.java       | 227 +++++++++++++++++++++
 .../adaptermanager/ObjectAdapterLegacy.java        | 190 +----------------
 7 files changed, 283 insertions(+), 252 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
index ef7cd6a..dc30bb6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
@@ -33,6 +33,7 @@ import org.apache.isis.core.commons.lang.MethodUtil;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 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.ConcurrencyException;
 import org.apache.isis.core.metamodel.adapter.version.Version;
 import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
@@ -169,11 +170,11 @@ public interface ObjectAdapter extends Instance {
      */
     Oid getOid();
 
-    /**
-     * Since {@link Oid}s are now immutable, it is the reference from the
-     * {@link ObjectAdapter} to its {@link Oid} that must now be updated.
-     */
-    void replaceOid(Oid persistedOid);
+//    /**
+//     * Since {@link Oid}s are now immutable, it is the reference from the
+//     * {@link ObjectAdapter} to its {@link Oid} that must now be updated.
+//     */
+//    void replaceOid(Oid persistedOid);
 
     /**
      * Returns either itself (if this is a root) or the parented collections, the
@@ -491,5 +492,13 @@ public interface ObjectAdapter extends Instance {
         }
     }
 
+    /**
+     * 
+     * @param persistedRootOid
+     * @return a copy of this adapter, having a new RootOid 
+     * @since 2.0.0-M2
+     */
+    ObjectAdapter withOid(RootOid newOid);
+
 
 }
diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index c38b67e..1ed2839 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -19,9 +19,8 @@
 
 package org.apache.isis.core.runtime.persistence.adapter;
 
-import java.util.Objects;
-
 import org.datanucleus.enhancement.Persistable;
+//import org.datanucleus.enhancement.Persistable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,7 +42,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.Specification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession4;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
@@ -53,16 +52,17 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
     private final AuthenticationSession authenticationSession;
     private final SpecificationLoader specificationLoader;
-    private final PersistenceSession4 persistenceSession;
+    private final PersistenceSession persistenceSession;
 
     /**
      * can be {@link #replacePojo(Object) replace}d.
      */
     private Object pojo;
+    
     /**
      * can be {@link #replaceOid(Oid) replace}d.
      */
-    private Oid oid;
+    private final Oid oid;
 
     /**
      * only for standalone or parented collections.
@@ -74,7 +74,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
             final Oid oid,
             final AuthenticationSession authenticationSession,
             final SpecificationLoader specificationLoader,
-            final PersistenceSession4 persistenceSession) {
+            final PersistenceSession persistenceSession) {
 
         this.persistenceSession = persistenceSession;
         this.specificationLoader = specificationLoader;
@@ -130,13 +130,6 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         return oid;
     }
 
-    @Override
-    public void replaceOid(Oid persistedOid) {
-        Objects.requireNonNull(oid); // values have no oid, so cannot be replaced
-        this.oid = persistedOid;
-    }
-
-
     // -- isParentedCollection, isValue
 
     @Override
@@ -149,8 +142,6 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         return oid == null;
     }
 
-
-
     // -- isTransient, representsPersistent, isDestroyed
 
     @Override
@@ -438,6 +429,9 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         throw new UnsupportedOperationException();
     }
 
-
+    @Override
+    public ObjectAdapter withOid(RootOid newOid) {
+        return new PojoAdapter(pojo, newOid, authenticationSession, specificationLoader, persistenceSession);
+    }
 
 }
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 fe9d89f..8687011 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
@@ -110,8 +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.ObjectAdapterContext;
 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;
@@ -1114,7 +1114,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     public ObjectAdapter getAdapterFor(final Object pojo) {
         Objects.requireNonNull(pojo);
 
-        return objectAdapterContext.lookupPojoAdapter(pojo);  
+        return objectAdapterContext.lookupAdapterByPojo(pojo);  
     }
 
     @Override
@@ -1122,7 +1122,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         Objects.requireNonNull(oid);
         ensureMapsConsistent(oid);
 
-        return objectAdapterContext.lookupOidAdapter(oid);
+        return objectAdapterContext.lookupAdapterById(oid);
     }
 
 
@@ -1184,7 +1184,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     private void ensureMapsConsistent(final Oid oid) {
         Objects.requireNonNull(oid);
 
-        final ObjectAdapter adapter = objectAdapterContext.lookupOidAdapter(oid);
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
         if (adapter == null) {
             return;
         }
@@ -1194,7 +1194,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
         final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupPojoAdapter(adapterPojo);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(adapterPojo);
 
         if(adapterPojo == null) {
             // nothing to check
@@ -1205,7 +1205,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
         final Oid adapterOid = adapter.getOid();
-        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupOidAdapter(adapterOid);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterById(adapterOid);
 
         if(adapterOid == null) {
             // nothing to check
@@ -1688,7 +1688,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
         Assert.assertNotNull(adapter);
         final Object pojo = adapter.getObject();
-        Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsPojoAdapter(pojo));
+        Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsAdapterForPojo(pojo));
 
         if (LOG.isDebugEnabled()) {
             // don't interact with the underlying object because may be a ghost
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index c845737..c2e6958 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -19,7 +19,9 @@
 
 package org.apache.isis.core.runtime.persistence.adapter;
 
-import java.util.Objects;
+import org.datanucleus.enhancement.Persistable;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.exceptions.IsisException;
@@ -39,20 +41,18 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.Specification;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession5;
-import org.datanucleus.enhancement.Persistable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
 
     private final static Logger LOG = LoggerFactory.getLogger(PojoAdapter.class);
 
-    // -- Constructor, fields, finalizer
+    // -- Constructor, fields
 
     private final AuthenticationSession authenticationSession;
     private final SpecificationLoader specificationLoader;
-    private final PersistenceSession5 persistenceSession;
+    private final PersistenceSession persistenceSession;
 
     /**
      * can be {@link #replacePojo(Object) replace}d.
@@ -61,7 +61,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
     /**
      * can be {@link #replaceOid(Oid) replace}d.
      */
-    private Oid oid;
+    private final Oid oid;
 
     /**
      * only for standalone or parented collections.
@@ -73,7 +73,7 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
             final Oid oid,
             final AuthenticationSession authenticationSession,
             final SpecificationLoader specificationLoader,
-            final PersistenceSession5 persistenceSession) {
+            final PersistenceSession persistenceSession) {
 
         this.persistenceSession = persistenceSession;
         this.specificationLoader = specificationLoader;
@@ -129,11 +129,11 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         return oid;
     }
 
-    @Override
-    public void replaceOid(Oid persistedOid) {
-        Objects.requireNonNull(oid); // values have no oid, so cannot be replaced
-        this.oid = persistedOid;
-    }
+//    @Override
+//    public void replaceOid(Oid persistedOid) {
+//        Objects.requireNonNull(oid); // values have no oid, so cannot be replaced
+//        this.oid = persistedOid;
+//    }
 
 
     // -- isParentedCollection, isValue
@@ -437,6 +437,9 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         throw new UnsupportedOperationException();
     }
 
-
+    @Override
+    public ObjectAdapter withOid(RootOid newOid) {
+        return new PojoAdapter(pojo, newOid, authenticationSession, specificationLoader, persistenceSession);
+    }
 
 }
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 6d5baa6..e72a73c 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
@@ -110,8 +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.ObjectAdapterContext;
 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;
@@ -985,18 +985,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         return adapter.isParentedCollection();
     }
 
-
-    // -- ObjectPersistor impl
-
-    private void makePersistent(final ObjectAdapter adapter) {
-        makePersistentInTransaction(adapter);
-    }
-
-
-    private void remove(final ObjectAdapter adapter) {
-        destroyObjectInTransaction(adapter);
-    }
-
     // -- destroyObjectInTransaction
 
     /**
@@ -1019,8 +1007,6 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         });
     }
 
-
-
     // -- newXxxCommand
     /**
      * Makes an {@link ObjectAdapter} persistent. The specified object should be
@@ -1112,7 +1098,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     public ObjectAdapter getAdapterFor(final Object pojo) {
         Objects.requireNonNull(pojo);
 
-        return objectAdapterContext.lookupPojoAdapter(pojo);  
+        return objectAdapterContext.lookupAdapterByPojo(pojo);  
     }
 
     @Override
@@ -1120,7 +1106,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
         Objects.requireNonNull(oid);
         ensureMapsConsistent(oid);
 
-        return objectAdapterContext.lookupOidAdapter(oid);
+        return objectAdapterContext.lookupAdapterById(oid);
     }
 
 
@@ -1182,7 +1168,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
     private void ensureMapsConsistent(final Oid oid) {
         Objects.requireNonNull(oid);
 
-        final ObjectAdapter adapter = objectAdapterContext.lookupOidAdapter(oid);
+        final ObjectAdapter adapter = objectAdapterContext.lookupAdapterById(oid);
         if (adapter == null) {
             return;
         }
@@ -1192,7 +1178,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
         final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupPojoAdapter(adapterPojo);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterByPojo(adapterPojo);
 
         if(adapterPojo == null) {
             // nothing to check
@@ -1203,7 +1189,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
     private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
         final Oid adapterOid = adapter.getOid();
-        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupOidAdapter(adapterOid);
+        final ObjectAdapter adapterAccordingToMap = objectAdapterContext.lookupAdapterById(adapterOid);
 
         if(adapterOid == null) {
             // nothing to check
@@ -1700,7 +1686,7 @@ implements IsisLifecycleListener2.PersistenceSessionLifecycleManagement {
 
         Assert.assertNotNull(adapter);
         final Object pojo = adapter.getObject();
-        Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsPojoAdapter(pojo));
+        Assert.assertFalse("POJO Map already contains object", pojo, objectAdapterContext.containsAdapterForPojo(pojo));
 
         if (LOG.isDebugEnabled()) {
             // don't interact with the underlying object because may be a ghost
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
new file mode 100644
index 0000000..59a6b46
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -0,0 +1,227 @@
+/*
+ *  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.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 ObjectAdapterContext {
+    private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
+    private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
+    private final ServicesInjector servicesInjector;
+    
+    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
+            ObjectAdapterLegacy.LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
+        }
+
+        try {
+            pojoAdapterMap.close();
+        } catch(final Throwable ex) {
+            // ignore
+            ObjectAdapterLegacy.LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
+        }
+    }
+
+    public boolean containsAdapterForPojo(Object pojo) {
+        return pojoAdapterMap.containsPojo(pojo);
+    }
+    
+    public ObjectAdapter lookupAdapterByPojo(Object pojo) {
+        return pojoAdapterMap.getAdapter(pojo);
+    }
+
+    public ObjectAdapter lookupAdapterById(Oid oid) {
+        return oidAdapterMap.getAdapter(oid);
+    }
+    
+    public void removeAdapter(ObjectAdapter adapter) {
+        if(adapter==null) {
+            return; // nothing to do
+        }
+        final Oid oid = adapter.getOid();
+        if (oid != null) { // eg. value objects don't have an Oid
+            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 PersistenceSession} 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();
+
+        final RootAndCollectionAdapters rootAndCollectionAdapters = new RootAndCollectionAdapters(adapter, session);
+
+        removeFromCache(rootAndCollectionAdapters, transientRootOid);
+        
+        // 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 (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+            ObjectAdapterLegacy.LOG.debug("replacing root adapter and re-adding into maps; oid is now: {} (was: {})", persistedRootOid.enString(), transientRootOid.enString());
+        }
+        
+        final ObjectAdapter adapterReplacement = adapter.withOid(persistedRootOid); 
+        
+        replaceRootAdapter(persistedRootOid, adapterReplacement, rootAndCollectionAdapters);
+        
+        if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+            ObjectAdapterLegacy.LOG.debug("made persistent {}; was {}", adapterReplacement, transientRootOid);
+        }
+    }
+
+    private void replaceRootAdapter(
+            final RootOid persistedRootOid, 
+            final ObjectAdapter adapterReplacement, 
+            final RootAndCollectionAdapters rootAndCollectionAdapters) {
+        
+        oidAdapterMap.add(persistedRootOid, adapterReplacement);
+        pojoAdapterMap.add(adapterReplacement.getObject(), adapterReplacement);
+
+        // associate the collection adapters with new Oids, and re-map
+        ObjectAdapterLegacy.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 (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+            ObjectAdapterLegacy.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, adapterReplacement);
+
+            if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
+                pojoAdapterMap.remove(collectionAdapter);
+                collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
+                pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
+            }
+        }
+        
+    }
+
+    private void removeFromCache(
+            final RootAndCollectionAdapters rootAndCollectionAdapters, 
+            final RootOid transientRootOid) {
+        ObjectAdapterLegacy.LOG.debug("remapAsPersistent: {}", transientRootOid);
+        ObjectAdapterLegacy.LOG.debug("removing root adapter from oid map");
+    
+        boolean removed = oidAdapterMap.remove(transientRootOid);
+        if (!removed) {
+            ObjectAdapterLegacy.LOG.warn("could not remove oid: {}", transientRootOid);
+            // should we fail here with a more serious error?
+        }
+    
+        if (ObjectAdapterLegacy.LOG.isDebugEnabled()) {
+            ObjectAdapterLegacy.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) {
+                ObjectAdapterLegacy.LOG.warn("could not remove collectionOid: {}", collectionOid);
+                // should we fail here with a more serious error?
+            }
+        }
+    }
+
+    private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
+        final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
+        return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
+    }
+
+
+
+
+
+}
\ No newline at end of file
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
index 77e21a8..77b8ed1 100644
--- 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
@@ -30,13 +30,10 @@ import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.commons.internal.exceptions._Exceptions;
 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.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.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetUtils;
@@ -44,7 +41,6 @@ import org.apache.isis.core.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.core.metamodel.facets.propcoll.accessor.PropertyOrCollectionAccessorFacet;
 import org.apache.isis.core.metamodel.facets.properties.update.modify.PropertySetterFacet;
 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.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
@@ -67,7 +63,7 @@ import org.apache.isis.schema.utils.CommonDtoUtils;
  */
 public class ObjectAdapterLegacy {
     
-    private static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterLegacy.class);
+    static final Logger LOG = LoggerFactory.getLogger(ObjectAdapterLegacy.class);
     
     public static ObjectAdapterContext openContext(ServicesInjector servicesInjector) {
         final ObjectAdapterContext objectAdapterContext = new ObjectAdapterContext(servicesInjector);
@@ -79,190 +75,6 @@ public class ObjectAdapterLegacy {
         
     }
     
-    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);
-        }
-
-
-
-
-       
-    }
-    
     // -- CommandExecutorServiceDefault --------------------------------------------------------
     
     public static class __CommandExecutorServiceDefault {