You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2014/11/07 04:46:50 UTC

[26/29] isis git commit: ISIS-939: simplifying PersistenceSession

ISIS-939: simplifying PersistenceSession

- removing PersistenceSession#resolveField (introduce ResolveFieldUtil for scimpi to call), also from the *ObjectStore impls
- remove Persistor interface, instead PersistenceSession everywhere
- remove ToPersistObjectSet interface, instead PersistenceSession everywhere
- remove RecreatedPojoRemapper interface, instead PersistenceSession everywhere
- remove EnlistedObjectDirtying interface, instead PersistenceSession everywhere
- remove ObjectAdapterMemento#getTitleHint() and #captureTitleHintIfPossible()
- re-introduce MessageBroker's #getApplicationError and #setApplicationError
- remove ObjectAdapter#isTitleAvailable() and from PojoAdapter
- removed commented out lines in ResolveState
- simplify PersistenceSession (remove #mapRecreatedPojo, #remapRecreatedPojo)
- introduce PersistenceQueryFactory from PersistenceSession
- PersistenceSession creates IsisTransactionManager in its constructor


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/5f8fca9b
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/5f8fca9b
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/5f8fca9b

Branch: refs/heads/ISIS-939
Commit: 5f8fca9b9c13c0f2f81caccdbb247154e7b25cc7
Parents: bea5a02
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Nov 3 22:55:07 2014 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Nov 6 16:19:00 2014 +0000

----------------------------------------------------------------------
 .../dispatcher/AbstractObjectProcessor.java     |   3 +-
 .../scimpi/dispatcher/ResolveFieldUtil.java     |  71 ++++
 .../dispatcher/context/RequestContext.java      |  13 +-
 .../dispatcher/view/collection/Collection.java  |   5 +-
 .../view/display/AbstractTableView.java         |  10 +-
 .../dispatcher/view/display/LongFormView.java   |   5 +-
 .../scimpi/dispatcher/view/edit/EditObject.java |   3 +-
 .../view/simple/AbstractConditionalBlock.java   |  10 +-
 .../dispatcher/view/simple/AbstractLink.java    |   3 +-
 .../dispatcher/view/simple/RemoveElement.java   |   7 +-
 .../model/isis/PersistenceSessionProvider.java  |   5 +-
 .../model/mementos/ObjectAdapterMemento.java    |  21 --
 .../viewer/wicket/model/models/EntityModel.java |  10 -
 .../wicket/model/models/ModelAbstract.java      |   4 +-
 .../FormComponentPanelAbstract.java             |  24 +-
 .../viewer/wicket/ui/panels/FormAbstract.java   |   8 +-
 .../viewer/wicket/ui/panels/PanelAbstract.java  |  21 +-
 .../integtestsupport/IsisSystemForTest.java     |   7 +-
 .../commons/authentication/MessageBroker.java   |  11 +
 .../core/metamodel/adapter/ObjectAdapter.java   |   2 -
 .../core/metamodel/adapter/ResolveState.java    |  59 +---
 .../metamodel/adapter/mgr/AdapterManager.java   |   8 +-
 .../core/objectstore/InMemoryObjectStore.java   |  11 +-
 .../internal/ObjectStoreInstances.java          |   2 +-
 .../ObjectFixtureFilePersistor.java             |  17 +-
 .../fixtures/FixturesInstallerDelegate.java     |   5 +-
 .../isis/core/runtime/memento/Memento.java      |   2 +-
 .../persistence/adapter/PojoAdapter.java        |   7 -
 .../adaptermanager/AdapterManagerDefault.java   |  24 +-
 .../objectstore/algorithm/PersistAlgorithm.java |   3 +-
 .../algorithm/PersistAlgorithmDefault.java      |   5 +-
 .../PersistAlgorithmForDataNucleus.java         |   5 +-
 .../algorithm/PersistAlgorithmUnified.java      |   5 +-
 .../algorithm/ToPersistObjectSet.java           |  45 ---
 ...shingServiceWithDefaultPayloadFactories.java |   2 +-
 .../runtime/system/persistence/ObjectStore.java |  12 +-
 .../persistence/PersistenceQueryFactory.java    | 103 ++++++
 .../system/persistence/PersistenceSession.java  | 346 +++++++------------
 .../persistence/PersistenceSessionFactory.java  |   7 +-
 .../runtime/system/persistence/Persistor.java   | 231 -------------
 .../persistence/RecreatedPojoRemapper.java      |  52 ---
 .../transaction/EnlistedObjectDirtying.java     |  49 ---
 .../jdo/datanucleus/DataNucleusObjectStore.java |  28 +-
 .../persistence/FrameworkSynchronizer.java      |  13 +-
 .../PersistenceQueryProcessorAbstract.java      |   7 +-
 .../algorithm/PersistAlgorithmContractTest.java |   3 +-
 .../persistence/PersistenceSessionTest.java     |   3 +-
 .../IsisSystemWithFixtures.java                 |   7 +-
 48 files changed, 427 insertions(+), 877 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
index d163bc1..97dd1ed 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/AbstractObjectProcessor.java
@@ -21,7 +21,6 @@ package org.apache.isis.viewer.scimpi.dispatcher;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
 
 public abstract class AbstractObjectProcessor extends AbstractElementProcessor {
@@ -38,7 +37,7 @@ public abstract class AbstractObjectProcessor extends AbstractElementProcessor {
             if (error != null) {
                 throw new ScimpiException("Field " + objectField.getId() + " " + error);
             }
-            IsisContext.getPersistenceSession().resolveField(object, objectField);
+            ResolveFieldUtil.resolveField(object, objectField);
             object = objectField.get(object);
         }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
new file mode 100644
index 0000000..a0ae5cf
--- /dev/null
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/ResolveFieldUtil.java
@@ -0,0 +1,71 @@
+/*
+ *  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.viewer.scimpi.dispatcher;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
+
+import static org.apache.isis.core.commons.ensure.Ensure.ensureThatState;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+
+public final class ResolveFieldUtil {
+
+    private ResolveFieldUtil(){}
+
+    /**
+     * Walking the graph.
+     *
+     * <p>
+     *     This combines the implementations of both the DN Objectstore
+     *     and also the in-memory objectstore.
+     * </p>
+     */
+    public static void resolveField(final ObjectAdapter object, final ObjectAssociation association) {
+
+
+        // DN impl.
+        {
+            final ObjectAdapter referencedCollectionAdapter = association.get(object);
+
+            // this code originally brought in from the JPA impl, but seems reasonable.
+            if (association.isOneToManyAssociation()) {
+                ensureThatState(referencedCollectionAdapter, is(notNullValue()));
+
+                final Object referencedCollection = referencedCollectionAdapter.getObject();
+                ensureThatState(referencedCollection, is(notNullValue()));
+
+                // if a proxy collection, then force it to initialize.  just 'touching' the object is sufficient.
+                // REVIEW: I wonder if this is actually needed; does JDO use proxy collections?
+                referencedCollection.hashCode();
+            }
+
+            // the JPA impl used to also call its lifecycle listener on the referenced collection object, eg List,
+            // itself.  I don't think this makes sense to do for JDO (the collection is not a PersistenceCapable).
+        }
+
+        // In-memory objectstore impl
+        {
+            final ObjectAdapter referenceAdapter = association.get(object);
+            referenceAdapter.markAsResolvedIfPossible();
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
index fc36d15..183a0b2 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/context/RequestContext.java
@@ -23,19 +23,12 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.Map.Entry;
-import java.util.TreeSet;
-
 import com.google.common.collect.Maps;
-
 import org.apache.commons.lang.StringEscapeUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.debug.DebugBuilder;
 import org.apache.isis.core.commons.factory.InstanceUtil;
@@ -50,7 +43,7 @@ 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;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
 import org.apache.isis.viewer.scimpi.dispatcher.ErrorCollator;
 import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
@@ -853,7 +846,7 @@ public abstract class RequestContext {
     }
 
 
-    protected Persistor getPersistenceSession() {
+    protected PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
index 5a561b6..1002c9f 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/collection/Collection.java
@@ -20,12 +20,11 @@
 package org.apache.isis.viewer.scimpi.dispatcher.view.collection;
 
 import java.util.Iterator;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
-import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
 import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
@@ -48,7 +47,7 @@ public class Collection extends AbstractElementProcessor {
             if (!objectField.isOneToManyAssociation()) {
                 throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
             }
-            IsisContext.getPersistenceSession().resolveField(object, objectField);
+            ResolveFieldUtil.resolveField(object, objectField);
             collection = objectField.get(object);
         } else {
             final String id = request.getOptionalProperty(COLLECTION);

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
index 26df958..286d84d 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/AbstractTableView.java
@@ -21,17 +21,17 @@ package org.apache.isis.viewer.scimpi.dispatcher.view.display;
 
 import java.util.Iterator;
 import java.util.List;
-
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 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;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
 import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
@@ -68,7 +68,7 @@ public abstract class AbstractTableView extends AbstractElementProcessor {
                 throw new ScimpiException("Field " + objectField.getId() + " is not a collection");
             }
             isFieldEditable = objectField.isUsable(IsisContext.getAuthenticationSession(), object, where).isAllowed();
-            getPersistenceSession().resolveField(object, objectField);
+            ResolveFieldUtil.resolveField(object, objectField);
             collection = objectField.get(object);
             final TypeOfFacet facet = objectField.getFacet(TypeOfFacet.class);
             elementSpec = facet.valueSpec();
@@ -94,7 +94,7 @@ public abstract class AbstractTableView extends AbstractElementProcessor {
 
     }
 
-    protected Persistor getPersistenceSession() {
+    protected PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
index 5630bcb..1efad45 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/display/LongFormView.java
@@ -20,12 +20,11 @@
 package org.apache.isis.viewer.scimpi.dispatcher.view.display;
 
 import java.util.List;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 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;
-import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
 import org.apache.isis.viewer.scimpi.dispatcher.view.display.TableView.SimpleTableBuilder;
 import org.apache.isis.viewer.scimpi.dispatcher.view.field.LinkedObject;
@@ -43,7 +42,7 @@ public class LongFormView extends AbstractFormView {
                 rowClasses = rowClassesList.split("[,|/]");
             }
             int noColumns;
-            IsisContext.getPersistenceSession().resolveField(object, field);
+            ResolveFieldUtil.resolveField(object, field);
             final ObjectAdapter collection = field.get(object);
             final ObjectSpecification elementSpec = collection.getElementSpecification();
             final List<ObjectAssociation> fields = elementSpec.getAssociations(Contributed.EXCLUDED, ObjectAssociation.Filters.VISIBLE_AT_LEAST_SOMETIMES);

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
index 4117ee7..deafb1a 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/edit/EditObject.java
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.facets.object.choices.enums.EnumFacet;
 import org.apache.isis.core.metamodel.facets.value.booleans.BooleanValueFacet;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
 import org.apache.isis.viewer.scimpi.dispatcher.edit.EditAction;
@@ -215,7 +216,7 @@ public class EditObject extends AbstractElementProcessor {
             final String fieldName = inputField.getName();
             final ObjectAssociation field = object.getSpecification().getAssociation(fieldName);
             if (field.isVisible(IsisContext.getAuthenticationSession(), object, where).isAllowed()) {
-                IsisContext.getPersistenceSession().resolveField(object, field);
+                ResolveFieldUtil.resolveField(object, field);
                 final ObjectAdapter fieldValue = field.get(object);
                 if (inputField.isEditable()) {
                     final String value = getValue(context, fieldValue);

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
index a17fcdb..dc5b39a 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractConditionalBlock.java
@@ -22,14 +22,13 @@ package org.apache.isis.viewer.scimpi.dispatcher.view.simple;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-
 import org.apache.isis.applib.annotation.Where;
 import org.apache.isis.applib.filter.Filters;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.consent.Consent;
-import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
+import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
 import org.apache.isis.core.metamodel.spec.ActionType;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
@@ -37,6 +36,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
 import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
 import org.apache.isis.viewer.scimpi.dispatcher.processor.Request;
 import org.apache.isis.viewer.scimpi.dispatcher.util.MethodsUtils;
@@ -494,7 +494,8 @@ class TestFieldSet extends Test {
     boolean test(final Request request, final String attributeName, final String targetId) {
         final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
         final ObjectAssociation objectField = findProperty(attributeName, object);
-        IsisContext.getPersistenceSession().resolveField(object, objectField);
+
+        ResolveFieldUtil.resolveField(object, objectField);
         final ObjectAdapter fld = objectField.get(object);
         if (fld != null) {
             final Object fieldValue = fld.getObject();
@@ -523,7 +524,7 @@ class TestFieldValue extends Test {
         
         final ObjectAdapter object = MethodsUtils.findObject(request.getContext(), targetId);
         final ObjectAssociation objectField = findProperty(fieldName, object);
-        IsisContext.getPersistenceSession().resolveField(object, objectField);
+        ResolveFieldUtil.resolveField(object, objectField);
         final ObjectAdapter fld = objectField.get(object);
         
         // TODO test for reference or value
@@ -561,3 +562,4 @@ class TestSet extends Test {
         return valuePresent;
     }
 }
+

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
index 743be2d..b6798be 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/AbstractLink.java
@@ -25,6 +25,7 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
 import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
+import org.apache.isis.viewer.scimpi.dispatcher.ResolveFieldUtil;
 import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
@@ -63,7 +64,7 @@ public abstract class AbstractLink extends AbstractElementProcessor {
             if (field.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
                 throw new ForbiddenException(field, ForbiddenException.VISIBLE);
             }
-            IsisContext.getPersistenceSession().resolveField(adapter, field);
+            ResolveFieldUtil.resolveField(adapter, field);
             adapter = field.get(adapter);
             if (adapter != null) {
                 objectId = context.mapObject(adapter, Scope.INTERACTION);

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
----------------------------------------------------------------------
diff --git a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
index 56ed442..3321b87 100644
--- a/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
+++ b/component/viewer/scimpi/dispatcher/src/main/java/org/apache/isis/viewer/scimpi/dispatcher/view/simple/RemoveElement.java
@@ -30,10 +30,7 @@ import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.viewer.scimpi.dispatcher.AbstractElementProcessor;
-import org.apache.isis.viewer.scimpi.dispatcher.Dispatcher;
-import org.apache.isis.viewer.scimpi.dispatcher.ForbiddenException;
-import org.apache.isis.viewer.scimpi.dispatcher.ScimpiException;
+import org.apache.isis.viewer.scimpi.dispatcher.*;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext;
 import org.apache.isis.viewer.scimpi.dispatcher.context.RequestContext.Scope;
 import org.apache.isis.viewer.scimpi.dispatcher.edit.RemoveAction;
@@ -90,7 +87,7 @@ public class RemoveElement extends AbstractElementProcessor {
         if (field.isVisible(IsisContext.getAuthenticationSession(), adapter, where).isVetoed()) {
             throw new ForbiddenException(field, ForbiddenException.VISIBLE);
         }
-        IsisContext.getPersistenceSession().resolveField(adapter, field);
+        ResolveFieldUtil.resolveField(adapter, field);
 
         Consent usable = field.isUsable(IsisContext.getAuthenticationSession(), adapter, where);
         if (usable.isAllowed()) {

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/isis/PersistenceSessionProvider.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/isis/PersistenceSessionProvider.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/isis/PersistenceSessionProvider.java
index 2c210a3..3c6d78f 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/isis/PersistenceSessionProvider.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/isis/PersistenceSessionProvider.java
@@ -19,9 +19,10 @@
 
 package org.apache.isis.viewer.wicket.model.isis;
 
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 public interface PersistenceSessionProvider {
 
-    Persistor getPersistenceSession();
+    PersistenceSession getPersistenceSession();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index 72658fd..107bde0 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -236,7 +236,6 @@ public class ObjectAdapterMemento implements Serializable {
         final ObjectSpecification specification = adapter.getSpecification();
         objectSpecId = specification.getSpecId();
         init(adapter);
-        captureTitleHintIfPossible();
     }
 
     private void init(final ObjectAdapter adapter) {
@@ -267,26 +266,6 @@ public class ObjectAdapterMemento implements Serializable {
     }
     
 
-    
-    public void captureTitleHintIfPossible() {
-        if (this.titleHint != null) {
-            return;
-        } 
-        
-        // REVIEW: this check is because Wicket 6.0.0 seems to call onEndRequest prior to onDetach
-        // so by the time we get here, there is no session to use...
-        if(IsisContext.inSession()) {
-            ObjectAdapter objectAdapter = this.getObjectAdapter(ConcurrencyChecking.NO_CHECK);
-            if (objectAdapter.isTitleAvailable()) {
-                this.titleHint = objectAdapter.titleString();
-            }
-        }
-    }
-
-    public String getTitleHint() {
-        return titleHint;
-    }
-
     /**
      * Lazily looks up {@link ObjectAdapter} if required.
      * 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 2faca9b..a2ec3df 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -357,16 +357,6 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
         adapterMemento = ObjectAdapterMemento.createOrNull(adapter);
     }
 
-    @Override
-    public void detach() {
-        if (isAttached()) {
-            if (adapterMemento != null) {
-                adapterMemento.captureTitleHintIfPossible();
-            }
-        }
-        super.detach();
-    }
-
 
     // //////////////////////////////////////////////////////////
     // PropertyModels

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
index 24361af..4556cd2 100644
--- a/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
+++ b/component/viewer/wicket/model/src/main/java/org/apache/isis/viewer/wicket/model/models/ModelAbstract.java
@@ -25,7 +25,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 /**
  * Adapter for {@link LoadableDetachableModel}s, providing access to some of the
@@ -50,7 +50,7 @@ public abstract class ModelAbstract<T> extends LoadableDetachableModel<T> {
         return IsisContext.getAuthenticationSession();
     }
 
-    protected Persistor getPersistenceSession() {
+    protected PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/formcomponent/FormComponentPanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/formcomponent/FormComponentPanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/formcomponent/FormComponentPanelAbstract.java
index 785f473..59f152e 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/formcomponent/FormComponentPanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/formcomponent/FormComponentPanelAbstract.java
@@ -20,20 +20,18 @@
 package org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent;
 
 import java.util.List;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.Session;
 import org.apache.wicket.markup.html.form.FormComponent;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
 import org.apache.wicket.model.IModel;
-
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProviderAware;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.isis.PersistenceSessionProvider;
 import org.apache.isis.viewer.wicket.ui.ComponentType;
@@ -52,18 +50,6 @@ public abstract class FormComponentPanelAbstract<T> extends FormComponentPanel<T
 
     private ComponentType componentType;
 
-    public FormComponentPanelAbstract(final ComponentType componentType) {
-        this(componentType, null);
-    }
-
-    public FormComponentPanelAbstract(final String id) {
-        this(id, null);
-    }
-
-    public FormComponentPanelAbstract(final ComponentType componentType, final IModel<T> model) {
-        this(componentType.getWicketId(), model);
-    }
-
     public FormComponentPanelAbstract(final String id, final IModel<T> model) {
         super(id, model);
         this.componentType = ComponentType.lookup(id);
@@ -156,19 +142,15 @@ public abstract class FormComponentPanelAbstract<T> extends FormComponentPanel<T
     // ///////////////////////////////////////////////////////////////////
 
     @Override
-    public Persistor getPersistenceSession() {
+    public PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 
     protected List<ObjectAdapter> getServices() {
-        return IsisContext.getPersistenceSession().getServices();
+        return getPersistenceSession().getServices();
     }
 
-    protected List<ObjectAdapter> getServiceAdapters() {
-        return IsisContext.getPersistenceSession().getServices();
-    }
 
-    
     // /////////////////////////////////////////////////
     // *Provider impl.
     // /////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
index 048e25f..c98db31 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormAbstract.java
@@ -33,7 +33,7 @@ import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.wicket.model.isis.PersistenceSessionProvider;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistry;
 import org.apache.isis.viewer.wicket.ui.app.registry.ComponentFactoryRegistryAccessor;
@@ -134,12 +134,8 @@ public abstract class FormAbstract<T> extends Form<T> implements IHeaderContribu
     // Dependencies (from IsisContext)
     // ///////////////////////////////////////////////////////////////////
 
-    public IsisContext getIsisContext() {
-        return IsisContext.getInstance();
-    }
-
     @Override
-    public Persistor getPersistenceSession() {
+    public PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
----------------------------------------------------------------------
diff --git a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
index 4667b12..690a0ff 100644
--- a/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
+++ b/component/viewer/wicket/ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PanelAbstract.java
@@ -19,10 +19,6 @@
 
 package org.apache.isis.viewer.wicket.ui.panels;
 
-import java.util.List;
-
-import com.google.inject.Inject;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.Session;
 import org.apache.wicket.markup.head.IHeaderResponse;
@@ -30,14 +26,12 @@ import org.apache.wicket.markup.html.IHeaderContributor;
 import org.apache.wicket.markup.html.panel.Panel;
 import org.apache.wicket.model.IModel;
 import org.apache.wicket.request.resource.CssResourceReference;
-
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProvider;
 import org.apache.isis.core.commons.authentication.AuthenticationSessionProviderAware;
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.runtime.system.context.IsisContext;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
 import org.apache.isis.viewer.wicket.model.isis.PersistenceSessionProvider;
 import org.apache.isis.viewer.wicket.ui.ComponentFactory;
@@ -160,25 +154,18 @@ public abstract class PanelAbstract<T extends IModel<?>> extends Panel implement
     }
 
     // ///////////////////////////////////////////////////////////////////
-    // Dependencies (from IsisContext
+    // Dependencies (from IsisContext)
     // ///////////////////////////////////////////////////////////////////
 
-    public IsisContext getIsisContext() {
-        return IsisContext.getInstance();
-    }
-
     @Override
-    public Persistor getPersistenceSession() {
+    public PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 
     public AdapterManager getAdapterManager() {
-        return IsisContext.getPersistenceSession().getAdapterManager();
+        return getPersistenceSession().getAdapterManager();
     }
 
-    protected List<ObjectAdapter> getServiceAdapters() {
-        return IsisContext.getPersistenceSession().getServices();
-    }
 
     // /////////////////////////////////////////////////
     // Dependency Injection

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
----------------------------------------------------------------------
diff --git a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
index 66ac70c..03fce17 100644
--- a/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
+++ b/core/integtestsupport/src/main/java/org/apache/isis/core/integtestsupport/IsisSystemForTest.java
@@ -52,7 +52,6 @@ import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.ObjectStore;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction.State;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
@@ -547,7 +546,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
 
     public ObjectAdapter reload(RootOid oid) {
         ensureSessionInProgress();
-        final Persistor persistenceSession = getPersistenceSession();
+        final PersistenceSession persistenceSession = getPersistenceSession();
         return persistenceSession.loadObject(oid);
     }
 
@@ -560,7 +559,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
         ensureSessionInProgress();
         ensureObjectIsNotPersistent(pojo);
         final ObjectAdapter adapter = adapterFor(pojo);
-        getPersistenceSession().remapAsPersistent(adapter, persistentOid);
+        getPersistenceSession().getAdapterManager().remapAsPersistent(adapter, persistentOid);
         return adapter;
     }
 
@@ -803,7 +802,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
         return getPersistenceSession().getTransactionManager();
     }
     
-    public Persistor getPersistor() {
+    public PersistenceSession getPersistor() {
     	return getPersistenceSession();
     }
     

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/MessageBroker.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/MessageBroker.java b/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/MessageBroker.java
index 12d5068..dc36cce 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/MessageBroker.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/commons/authentication/MessageBroker.java
@@ -33,6 +33,7 @@ public class MessageBroker implements Serializable, DebuggableWithTitle {
     
     private final List<String> messages = Lists.newArrayList();
     private final List<String> warnings = Lists.newArrayList();
+    private String applicationError;
 
     //region > acquire (factory method)
 
@@ -57,6 +58,7 @@ public class MessageBroker implements Serializable, DebuggableWithTitle {
     public void reset() {
         warnings.clear();
         messages.clear();
+        applicationError = null;
     }
 
     //endregion
@@ -85,6 +87,14 @@ public class MessageBroker implements Serializable, DebuggableWithTitle {
 
     //endregion
 
+    public String getApplicationError() {
+        return applicationError;
+    }
+
+    public void setApplicationError(String applicationError) {
+        this.applicationError = applicationError;
+    }
+
     //region > debugging
 
     @Override
@@ -120,6 +130,7 @@ public class MessageBroker implements Serializable, DebuggableWithTitle {
         messages.clear();
         return copy;
     }
+
     //endregion
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ObjectAdapter.java
----------------------------------------------------------------------
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 6dc619a..1954b3e 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
@@ -208,11 +208,9 @@ public interface ObjectAdapter extends Instance, org.apache.isis.applib.annotati
 
 
     boolean canTransitionToResolving();
-    boolean isTitleAvailable();
     void markAsResolvedIfPossible();
 
     
-    
     Version getVersion();
 
     void setVersion(Version version);

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ResolveState.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ResolveState.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ResolveState.java
index f5beaf9..fbf1fe6 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ResolveState.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/ResolveState.java
@@ -19,6 +19,9 @@
 
 package org.apache.isis.core.metamodel.adapter;
 
+import java.util.*;
+import com.google.common.collect.Maps;
+
 import static org.apache.isis.core.metamodel.adapter.ResolveState.RepresentsPersistent.DOES_NOT_REPRESENT_PERSISTENT;
 import static org.apache.isis.core.metamodel.adapter.ResolveState.RepresentsPersistent.REPRESENTS_PERSISTENT;
 import static org.apache.isis.core.metamodel.adapter.ResolveState.RespondsToChanges.DOES_NOT_RESPOND_TO_CHANGES;
@@ -26,14 +29,6 @@ import static org.apache.isis.core.metamodel.adapter.ResolveState.RespondsToChan
 import static org.apache.isis.core.metamodel.adapter.ResolveState.TransitionFrom.CANNOT_TRANSITION_FROM;
 import static org.apache.isis.core.metamodel.adapter.ResolveState.TransitionFrom.CAN_TRANSITION_FROM;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.collect.Maps;
-
 public final class ResolveState {
     private static final Map<String, ResolveState> statesByName = Maps.newHashMap();
 
@@ -61,40 +56,6 @@ public final class ResolveState {
     public static final ResolveState DESTROYED = new ResolveState("Destroyed", "D~~", null,      CANNOT_TRANSITION_FROM, RESPONDS_TO_CHANGES,         DOES_NOT_REPRESENT_PERSISTENT);
     public static final ResolveState VALUE     = new ResolveState("Value",     "V~~", null,      CANNOT_TRANSITION_FROM, RESPONDS_TO_CHANGES,         DOES_NOT_REPRESENT_PERSISTENT);
 
-    // 20120709: used only in <tt>Memento</tt>, when recreating a transient object.
-    // however, analysis is that could equally set to TRANSIENT, rendering this state
-    // surplus to requirements.
-    // public static final ResolveState SERIALIZING_TRANSIENT = new ResolveState("Serializing Transient", "T~S", TRANSIENT, CANNOT_TRANSITION_FROM, DOES_NOT_RESPOND_TO_CHANGES, REPRESENTS_TRANSIENT,         DOES_NOT_REPRESENT_PERSISTENT);
-
-    // no longer seem to be used
-
-    // public static final ResolveState PART_RESOLVED = new
-    // ResolveState("Part Resolved", "Pr~~", null, RESOLVABLE_FROM,
-    // NOT_RESOLVABLE_INTO, RESPONDS_TO_CHANGES, DOES_NOT_REPRESENT_TRANSIENT,
-    // REPRESENTS_PERSISTENT, DOES_NOT_REPRESENT_RESOLVING, COULD_RESOLVE);
-    // public static final ResolveState RESOLVING_PART = new
-    // ResolveState("Resolving Part", "P~r~", PART_RESOLVED,
-    // NOT_RESOLVABLE_FROM, RESOLVABLE_INTO, DOES_NOT_RESPOND_TO_CHANGES,
-    // DOES_NOT_REPRESENT_TRANSIENT, REPRESENTS_PERSISTENT,
-    // REPRESENTS_RESOLVING, COULD_RESOLVE);
-
-    // no longer appear to be needed following the removal of remoting support.
-
-    // public static final ResolveState SERIALIZING_GHOST = new
-    // ResolveState("Serializing Ghost", "PG~S", GHOST, NOT_RESOLVABLE_FROM,
-    // NOT_RESOLVABLE_INTO, DOES_NOT_RESPOND_TO_CHANGES,
-    // DOES_NOT_REPRESENT_TRANSIENT, REPRESENTS_PERSISTENT,
-    // DOES_NOT_REPRESENT_RESOLVING, COULD_RESOLVE);
-    // public static final ResolveState SERIALIZING_PART_RESOLVED = new
-    // ResolveState("Serializing Part Resolved", "Pr~S", PART_RESOLVED,
-    // NOT_RESOLVABLE_FROM, NOT_RESOLVABLE_INTO, DOES_NOT_RESPOND_TO_CHANGES,
-    // DOES_NOT_REPRESENT_TRANSIENT, REPRESENTS_PERSISTENT,
-    // DOES_NOT_REPRESENT_RESOLVING,
-    // COULD_RESOLVE);
-
-    // 20120709: only used in <tt>DefaultPersistAlgorithm</tt>
-    // able to remove because, after refactoring simplifications, ended up as equivalent to UPDATING.
-    // public static final ResolveState SERIALIZING_RESOLVED  = new ResolveState("Serializing Resolved",   "PRS", RESOLVED,  CANNOT_TRANSITION_FROM, DOES_NOT_RESPOND_TO_CHANGES, DOES_NOT_REPRESENT_TRANSIENT, REPRESENTS_PERSISTENT);
 
 
     /**
@@ -104,28 +65,14 @@ public final class ResolveState {
     public static Map<ResolveState, ResolveState[]> changeToStatesByState = new HashMap<ResolveState, ResolveState[]>() {
         private static final long serialVersionUID = 1L;
         {
-            // previously also RESOLVING_PART and SERIALIZING_GHOST
             put(GHOST, new ResolveState[] { DESTROYED, RESOLVING, UPDATING });
             put(NEW, new ResolveState[] { TRANSIENT, GHOST, VALUE });
-            // previously also SERIALIZING_TRANSIENT
             put(TRANSIENT, new ResolveState[] { RESOLVED });
             put(RESOLVING, new ResolveState[] { RESOLVED });
-            // previously also SERIALIZING_RESOLVED
             put(RESOLVED, new ResolveState[] { GHOST, UPDATING, DESTROYED });
-            //put(SERIALIZING_RESOLVED, new ResolveState[] { RESOLVED });
-            //put(SERIALIZING_TRANSIENT, new ResolveState[] { TRANSIENT });
             put(UPDATING, new ResolveState[] { RESOLVED });
             put(DESTROYED, new ResolveState[] {});
             put(VALUE, new ResolveState[] {});
-
-            // put(PART_RESOLVED, new ResolveState[] { RESOLVING , UPDATING,
-            // DESTROYED , RESOLVING_PART, SERIALIZING_PART_RESOLVED });
-            // put(RESOLVING_PART, new ResolveState[] { PART_RESOLVED, RESOLVED
-            // });
-            // put(SERIALIZING_GHOST, new ResolveState[] { GHOST });
-            // put(SERIALIZING_PART_RESOLVED, new ResolveState[] { PART_RESOLVED
-            // });
-
         }
     };
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
index 03423d1..8ebae19 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/adapter/mgr/AdapterManager.java
@@ -121,7 +121,7 @@ public interface AdapterManager extends Injectable {
                 ConcurrencyChecking.concurrencyChecking.set(prior);
             }
         }
-        
+
         /**
          * Allows a caller to temporarily disable concurrency checking for the current thread.
          */
@@ -140,7 +140,7 @@ public interface AdapterManager extends Injectable {
 
     /**
      * As per {@link #adapterFor(TypedOid, ConcurrencyChecking)}, with
-     * {@value org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking#NO_CHECK no checking}.
+     * {@link org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking#NO_CHECK no checking}.
      *
      * <p>
      * This method  will <i>always</i> return an object, possibly indicating it is persistent; so make sure that you
@@ -162,7 +162,7 @@ public interface AdapterManager extends Injectable {
      * {@link Oid#isTransient() transient} object.
      * 
      * <p>
-     * The pojo itself is recreated by delegating to a {@link PojoRecreator} implementation.
+     * The pojo itself is recreated by delegating to a {@link org.apache.isis.core.metamodel.adapter.mgr.AdapterManager}.
      * The default impl just uses the {@link ObjectSpecification#createObject()};
      * however object stores (eg JDO/DataNucleus) can provide alternative implementations
      * in order to ensure that the created pojo is attached to a persistence context.
@@ -182,7 +182,7 @@ public interface AdapterManager extends Injectable {
      * will be {@link TypedOid#setVersion(org.apache.isis.core.metamodel.adapter.version.Version) set} to the current 
      * value.  This allows the client to retry if they wish.
      * 
-     * @throws {@link ObjectNotFoundException} if the object does not exist.
+     * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
      */
     ObjectAdapter adapterFor(TypedOid oid, ConcurrencyChecking concurrencyChecking);
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryObjectStore.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryObjectStore.java b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryObjectStore.java
index 58a426c..53e3775 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryObjectStore.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/objectstore/InMemoryObjectStore.java
@@ -128,7 +128,7 @@ public class InMemoryObjectStore implements ObjectStore {
                 // this could happen if we rehydrate a persisted object that
                 // depends on another persisted object
                 // not yet rehydrated.
-                getPersistenceSession().removeAdapter(existingAdapterLookedUpByPojo);
+                getPersistenceSession().getAdapterManager().removeAdapter(existingAdapterLookedUpByPojo);
             }
 
             final ObjectAdapter existingAdapterLookedUpByOid = getAdapterManager().getAdapterFor(oid);
@@ -136,7 +136,7 @@ public class InMemoryObjectStore implements ObjectStore {
                 throw new IsisException("A mapping already exists for " + oid + ": " + existingAdapterLookedUpByOid);
             }
 
-            final ObjectAdapter recreatedAdapter = getPersistenceSession().mapRecreatedPojo(oid, pojo);
+            final ObjectAdapter recreatedAdapter = getPersistenceSession().getAdapterManager().mapRecreatedPojo(oid, pojo);
 
             final Version version = objectStoreInstances.getVersion(oid);
             recreatedAdapter.setVersion(version);
@@ -266,13 +266,6 @@ public class InMemoryObjectStore implements ObjectStore {
         adapter.markAsResolvedIfPossible();
     }
 
-    @Override
-    public void resolveField(final ObjectAdapter object, final ObjectAssociation field) throws ObjectPersistenceException {
-        final ObjectAdapter referenceAdapter = field.get(object);
-        referenceAdapter.markAsResolvedIfPossible();
-    }
-
-
 
     // ///////////////////////////////////////////////////////
     // getInstances, hasInstances

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/objectstore/internal/ObjectStoreInstances.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/objectstore/internal/ObjectStoreInstances.java b/core/runtime/src/main/java/org/apache/isis/core/objectstore/internal/ObjectStoreInstances.java
index 028dffb..b24f332 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/objectstore/internal/ObjectStoreInstances.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/objectstore/internal/ObjectStoreInstances.java
@@ -140,7 +140,7 @@ public class ObjectStoreInstances {
         if (adapterLookedUpByOid != null) {
             return adapterLookedUpByOid;
         }
-        return getPersistenceSession().mapRecreatedPojo(oid, pojo);
+        return getPersistenceSession().getAdapterManager().mapRecreatedPojo(oid, pojo);
     }
 
     // ///////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixturedomainservice/ObjectFixtureFilePersistor.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixturedomainservice/ObjectFixtureFilePersistor.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixturedomainservice/ObjectFixtureFilePersistor.java
index 934ecbe..90ac06e 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixturedomainservice/ObjectFixtureFilePersistor.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixturedomainservice/ObjectFixtureFilePersistor.java
@@ -19,20 +19,10 @@
 
 package org.apache.isis.core.runtime.fixturedomainservice;
 
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
+import java.io.*;
+import java.util.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacet;
@@ -46,7 +36,6 @@ import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
 
 public class ObjectFixtureFilePersistor {
 
@@ -216,7 +205,7 @@ class LoadedObjects {
     }
 
     
-    protected Persistor getPersistenceSession() {
+    protected PersistenceSession getPersistenceSession() {
         return IsisContext.getPersistenceSession();
     }
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
index 9dd3556..868c498 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/fixtures/FixturesInstallerDelegate.java
@@ -33,7 +33,6 @@ import org.apache.isis.core.metamodel.services.ServicesInjectorSpi;
 import org.apache.isis.core.runtime.system.DeploymentType;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.Persistor;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 
 /**
@@ -147,7 +146,7 @@ public class FixturesInstallerDelegate {
     /**
      * Hook - default does nothing.
      */
-    protected void preInstallFixtures(final Persistor persistenceSession) {
+    protected void preInstallFixtures(final PersistenceSession persistenceSession) {
     }
 
     // ///////////////////////////////////////
@@ -238,7 +237,7 @@ public class FixturesInstallerDelegate {
     /**
      * Hook - default does nothing.
      */
-    protected void postInstallFixtures(final Persistor persistenceSession) {
+    protected void postInstallFixtures(final PersistenceSession persistenceSession) {
     }
 
     // /////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
index dd384d5..b470119 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/memento/Memento.java
@@ -197,7 +197,7 @@ public class Memento implements Serializable {
 		if (spec.isParentedOrFreeCollection()) {
         	
         	final Object recreatedPojo = spec.createObject();
-        	adapter = getPersistenceSession().mapRecreatedPojo(oid, recreatedPojo);
+        	adapter = getPersistenceSession().getAdapterManager() .mapRecreatedPojo(oid, recreatedPojo);
             populateCollection(adapter, (CollectionData) data);
             
         } else {

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
index 08b6af4..8df358b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adapter/PojoAdapter.java
@@ -234,13 +234,6 @@ public class PojoAdapter extends InstanceAbstract implements ObjectAdapter {
         return aggregateResolveState().canTransitionToResolving();
     }
 
-
-    @Override
-    public boolean isTitleAvailable() {
-        final ResolveState resolveState = aggregateResolveState();
-        return resolveState.isValue() || resolveState.isResolved();
-    }
-
     /**
      * If {@link #isGhost()}, then will become resolved.
      */

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
index 6f180d7..c9f685c 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/adaptermanager/AdapterManagerDefault.java
@@ -57,7 +57,6 @@ import org.apache.isis.core.runtime.persistence.PojoRecreationException;
 import org.apache.isis.core.runtime.system.context.IsisContext;
 import org.apache.isis.core.runtime.system.persistence.OidGenerator;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-import org.apache.isis.core.runtime.system.persistence.RecreatedPojoRemapper;
 
 import static org.apache.isis.core.commons.ensure.Ensure.ensureThatArg;
 import static org.hamcrest.CoreMatchers.*;
@@ -77,7 +76,6 @@ import static org.hamcrest.CoreMatchers.*;
  * maps to an {@link ObjectAdapter adapter} and these are reused.
  */
 public class AdapterManagerDefault implements AdapterManager, Iterable<ObjectAdapter>,
-        RecreatedPojoRemapper,
         SessionScopedComponent,
         DebuggableWithTitle,
         Resettable {
@@ -366,7 +364,6 @@ public class AdapterManagerDefault implements AdapterManager, Iterable<ObjectAda
         return adapter;
     }
 
-    @Override
     public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
         removeAdapter(adapter);
         adapter.replacePojo(pojo);
@@ -374,7 +371,26 @@ public class AdapterManagerDefault implements AdapterManager, Iterable<ObjectAda
     }
 
 
-    @Override
+    /**
+     * Either returns an existing {@link ObjectAdapter adapter} (as per
+     * {@link #getAdapterFor(Object)} or {@link #getAdapterFor(Oid)}), otherwise
+     * re-creates an adapter with the specified (persistent) {@link Oid}.
+     *
+     * <p>
+     * Typically called when the {@link Oid} is already known, that is, when
+     * resolving an already-persisted object. Is also available for
+     * <tt>Memento</tt> support however, so {@link Oid} could also represent a
+     * {@link Oid#isTransient() transient} object.
+     *
+     * <p>
+     * If the {@link ObjectAdapter adapter} is recreated, its
+     * {@link ResolveState} will be set to either
+     * {@link ResolveState#TRANSIENT} or {@link ResolveState#GHOST} based on
+     * whether the {@link Oid} is {@link Oid#isTransient() transient} or not.
+     *
+     * @param oid
+     * @param recreatedPojo - already known to the object store impl, or a service
+     */
     public ObjectAdapter mapRecreatedPojo(final Oid oid, final Object recreatedPojo) {
 
         // attempt to locate adapter for the pojo

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java
index 53f2d58..c0a9de1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithm.java
@@ -20,10 +20,11 @@
 package org.apache.isis.core.runtime.persistence.objectstore.algorithm;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 public interface PersistAlgorithm {
     
-    public void makePersistent(final ObjectAdapter object, final ToPersistObjectSet adders);
+    public void makePersistent(final ObjectAdapter object, final PersistenceSession adders);
 
     public String name();
 }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmDefault.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmDefault.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmDefault.java
index 57afe05..fb2a81d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmDefault.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmDefault.java
@@ -30,6 +30,7 @@ import org.apache.isis.core.metamodel.facets.collections.modify.CollectionFacetU
 import org.apache.isis.core.metamodel.spec.feature.Contributed;
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.runtime.persistence.ObjectPersistenceException;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 class PersistAlgorithmDefault extends PersistAlgorithmAbstract {
     private static final Logger LOG = LoggerFactory.getLogger(PersistAlgorithmDefault.class);
@@ -40,7 +41,7 @@ class PersistAlgorithmDefault extends PersistAlgorithmAbstract {
     }
 
     @Override
-    public void makePersistent(final ObjectAdapter adapter, final ToPersistObjectSet toPersistObjectSet) {
+    public void makePersistent(final ObjectAdapter adapter, final PersistenceSession toPersistObjectSet) {
         if (adapter.getSpecification().isParentedOrFreeCollection()) {
             if(LOG.isDebugEnabled()) {
                 LOG.debug("persist " + adapter);
@@ -61,7 +62,7 @@ class PersistAlgorithmDefault extends PersistAlgorithmAbstract {
         }
     }
 
-    protected void persist(final ObjectAdapter adapter, final ToPersistObjectSet toPersistObjectSet) {
+    protected void persist(final ObjectAdapter adapter, final PersistenceSession toPersistObjectSet) {
         if (alreadyPersistedOrNotPersistableOrServiceOrStandalone(adapter)) {
             return;
         }

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmForDataNucleus.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmForDataNucleus.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmForDataNucleus.java
index 134654b..297f470 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmForDataNucleus.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmForDataNucleus.java
@@ -22,6 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 
 /**
@@ -51,7 +52,7 @@ class PersistAlgorithmForDataNucleus extends PersistAlgorithmAbstract {
     // ////////////////////////////////////////////////////////////////
 
     public void makePersistent(final ObjectAdapter adapter,
-            final ToPersistObjectSet toPersistObjectSet) {
+            final PersistenceSession persistenceSession) {
         if (alreadyPersistedOrNotPersistable(adapter)) {
             return;
         }
@@ -68,7 +69,7 @@ class PersistAlgorithmForDataNucleus extends PersistAlgorithmAbstract {
         if (alreadyPersistedOrNotPersistable(adapter)) {
             return;
         }
-        toPersistObjectSet.addCreateObjectCommand(adapter);
+        persistenceSession.addCreateObjectCommand(adapter);
     }
 
 

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmUnified.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmUnified.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmUnified.java
index dca5413..5ebc0b0 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmUnified.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/PersistAlgorithmUnified.java
@@ -23,6 +23,7 @@ import org.slf4j.LoggerFactory;
 import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.runtime.PersistorImplementation;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
 
 /**
@@ -48,8 +49,8 @@ public class PersistAlgorithmUnified extends PersistAlgorithmAbstract {
 
     public void makePersistent(
             final ObjectAdapter adapter,
-            final ToPersistObjectSet toPersistObjectSet) {
-        persistAlgorithm.makePersistent(adapter, toPersistObjectSet);
+            final PersistenceSession persistenceSession) {
+        persistAlgorithm.makePersistent(adapter, persistenceSession);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/ToPersistObjectSet.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/ToPersistObjectSet.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/ToPersistObjectSet.java
deleted file mode 100644
index 7170743..0000000
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/algorithm/ToPersistObjectSet.java
+++ /dev/null
@@ -1,45 +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.core.runtime.persistence.objectstore.algorithm;
-
-import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
-
-/**
- * Set of {@link ObjectAdapter}s that require persisting.
- * 
- * <p>
- * Is consumed by {@link PersistAlgorithm}, and is ultimately implemented by
- * {@link PersistenceSession}.
- */
-public interface ToPersistObjectSet {
-
-    void remapAsPersistent(final ObjectAdapter object);
-    
-    void addCreateObjectCommand(ObjectAdapter object);
-    
-    /**
-     * To support ISIS-234; keep track, for the duration of the transaction only, 
-     * of the old transient {@link Oid}s and their corresponding persistent {@link Oid}s.
-     */
-    Oid remappedFrom(Oid oid);
-    
-}

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
index f7c7466..caa5e28 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/objectstore/transaction/PublishingServiceWithDefaultPayloadFactories.java
@@ -58,7 +58,7 @@ public class PublishingServiceWithDefaultPayloadFactories {
             // objectstores such as JDO prevent the underlying pojo from being touched once it has been deleted.
             // we therefore replace that pojo with an 'empty' one.
             Object replacementObject = adapter.getSpecification().createObject();
-            getPersistenceSession().remapRecreatedPojo(adapter, replacementObject);
+            getPersistenceSession().getAdapterManager().remapRecreatedPojo(adapter, replacementObject);
             return adapter;
         }
         protected PersistenceSession getPersistenceSession() {

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectStore.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectStore.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectStore.java
index a5b8005..ff28104 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectStore.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/ObjectStore.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.adapter.oid.CollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.adapter.oid.TypedOid;
 import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.runtime.persistence.objectstore.transaction.*;
 
 public interface ObjectStore extends TransactionalResource, DebuggableWithTitle, SessionScopedComponent {
@@ -121,8 +120,7 @@ public interface ObjectStore extends TransactionalResource, DebuggableWithTitle,
 
     /**
      * Retrieves the object identified by the specified {@link TypedOid} from the object
-     * store, {@link RecreatedPojoRemapper#mapRecreatedPojo(org.apache.isis.core.metamodel.adapter.oid.Oid, Object) mapped} into
-     * the {@link AdapterManager}.
+     * store, {@link AdapterManager#mapRecreatedPojo(org.apache.isis.core.metamodel.adapter.oid.Oid, Object) mapped by the adapter manager}.
      * 
      * <p>The cache should be checked first and, if the object is cached,
      * the cached version should be returned. It is important that if this
@@ -163,7 +161,7 @@ public interface ObjectStore extends TransactionalResource, DebuggableWithTitle,
 
 
     // ///////////////////////////////////////////////////////
-    // resolveField, resolveImmediately
+    // resolveImmediately
     // ///////////////////////////////////////////////////////
 
     /**
@@ -173,12 +171,6 @@ public interface ObjectStore extends TransactionalResource, DebuggableWithTitle,
      */
     void resolveImmediately(ObjectAdapter object);
 
-    /**
-     * Called by the resolveEagerly method in ObjectAdapterManager.
-     * 
-     * @see PersistenceSession#resolveField(ObjectAdapter, ObjectAssociation)
-     */
-    void resolveField(ObjectAdapter object, ObjectAssociation field);
 
     // ///////////////////////////////////////////////////////
     // Services

http://git-wip-us.apache.org/repos/asf/isis/blob/5f8fca9b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
new file mode 100644
index 0000000..e93769b
--- /dev/null
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceQueryFactory.java
@@ -0,0 +1,103 @@
+/*
+ *  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;
+
+import java.util.Map;
+import com.google.common.collect.Maps;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.isis.applib.query.Query;
+import org.apache.isis.applib.query.QueryDefault;
+import org.apache.isis.applib.query.QueryFindAllInstances;
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.services.container.query.QueryCardinality;
+import org.apache.isis.core.metamodel.services.container.query.QueryFindByPattern;
+import org.apache.isis.core.metamodel.services.container.query.QueryFindByTitle;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+import org.apache.isis.core.runtime.persistence.query.*;
+
+public class PersistenceQueryFactory {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PersistenceQueryFactory.class);
+
+    private final SpecificationLoader specificationLoader;
+    private final AdapterManager adapterManager;
+
+    PersistenceQueryFactory(final SpecificationLoader specificationLoader, final AdapterManager adapterManager) {
+        this.specificationLoader = specificationLoader;
+        this.adapterManager = adapterManager;
+    }
+
+    /**
+     * Converts the {@link org.apache.isis.applib.query.Query applib representation of a query} into the
+     * {@link PersistenceQuery NOF-internal representation}.
+     */
+    final PersistenceQuery createPersistenceQueryFor(final Query<?> query, final QueryCardinality cardinality) {
+        if (LOG.isDebugEnabled()) {
+            LOG.debug("createPersistenceQueryFor: " + query.getDescription());
+        }
+        final ObjectSpecification noSpec = specFor(query);
+        if (query instanceof QueryFindAllInstances) {
+            final QueryFindAllInstances<?> queryFindAllInstances = (QueryFindAllInstances<?>) query;
+            return new PersistenceQueryFindAllInstances(noSpec, queryFindAllInstances.getStart(), queryFindAllInstances.getCount());
+        }
+        if (query instanceof QueryFindByTitle) {
+            final QueryFindByTitle<?> queryByTitle = (QueryFindByTitle<?>) query;
+            final String title = queryByTitle.getTitle();
+            return new PersistenceQueryFindByTitle(noSpec, title, queryByTitle.getStart(), queryByTitle.getCount());
+        }
+        if (query instanceof QueryFindByPattern) {
+            final QueryFindByPattern<?> queryByPattern = (QueryFindByPattern<?>) query;
+            final Object pattern = queryByPattern.getPattern();
+            final ObjectAdapter patternAdapter = adapterManager.adapterFor(pattern);
+            return new PersistenceQueryFindByPattern(noSpec, patternAdapter, queryByPattern.getStart(), queryByPattern.getCount());
+        }
+        if (query instanceof QueryDefault) {
+            final QueryDefault<?> queryDefault = (QueryDefault<?>) query;
+            final String queryName = queryDefault.getQueryName();
+            final Map<String, ObjectAdapter> argumentsAdaptersByParameterName = wrap(queryDefault.getArgumentsByParameterName());
+            return new PersistenceQueryFindUsingApplibQueryDefault(noSpec, queryName, argumentsAdaptersByParameterName, cardinality, queryDefault.getStart(), queryDefault.getCount());
+        }
+        // fallback; generic serializable applib query.
+        return new PersistenceQueryFindUsingApplibQuerySerializable(noSpec, query, cardinality);
+    }
+
+    /**
+     * Converts a map of pojos keyed by string to a map of adapters keyed by the
+     * same strings.
+     */
+    private Map<String, ObjectAdapter> wrap(final Map<String, Object> argumentsByParameterName) {
+        final Map<String, ObjectAdapter> argumentsAdaptersByParameterName = Maps.newHashMap();
+        for (final Map.Entry<String, Object> entry : argumentsByParameterName.entrySet()) {
+            final String parameterName = entry.getKey();
+            final Object argument = argumentsByParameterName.get(parameterName);
+            final ObjectAdapter argumentAdapter = argument != null ? adapterManager.adapterFor(argument) : null;
+            argumentsAdaptersByParameterName.put(parameterName, argumentAdapter);
+        }
+        return argumentsAdaptersByParameterName;
+    }
+
+    private ObjectSpecification specFor(final Query<?> query) {
+        return specificationLoader.loadSpecification(query.getResultType());
+    }
+
+
+}