You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2019/12/05 16:51:21 UTC

[isis] branch master updated: ISIS-2177: move ObjectAdapterMemento static methods to proper service

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 4e8676e  ISIS-2177: move ObjectAdapterMemento static methods to proper service
4e8676e is described below

commit 4e8676e087bc7bf0302ccad2cc6c77f3f6d69006
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Dec 5 17:51:08 2019 +0100

    ISIS-2177: move ObjectAdapterMemento static methods to proper service
---
 ...apterMementoDefault.java => MementoHelper.java} | 130 ++++++++++-----------
 .../isis/runtime/memento/MementoStoreLegacy.java   |  16 ++-
 .../java/org/apache/isis/runtime/memento/Null.java |  35 ------
 .../isis/runtime/memento/ObjectAdapterMemento.java |  44 +------
 ...pport.java => ObjectAdapterMementoService.java} |  18 ++-
 ...ava => ObjectAdapterMementoServiceDefault.java} |  24 +---
 .../apache/isis/runtime/memento/ObjectData.java    |  18 ++-
 .../wicket/model/models/EntityCollectionModel.java |  15 ++-
 .../viewer/wicket/model/models/EntityModel.java    |   4 +-
 .../model/models/EntityModelForReference.java      |   4 +-
 .../viewer/wicket/model/models/ScalarModel.java    |  18 ++-
 .../viewer/wicket/model/models/ValueModel.java     |   2 +-
 .../ScalarModel_isScalarSubtypingAnyOf_Test.java   |   4 +-
 .../webapp/context/IsisWebAppCommonContext.java    |  14 +--
 14 files changed, 148 insertions(+), 198 deletions(-)

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/MementoHelper.java
similarity index 80%
rename from core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoDefault.java
rename to core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoHelper.java
index e9b39de..5cef276 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/MementoHelper.java
@@ -24,12 +24,10 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.function.Function;
-import java.util.stream.Collectors;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.applib.services.hint.HintStore;
 import org.apache.isis.commons.internal.assertions._Assert;
-import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.metamodel.adapter.ObjectAdapterProvider;
@@ -41,8 +39,6 @@ import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.system.context.IsisContext;
-import org.apache.isis.runtime.system.persistence.PersistenceSession;
 
 import static org.apache.isis.commons.internal.base._With.requires;
 
@@ -51,14 +47,14 @@ import lombok.NoArgsConstructor;
 import lombok.val;
 
 
-final class ObjectAdapterMementoDefault implements Serializable {
+final class MementoHelper implements Serializable {
 
     private static final long serialVersionUID = 1L;
 
     /**
      * Factory method
      */
-    public static ObjectAdapterMementoDefault createOrNull(ManagedObject adapter) {
+    public static MementoHelper createOrNull(ManagedObject adapter) {
         if (adapter == null) {
             return null;
         }
@@ -66,28 +62,28 @@ final class ObjectAdapterMementoDefault implements Serializable {
         if(pojo == null) {
             return null;
         }
-        return new ObjectAdapterMementoDefault(adapter);
+        return new MementoHelper(adapter);
     }
 
     /**
      * Factory method
      */
-    static ObjectAdapterMementoDefault createPersistent(
+    static MementoHelper createPersistent(
             RootOid rootOid, 
             SpecificationLoader specificationLoader) {
         
-        return new ObjectAdapterMementoDefault(rootOid, specificationLoader);
+        return new MementoHelper(rootOid, specificationLoader);
     }
 
-    static ObjectAdapterMementoDefault createForList(
-            ArrayList<ObjectAdapterMementoDefault> list,
+    static MementoHelper createForList(
+            ArrayList<MementoHelper> list,
             ObjectSpecId objectSpecId) {
         
-        return new ObjectAdapterMementoDefault(list, objectSpecId);
+        return new MementoHelper(list, objectSpecId);
     }
 
-    static ObjectAdapterMementoDefault createForList(
-            Collection<ObjectAdapterMementoDefault> list,
+    static MementoHelper createForList(
+            Collection<MementoHelper> list,
             ObjectSpecId objectSpecId) {
         
         return list != null ? createForList(_Lists.newArrayList(list), objectSpecId) :  null;
@@ -105,11 +101,11 @@ final class ObjectAdapterMementoDefault implements Serializable {
 //        return createForList(listOfMementos, specId);
 //    }
 
-    static ObjectAdapterMementoDefault createForEncodeable(
+    static MementoHelper createForEncodeable(
             ObjectSpecId specId,
             String encodableValue) {
         
-        return new ObjectAdapterMementoDefault(specId, encodableValue);
+        return new MementoHelper(specId, encodableValue);
     }
 
     enum Cardinality {
@@ -120,7 +116,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public ManagedObject asAdapter(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
@@ -128,16 +124,16 @@ final class ObjectAdapterMementoDefault implements Serializable {
             }
 
             @Override
-            public int hashCode(ObjectAdapterMementoDefault memento) {
+            public int hashCode(MementoHelper memento) {
                 return memento.recreateStrategy.hashCode(memento);
             }
 
             @Override
-            public boolean equals(ObjectAdapterMementoDefault memento, Object other) {
-                if (!(other instanceof ObjectAdapterMementoDefault)) {
+            public boolean equals(MementoHelper memento, Object other) {
+                if (!(other instanceof MementoHelper)) {
                     return false;
                 }
-                final ObjectAdapterMementoDefault otherMemento = (ObjectAdapterMementoDefault) other;
+                final MementoHelper otherMemento = (MementoHelper) other;
                 if(otherMemento.cardinality != SCALAR) {
                     return false;
                 }
@@ -145,7 +141,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
             }
 
             @Override
-            public String asString(final ObjectAdapterMementoDefault memento) {
+            public String asString(final MementoHelper memento) {
                 return memento.recreateStrategy.toString(memento);
             }
         },
@@ -156,7 +152,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public ManagedObject asAdapter(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
@@ -167,16 +163,16 @@ final class ObjectAdapterMementoDefault implements Serializable {
             }
 
             @Override
-            public int hashCode(ObjectAdapterMementoDefault memento) {
+            public int hashCode(MementoHelper memento) {
                 return memento.list.hashCode();
             }
 
             @Override
-            public boolean equals(ObjectAdapterMementoDefault memento, Object other) {
-                if (!(other instanceof ObjectAdapterMementoDefault)) {
+            public boolean equals(MementoHelper memento, Object other) {
+                if (!(other instanceof MementoHelper)) {
                     return false;
                 }
-                final ObjectAdapterMementoDefault otherMemento = (ObjectAdapterMementoDefault) other;
+                final MementoHelper otherMemento = (MementoHelper) other;
                 if(otherMemento.cardinality != VECTOR) {
                     return false;
                 }
@@ -184,7 +180,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
             }
 
             @Override
-            public String asString(ObjectAdapterMementoDefault memento) {
+            public String asString(MementoHelper memento) {
                 return memento.list.toString();
             }
         };
@@ -197,15 +193,15 @@ final class ObjectAdapterMementoDefault implements Serializable {
         }
 
         public abstract ManagedObject asAdapter(
-                ObjectAdapterMementoDefault memento,
+                MementoHelper memento,
                 MementoStore mementoStore,
                 SpecificationLoader specificationLoader);
 
-        public abstract int hashCode(ObjectAdapterMementoDefault memento);
+        public abstract int hashCode(MementoHelper memento);
 
-        public abstract boolean equals(ObjectAdapterMementoDefault memento, Object other);
+        public abstract boolean equals(MementoHelper memento, Object other);
 
-        public abstract String asString(ObjectAdapterMementoDefault memento);
+        public abstract String asString(MementoHelper memento);
     }
 
     enum RecreateStrategy {
@@ -217,7 +213,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
         ENCODEABLE {
             @Override
             ManagedObject recreateAdapter(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
@@ -229,26 +225,26 @@ final class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public boolean equals(
-                    ObjectAdapterMementoDefault memento, 
-                    ObjectAdapterMementoDefault otherMemento) {
+                    MementoHelper memento, 
+                    MementoHelper otherMemento) {
                 
                 return otherMemento.recreateStrategy == ENCODEABLE && 
                         memento.encodableValue.equals(otherMemento.encodableValue);
             }
 
             @Override
-            public int hashCode(ObjectAdapterMementoDefault memento) {
+            public int hashCode(MementoHelper memento) {
                 return memento.encodableValue.hashCode();
             }
 
             @Override
-            public String toString(ObjectAdapterMementoDefault memento) {
+            public String toString(MementoHelper memento) {
                 return memento.encodableValue;
             }
 
             @Override
             public void resetVersion(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore, 
                     SpecificationLoader specificationLoader) {
             }
@@ -260,7 +256,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
         LOOKUP {
             @Override
             ManagedObject recreateAdapter(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore, 
                     SpecificationLoader specificationLoader) {
                 
@@ -282,7 +278,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
 
             @Override
             public void resetVersion(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
                 
@@ -295,17 +291,17 @@ final class ObjectAdapterMementoDefault implements Serializable {
             }
 
             @Override
-            public boolean equals(ObjectAdapterMementoDefault oam, ObjectAdapterMementoDefault other) {
+            public boolean equals(MementoHelper oam, MementoHelper other) {
                 return other.recreateStrategy == LOOKUP && oam.persistentOidStr.equals(other.persistentOidStr);
             }
 
             @Override
-            public int hashCode(ObjectAdapterMementoDefault oam) {
+            public int hashCode(MementoHelper oam) {
                 return oam.persistentOidStr.hashCode();
             }
 
             @Override
-            public String toString(final ObjectAdapterMementoDefault oam) {
+            public String toString(final MementoHelper oam) {
                 return oam.persistentOidStr;
             }
 
@@ -320,7 +316,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
              */
             @Override
             ManagedObject recreateAdapter(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore, 
                     SpecificationLoader specificationLoader) {
                 
@@ -328,30 +324,30 @@ final class ObjectAdapterMementoDefault implements Serializable {
             }
 
             @Override
-            public boolean equals(ObjectAdapterMementoDefault oam, ObjectAdapterMementoDefault other) {
+            public boolean equals(MementoHelper oam, MementoHelper other) {
                 return other.recreateStrategy == TRANSIENT && oam.transientMemento.equals(other.transientMemento);
             }
 
             @Override
-            public int hashCode(ObjectAdapterMementoDefault oam) {
+            public int hashCode(MementoHelper oam) {
                 return oam.transientMemento.hashCode();
             }
 
             @Override
-            public String toString(final ObjectAdapterMementoDefault oam) {
+            public String toString(final MementoHelper oam) {
                 return oam.transientMemento.toString();
             }
 
             @Override
             public void resetVersion(
-                    ObjectAdapterMementoDefault memento,
+                    MementoHelper memento,
                     MementoStore mementoStore,
                     SpecificationLoader specificationLoader) {
             }
         };
 
         public ManagedObject getAdapter(
-                ObjectAdapterMementoDefault memento,
+                MementoHelper memento,
                 MementoStore mementoStore,
                 SpecificationLoader specificationLoader) {
             
@@ -359,20 +355,20 @@ final class ObjectAdapterMementoDefault implements Serializable {
         }
 
         abstract ManagedObject recreateAdapter(
-                ObjectAdapterMementoDefault memento,
+                MementoHelper memento,
                 MementoStore mementoStore, 
                 SpecificationLoader specificationLoader);
 
         public abstract boolean equals(
-                ObjectAdapterMementoDefault memento, 
-                ObjectAdapterMementoDefault otherMemento);
+                MementoHelper memento, 
+                MementoHelper otherMemento);
         
-        public abstract int hashCode(ObjectAdapterMementoDefault memento);
+        public abstract int hashCode(MementoHelper memento);
 
-        public abstract String toString(ObjectAdapterMementoDefault memento);
+        public abstract String toString(MementoHelper memento);
 
         public abstract void resetVersion(
-                ObjectAdapterMementoDefault memento,
+                MementoHelper memento,
                 MementoStore mementoStore, 
                 SpecificationLoader specificationLoader);
     }
@@ -433,10 +429,10 @@ final class ObjectAdapterMementoDefault implements Serializable {
     /**
      * populated only if {@link #getCardinality() sort} is {@link Cardinality#VECTOR vector}
      */
-    private ArrayList<ObjectAdapterMementoDefault> list;
+    private ArrayList<MementoHelper> list;
 
-    public ObjectAdapterMementoDefault(
-            ArrayList<ObjectAdapterMementoDefault> list, 
+    public MementoHelper(
+            ArrayList<MementoHelper> list, 
             ObjectSpecId objectSpecId) {
         
         this.cardinality = Cardinality.VECTOR;
@@ -444,7 +440,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
         this.objectSpecId = objectSpecId;
     }
 
-    private ObjectAdapterMementoDefault(RootOid rootOid, SpecificationLoader specificationLoader) {
+    private MementoHelper(RootOid rootOid, SpecificationLoader specificationLoader) {
 
         // -- // TODO[2112] do we ever need to create ENCODEABLE here?
         val specId = rootOid.getObjectSpecId(); 
@@ -471,7 +467,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
         this.recreateStrategy = RecreateStrategy.LOOKUP;
     }
 
-    private ObjectAdapterMementoDefault(ManagedObject adapter) {
+    private MementoHelper(ManagedObject adapter) {
         
         requires(adapter, "adapter");
         
@@ -481,7 +477,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
         init(adapter);
     }
 
-    private ObjectAdapterMementoDefault(ObjectSpecId specId, String encodableValue) {
+    private MementoHelper(ObjectSpecId specId, String encodableValue) {
         this.cardinality = Cardinality.SCALAR;
         this.objectSpecId = specId;
         this.encodableValue = encodableValue;
@@ -521,7 +517,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
         return cardinality;
     }
 
-    ArrayList<ObjectAdapterMementoDefault> getList() {
+    ArrayList<MementoHelper> getList() {
         ensureVector();
         return list;
     }
@@ -595,7 +591,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
      * {@link ConcurrencyChecking concurrency checking} of the OID.
      */
     boolean containedIn(
-            List<ObjectAdapterMementoDefault> mementos,
+            List<MementoHelper> mementos,
             MementoStore mementoStore,
             SpecificationLoader specificationLoader) {
 
@@ -643,13 +639,13 @@ final class ObjectAdapterMementoDefault implements Serializable {
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
     final static class Functions {
 
-        public static Function<Object, ObjectAdapterMementoDefault> fromPojo(
+        public static Function<Object, MementoHelper> fromPojo(
                 final ObjectAdapterProvider adapterProvider) {
             
-            return pojo->ObjectAdapterMementoDefault.createOrNull( adapterProvider.adapterFor(pojo) );
+            return pojo->MementoHelper.createOrNull( adapterProvider.adapterFor(pojo) );
         }
 
-        public static Function<ObjectAdapterMementoDefault, ManagedObject> fromMemento(
+        public static Function<MementoHelper, ManagedObject> fromMemento(
                 final MementoStore mementoStore,
                 final SpecificationLoader specificationLoader) {
 
@@ -663,7 +659,7 @@ final class ObjectAdapterMementoDefault implements Serializable {
             };
         }
 
-        public static Function<ObjectAdapterMementoDefault, Object> toPojo(
+        public static Function<MementoHelper, Object> toPojo(
                 final MementoStore mementoStore,
                 final SpecificationLoader specificationLoader) {
             
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
index 70c8325..d4e0e90 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/MementoStoreLegacy.java
@@ -48,6 +48,7 @@ import org.apache.isis.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.persistence.adapter.PojoAdapter;
+import org.apache.isis.runtime.system.context.IsisContext;
 import org.apache.isis.runtime.system.session.IsisSession;
 
 import static org.apache.isis.commons.internal.functions._Predicates.not;
@@ -67,7 +68,7 @@ import lombok.extern.log4j.Log4j2;
 final class MementoStoreLegacy implements MementoStore {
 
     private final ObjectManager objectManager;
-    private final ObjectAdapterProvider objectAdapterProvider;
+    //private final ObjectAdapterProvider objectAdapterProvider;
     private final SpecificationLoader specificationLoader;
 
     @Override
@@ -95,7 +96,7 @@ final class MementoStoreLegacy implements MementoStore {
             _Assert.assertTrue("oid must be a RootOid representing an object because spec is not a collection and cannot be a value", oid instanceof RootOid);
             RootOid typedOid = (RootOid) oid;
             // recreate an adapter for the original OID
-            adapter = objectAdapterProvider.adapterFor(typedOid);
+            adapter = objectAdapterProvider().adapterFor(typedOid);
 
             updateObject(adapter, data);
         }
@@ -105,7 +106,7 @@ final class MementoStoreLegacy implements MementoStore {
         }
         return adapter;
     }
-    
+
     @Override
     public ManagedObject adapterForListOfPojos(List<Object> listOfPojos) {
         return ManagedObject.of(specificationLoader::loadSpecification, listOfPojos);
@@ -123,7 +124,7 @@ final class MementoStoreLegacy implements MementoStore {
         // handle values
         if (data instanceof StandaloneData) {
             val standaloneData = (StandaloneData) data;
-            return standaloneData.getAdapter(objectAdapterProvider, specificationLoader);
+            return standaloneData.getAdapter(objectAdapterProvider(), specificationLoader);
         }
 
         // reference to entity
@@ -132,7 +133,7 @@ final class MementoStoreLegacy implements MementoStore {
         _Assert.assertTrue("can only create a reference to an entity", oid instanceof RootOid);
 
         val rootOid = (RootOid) oid;
-        val referencedAdapter = objectAdapterProvider.adapterFor(rootOid);
+        val referencedAdapter = objectAdapterProvider().adapterFor(rootOid);
 
         if (data instanceof ObjectData) {
             if (rootOid.isTransient()) {
@@ -289,5 +290,10 @@ final class MementoStoreLegacy implements MementoStore {
             }
         }
     }
+    
+    private ObjectAdapterProvider objectAdapterProvider() {
+        val objectAdapterProvider = (ObjectAdapterProvider) IsisContext.getPersistenceSession().get();
+        return objectAdapterProvider;
+    }
 
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java
deleted file mode 100644
index 99cf93c..0000000
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/Null.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- *  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.runtime.memento;
-
-import java.io.Serializable;
-
-final class Null implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    public Null() {
-    }
-
-    @Override
-    public String toString() {
-        return "NULL";
-    }
-
-}
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
index 9612aa3..896b216 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMemento.java
@@ -23,19 +23,14 @@ import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Optional;
-import java.util.stream.Collectors;
 
 import org.apache.isis.applib.services.bookmark.Bookmark;
 import org.apache.isis.commons.collections.Cardinality;
-import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
-import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.spec.ObjectSpecId;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
-import org.apache.isis.runtime.memento.ObjectAdapterMementoDefault.RecreateStrategy;
-
-import lombok.val;
+import org.apache.isis.runtime.memento.MementoHelper.RecreateStrategy;
 
 /**
  * @since 2.0
@@ -66,27 +61,6 @@ public interface ObjectAdapterMemento extends Serializable {
 
     // -- FACTORIES
 
-    static ObjectAdapterMemento ofRootOid(RootOid rootOid, ObjectAdapterMementoSupport support) {
-        if(rootOid==null) {
-            return null;
-        }
-        return support.mementoForRootOid(rootOid);
-    }
-
-    static ObjectAdapterMemento ofAdapter(ManagedObject adapter, ObjectAdapterMementoSupport support) {
-        if(adapter==null) {
-            return null;
-        }
-        return support.mementoForAdapter(adapter);
-    }
-
-    static ObjectAdapterMemento ofPojo(Object pojo, ObjectAdapterMementoSupport support) {
-        if(pojo==null) {
-            return null;
-        }
-        return support.mementoForPojo(pojo);
-    }
-
     static ObjectAdapterMemento wrapMementoList(
             Collection<ObjectAdapterMemento> container, 
             ObjectSpecId specId) {
@@ -110,20 +84,4 @@ public interface ObjectAdapterMemento extends Serializable {
     }
 
 
-    static ObjectAdapterMemento ofIterablePojos(
-            Object iterablePojos,
-            ObjectSpecId specId,
-            ObjectAdapterMementoSupport support) {
-
-        val listOfMementos = _NullSafe.stream((Iterable<?>) iterablePojos)
-                .map(pojo->ofPojo(pojo, support))
-                .collect(Collectors.toList());
-        val memento =
-                ObjectAdapterMemento.wrapMementoList(listOfMementos, specId);
-        return memento;
-    }
-
-    
-
-
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoService.java
similarity index 67%
rename from core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java
rename to core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoService.java
index 9c409ae..b5c6d59 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoService.java
@@ -18,22 +18,38 @@
  */
 package org.apache.isis.runtime.memento;
 
+import java.util.stream.Collectors;
+
+import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
+import org.apache.isis.metamodel.spec.ObjectSpecId;
+
+import lombok.val;
 
 /**
  * @since 2.0
  * 
  *
  */
-public interface ObjectAdapterMementoSupport {
+public interface ObjectAdapterMementoService {
 
     ObjectAdapterMemento mementoForRootOid(RootOid rootOid);
 
     ObjectAdapterMemento mementoForAdapter(ManagedObject adapter);
 
     ObjectAdapterMemento mementoForPojo(Object pojo);
+    
+    default ObjectAdapterMemento mementoForPojos(Iterable<Object> iterablePojos, ObjectSpecId specId) {
+        val listOfMementos = _NullSafe.stream(iterablePojos)
+                .map(pojo->mementoForPojo(pojo))
+                .collect(Collectors.toList());
+        val memento =
+                ObjectAdapterMemento.wrapMementoList(listOfMementos, specId);
+        return memento;
+    }
 
     ManagedObject reconstructObject(ObjectAdapterMemento memento);
+    
 
 }
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoServiceDefault.java
similarity index 79%
rename from core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
rename to core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoServiceDefault.java
index acf41f5..c5eee01 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoSupport_usingDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectAdapterMementoServiceDefault.java
@@ -42,8 +42,8 @@ import lombok.val;
  *
  */
 @Service @Singleton
-public class ObjectAdapterMementoSupport_usingDefault 
-implements ObjectAdapterMementoSupport {
+public class ObjectAdapterMementoServiceDefault 
+implements ObjectAdapterMementoService {
     
     @Inject @Getter private SpecificationLoader specificationLoader;
     @Inject private ObjectManager objectManager;
@@ -51,13 +51,13 @@ implements ObjectAdapterMementoSupport {
 
     @Override
     public ObjectAdapterMemento mementoForRootOid(RootOid rootOid) {
-        val delegate = ObjectAdapterMementoDefault.createPersistent(rootOid, specificationLoader);
+        val delegate = MementoHelper.createPersistent(rootOid, specificationLoader);
         return ObjectAdapterMementoDelegator.of(delegate);
     }
 
     @Override
     public ObjectAdapterMemento mementoForAdapter(ManagedObject adapter) {
-        val delegate = ObjectAdapterMementoDefault.createOrNull(adapter);
+        val delegate = MementoHelper.createOrNull(adapter);
         if(delegate==null) {
             return null;
         }
@@ -76,22 +76,10 @@ implements ObjectAdapterMementoSupport {
             return null;
         }
         if(mementoStore==null) {
-            val objectAdapterProvider = (ObjectAdapterProvider) IsisContext.getPersistenceSession().get();
-            mementoStore = new MementoStoreLegacy(objectManager, objectAdapterProvider, specificationLoader);
+            mementoStore = new MementoStoreLegacy(objectManager, specificationLoader);
         }
         
-        
         return memento.reconstructObject(mementoStore, specificationLoader);
-        
-//        val specId = memento.getObjectSpecId();
-//        val spec = specificationLoader.loadSpecification(specId);
-//        
-//        if(memento.getIdentifier()==null) {
-//            System.out.println("#### has no id: " + memento);
-//        }
-//        
-//        val objectLoadRequest = ObjectLoader.Request.of(spec, memento.getIdentifier());
-//        return objectManager.loadObject(objectLoadRequest);         
     }
 
     @RequiredArgsConstructor(staticName = "of")
@@ -99,7 +87,7 @@ implements ObjectAdapterMementoSupport {
 
         private static final long serialVersionUID = 1L;
 
-        private final ObjectAdapterMementoDefault delegate;
+        private final MementoHelper delegate;
 
         @Override
         public String asString() {
diff --git a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java
index 40730f1..e880f51 100644
--- a/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java
+++ b/core/runtime/src/main/java/org/apache/isis/runtime/memento/ObjectData.java
@@ -25,11 +25,12 @@ import java.util.Map;
 
 import org.apache.isis.metamodel.adapter.oid.Oid;
 
+import lombok.NoArgsConstructor;
+
 final class ObjectData extends Data {
 
     private static final long serialVersionUID = 3772154051989942219L;
     
-    private final static Serializable NO_ENTRY = new Null();
     private final Map<String, Object> fields = new HashMap<String, Object>();
 
     public ObjectData(final Oid oid, final String className) {
@@ -56,6 +57,21 @@ final class ObjectData extends Data {
     public String toString() {
         return fields.toString();
     }
+    
+    // -- HELPER
+    
+    private final static Serializable NO_ENTRY = new EmptyEntry();
+    
+    @NoArgsConstructor
+    private final static class EmptyEntry implements Serializable {
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        public String toString() {
+            return "NULL";
+        }
+
+    }
 
 
 }
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
index 142a641..c379a87 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityCollectionModel.java
@@ -47,7 +47,7 @@ import org.apache.isis.metamodel.spec.ObjectSpecification;
 import org.apache.isis.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.runtime.memento.ObjectAdapterMemento;
-import org.apache.isis.runtime.memento.ObjectAdapterMementoSupport;
+import org.apache.isis.runtime.memento.ObjectAdapterMementoService;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
 import org.apache.isis.viewer.wicket.model.links.LinksProvider;
@@ -93,11 +93,11 @@ implements LinksProvider, UiHintContainer {
         // rather than the compile-time type
         val lowestCommonSuperclassFinder = new LowestCommonSuperclassFinder();
 
-        val mementoSupport = model.getMementoSupport();
+        val mementoService = model.getMementoService();
 
         val mementoList = streamElementsOf(collectionAsAdapter) // pojos
                 .peek(lowestCommonSuperclassFinder::collect)
-                .map(pojo->ObjectAdapterMemento.ofPojo(pojo, mementoSupport))
+                .map(mementoService::mementoForPojo)
                 .collect(Collectors.toList());
 
         val specificationLoader = model.getSpecificationLoader();
@@ -198,10 +198,10 @@ implements LinksProvider, UiHintContainer {
             void setObject(EntityCollectionModel colModel, List<ManagedObject> adapterList) {
 
                 //XXX lombok issue, cannot use val here 
-                ObjectAdapterMementoSupport mementoSupport = colModel.getMementoSupport();
+                final ObjectAdapterMementoService mementoService = colModel.getMementoService();
 
                 colModel.mementoList = _NullSafe.stream(adapterList)
-                        .map(adapter->ObjectAdapterMemento.ofAdapter(adapter, mementoSupport))
+                        .map(mementoService::mementoForAdapter)
                         .filter(_NullSafe::isPresent)
                         .collect(Collectors.toList());
             }
@@ -479,7 +479,7 @@ implements LinksProvider, UiHintContainer {
      */
     public void setObjectList(ManagedObject resultAdapter) {
         this.mementoList = streamElementsOf(resultAdapter)
-                .map(pojo->ObjectAdapterMemento.ofPojo(pojo, super.getMementoSupport()))
+                .map(super.getMementoService()::mementoForPojo)
                 .collect(Collectors.toList());
     }
 
@@ -514,8 +514,7 @@ implements LinksProvider, UiHintContainer {
 
 
     public void toggleSelectionOn(ManagedObject selectedAdapter) {
-        ObjectAdapterMemento selectedAsMemento = ObjectAdapterMemento
-                .ofAdapter(selectedAdapter, super.getMementoSupport());
+        val selectedAsMemento = super.getMementoService().mementoForAdapter(selectedAdapter); 
 
         // try to remove; if couldn't, then mustn't have been in there, in which case add.
         boolean removed = toggledMementosList.remove(selectedAsMemento);
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 73f163b..06593a3 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -341,7 +341,7 @@ implements ObjectAdapterModel, UiHintContainer {
     @Override
     public void setObject(ManagedObject adapter) {
         super.setObject(adapter);
-        adapterMemento = ObjectAdapterMemento.ofAdapter(adapter, super.getMementoSupport());
+        adapterMemento = super.getMementoService().mementoForAdapter(adapter); 
     }
 
     public void setObjectMemento(final ObjectAdapterMemento adapterMemento) {
@@ -491,7 +491,7 @@ implements ObjectAdapterModel, UiHintContainer {
                 return pending;
             }
             val adapter = entityModel.getObject();
-            return ObjectAdapterMemento.ofAdapter(adapter, entityModel.getMementoSupport());
+            return entityModel.getMementoService().mementoForAdapter(adapter);
         }
 
         @Override
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
index eb77373..4aafc86 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelForReference.java
@@ -95,11 +95,11 @@ public class EntityModelForReference implements ObjectAdapterModel {
 
     @Override
     public PageParameters getPageParameters() {
-        val mementoSupport = scalarModel.getMementoSupport();
+        val mementoService = scalarModel.getMementoService();
         val hintStore = scalarModel.getCommonContext().lookupServiceElseFail(HintStore.class); 
         
         val pageParameters = createPageParameters(getObject());
-        val objectAdapterMemento = ObjectAdapterMemento.ofAdapter(getObject(), mementoSupport);
+        val objectAdapterMemento = mementoService.mementoForAdapter(getObject()); 
         
         HintPageParameterSerializer.hintStoreToPageParameters(pageParameters, objectAdapterMemento, hintStore);
         return pageParameters;
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index d88883a..cbeee5c 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -28,6 +28,7 @@ import java.util.stream.Stream;
 
 import org.apache.isis.applib.annotation.PromptStyle;
 import org.apache.isis.applib.annotation.Where;
+import org.apache.isis.commons.internal.base._Casts;
 import org.apache.isis.commons.internal.base._NullSafe;
 import org.apache.isis.commons.internal.collections._Lists;
 import org.apache.isis.metamodel.consent.Consent;
@@ -56,6 +57,8 @@ import org.apache.isis.viewer.wicket.model.links.LinksProvider;
 import org.apache.isis.viewer.wicket.model.mementos.ActionParameterMemento;
 import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
 
+import lombok.val;
+
 
 
 /**
@@ -837,8 +840,9 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
         }
 
         if(isCollection()) {
-            ObjectAdapterMemento memento = ObjectAdapterMemento
-                    .ofIterablePojos(pojo, getTypeOfSpecification().getSpecId(), super.getMementoSupport());
+            val memento = super.getMementoService()
+                    .mementoForPojos(_Casts.uncheckedCast(pojo), getTypeOfSpecification().getSpecId());
+                    
             super.setObjectMemento(memento); // associated value
         } else {
             super.setObject(adapter); // associated value
@@ -859,12 +863,14 @@ implements LinksProvider, FormExecutorContext, ActionArgumentModel {
 
     public void setPendingAdapter(final ManagedObject objectAdapter) {
         if(isCollection()) {
-            Object pojo = objectAdapter.getPojo();
-            ObjectAdapterMemento memento = ObjectAdapterMemento
-                    .ofIterablePojos(pojo, getTypeOfSpecification().getSpecId(), super.getMementoSupport());
+            val pojos = objectAdapter.getPojo();
+            val memento = super.getMementoService()
+                    .mementoForPojos(_Casts.uncheckedCast(pojos), getTypeOfSpecification().getSpecId());
             setPending(memento);
         } else {
-            setPending(ObjectAdapterMemento.ofAdapter(objectAdapter, super.getMementoSupport()));
+            val memento = super.getMementoService()
+                    .mementoForAdapter(objectAdapter);
+            setPending(memento);
         }
     }
 
diff --git a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
index ffa585b..63992cc 100644
--- a/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
+++ b/core/viewers/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ValueModel.java
@@ -35,7 +35,7 @@ public class ValueModel extends ModelAbstract<ManagedObject> {
 
     public ValueModel(IsisWebAppCommonContext commonContext, ManagedObject adapter) {
         super(commonContext);
-        adapterMemento = ObjectAdapterMemento.ofAdapter(adapter, super.getMementoSupport());
+        adapterMemento = super.getMementoService().mementoForAdapter(adapter);
     }
 
     @Override
diff --git a/core/viewers/wicket/model/src/test/java/org/apache/isis/viewer/wicket/model/models/ScalarModel_isScalarSubtypingAnyOf_Test.java b/core/viewers/wicket/model/src/test/java/org/apache/isis/viewer/wicket/model/models/ScalarModel_isScalarSubtypingAnyOf_Test.java
index 459607c..65c5e4f 100644
--- a/core/viewers/wicket/model/src/test/java/org/apache/isis/viewer/wicket/model/models/ScalarModel_isScalarSubtypingAnyOf_Test.java
+++ b/core/viewers/wicket/model/src/test/java/org/apache/isis/viewer/wicket/model/models/ScalarModel_isScalarSubtypingAnyOf_Test.java
@@ -28,7 +28,7 @@ import org.apache.isis.metamodel.MetaModelContext;
 import org.apache.isis.metamodel.MetaModelContext_forTesting;
 import org.apache.isis.metamodel.objectmanager.ObjectManager;
 import org.apache.isis.metamodel.spec.ObjectSpecification;
-import org.apache.isis.runtime.memento.ObjectAdapterMementoSupport;
+import org.apache.isis.runtime.memento.ObjectAdapterMementoService;
 import org.apache.isis.unittestsupport.jmocking.JUnitRuleMockery2;
 import org.apache.isis.webapp.context.IsisWebAppCommonContext;
 
@@ -45,7 +45,7 @@ public class ScalarModel_isScalarSubtypingAnyOf_Test {
 
     @Mock ObjectSpecification mockObjectSpecification;
     @Mock EntityModel mockEntityModel;
-    @Mock ObjectAdapterMementoSupport mockObjectAdapterMementoSupport;
+    @Mock ObjectAdapterMementoService mockObjectAdapterMementoSupport;
     @Mock ObjectManager mockObjectManager; 
     
     MetaModelContext metaModelContext;
diff --git a/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java b/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java
index 5a16b78..0b19630 100644
--- a/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java
+++ b/core/webapp/src/main/java/org/apache/isis/webapp/context/IsisWebAppCommonContext.java
@@ -33,7 +33,7 @@ import org.apache.isis.metamodel.adapter.oid.RootOid;
 import org.apache.isis.metamodel.spec.ManagedObject;
 import org.apache.isis.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.runtime.memento.ObjectAdapterMemento;
-import org.apache.isis.runtime.memento.ObjectAdapterMementoSupport;
+import org.apache.isis.runtime.memento.ObjectAdapterMementoService;
 import org.apache.isis.runtime.system.session.IsisSession;
 
 import lombok.AccessLevel;
@@ -63,7 +63,7 @@ public class IsisWebAppCommonContext implements MetaModelContext.Delegating {
     private final MenuBarsService menuBarsService = lookupServiceElseFail(MenuBarsService.class);
     
     @Getter(lazy = true, value = AccessLevel.PRIVATE)
-    private final ObjectAdapterMementoSupport mementoSupport = lookupServiceElseFail(ObjectAdapterMementoSupport.class);
+    private final ObjectAdapterMementoService mementoService = lookupServiceElseFail(ObjectAdapterMementoService.class);
     
     @Getter(lazy = true)
     private final Function<Object, ManagedObject> pojoToAdapter = metaModelContext.getObjectManager()::adapt;
@@ -93,15 +93,15 @@ public class IsisWebAppCommonContext implements MetaModelContext.Delegating {
     }
     
     public ObjectAdapterMemento mementoFor(ManagedObject adapter) {
-        return ObjectAdapterMemento.ofAdapter(adapter, getMementoSupport());
+        return getMementoService().mementoForAdapter(adapter);
     }
     
     public ObjectAdapterMemento mementoFor(RootOid rootOid) {
-        return ObjectAdapterMemento.ofRootOid(rootOid, getMementoSupport());
+        return getMementoService().mementoForRootOid(rootOid);
     }
     
     public ManagedObject reconstructObject(ObjectAdapterMemento memento) {
-        return getMementoSupport().reconstructObject(memento);
+        return getMementoService().reconstructObject(memento);
     }
     
     // -- COMMON CONTEXT PROVIDER INTERFACE
@@ -128,8 +128,8 @@ public class IsisWebAppCommonContext implements MetaModelContext.Delegating {
             return getCommonContext().getSpecificationLoader();
         }
         
-        default ObjectAdapterMementoSupport getMementoSupport() {
-            return getCommonContext().getMementoSupport();
+        default ObjectAdapterMementoService getMementoService() {
+            return getCommonContext().getMementoService();
         }
         
         default Function<Object, ManagedObject> getPojoToAdapter() {