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 2015/09/15 08:03:48 UTC

[43/50] [abbrv] isis git commit: ISIS-1194: using PersistenceSession rather than AdapterManager interface where possible;

ISIS-1194: using PersistenceSession rather than AdapterManager interface where possible;

removed:
- adapterFor(RootOid) and adapterFor(RootOid, ConcurrencyChecking) from AdapterManager; always call PersistenceSession instead
- remove remapRecreatedojo, remapAsPersistent from AdapterManagerDefault, as are now never called
- simplified OidUtils (part of RO rendering), moving logic into PersistenceSession as new "adapterForAny(RootOid)" method
- in PersistenceSession:
  - inlined getOidAdapterMap() and getPojoAdapterMap();
  - marked methods private where possible
also:
- added RendererContext5 to expose the SpecificationLoader (though in the end, not actually required)


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

Branch: refs/heads/master
Commit: d627d827d40cffedf26b5f36761e4bcea6c7f4ad
Parents: ecdb512
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon Sep 14 21:14:26 2015 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon Sep 14 21:14:26 2015 +0100

----------------------------------------------------------------------
 .../integtestsupport/IsisSystemForTest.java     |   2 +-
 .../metamodel/adapter/mgr/AdapterManager.java   |  39 ----
 .../noruntime/RuntimeContextNoRuntime.java      |  10 --
 .../adaptermanager/AdapterManagerDefault.java   |  27 ---
 .../container/DomainObjectContainerResolve.java |   2 +-
 .../internal/RuntimeContextFromSession.java     |  11 --
 .../AbstractIsisSessionTemplate.java            |   4 +-
 .../system/persistence/PersistenceSession.java  | 177 +++++++++++++------
 .../rendering/RendererContext5.java             |  30 ++++
 .../restfulobjects/server/ResourceContext.java  |   4 +-
 .../restfulobjects/server/util/OidUtils.java    |  40 +----
 .../viewer/wicket/model/models/ActionModel.java |   2 +-
 12 files changed, 157 insertions(+), 191 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/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 8e9a348..2dc250c 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
@@ -587,7 +587,7 @@ public class IsisSystemForTest implements org.junit.rules.TestRule, DomainServic
 
     public ObjectAdapter recreateAdapter(RootOid oid) {
         ensureSessionInProgress();
-        return getAdapterManager().adapterFor(oid);
+        return getPersistenceSession().adapterFor(oid);
     }
 
     public ObjectAdapter remapAsPersistent(Object pojo, RootOid persistentOid) {

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/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 3c06936..899a656 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
@@ -25,7 +25,6 @@ import org.apache.isis.applib.annotation.ActionSemantics;
 import org.apache.isis.core.commons.components.Injectable;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 
 public interface AdapterManager extends Injectable {
@@ -120,46 +119,8 @@ public interface AdapterManager extends Injectable {
 
     }
 
-    /**
-     * As per {@link #adapterFor(RootOid, ConcurrencyChecking)}, with
-     * {@link 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
-     * know that the oid does indeed represent an object you know exists.
-     * </p>
-     */
-    ObjectAdapter adapterFor(RootOid oid);
 
 
-    /**
-     * Either returns an existing {@link ObjectAdapter adapter} (as per
-     * {@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>
-     * The pojo itself is recreated by delegating to a {@link AdapterManager}.
-     *
-     * <p>
-     * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
-     * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
-     * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
-     * If the version differs, then a {@link ConcurrencyException} is thrown.
-     *
-     * <p>
-     * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
-     * will be {@link RootOid#setVersion(Version) set} to the current
-     * value.  This allows the client to retry if they wish.
-     *
-     * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
-     */
-    ObjectAdapter adapterFor(RootOid oid, ConcurrencyChecking concurrencyChecking);
 
     /**
      * Looks up or creates a standalone (value) or root adapter.

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
----------------------------------------------------------------------
diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
index 814a784..4297fb0 100644
--- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
+++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/runtimecontext/noruntime/RuntimeContextNoRuntime.java
@@ -141,16 +141,6 @@ public class RuntimeContextNoRuntime extends RuntimeContextAbstract {
             }
 
             @Override
-            public ObjectAdapter adapterFor(RootOid rootOid) {
-            	throw new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
-            }
-            
-            @Override
-            public ObjectAdapter adapterFor(RootOid rootOid, ConcurrencyChecking concurrencyChecking) {
-                throw new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
-            }
-            
-            @Override
             public ObjectAdapter getAdapterFor(Oid oid) {
                 throw new UnsupportedOperationException("Not supported by this implementation of RuntimeContext");
             }

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/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 e894cdc..b631847 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
@@ -27,7 +27,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 
@@ -102,27 +101,8 @@ public class AdapterManagerDefault implements AdapterManager,
         return persistenceSession.adapterFor(pojo, parentAdapter, collection);
     }
 
-
-    @Override
-    public ObjectAdapter adapterFor(final RootOid rootOid) {
-        return persistenceSession.adapterFor(rootOid);
-    }
-
-    @Override
-    public ObjectAdapter adapterFor(
-            final RootOid oid,
-            final ConcurrencyChecking concurrencyChecking) {
-        return persistenceSession.adapterFor(oid, concurrencyChecking);
-    }
-
-
     //endregion
 
-    //region > remapRecreatedPojo
-    public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
-        persistenceSession.remapRecreatedPojo(adapter, pojo);
-    }
-    //endregion
 
     //region > mapRecreatedPojo
 
@@ -141,13 +121,6 @@ public class AdapterManagerDefault implements AdapterManager,
 
     //endregion
 
-    //region > remapAsPersistent
-
-    public void remapAsPersistent(final ObjectAdapter adapter, RootOid hintRootOid) {
-        persistenceSession.remapAsPersistent(adapter, hintRootOid);
-    }
-
-    //endregion
 
     //region > Injectable
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/container/DomainObjectContainerResolve.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/container/DomainObjectContainerResolve.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/container/DomainObjectContainerResolve.java
index a186b9d..d8cffd9 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/container/DomainObjectContainerResolve.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/container/DomainObjectContainerResolve.java
@@ -95,7 +95,7 @@ public class DomainObjectContainerResolve {
     }
 
     private ObjectAdapter adapterFor(final RootOid oid) {
-        return getAdapterManager().adapterFor(oid);
+        return getPersistenceSession().adapterFor(oid);
     }
 
     // /////////////////////////////////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
index 3f5a6b5..9eba740 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/persistence/internal/RuntimeContextFromSession.java
@@ -35,7 +35,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManagerAware;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
-import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProvider;
 import org.apache.isis.core.metamodel.deployment.DeploymentCategoryProviderAbstract;
@@ -123,16 +122,6 @@ public class RuntimeContextFromSession extends RuntimeContextAbstract {
             }
 
             @Override
-            public ObjectAdapter adapterFor(RootOid oid) {
-                return getPersistenceSession().adapterFor(oid);
-            }
-
-            @Override
-            public ObjectAdapter adapterFor(RootOid oid, ConcurrencyChecking concurrencyChecking) {
-                return getPersistenceSession().adapterFor(oid, concurrencyChecking);
-            }
-
-            @Override
             public void injectInto(Object candidate) {
                 if (AdapterManagerAware.class.isAssignableFrom(candidate.getClass())) {
                     final AdapterManagerAware cast = AdapterManagerAware.class.cast(candidate);

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/runtime/src/main/java/org/apache/isis/core/runtime/sessiontemplate/AbstractIsisSessionTemplate.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/sessiontemplate/AbstractIsisSessionTemplate.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/sessiontemplate/AbstractIsisSessionTemplate.java
index 0205dd0..5a18234 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/sessiontemplate/AbstractIsisSessionTemplate.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/sessiontemplate/AbstractIsisSessionTemplate.java
@@ -81,10 +81,10 @@ public abstract class AbstractIsisSessionTemplate {
     // //////////////////////////////////////
 
     protected ObjectAdapter adapterFor(final Object targetObject) {
-        return getAdapterManager().adapterFor(targetObject);
+        return getPersistenceSession().adapterFor(targetObject);
     }
     protected ObjectAdapter adapterFor(final RootOid rootOid) {
-        return getAdapterManager().adapterFor(rootOid);
+        return getPersistenceSession().adapterFor(rootOid);
     }
     
     // //////////////////////////////////////

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
index 9ef8083..d2455a8 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession.java
@@ -256,8 +256,8 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
             LOG.debug("opening " + this);
         }
 
-        getOidAdapterMap().open();
-        getPojoAdapterMap().open();
+        oidAdapterMap.open();
+        pojoAdapterMap.open();
 
         persistenceManager = applicationComponents.getPersistenceManagerFactory().getPersistenceManager();
 
@@ -356,14 +356,14 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         }
 
         try {
-            getOidAdapterMap().close();
+            oidAdapterMap.close();
         } catch(final Throwable ex) {
             // ignore
             LOG.error("close: oidAdapterMap#close() failed; continuing to avoid memory leakage");
         }
 
         try {
-            getPojoAdapterMap().close();
+            pojoAdapterMap.close();
         } catch(final Throwable ex) {
             // ignore
             LOG.error("close: pojoAdapterMap#close() failed; continuing to avoid memory leakage");
@@ -1178,12 +1178,12 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         }
         debug.appendln();
 
-        debug.appendTitle(getPojoAdapterMap().debugTitle());
-        getPojoAdapterMap().debugData(debug);
+        debug.appendTitle(pojoAdapterMap.debugTitle());
+        pojoAdapterMap.debugData(debug);
         debug.appendln();
 
-        debug.appendTitle(getOidAdapterMap().debugTitle());
-        getOidAdapterMap().debugData(debug);
+        debug.appendTitle(oidAdapterMap.debugTitle());
+        oidAdapterMap.debugData(debug);
 
         debug.appendTitle("Persistor");
         getTransactionManager().debugData(debug);
@@ -1265,19 +1265,11 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     private final PojoAdapterHashMap pojoAdapterMap = new PojoAdapterHashMap();
     private final OidAdapterHashMap oidAdapterMap = new OidAdapterHashMap();
 
-    public PojoAdapterHashMap getPojoAdapterMap() {
-        return pojoAdapterMap;
-    }
-
-    public OidAdapterHashMap getOidAdapterMap() {
-        return oidAdapterMap;
-    }
-
     @Override
     public ObjectAdapter getAdapterFor(final Object pojo) {
         ensureThatArg(pojo, is(notNullValue()));
 
-        return getPojoAdapterMap().getAdapter(pojo);
+        return pojoAdapterMap.getAdapter(pojo);
     }
 
     @Override
@@ -1285,11 +1277,11 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         ensureThatArg(oid, is(notNullValue()));
         ensureMapsConsistent(oid);
 
-        return getOidAdapterMap().getAdapter(oid);
+        return oidAdapterMap.getAdapter(oid);
     }
 
 
-    public ObjectAdapter existingOrValueAdapter(Object pojo) {
+    private ObjectAdapter existingOrValueAdapter(Object pojo) {
 
         // attempt to locate adapter for the pojo
         ObjectAdapter adapter = getAdapterFor(pojo);
@@ -1328,7 +1320,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     /**
      * Fail early if any problems.
      */
-    public void ensureMapsConsistent(final ObjectAdapter adapter) {
+    private void ensureMapsConsistent(final ObjectAdapter adapter) {
         if (adapter.isValue()) {
             return;
         }
@@ -1345,7 +1337,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     private void ensureMapsConsistent(final Oid oid) {
         ensureThatArg(oid, is(notNullValue()));
 
-        final ObjectAdapter adapter = getOidAdapterMap().getAdapter(oid);
+        final ObjectAdapter adapter = oidAdapterMap.getAdapter(oid);
         if (adapter == null) {
             return;
         }
@@ -1355,7 +1347,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
 
     private void ensurePojoAdapterMapConsistent(final ObjectAdapter adapter) {
         final Object adapterPojo = adapter.getObject();
-        final ObjectAdapter adapterAccordingToPojoAdapterMap = getPojoAdapterMap().getAdapter(adapterPojo);
+        final ObjectAdapter adapterAccordingToPojoAdapterMap = pojoAdapterMap.getAdapter(adapterPojo);
         // take care not to touch the pojo, since it might have been deleted.
         ensureThatArg(
                 adapter, is(adapterAccordingToPojoAdapterMap),
@@ -1365,7 +1357,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
 
     private void ensureOidAdapterMapConsistent(final ObjectAdapter adapter) {
         final Oid adapterOid = adapter.getOid();
-        final ObjectAdapter adapterAccordingToOidAdapterMap = getOidAdapterMap()
+        final ObjectAdapter adapterAccordingToOidAdapterMap = oidAdapterMap
                 .getAdapter(adapterOid);
         // take care not to touch the pojo, since it might have been deleted.
         ensureThatArg(
@@ -1375,13 +1367,82 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     }
 
 
-    @Override
+    public ObjectAdapter adapterForAny(RootOid rootOid) {
+
+        final ObjectSpecId specId = rootOid.getObjectSpecId();
+        final ObjectSpecification spec = getSpecificationLoader().lookupBySpecId(specId);
+        if(spec == null) {
+            // eg "NONEXISTENT:123"
+            return null;
+        }
+
+        if(spec.containsFacet(ViewModelFacet.class)) {
+
+            // this is a hack; the RO viewer when rendering the URL for the view model loses the "view model" indicator
+            // ("*") from the specId, meaning that the marshalling logic above in RootOidDefault.deString() creates an
+            // oid in the wrong state.  The code below checks for this and recreates the oid with the current state of 'view model'
+            if(!rootOid.isViewModel()) {
+                rootOid = new RootOid(rootOid.getObjectSpecId(), rootOid.getIdentifier(), Oid.State.VIEWMODEL);
+            }
+
+            try {
+                return adapterFor(rootOid);
+            } catch(final ObjectNotFoundException ex) {
+                return null;
+            } catch(final PojoRecreationException ex) {
+                return null;
+            }
+        } else {
+            try {
+                ObjectAdapter objectAdapter = loadObjectInTransaction(rootOid);
+                return objectAdapter.isTransient() ? null : objectAdapter;
+            } catch(final ObjectNotFoundException ex) {
+                return null;
+            }
+        }
+    }
+
+    /**
+     * As per {@link #adapterFor(RootOid, ConcurrencyChecking)}, with
+     * {@link 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
+     * know that the oid does indeed represent an object you know exists.
+     * </p>
+     */
     public ObjectAdapter adapterFor(final RootOid rootOid) {
         return adapterFor(rootOid, ConcurrencyChecking.NO_CHECK);
     }
 
 
-    @Override
+    /**
+     * Either returns an existing {@link ObjectAdapter adapter} (as per
+     * {@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>
+     * The pojo itself is recreated by delegating to a {@link AdapterManager}.
+     *
+     * <p>
+     * The {@link ConcurrencyChecking} parameter determines whether concurrency checking is performed.
+     * If it is requested, then a check is made to ensure that the {@link Oid#getVersion() version}
+     * of the {@link RootOid oid} of the recreated adapter is the same as that of the provided {@link RootOid oid}.
+     * If the version differs, then a {@link ConcurrencyException} is thrown.
+     *
+     * <p>
+     * ALSO, even if a {@link ConcurrencyException}, then the provided {@link RootOid oid}'s {@link Version version}
+     * will be {@link RootOid#setVersion(Version) set} to the current
+     * value.  This allows the client to retry if they wish.
+     *
+     * @throws {@link org.apache.isis.core.runtime.persistence.ObjectNotFoundException} if the object does not exist.
+     */
     public ObjectAdapter adapterFor(
             final RootOid rootOid,
             final ConcurrencyChecking concurrencyChecking) {
@@ -1412,9 +1473,9 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
                     // check for exception, but don't throw if suppressed through thread-local
                     final Version otherVersion = originalOid.getVersion();
                     final Version thisVersion = recreatedOid.getVersion();
-                    if(thisVersion != null &&
-                            otherVersion != null &&
-                            thisVersion.different(otherVersion)) {
+                    if( thisVersion != null &&
+                        otherVersion != null &&
+                        thisVersion.different(otherVersion)) {
 
                         if(concurrencyCheckingGloballyEnabled && ConcurrencyChecking.isCurrentlyEnabled()) {
                             LOG.info("concurrency conflict detected on " + recreatedOid + " (" + otherVersion + ")");
@@ -1444,7 +1505,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     }
 
 
-    public Object recreatePojo(RootOid oid) {
+    private Object recreatePojo(RootOid oid) {
         if(oid.isTransient() || oid.isViewModel()) {
             return recreatePojoDefault(oid);
         } else {
@@ -1528,7 +1589,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * Should only be called if the pojo is known not to be
      * {@link #getAdapterFor(Object) mapped}.
      */
-    public ObjectAdapter createCollectionAdapter(
+    private ObjectAdapter createCollectionAdapter(
             final Object pojo,
             final ObjectAdapter parentAdapter,
             final OneToManyAssociation otma) {
@@ -1554,8 +1615,6 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
 
 
 
-
-
     /**
      * {@inheritDoc}
      *
@@ -1586,7 +1645,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
             LOG.debug("removing root adapter from oid map");
         }
 
-        boolean removed = getOidAdapterMap().remove(transientRootOid);
+        boolean removed = oidAdapterMap.remove(transientRootOid);
         if (!removed) {
             LOG.warn("could not remove oid: " + transientRootOid);
             // should we fail here with a more serious error?
@@ -1597,7 +1656,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         }
         for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
             final Oid collectionOid = collectionAdapter.getOid();
-            removed = getOidAdapterMap().remove(collectionOid);
+            removed = oidAdapterMap.remove(collectionOid);
             if (!removed) {
                 LOG.warn("could not remove collectionOid: " + collectionOid);
                 // should we fail here with a more serious error?
@@ -1633,7 +1692,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
                     oidMarshaller) + " (was: " + transientRootOid.enString(oidMarshaller) + ")");
         }
         adapter.replaceOid(persistedRootOid);
-        getOidAdapterMap().add(persistedRootOid, adapter);
+        oidAdapterMap.add(persistedRootOid, adapter);
 
         // associate the collection adapters with new Oids, and re-map
         if (LOG.isDebugEnabled()) {
@@ -1642,7 +1701,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         for (final ObjectAdapter collectionAdapter : rootAndCollectionAdapters) {
             final ParentedCollectionOid previousCollectionOid = (ParentedCollectionOid) collectionAdapter.getOid();
             final ParentedCollectionOid persistedCollectionOid = previousCollectionOid.asPersistent(persistedRootOid);
-            getOidAdapterMap().add(persistedCollectionOid, collectionAdapter);
+            oidAdapterMap.add(persistedCollectionOid, collectionAdapter);
         }
 
 
@@ -1658,9 +1717,9 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
             final Object collectionPojoActuallyOnPojo = getCollectionPojo(otma, adapter);
 
             if (collectionPojoActuallyOnPojo != collectionPojoWrappedByAdapter) {
-                getPojoAdapterMap().remove(collectionAdapter);
+                pojoAdapterMap.remove(collectionAdapter);
                 collectionAdapter.replacePojo(collectionPojoActuallyOnPojo);
-                getPojoAdapterMap().add(collectionPojoActuallyOnPojo, collectionAdapter);
+                pojoAdapterMap.add(collectionPojoActuallyOnPojo, collectionAdapter);
             }
         }
 
@@ -1669,7 +1728,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         }
     }
 
-    public static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
+    private static Object getCollectionPojo(final OneToManyAssociation association, final ObjectAdapter ownerAdapter) {
         final PropertyOrCollectionAccessorFacet accessor = association.getFacet(PropertyOrCollectionAccessorFacet.class);
         return accessor.getProperty(ownerAdapter, InteractionInitiatedBy.FRAMEWORK);
     }
@@ -1738,6 +1797,18 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         unmap(adapter);
     }
 
+    private void unmap(final ObjectAdapter adapter) {
+        ensureMapsConsistent(adapter);
+
+        final Oid oid = adapter.getOid();
+        if (oid != null) {
+            oidAdapterMap.remove(oid);
+        }
+        pojoAdapterMap.remove(adapter);
+    }
+
+
+
 
     public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) {
         removeAdapter(adapter);
@@ -1746,7 +1817,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     }
 
 
-    public ObjectAdapter createRootOrAggregatedAdapter(final Oid oid, final Object pojo) {
+    private ObjectAdapter createRootOrAggregatedAdapter(final Oid oid, final Object pojo) {
         final ObjectAdapter createdAdapter;
         if(oid instanceof RootOid) {
             final RootOid rootOid = (RootOid) oid;
@@ -1762,7 +1833,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * Creates a new transient root {@link ObjectAdapter adapter} for the supplied domain
      * object.
      */
-    public ObjectAdapter createTransientOrViewModelRootAdapter(final Object pojo) {
+    private ObjectAdapter createTransientOrViewModelRootAdapter(final Object pojo) {
         final RootOid rootOid = oidGenerator.createTransientOrViewModelOid(pojo);
         return createRootAdapter(pojo, rootOid);
     }
@@ -1779,7 +1850,7 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * {@link #getAdapterFor(Object) mapped}, and for immutable value types
      * referenced.
      */
-    public ObjectAdapter createStandaloneAdapter(final Object pojo) {
+    private ObjectAdapter createStandaloneAdapter(final Object pojo) {
         return createAdapter(pojo, null);
     }
 
@@ -1790,12 +1861,12 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
      * @see #createStandaloneAdapter(Object)
      * @see #createCollectionAdapter(Object, ParentedCollectionOid)
      */
-    public ObjectAdapter createRootAdapter(final Object pojo, RootOid rootOid) {
+    private ObjectAdapter createRootAdapter(final Object pojo, RootOid rootOid) {
         Ensure.ensureThatArg(rootOid, is(not(nullValue())));
         return createAdapter(pojo, rootOid);
     }
 
-    public ObjectAdapter createCollectionAdapter(
+    private ObjectAdapter createCollectionAdapter(
             final Object pojo,
             ParentedCollectionOid collectionOid) {
         Ensure.ensureThatArg(collectionOid, is(not(nullValue())));
@@ -1812,13 +1883,13 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
     }
 
 
-    public ObjectAdapter mapAndInjectServices(final ObjectAdapter adapter) {
+    private ObjectAdapter mapAndInjectServices(final ObjectAdapter adapter) {
         // since the whole point of this method is to map an adapter that's just been created.
         // so we *don't* call ensureMapsConsistent(adapter);
 
         Assert.assertNotNull(adapter);
         final Object pojo = adapter.getObject();
-        Assert.assertFalse("POJO Map already contains object", pojo, getPojoAdapterMap().containsPojo(pojo));
+        Assert.assertFalse("POJO Map already contains object", pojo, pojoAdapterMap.containsPojo(pojo));
 
         if (LOG.isDebugEnabled()) {
             // don't interact with the underlying object because may be a ghost
@@ -1840,11 +1911,11 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         // add all aggregated collections
         final ObjectSpecification objSpec = adapter.getSpecification();
         if (!adapter.isParentedCollection() || adapter.isParentedCollection() && !objSpec.isImmutable()) {
-            getPojoAdapterMap().add(pojo, adapter);
+            pojoAdapterMap.add(pojo, adapter);
         }
 
         // order is important - add to pojo map first, then identity map
-        getOidAdapterMap().add(adapter.getOid(), adapter);
+        oidAdapterMap.add(adapter.getOid(), adapter);
 
         // must inject after mapping, otherwise infinite loop
         servicesInjector.injectServicesInto(pojo);
@@ -1852,16 +1923,6 @@ public class PersistenceSession implements TransactionalResource, SessionScopedC
         return adapter;
     }
 
-    public void unmap(final ObjectAdapter adapter) {
-        ensureMapsConsistent(adapter);
-
-        final Oid oid = adapter.getOid();
-        if (oid != null) {
-            getOidAdapterMap().remove(oid);
-        }
-        getPojoAdapterMap().remove(adapter);
-    }
-
 
     //endregion
 

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
new file mode 100644
index 0000000..f91d9d2
--- /dev/null
+++ b/core/viewer-restfulobjects-rendering/src/main/java/org/apache/isis/viewer/restfulobjects/rendering/RendererContext5.java
@@ -0,0 +1,30 @@
+/*
+ *  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.restfulobjects.rendering;
+
+import org.apache.isis.core.metamodel.spec.SpecificationLoader;
+
+/**
+ * TODO: roll-up in the future (introduced only so that API does not break)
+ */
+public interface RendererContext5 extends RendererContext4 {
+
+    public SpecificationLoader getSpecificationLoader();
+
+}

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
index 3801a78..999959a 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/ResourceContext.java
@@ -51,11 +51,11 @@ import org.apache.isis.viewer.restfulobjects.applib.RepresentationType;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.DomainModel;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulRequest.RequestParameter;
 import org.apache.isis.viewer.restfulobjects.applib.client.RestfulResponse.HttpStatusCode;
-import org.apache.isis.viewer.restfulobjects.rendering.RendererContext4;
+import org.apache.isis.viewer.restfulobjects.rendering.RendererContext5;
 import org.apache.isis.viewer.restfulobjects.rendering.RestfulObjectsApplicationException;
 import org.apache.isis.viewer.restfulobjects.rendering.util.Util;
 
-public class ResourceContext implements RendererContext4 {
+public class ResourceContext implements RendererContext5 {
 
     private final HttpHeaders httpHeaders;
     private final UriInfo uriInfo;

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
----------------------------------------------------------------------
diff --git a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
index 1e52cd2..e344dba 100644
--- a/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
+++ b/core/viewer-restfulobjects-server/src/main/java/org/apache/isis/viewer/restfulobjects/server/util/OidUtils.java
@@ -19,15 +19,8 @@
 package org.apache.isis.viewer.restfulobjects.server.util;
 
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.OidMarshaller;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
-import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
-import org.apache.isis.core.metamodel.spec.ObjectSpecId;
-import org.apache.isis.core.metamodel.spec.ObjectSpecification;
-import org.apache.isis.core.runtime.persistence.ObjectNotFoundException;
-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.PersistenceSession;
 import org.apache.isis.viewer.restfulobjects.rendering.RendererContext;
 
@@ -61,41 +54,10 @@ public final class OidUtils {
             final RendererContext rendererContext,
             final String oidStrUnencoded) {
         RootOid rootOid = RootOid.deString(oidStrUnencoded, getOidMarshaller());
-        final ObjectSpecId specId = rootOid.getObjectSpecId();
 
-        final ObjectSpecification spec = IsisContext.getSpecificationLoader().lookupBySpecId(specId);
-        if(spec == null) {
-            // eg "NONEXISTENT:123"
-            return null;
-        }
-
-        // TODO: the logic to figure out which PersistenceSession API to call should be pushed down into PersistenceSession itself.
         final PersistenceSession persistenceSession = rendererContext.getPersistenceSession();
 
-        if(spec.containsFacet(ViewModelFacet.class)) {
-
-            // this is a hack; the RO viewer when rendering the URL for the view model loses the "view model" indicator
-            // ("*") from the specId, meaning that the marshalling logic above in RootOidDefault.deString() creates an
-            // oid in the wrong state.  The code below checks for this and recreates the oid with the current state of 'view model'
-            if(!rootOid.isViewModel()) {
-                rootOid = new RootOid(rootOid.getObjectSpecId(), rootOid.getIdentifier(), Oid.State.VIEWMODEL);
-            }
-
-            try {
-                return persistenceSession.adapterFor(rootOid);
-            } catch(final ObjectNotFoundException ex) {
-                return null;
-            } catch(final PojoRecreationException ex) {
-                return null;
-            }
-        } else {
-            try {
-                ObjectAdapter objectAdapter = persistenceSession.loadObjectInTransaction(rootOid);
-                return objectAdapter.isTransient() ? null : objectAdapter;
-            } catch(final ObjectNotFoundException ex) {
-                return null;
-            }
-        }
+        return persistenceSession.adapterForAny(rootOid);
     }
 
     private static OidMarshaller getOidMarshaller() {

http://git-wip-us.apache.org/repos/asf/isis/blob/d627d827/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index c7d3255..84d1152 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -399,7 +399,7 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> {
         
         try {
             final RootOid oid = RootOid.deStringEncoded(encoded, getOidMarshaller());
-            return getAdapterManager().adapterFor(oid);
+            return getPersistenceSession().adapterFor(oid);
         } catch (final Exception e) {
             return null;
         }