You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2018/09/10 04:43:57 UTC

[isis] branch ISIS-1976-rethink-object-adapters updated (2ce76eb -> 289890b)

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

ahuber pushed a change to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git.


    from 2ce76eb  ISIS-1976: let OAs for values also have an Oid
     new fe0c9c5  ISIS-1976: cleanup unreachable code paths
     new 289890b  ISIS-1976: fixing NPE when represents-persistent is not recognized by the PM yet

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../system/persistence/PersistenceSession4.java    |  6 +-
 .../system/persistence/PersistenceSession5.java    | 18 ++++--
 .../system/persistence/PersistenceSession.java     | 24 +++-----
 .../system/persistence/PersistenceSessionBase.java |  2 +
 .../adaptermanager/ObjectAdapterContext.java       | 20 +------
 .../ObjectAdapterContext_Factories.java            |  5 --
 .../ObjectAdapterContext_NewIdentifier.java        | 65 +++-------------------
 ...ObjectAdapterContext_ObjectAdapterProvider.java |  2 +-
 .../adaptermanager/OidAdapterHashMap.java          |  4 +-
 .../persistence/adaptermanager/OidProviders.java   | 41 +++++++++++---
 10 files changed, 70 insertions(+), 117 deletions(-)


[isis] 02/02: ISIS-1976: fixing NPE when represents-persistent is not recognized by the PM yet

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit 289890b96c1e13b9e1a5e691f54ed87f1c031795
Author: Andi Huber <ah...@apache.org>
AuthorDate: Mon Sep 10 06:24:08 2018 +0200

    ISIS-1976: fixing NPE when represents-persistent is not recognized by
    the PM yet
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../system/persistence/PersistenceSession4.java    |  6 ++----
 .../system/persistence/PersistenceSession5.java    | 18 ++++++++++++----
 .../system/persistence/PersistenceSession.java     | 24 ++++++++--------------
 .../system/persistence/PersistenceSessionBase.java |  2 ++
 .../ObjectAdapterContext_NewIdentifier.java        | 13 +++---------
 ...ObjectAdapterContext_ObjectAdapterProvider.java |  2 +-
 .../persistence/adaptermanager/OidProviders.java   | 23 +++++++++++++--------
 7 files changed, 45 insertions(+), 43 deletions(-)

diff --git a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
index e5e0b8c..7ba1caa 100644
--- a/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
+++ b/core/plugins/jdo-datanucleus-4/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession4.java
@@ -1201,10 +1201,8 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public String identifierFor(final Object pojo, final Oid.State type) {
-        return type == Oid.State.TRANSIENT
-                ? UUID.randomUUID().toString()
-                        : JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
+    public String identifierFor(final Object pojo) {
+        return JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
     }
 
 
diff --git a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
index e77e5fb..2a9ec77 100644
--- a/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
+++ b/core/plugins/jdo-datanucleus-5/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSession5.java
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.core.runtime.system.persistence;
 
+import static java.util.Objects.requireNonNull;
 import static org.apache.isis.commons.internal.base._Casts.uncheckedCast;
 
 import java.lang.reflect.Array;
@@ -33,6 +34,7 @@ import java.util.UUID;
 
 import javax.jdo.FetchGroup;
 import javax.jdo.FetchPlan;
+import javax.jdo.JDOHelper;
 import javax.jdo.PersistenceManager;
 import javax.jdo.PersistenceManagerFactory;
 import javax.jdo.identity.SingleFieldIdentity;
@@ -42,6 +44,8 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
 import org.datanucleus.enhancement.Persistable;
+import org.datanucleus.enhancer.methods.IsDeleted;
+import org.datanucleus.enhancer.methods.IsPersistent;
 import org.datanucleus.exceptions.NucleusObjectNotFoundException;
 import org.datanucleus.identity.DatastoreIdImpl;
 import org.slf4j.Logger;
@@ -1193,10 +1197,16 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
     }
 
     @Override
-    public String identifierFor(final Object pojo, final Oid.State type) {
-        return type == Oid.State.TRANSIENT
-                ? UUID.randomUUID().toString()
-                        : JdoObjectIdSerializer.toOidIdentifier(getPersistenceManager().getObjectId(pojo));
+    public String identifierFor(final Object pojo) {
+        final Object jdoOid = getPersistenceManager().getObjectId(pojo);
+        if(jdoOid==null) {
+            return UUID.randomUUID().toString(); //FIXME[ISIS-1976] should be guarded against somewhere else
+        }
+        
+        requireNonNull(jdoOid, 
+                ()->String.format("Pojo of type '%s' is not recognized by JDO.", 
+                        pojo.getClass().getName()));
+        return JdoObjectIdSerializer.toOidIdentifier(jdoOid);
     }
 
 
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 f0850e5..eec2996 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
@@ -29,7 +29,6 @@ import org.apache.isis.core.commons.config.IsisConfiguration;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapterProvider;
 import org.apache.isis.core.metamodel.adapter.concurrency.ConcurrencyChecking;
-import org.apache.isis.core.metamodel.adapter.oid.Oid.State;
 import org.apache.isis.core.metamodel.adapter.oid.ParentedCollectionOid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
@@ -52,14 +51,6 @@ public interface PersistenceSession extends ObjectAdapterProvider.Delegating, Tr
     public static final String INSTALL_FIXTURES_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_INSTALL_FIXTURES_KEY;
     public static final boolean INSTALL_FIXTURES_DEFAULT = false;
 
-    // [ahuber] could as well be 'protected', not referenced from other then implementing classes
-    public static final String ROOT_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_ROOT_KEY;
-
-    /**
-     * Append regular <a href="http://www.datanucleus.org/products/accessplatform/persistence_properties.html">datanucleus properties</a> to this key
-     */
-    public static final String DATANUCLEUS_PROPERTIES_ROOT = ROOT_KEY + "impl.";
-
     //---
 
     MementoRecreateObjectSupport mementoSupport();
@@ -108,12 +99,18 @@ public interface PersistenceSession extends ObjectAdapterProvider.Delegating, Tr
     PersistenceManager getPersistenceManager();
     
     /**
-     * @param pojo
-     * @param type
+     * @param pojo a persistable object
      * @return String representing an object's id.
      * @since 2.0.0-M2
      */
-    String identifierFor(Object pojo, State type);
+    String identifierFor(Object pojo);
+    
+    /**@since 2.0.0-M2*/
+    boolean isTransient(Object pojo);
+    /**@since 2.0.0-M2*/
+    boolean isRepresentingPersistent(Object pojo);
+    /**@since 2.0.0-M2*/
+    boolean isDestroyed(Object pojo);
 
     /**
      * Convenient equivalent to {@code getPersistenceManager()}.
@@ -170,9 +167,6 @@ public interface PersistenceSession extends ObjectAdapterProvider.Delegating, Tr
 
     void resolve(Object parent);
 
-    boolean isTransient(Object pojo);
-    boolean isRepresentingPersistent(Object pojo);
-    boolean isDestroyed(Object pojo);
 
 
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
index 6fc8284..f597cc5 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/PersistenceSessionBase.java
@@ -40,6 +40,7 @@ import org.apache.isis.core.commons.util.ToString;
 import org.apache.isis.core.metamodel.services.ServicesInjector;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.persistence.FixturesInstalledFlag;
+import org.apache.isis.core.runtime.runner.opts.OptionHandlerFixtureAbstract;
 import org.apache.isis.core.runtime.services.changes.ChangedObjectsServiceInternal;
 import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
 import org.apache.isis.objectstore.jdo.datanucleus.persistence.queries.PersistenceQueryProcessor;
@@ -49,6 +50,7 @@ abstract class PersistenceSessionBase implements PersistenceSession {
     // -- CONSTANTS
 
     protected static final Logger LOG = LoggerFactory.getLogger(PersistenceSession.class);
+    protected static final String ROOT_KEY = OptionHandlerFixtureAbstract.DATANUCLEUS_ROOT_KEY;
 
     // -- FIELDS
 
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
index 5aad3c1..4ac5b3b 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
@@ -69,20 +69,13 @@ class ObjectAdapterContext_NewIdentifier {
      * @param pojo - being persisted
      */
     final RootOid createPersistentOid(Object pojo) {
-        final Oid.State type = Oid.State.PERSISTENT;
-        
+  
         final ObjectSpecification spec = specificationLoader.loadSpecification(pojo.getClass());
         
-        //FIXME[ISIS-1976] remove guard
-        final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
-        if(spec.isService() || recreatableObjectFacet!=null || spec.containsDoOpFacet(ViewModelFacet.class)) {
-            _Exceptions.throwUnexpectedCodeReach();
-        }
-        
-        final String identifier = persistenceSession.identifierFor(pojo, type);
+        final String identifier = persistenceSession.identifierFor(pojo);
         
         final ObjectSpecId objectSpecId = spec.getSpecId();
-        return new RootOid(objectSpecId, identifier, type);
+        return new RootOid(objectSpecId, identifier, Oid.State.PERSISTENT);
     }
     
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
index e3c4cd9..ab92f47 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_ObjectAdapterProvider.java
@@ -68,7 +68,7 @@ class ObjectAdapterContext_ObjectAdapterProvider implements ObjectAdapterProvide
                 .add(new OidProviders.OidForServices())
                 .add(new OidProviders.OidForValues())
                 .add(new OidProviders.OidForViewModels())
-                .add(new OidProviders.OidForPersistables())
+                .add(new OidProviders.OidForPersistent())
                 .add(new OidProviders.OidForOthers())
                 .build();
     }
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
index 63cce83..833bf1d 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
@@ -18,6 +18,8 @@
  */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
+import java.util.UUID;
+
 import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -45,13 +47,13 @@ public class OidProviders {
 
     }
 
-    public static class OidForPersistables implements OidProvider {
+    public static class OidForPersistent implements OidProvider {
 
         private final IsisJdoMetamodelPlugin isisJdoMetamodelPlugin = IsisJdoMetamodelPlugin.get();
 
         @Override
         public boolean isHandling(Object pojo, ObjectSpecification spec) {
-            // equivalent to  isInstanceOfPersistable = pojo instanceof Persistable;
+            // equivalent to 'isInstanceOfPersistable = pojo instanceof Persistable'
             final boolean isInstanceOfPersistable = isisJdoMetamodelPlugin.isPersistenceEnhanced(pojo.getClass());
             return isInstanceOfPersistable;
         }
@@ -59,14 +61,18 @@ public class OidProviders {
         @Override
         public RootOid oidFor(Object pojo, ObjectSpecification spec) {
             final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
-            final Oid.State state = persistenceSession.isTransient(pojo) ? Oid.State.TRANSIENT : Oid.State.PERSISTENT;
-            final String identifier = persistenceSession.identifierFor(pojo, state);
-            return new RootOid(spec.getSpecId(), identifier, state);
+            final boolean isPersistent = !persistenceSession.isTransient(pojo);
+            if(isPersistent) {
+                final String identifier = persistenceSession.identifierFor(pojo);
+                return new RootOid(spec.getSpecId(), identifier, Oid.State.PERSISTENT);
+            } else {
+                final String identifier = UUID.randomUUID().toString();
+                return new RootOid(spec.getSpecId(), identifier, Oid.State.TRANSIENT);    
+            }
         }
-
+        
     }
 
-
     public static class OidForValues implements OidProvider {
 
         @Override
@@ -106,8 +112,7 @@ public class OidProviders {
 
         @Override
         public RootOid oidFor(Object pojo, ObjectSpecification spec) {
-            final PersistenceSession persistenceSession = IsisContext.getPersistenceSession().get();
-            final String identifier = persistenceSession.identifierFor(pojo, Oid.State.TRANSIENT);
+            final String identifier = UUID.randomUUID().toString();
             return new RootOid(spec.getSpecId(), identifier, Oid.State.TRANSIENT);
         }
 


[isis] 01/02: ISIS-1976: cleanup unreachable code paths

Posted by ah...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch ISIS-1976-rethink-object-adapters
in repository https://gitbox.apache.org/repos/asf/isis.git

commit fe0c9c5f43677a102bc139b0abdbd3a6f9a4cd4a
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Sep 9 07:38:14 2018 +0200

    ISIS-1976: cleanup unreachable code paths
    
    Task-Url: https://issues.apache.org/jira/browse/ISIS-1976
---
 .../adaptermanager/ObjectAdapterContext.java       | 20 +------
 .../ObjectAdapterContext_Factories.java            |  5 --
 .../ObjectAdapterContext_NewIdentifier.java        | 70 ++++------------------
 .../adaptermanager/OidAdapterHashMap.java          |  4 +-
 .../persistence/adaptermanager/OidProviders.java   | 18 ++++++
 5 files changed, 34 insertions(+), 83 deletions(-)

diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
index c43ec56..6f5df49 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java
@@ -223,12 +223,8 @@ public class ObjectAdapterContext {
     
     // -- NEW IDENTIFIER
     
-    RootOid createTransientOrViewModelOid(final Object pojo) {
-        return newIdentifierMixin.createTransientOrViewModelOid(pojo);
-    }
-
     public RootOid createPersistentOrViewModelOid(Object pojo) {
-        return newIdentifierMixin.createPersistentOrViewModelOid(pojo);
+        return newIdentifierMixin.createPersistentOid(pojo);
     }
     
     // -- SERVICE LOOKUP
@@ -251,20 +247,6 @@ public class ObjectAdapterContext {
          */
         ObjectAdapter createRootAdapter(Object pojo, RootOid rootOid);
         
-        /**
-         * Creates a {@link ObjectAdapter adapter} with no {@link Oid}.
-         *
-         * <p>
-         * Standalone adapters are never {@link #mapAndInjectServices(ObjectAdapter) mapped}
-         * (they have no {@link Oid}, after all).
-         *
-         * <p>
-         * Should only be called if the pojo is known not to be
-         * {@link #lookupAdapterFor(Object) mapped}, and for immutable value types
-         * referenced.
-         */
-        ObjectAdapter createStandaloneAdapter(Object pojo);
-
         ObjectAdapter createCollectionAdapter(Object pojo, ParentedCollectionOid collectionOid);
 
         /**
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java
index e1d77db..e488aba 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_Factories.java
@@ -53,11 +53,6 @@ class ObjectAdapterContext_Factories implements ObjectAdapterFactories {
     }
 
     @Override
-    public ObjectAdapter createStandaloneAdapter(final Object pojo) {
-        return createAdapter(pojo, null);
-    }
-
-    @Override
     public ObjectAdapter createRootAdapter(final Object pojo, RootOid rootOid) {
         assert rootOid != null;
         return createAdapter(pojo, rootOid);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
index 5199d79..5aad3c1 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext_NewIdentifier.java
@@ -57,25 +57,6 @@ class ObjectAdapterContext_NewIdentifier {
         this.specificationLoader = servicesInjector.getSpecificationLoader();
     }
     
-//    RootOid rootOidFor(Object pojo) {
-//        final RootOid rootOid = servicesInjector.isRegisteredServiceInstance(pojo) 
-//                ? createPersistentOrViewModelOid(pojo) 
-//                        : createTransientOrViewModelOid(pojo);
-//        
-//                
-//        return rootOid;
-//    }
-    
-    
-    // -- create...Oid (main API)
-    /**
-     * Create a new {@link Oid#isTransient() transient} {@link Oid} for the
-     * supplied pojo, uniquely distinguishable from any other {@link Oid}.
-     */
-    final RootOid createTransientOrViewModelOid(final Object pojo) {
-        return newIdentifier(pojo, Oid.State.TRANSIENT);
-    }
-
     /**
      * Return an equivalent {@link RootOid}, but being persistent.
      *
@@ -87,46 +68,21 @@ class ObjectAdapterContext_NewIdentifier {
      *
      * @param pojo - being persisted
      */
-    final RootOid createPersistentOrViewModelOid(Object pojo) {
-        return newIdentifier(pojo, Oid.State.PERSISTENT);
-    }
-
-    RootOid newIdentifier(final Object pojo, final Oid.State type) {
-        final ObjectSpecification spec = objectSpecFor(pojo);
-      //FIXME[ISIS-1976] remove guard 
-        if(spec.isService()) {
-            //_Exceptions.throwUnexpectedCodeReach(); 
-            return newRootId(spec, PersistenceSession.SERVICE_IDENTIFIER, Oid.State.PERSISTENT); // services are always persistent
-        }
-
+    final RootOid createPersistentOid(Object pojo) {
+        final Oid.State type = Oid.State.PERSISTENT;
+        
+        final ObjectSpecification spec = specificationLoader.loadSpecification(pojo.getClass());
+        
+        //FIXME[ISIS-1976] remove guard
         final ViewModelFacet recreatableObjectFacet = spec.getFacet(ViewModelFacet.class);
-        final String identifier =
-                recreatableObjectFacet != null
-                ? recreatableObjectFacet.memento(pojo)
-                        : persistenceSession.identifierFor(pojo, type);
-
-                return newRootId(spec, identifier, type);
-    }
-    
-    
-    private RootOid newRootId(final ObjectSpecification spec, final String identifier, final Oid.State type) {
-        final Oid.State state =
-                spec.containsDoOpFacet(ViewModelFacet.class)
-                ? Oid.State.VIEWMODEL
-                        : type == Oid.State.TRANSIENT
-                        ? Oid.State.TRANSIENT
-                                : Oid.State.PERSISTENT;
+        if(spec.isService() || recreatableObjectFacet!=null || spec.containsDoOpFacet(ViewModelFacet.class)) {
+            _Exceptions.throwUnexpectedCodeReach();
+        }
+        
+        final String identifier = persistenceSession.identifierFor(pojo, type);
+        
         final ObjectSpecId objectSpecId = spec.getSpecId();
-        return new RootOid(objectSpecId, identifier, state);
+        return new RootOid(objectSpecId, identifier, type);
     }
     
-    // -- HELPER
-    
-    private ObjectSpecification objectSpecFor(final Object pojo) {
-        final Class<?> pojoClass = pojo.getClass();
-        return specificationLoader.loadSpecification(pojoClass);
-    }
-
-
-    
 }
\ No newline at end of file
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java
index ea99b7b..928ea05 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidAdapterHashMap.java
@@ -65,7 +65,7 @@ class OidAdapterHashMap implements Iterable<Oid>, SessionScopedComponent {
      * Add an adapter for a given oid
      */
     public void add(@Nullable final Oid oid, final ObjectAdapter adapter) {
-        if(oid==null) { // eg. value objects don't have an Oid
+        if(oid.isValue()) { // not stored for value 
             return;
         }
         adapterByOidMap.put(oid, adapter);
@@ -85,7 +85,7 @@ class OidAdapterHashMap implements Iterable<Oid>, SessionScopedComponent {
      * @return <tt>true</tt> if an adapter was removed.
      */
     public boolean remove(@Nullable final Oid oid) {
-        if(oid==null) { // eg. value objects don't have an Oid
+        if(oid.isValue()) { // not stored for value 
             return false;
         }
         LOG.debug("remove oid: {}", oid);
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
index afcd193..63cce83 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/OidProviders.java
@@ -1,3 +1,21 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
 package org.apache.isis.core.runtime.system.persistence.adaptermanager;
 
 import org.apache.isis.core.metamodel.IsisJdoMetamodelPlugin;