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:59 UTC

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

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);
         }