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/10/24 08:51:35 UTC

[isis] 04/06: ISIS-2158: housekeeping: mementos

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

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

commit 50d8ea5fc21afd4e1c93acdb5d51aad19a922771
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Oct 24 08:46:26 2019 +0200

    ISIS-2158: housekeeping: mementos
---
 .../apache/isis/metamodel/spec/ManagedObject.java  |  12 +-
 .../org/apache/isis/runtime/memento/Memento.java   | 137 ++++------
 .../memento/ObjectAdapterMementoDefault.java       | 292 +++++++++++----------
 .../isis/runtime/memento/StandaloneData.java       |  18 +-
 4 files changed, 225 insertions(+), 234 deletions(-)

diff --git a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
index a929ae2..313fb44 100644
--- a/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
+++ b/core/metamodel/src/main/java/org/apache/isis/metamodel/spec/ManagedObject.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.oid.Oid;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
@@ -299,19 +300,26 @@ public interface ManagedObject {
         return true;
     }
     
+    // -- OID UTILITIES
+    
     static final class Oids {
         static final OidFactory oidFactory = OidFactory.buildDefault();
+        
+        static final <T extends Oid> T copy(T oid) {
+            if(oid == null) { return null; }
+            return _Casts.uncheckedCast(oid.copy()); 
+        }
     }
 
     static Oid _oid(ManagedObject adapter) {
         if(adapter instanceof ObjectAdapter) {
-            return promote(adapter).getOid();
+            return Oids.copy(promote(adapter).getOid());
         }
         
         return Oids.oidFactory.oidFor(adapter);
     }
 
-
+    
 
 
 
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 7ec7ece..331975b 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
@@ -21,10 +21,8 @@ package org.apache.isis.runtime.memento;
 
 import java.io.Serializable;
 import java.util.List;
-import java.util.stream.Stream;
 
 import org.apache.isis.commons.exceptions.UnknownTypeException;
-import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.collections._Arrays;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
@@ -36,12 +34,12 @@ import org.apache.isis.metamodel.facets.propcoll.accessor.PropertyOrCollectionAc
 import org.apache.isis.metamodel.facets.properties.update.modify.PropertySetterFacet;
 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.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;
 import lombok.extern.log4j.Log4j2;
 
@@ -58,53 +56,60 @@ public class Memento implements Serializable {
 
     private final static long serialVersionUID = 1L;
 
-    private final List<Oid> transientObjects = _Lists.newArrayList();
+    private final List<Oid> oids = _Lists.newArrayList();
 
+    @Getter private Data data;
 
-    private Data data;
-
-
-    ////////////////////////////////////////////////
-    // constructor, Encodeable
-    ////////////////////////////////////////////////
-
-    public Memento(final ManagedObject adapter) {
-        data = (adapter == null) ? null : createData( ManagedObject.promote(adapter) );
+    public Memento(ManagedObject adapter) {
+        data = (adapter == null) ? null : createData(adapter);
         log.debug("created memento for {}", this);
     }
+    
+    public ObjectAdapter recreateObject(
+            SpecificationLoader specLoader, 
+            PersistenceSession persistenceSession) {
+        
+        if (data == null) {
+            return null;
+        }
+        val spec = specLoader.lookupBySpecIdElseLoad(ObjectSpecId.of(data.getClassName()));
+        val oid = data.getOid();
+        return persistenceSession.adapterOfMemento(spec, oid, data);
+    }
 
+    @Override
+    public String toString() {
+        return "[" + (data == null ? null : data.getClassName() + "/" + data.getOid() + data) + "]";
+    }
+    
+    // -- HELPER
 
-    ////////////////////////////////////////////////
-    // createData
-    ////////////////////////////////////////////////
-
-    private Data createData(final ObjectAdapter adapter) {
-        if (adapter.getSpecification().isParentedOrFreeCollection() && !adapter.getSpecification().isEncodeable()) {
+    private Data createData(ManagedObject adapter) {
+        if (adapter.getSpecification().isParentedOrFreeCollection() && 
+                !adapter.getSpecification().isEncodeable()) {
             return createCollectionData(adapter);
         } else {
             return createObjectData(adapter);
         }
     }
 
-    private Data createCollectionData(final ObjectAdapter adapter) {
+    private Data createCollectionData(ManagedObject adapter) {
 
         final Data[] collData = CollectionFacet.Utils.streamAdapters(adapter)
-                .map(this::createReferenceData)
+                .map(this::createReferencedData)
                 .collect(_Arrays.toArray(Data.class, CollectionFacet.Utils.size(adapter)));
 
-        final String elementTypeSpecName = adapter.getSpecification().getFullIdentifier();
-        return new CollectionData(clone(adapter.getOid()), elementTypeSpecName, collData);
+        final String elementTypeId = adapter.getSpecification().getFullIdentifier();
+        return new CollectionData(ManagedObject._oid(adapter), elementTypeId, collData);
     }
 
-    private ObjectData createObjectData(final ObjectAdapter adapter) {
-        final Oid adapterOid = clone(adapter.getOid());
-        transientObjects.add(adapterOid);
-        final ObjectSpecification cls = adapter.getSpecification();
-        final ObjectData data = new ObjectData(adapterOid, cls.getFullIdentifier());
-
-        final Stream<ObjectAssociation> associations = cls.streamAssociations(Contributed.EXCLUDED);
+    private ObjectData createObjectData(ManagedObject adapter) {
+        val oid = ManagedObject._oid(adapter);
+        oids.add(oid);
+        val spec = adapter.getSpecification();
+        val data = new ObjectData(oid, spec.getFullIdentifier());
 
-        associations
+        spec.streamAssociations(Contributed.EXCLUDED)
         .filter(association->{
             if (association.isNotPersisted()) {
                 if (association.isOneToManyAssociation()) {
@@ -125,88 +130,52 @@ public class Memento implements Serializable {
         return data;
     }
 
-    private void createAssociationData(final ObjectAdapter adapter, final ObjectData data, final ObjectAssociation objectAssoc) {
+    private void createAssociationData(ManagedObject adapter, ObjectData data, ObjectAssociation objectAssoc) {
         Object assocData;
         if (objectAssoc.isOneToManyAssociation()) {
             val collAdapter = objectAssoc.get(adapter, InteractionInitiatedBy.FRAMEWORK);
-            assocData = createCollectionData(ManagedObject.promote(collAdapter));
+            assocData = createCollectionData(collAdapter);
         } else if (objectAssoc.getSpecification().isEncodeable()) {
-            final EncodableFacet facet = objectAssoc.getSpecification().getFacet(EncodableFacet.class);
+            val encodableFacet = objectAssoc.getSpecification().getFacet(EncodableFacet.class);
             val value = objectAssoc.get(adapter, InteractionInitiatedBy.FRAMEWORK);
-            assocData = facet.toEncodedString(value);
+            assocData = encodableFacet.toEncodedString(value);
         } else if (objectAssoc.isOneToOneAssociation()) {
             val referencedAdapter = objectAssoc.get(adapter, InteractionInitiatedBy.FRAMEWORK);
-            assocData = createReferenceData(ManagedObject.promote(referencedAdapter));
+            assocData = createReferencedData(referencedAdapter);
         } else {
             throw new UnknownTypeException(objectAssoc);
         }
         data.addField(objectAssoc.getId(), assocData);
     }
 
-    private Data createReferenceData(final ObjectAdapter referencedAdapter) {
+    private Data createReferencedData(ManagedObject referencedAdapter) {
         if (referencedAdapter == null) {
             return null;
         }
 
-        final Oid refOid = clone(referencedAdapter.getOid());
+        val refOid = ManagedObject._oid(referencedAdapter);
 
         if (refOid == null || refOid.isValue()) {
             return createStandaloneData(referencedAdapter);
         }
 
-
-        if (    (referencedAdapter.getSpecification().isParented() || refOid.isTransient()) &&
-                !transientObjects.contains(refOid)) {
-            transientObjects.add(refOid);
-            return createObjectData(referencedAdapter);
+        val refSpec = referencedAdapter.getSpecification();
+        
+        if (refSpec.isParented() || refOid.isTransient()) {
+            
+            if(!oids.contains(refOid)) {
+                oids.add(refOid);
+                return createObjectData(referencedAdapter);    
+            }
         }
 
-        final String specification = referencedAdapter.getSpecification().getFullIdentifier();
-        return new Data(refOid, specification);
-    }
-
-    private static <T extends Oid> T clone(final T oid) {
-        if(oid == null) { return null; }
-        return _Casts.uncheckedCast(oid.copy()); 
+        return new Data(refOid, refSpec.getFullIdentifier());
     }
 
-    private Data createStandaloneData(final ObjectAdapter adapter) {
+    private Data createStandaloneData(ManagedObject adapter) {
         return new StandaloneData(adapter);
     }
 
-    ////////////////////////////////////////////////
-    // properties
-    ////////////////////////////////////////////////
 
-    public Oid getOid() {
-        return data.getOid();
-    }
-
-    protected Data getData() {
-        return data;
-    }
-
-    ////////////////////////////////////////////////
-    // recreateObject
-    ////////////////////////////////////////////////
-
-    public ObjectAdapter recreateObject(SpecificationLoader specLoader, PersistenceSession persistenceSession) {
-        if (data == null) {
-            return null;
-        }
-        val spec = specLoader.lookupBySpecIdElseLoad(ObjectSpecId.of(data.getClassName()));
-        val oid = getOid();
-        return persistenceSession.adapterOfMemento(spec, oid, data);
-    }
-
-
-    // ///////////////////////////////////////////////////////////////
-    // toString, debug
-    // ///////////////////////////////////////////////////////////////
-
-    @Override
-    public String toString() {
-        return "[" + (data == null ? null : data.getClassName() + "/" + data.getOid() + data) + "]";
-    }
 
 }
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 585bb6c..f7731a3 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
@@ -35,7 +35,6 @@ import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.adapter.oid.ObjectNotFoundException;
 import org.apache.isis.metamodel.adapter.oid.Oid;
-import org.apache.isis.metamodel.adapter.oid.Oid.Factory;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.facets.object.encodeable.EncodableFacet;
 import org.apache.isis.metamodel.spec.ManagedObject;
@@ -44,6 +43,10 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
+import static org.apache.isis.commons.internal.base._With.requires;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
 import lombok.val;
 
 public class ObjectAdapterMementoDefault implements Serializable {
@@ -53,12 +56,12 @@ public class ObjectAdapterMementoDefault implements Serializable {
     /**
      * Factory method
      */
-    public static ObjectAdapterMementoDefault createOrNull(final ManagedObject adapter) {
+    public static ObjectAdapterMementoDefault createOrNull(ManagedObject adapter) {
         if (adapter == null) {
             return null;
         }
-        final Object object = adapter.getPojo();
-        if(object == null) {
+        val pojo = adapter.getPojo();
+        if(pojo == null) {
             return null;
         }
         return new ObjectAdapterMementoDefault(adapter);
@@ -67,26 +70,32 @@ public class ObjectAdapterMementoDefault implements Serializable {
     /**
      * Factory method
      */
-    public static ObjectAdapterMementoDefault createPersistent(RootOid rootOid, SpecificationLoader specificationLoader) {
+    public static ObjectAdapterMementoDefault createPersistent(
+            RootOid rootOid, 
+            SpecificationLoader specificationLoader) {
+        
         return new ObjectAdapterMementoDefault(rootOid, specificationLoader);
     }
 
     public static ObjectAdapterMementoDefault createForList(
-            final ArrayList<ObjectAdapterMementoDefault> list,
-            final ObjectSpecId objectSpecId) {
+            ArrayList<ObjectAdapterMementoDefault> list,
+            ObjectSpecId objectSpecId) {
+        
         return new ObjectAdapterMementoDefault(list, objectSpecId);
     }
 
     public static ObjectAdapterMementoDefault createForList(
-            final Collection<ObjectAdapterMementoDefault> list,
-            final ObjectSpecId objectSpecId) {
+            Collection<ObjectAdapterMementoDefault> list,
+            ObjectSpecId objectSpecId) {
+        
         return list != null ? createForList(_Lists.newArrayList(list), objectSpecId) :  null;
     }
 
     public static ObjectAdapterMementoDefault createForIterable(
-            final Iterable<?> iterable,
-            final ObjectSpecId specId,
-            final PersistenceSession persistenceSession) {
+            Iterable<?> iterable,
+            ObjectSpecId specId,
+            PersistenceSession persistenceSession) {
+        
         final List<ObjectAdapterMementoDefault> listOfMementos =
                 _NullSafe.stream(iterable)
                 .map(Functions.fromPojo(persistenceSession))
@@ -95,8 +104,9 @@ public class ObjectAdapterMementoDefault implements Serializable {
     }
 
     public static ObjectAdapterMementoDefault createForEncodeable(
-            final ObjectSpecId specId,
-            final String encodableValue) {
+            ObjectSpecId specId,
+            String encodableValue) {
+        
         return new ObjectAdapterMementoDefault(specId, encodableValue);
     }
 
@@ -108,32 +118,33 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public ObjectAdapter asAdapter(
-                    final ObjectAdapterMementoDefault oam,
-                    final PersistenceSession persistenceSession,
-                    final SpecificationLoader specificationLoader) {
-                return oam.recreateStrategy.getAdapter(oam, persistenceSession, specificationLoader);
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession,
+                    SpecificationLoader specificationLoader) {
+                
+                return memento.recreateStrategy.getAdapter(memento, persistenceSession, specificationLoader);
             }
 
             @Override
-            public int hashCode(final ObjectAdapterMementoDefault oam) {
-                return oam.recreateStrategy.hashCode(oam);
+            public int hashCode(ObjectAdapterMementoDefault memento) {
+                return memento.recreateStrategy.hashCode(memento);
             }
 
             @Override
-            public boolean equals(final ObjectAdapterMementoDefault oam, final Object other) {
+            public boolean equals(ObjectAdapterMementoDefault memento, Object other) {
                 if (!(other instanceof ObjectAdapterMementoDefault)) {
                     return false;
                 }
-                final ObjectAdapterMementoDefault otherOam = (ObjectAdapterMementoDefault) other;
-                if(otherOam.cardinality != SCALAR) {
+                final ObjectAdapterMementoDefault otherMemento = (ObjectAdapterMementoDefault) other;
+                if(otherMemento.cardinality != SCALAR) {
                     return false;
                 }
-                return oam.recreateStrategy.equals(oam, (ObjectAdapterMementoDefault) other);
+                return memento.recreateStrategy.equals(memento, otherMemento);
             }
 
             @Override
-            public String asString(final ObjectAdapterMementoDefault oam) {
-                return oam.recreateStrategy.toString(oam);
+            public String asString(final ObjectAdapterMementoDefault memento) {
+                return memento.recreateStrategy.toString(memento);
             }
         },
         /**
@@ -143,39 +154,40 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public ObjectAdapter asAdapter(
-                    final ObjectAdapterMementoDefault oam,
-                    final PersistenceSession persistenceSession,
-                    final SpecificationLoader specificationLoader) {
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession,
+                    SpecificationLoader specificationLoader) {
+                
                 final List<Object> listOfPojos =
-                        _Lists.map(oam.list, Functions.toPojo(persistenceSession, specificationLoader));
+                        _Lists.map(memento.list, Functions.toPojo(persistenceSession, specificationLoader));
 
                 return persistenceSession.adapterFor(listOfPojos);
             }
 
             @Override
-            public int hashCode(final ObjectAdapterMementoDefault oam) {
-                return oam.list.hashCode();
+            public int hashCode(ObjectAdapterMementoDefault memento) {
+                return memento.list.hashCode();
             }
 
             @Override
-            public boolean equals(final ObjectAdapterMementoDefault oam, final Object other) {
+            public boolean equals(ObjectAdapterMementoDefault memento, Object other) {
                 if (!(other instanceof ObjectAdapterMementoDefault)) {
                     return false;
                 }
-                final ObjectAdapterMementoDefault otherOam = (ObjectAdapterMementoDefault) other;
-                if(otherOam.cardinality != VECTOR) {
+                final ObjectAdapterMementoDefault otherMemento = (ObjectAdapterMementoDefault) other;
+                if(otherMemento.cardinality != VECTOR) {
                     return false;
                 }
-                return oam.list.equals(otherOam.list);
+                return memento.list.equals(otherMemento.list);
             }
 
             @Override
-            public String asString(final ObjectAdapterMementoDefault oam) {
-                return oam.list.toString();
+            public String asString(ObjectAdapterMementoDefault memento) {
+                return memento.list.toString();
             }
         };
 
-        void ensure(final Cardinality sort) {
+        void ensure(Cardinality sort) {
             if(this == sort) {
                 return;
             }
@@ -183,15 +195,15 @@ public class ObjectAdapterMementoDefault implements Serializable {
         }
 
         public abstract ObjectAdapter asAdapter(
-                final ObjectAdapterMementoDefault oam,
-                final PersistenceSession persistenceSession,
-                final SpecificationLoader specificationLoader);
+                ObjectAdapterMementoDefault memento,
+                PersistenceSession persistenceSession,
+                SpecificationLoader specificationLoader);
 
-        public abstract int hashCode(final ObjectAdapterMementoDefault oam);
+        public abstract int hashCode(ObjectAdapterMementoDefault memento);
 
-        public abstract boolean equals(final ObjectAdapterMementoDefault oam, final Object other);
+        public abstract boolean equals(ObjectAdapterMementoDefault memento, Object other);
 
-        public abstract String asString(final ObjectAdapterMementoDefault oam);
+        public abstract String asString(ObjectAdapterMementoDefault memento);
     }
 
     enum RecreateStrategy {
@@ -203,34 +215,40 @@ public class ObjectAdapterMementoDefault implements Serializable {
         ENCODEABLE {
             @Override
             ObjectAdapter recreateAdapter(
-                    final ObjectAdapterMementoDefault oam,
-                    final PersistenceSession persistenceSession,
-                    final SpecificationLoader specificationLoader) {
-                ObjectSpecId objectSpecId = oam.objectSpecId;
-                ObjectSpecification objectSpec = specificationLoader.lookupBySpecIdElseLoad(objectSpecId);
-                final EncodableFacet encodableFacet = objectSpec.getFacet(EncodableFacet.class);
-                return encodableFacet.fromEncodedString(oam.encodableValue);
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession,
+                    SpecificationLoader specificationLoader) {
+                
+                ObjectSpecId specId = memento.objectSpecId;
+                ObjectSpecification objectSpec = specificationLoader.lookupBySpecIdElseLoad(specId);
+                EncodableFacet encodableFacet = objectSpec.getFacet(EncodableFacet.class);
+                return encodableFacet.fromEncodedString(memento.encodableValue);
             }
 
             @Override
-            public boolean equals(ObjectAdapterMementoDefault oam, ObjectAdapterMementoDefault other) {
-                return other.recreateStrategy == ENCODEABLE && oam.encodableValue.equals(other.encodableValue);
+            public boolean equals(
+                    ObjectAdapterMementoDefault memento, 
+                    ObjectAdapterMementoDefault otherMemento) {
+                
+                return otherMemento.recreateStrategy == ENCODEABLE && 
+                        memento.encodableValue.equals(otherMemento.encodableValue);
             }
 
             @Override
-            public int hashCode(ObjectAdapterMementoDefault oam) {
-                return oam.encodableValue.hashCode();
+            public int hashCode(ObjectAdapterMementoDefault memento) {
+                return memento.encodableValue.hashCode();
             }
 
             @Override
-            public String toString(final ObjectAdapterMementoDefault oam) {
-                return oam.encodableValue;
+            public String toString(ObjectAdapterMementoDefault memento) {
+                return memento.encodableValue;
             }
 
             @Override
             public void resetVersion(
-                    ObjectAdapterMementoDefault ObjectAdapterMemento_LastKnownGood,
-                    final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession, 
+                    SpecificationLoader specificationLoader) {
             }
         },
         /**
@@ -240,10 +258,11 @@ public class ObjectAdapterMementoDefault implements Serializable {
         LOOKUP {
             @Override
             ObjectAdapter recreateAdapter(
-                    final ObjectAdapterMementoDefault oam,
-                    final PersistenceSession persistenceSession, 
-                    final SpecificationLoader specificationLoader) {
-                RootOid oid = Oid.unmarshaller().unmarshal(oam.persistentOidStr, RootOid.class);
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession, 
+                    SpecificationLoader specificationLoader) {
+                
+                RootOid oid = Oid.unmarshaller().unmarshal(memento.persistentOidStr, RootOid.class);
                 try {
                     final ObjectAdapter adapter = persistenceSession.adapterFor(oid);
                     return adapter;
@@ -254,20 +273,21 @@ public class ObjectAdapterMementoDefault implements Serializable {
                     // we copy this updated oid string into our memento so that, if we retry,
                     // we will succeed second time around
 
-                    oam.persistentOidStr = oid.enString();
+                    memento.persistentOidStr = oid.enString();
                 }
             }
 
             @Override
             public void resetVersion(
-                    final ObjectAdapterMementoDefault oam,
-                    final PersistenceSession persistenceSession,
-                    final SpecificationLoader specificationLoader) {
-                // REVIEW: this may be redundant because recreateAdapter also guarantees the version will be reset.
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession,
+                    SpecificationLoader specificationLoader) {
+                
+                //XXX REVIEW: this may be redundant because recreateAdapter also guarantees the version will be reset.
                 final ObjectAdapter adapter = recreateAdapter(
-                        oam, persistenceSession, specificationLoader);
+                        memento, persistenceSession, specificationLoader);
                 Oid oid = adapter.getOid();
-                oam.persistentOidStr = oid.enString();
+                memento.persistentOidStr = oid.enString();
             }
 
             @Override
@@ -296,10 +316,11 @@ public class ObjectAdapterMementoDefault implements Serializable {
              */
             @Override
             ObjectAdapter recreateAdapter(
-                    final ObjectAdapterMementoDefault oam,
-                    final PersistenceSession persistenceSession, 
-                    final SpecificationLoader specificationLoader) {
-                return oam.transientMemento.recreateObject(specificationLoader, persistenceSession);
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession, 
+                    SpecificationLoader specificationLoader) {
+                
+                return memento.transientMemento.recreateObject(specificationLoader, persistenceSession);
             }
 
             @Override
@@ -319,31 +340,37 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public void resetVersion(
-                    final ObjectAdapterMementoDefault ObjectAdapterMemento_LastKnownGood,
-                    final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+                    ObjectAdapterMementoDefault memento,
+                    PersistenceSession persistenceSession,
+                    SpecificationLoader specificationLoader) {
             }
         };
 
         public ObjectAdapter getAdapter(
-                final ObjectAdapterMementoDefault nom,
-                final PersistenceSession persistenceSession,
-                final SpecificationLoader specificationLoader) {
-            return recreateAdapter(nom, persistenceSession, specificationLoader);
+                ObjectAdapterMementoDefault memento,
+                PersistenceSession persistenceSession,
+                SpecificationLoader specificationLoader) {
+            
+            return recreateAdapter(memento, persistenceSession, specificationLoader);
         }
 
         abstract ObjectAdapter recreateAdapter(
-                final ObjectAdapterMementoDefault nom,
-                final PersistenceSession persistenceSession, 
-                final SpecificationLoader specificationLoader);
+                ObjectAdapterMementoDefault memento,
+                PersistenceSession persistenceSession, 
+                SpecificationLoader specificationLoader);
 
-        public abstract boolean equals(ObjectAdapterMementoDefault oam, ObjectAdapterMementoDefault other);
-        public abstract int hashCode(ObjectAdapterMementoDefault ObjectAdapterMemento_LastKnownGood);
+        public abstract boolean equals(
+                ObjectAdapterMementoDefault memento, 
+                ObjectAdapterMementoDefault otherMemento);
+        
+        public abstract int hashCode(ObjectAdapterMementoDefault memento);
 
-        public abstract String toString(ObjectAdapterMementoDefault adapterMemento);
+        public abstract String toString(ObjectAdapterMementoDefault memento);
 
         public abstract void resetVersion(
-                ObjectAdapterMementoDefault ObjectAdapterMemento_LastKnownGood,
-                final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader);
+                ObjectAdapterMementoDefault memento,
+                PersistenceSession persistenceSession, 
+                SpecificationLoader specificationLoader);
     }
 
 
@@ -405,8 +432,8 @@ public class ObjectAdapterMementoDefault implements Serializable {
     private ArrayList<ObjectAdapterMementoDefault> list;
 
     public ObjectAdapterMementoDefault(
-            final ArrayList<ObjectAdapterMementoDefault> list, 
-            final ObjectSpecId objectSpecId) {
+            ArrayList<ObjectAdapterMementoDefault> list, 
+            ObjectSpecId objectSpecId) {
         
         this.cardinality = Cardinality.VECTOR;
         this.list = list;
@@ -437,17 +464,17 @@ public class ObjectAdapterMementoDefault implements Serializable {
         this.recreateStrategy = RecreateStrategy.LOOKUP;
     }
 
-    private ObjectAdapterMementoDefault(final ManagedObject adapter) {
-        if (adapter == null) {
-            throw new IllegalArgumentException("adapter cannot be null");
-        }
+    private ObjectAdapterMementoDefault(ManagedObject adapter) {
+        
+        requires(adapter, "adapter");
+        
         this.cardinality = Cardinality.SCALAR;
-        final ObjectSpecification specification = adapter.getSpecification();
-        objectSpecId = specification.getSpecId();
+        val spec = adapter.getSpecification();
+        objectSpecId = spec.getSpecId();
         init(adapter);
     }
 
-    private ObjectAdapterMementoDefault(final ObjectSpecId specId, final String encodableValue) {
+    private ObjectAdapterMementoDefault(ObjectSpecId specId, String encodableValue) {
         this.cardinality = Cardinality.SCALAR;
         this.objectSpecId = specId;
         this.encodableValue = encodableValue;
@@ -455,12 +482,12 @@ public class ObjectAdapterMementoDefault implements Serializable {
     }
 
 
-    private void init(final ManagedObject adapter) {
+    private void init(ManagedObject adapter) {
 
-        final ObjectSpecification specification = adapter.getSpecification();
+        val spec = adapter.getSpecification();
 
-        final EncodableFacet encodableFacet = specification.getFacet(EncodableFacet.class);
-        final boolean isEncodable = encodableFacet != null;
+        val encodableFacet = spec.getFacet(EncodableFacet.class);
+        val isEncodable = encodableFacet != null;
         if (isEncodable) {
             encodableValue = encodableFacet.toEncodedString(adapter);
             recreateStrategy = RecreateStrategy.ENCODEABLE;
@@ -494,8 +521,9 @@ public class ObjectAdapterMementoDefault implements Serializable {
 
 
     public void resetVersion(
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
+            PersistenceSession persistenceSession,
+            SpecificationLoader specificationLoader) {
+        
         ensureScalar();
         recreateStrategy.resetVersion(this, persistenceSession, specificationLoader);
     }
@@ -507,7 +535,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
     }
 
     public Bookmark asHintingBookmark() {
-        Bookmark bookmark = asBookmark();
+        val bookmark = asBookmark();
         return hintId != null && bookmark != null
                 ? new HintStore.BookmarkWithHintId(bookmark, hintId)
                         : bookmark;
@@ -524,8 +552,8 @@ public class ObjectAdapterMementoDefault implements Serializable {
      * can call {@link #setAdapter(ObjectAdapter)} to keep this memento in sync.
      */
     public ObjectAdapter getObjectAdapter(
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
+            PersistenceSession persistenceSession,
+            SpecificationLoader specificationLoader) {
         
         val spec = specificationLoader.loadSpecification(objectSpecId);
         
@@ -542,7 +570,7 @@ public class ObjectAdapterMementoDefault implements Serializable {
      *
      * @param adapter
      */
-    public void setAdapter(final ObjectAdapter adapter) {
+    public void setAdapter(ManagedObject adapter) {
         ensureScalar();
         init(adapter);
     }
@@ -556,21 +584,21 @@ public class ObjectAdapterMementoDefault implements Serializable {
      * {@link ConcurrencyChecking concurrency checking} of the OID.
      */
     public boolean containedIn(
-            List<ObjectAdapterMementoDefault> list,
-            final PersistenceSession persistenceSession,
-            final SpecificationLoader specificationLoader) {
+            List<ObjectAdapterMementoDefault> mementos,
+            PersistenceSession persistenceSession,
+            SpecificationLoader specificationLoader) {
 
         ensureScalar();
 
-        // REVIEW: heavy handed, ought to be possible to just compare the OIDs
+        //XXX REVIEW: heavy handed, ought to be possible to just compare the OIDs
         // ignoring the concurrency checking
-        final ObjectAdapter currAdapter = getObjectAdapter(persistenceSession,
-                specificationLoader);
-        for (ObjectAdapterMementoDefault each : list) {
-            if(each == null) {
+        val currAdapter = getObjectAdapter(persistenceSession, specificationLoader);
+        
+        for (val memento : mementos) {
+            if(memento == null) {
                 continue;
             }
-            final ObjectAdapter otherAdapter = each.getObjectAdapter(persistenceSession, specificationLoader);
+            val otherAdapter = memento.getObjectAdapter(persistenceSession, specificationLoader);
             if(currAdapter == otherAdapter) {
                 return true;
             }
@@ -599,24 +627,15 @@ public class ObjectAdapterMementoDefault implements Serializable {
     }
 
 
-    //////////////////////////////////////////////////
-    // Functions
-    //////////////////////////////////////////////////
-
+    // -- FUNCTIONS
 
+    @NoArgsConstructor(access = AccessLevel.PRIVATE)
     public final static class Functions {
 
-        private Functions() {
-        }
-
         public static Function<Object, ObjectAdapterMementoDefault> fromPojo(final ObjectAdapterProvider adapterProvider) {
             return pojo->ObjectAdapterMementoDefault.createOrNull( adapterProvider.adapterFor(pojo) );
         }
 
-        public static Function<ObjectAdapter, ObjectAdapterMementoDefault> fromAdapter() {
-            return ObjectAdapterMementoDefault::createOrNull;
-        }
-
         public static Function<ObjectAdapterMementoDefault, ObjectAdapter> fromMemento(
                 final PersistenceSession persistenceSession,
                 final SpecificationLoader specificationLoader) {
@@ -631,20 +650,15 @@ public class ObjectAdapterMementoDefault implements Serializable {
             };
         }
 
-        public static Function<ObjectAdapter, ObjectAdapterMementoDefault> toMemento() {
-            return ObjectAdapterMementoDefault::createOrNull;
-        }
-
-
         public static Function<ObjectAdapterMementoDefault, Object> toPojo(
                 final PersistenceSession persistenceSession,
                 final SpecificationLoader specificationLoader) {
-            return input->{
-                if(input == null) {
+            
+            return memento->{
+                if(memento == null) {
                     return null;
                 }
-                final ObjectAdapter objectAdapter = input
-                        .getObjectAdapter(persistenceSession, specificationLoader);
+                val objectAdapter = memento.getObjectAdapter(persistenceSession, specificationLoader);
                 if(objectAdapter == null) {
                     return null;
                 }
@@ -652,10 +666,6 @@ public class ObjectAdapterMementoDefault implements Serializable {
             };
         }
 
-        public static Function<ObjectAdapterMementoDefault, RootOid> toOid() {
-            return ObjectAdapterMemento_LastKnownGood->Factory.ofBookmark(ObjectAdapterMemento_LastKnownGood.asBookmark());
-        }
-
     }
 
     private void ensureScalar() {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java
index 740a280..2a7b636 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/StandaloneData.java
@@ -29,6 +29,7 @@ import org.apache.isis.commons.internal.encoding.DataOutputExtended;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.metamodel.facets.object.encodeable.EncodableFacet;
+import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 
@@ -39,7 +40,10 @@ public class StandaloneData extends Data {
     private static final long serialVersionUID = 1L;
 
     private static enum As {
-        ENCODED_STRING(0), SERIALIZABLE(1);
+        
+        ENCODED_STRING(0), 
+        SERIALIZABLE(1);
+        
         static Map<Integer, As> cache = new HashMap<Integer, As>();
         static {
             for (final As as : values()) {
@@ -48,19 +52,19 @@ public class StandaloneData extends Data {
         }
         private final int idx;
 
-        private As(final int idx) {
+        private As(int idx) {
             this.idx = idx;
         }
 
-        static As get(final int idx) {
+        static As get(int idx) {
             return cache.get(idx);
         }
 
-        public static As readFrom(final DataInputExtended input) throws IOException {
+        public static As readFrom(DataInputExtended input) throws IOException {
             return get(input.readByte());
         }
 
-        public void writeTo(final DataOutputExtended output) throws IOException {
+        public void writeTo(DataOutputExtended output) throws IOException {
             output.writeByte(idx);
         }
     }
@@ -68,7 +72,7 @@ public class StandaloneData extends Data {
     private String objectAsEncodedString;
     private Serializable objectAsSerializable;
 
-    public StandaloneData(final ObjectAdapter adapter) {
+    public StandaloneData(ManagedObject adapter) {
         super(null, adapter.getSpecification().getFullIdentifier());
 
         final Object object = adapter.getPojo();
@@ -78,7 +82,7 @@ public class StandaloneData extends Data {
             return;
         }
 
-        final EncodableFacet encodeableFacet = adapter.getSpecification().getFacet(EncodableFacet.class);
+        val encodeableFacet = adapter.getSpecification().getFacet(EncodableFacet.class);
         if (encodeableFacet != null) {
             this.objectAsEncodedString = encodeableFacet.toEncodedString(adapter);
             initialized();