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 2020/08/21 07:49:09 UTC

[isis] 01/02: ISIS-2423: fixes persisting callback (in preStore/postStore)

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

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

commit 4203e19bb208e7a90840b46a36a70f141522abef
Author: danhaywood <da...@haywood-associates.co.uk>
AuthorDate: Fri Aug 21 08:24:19 2020 +0100

    ISIS-2423: fixes persisting callback (in preStore/postStore)
---
 .../objectadapter/ObjectAdapterContext.java        | 26 ------------
 .../persistence/IsisLifecycleListener.java         | 20 +++++++---
 .../persistence/PersistenceSession5.java           | 46 +++++++++++-----------
 3 files changed, 37 insertions(+), 55 deletions(-)

diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
index a477f87..4ea77a8 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/objectadapter/ObjectAdapterContext.java
@@ -35,7 +35,6 @@ import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation;
 import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
 import org.apache.isis.core.runtime.context.RuntimeContextBase;
 import org.apache.isis.persistence.jdo.datanucleus5.persistence.IsisPersistenceSessionJdo;
-import org.apache.isis.persistence.jdo.datanucleus5.persistence.PersistenceSession;
 
 import lombok.Getter;
 import lombok.val;
@@ -204,29 +203,4 @@ final public class ObjectAdapterContext {
         lifecycleEventMixin.postLifecycleEventIfRequired(adapter, lifecycleEventFacetClass);
     }
 
-    // ------------------------------------------------------------------------------------------------
-
-    /**
-     * @param newRootOid - allow a different persistent root oid to be provided.
-     * @param session 
-     */
-    public void asPersistent(final ObjectAdapter rootAdapter, PersistenceSession session) {
-
-        final RootOid persistentOid = createPersistentOrViewModelOid(rootAdapter.getPojo());
-
-        Objects.requireNonNull(persistentOid);
-        _Assert.assertFalse(rootAdapter.isParented(), "expected to not be parented");
-        
-        final ObjectSpecId hintRootOidObjectSpecId = persistentOid.getObjectSpecId();
-        final ObjectSpecId adapterObjectSpecId = rootAdapter.getSpecification().getSpecId();
-        if(!hintRootOidObjectSpecId.equals(adapterObjectSpecId)) {
-            throw _Exceptions.unrecoverable("hintRootOid's objectType must be same as that of adapter " +
-                    "(was: '" + hintRootOidObjectSpecId + "'; adapter's is " + adapterObjectSpecId + "'");
-        }
-    }
-
-
-
-
-
 }
\ No newline at end of file
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisLifecycleListener.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisLifecycleListener.java
index a75fe72..8b53afe 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisLifecycleListener.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/IsisLifecycleListener.java
@@ -47,10 +47,14 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
         void ensureRootObject(Persistable pojo);
         ObjectAdapter initializeEntity(Persistable pojo);
 
-        void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(Persistable pojo);
         void invokeIsisPersistingCallback(Persistable pojo);
+        void enlistCreatedAndInvokeIsisPersistedCallback(Persistable pojo);
+
         void enlistUpdatingAndInvokeIsisUpdatingCallback(Persistable pojo);
+        void invokeIsisUpdatedCallback(Persistable pojo);
+
         void enlistDeletingAndInvokeIsisRemovingCallbackFacet(Persistable pojo);
+
     }
 
     private final PersistenceSessionLifecycleManagement persistenceSession;
@@ -90,19 +94,25 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
     @Override
     public void preStore(InstanceLifecycleEvent event) {
         final Persistable pojo = Utils.persistenceCapableFor(event);
-        persistenceSession.invokeIsisPersistingCallback(pojo);
+        if(pojo.dnGetStateManager().isNew(pojo)) {
+            persistenceSession.invokeIsisPersistingCallback(pojo);
+        } else {
+            persistenceSession.enlistUpdatingAndInvokeIsisUpdatingCallback(pojo);
+        }
     }
 
     @Override
     public void postStore(InstanceLifecycleEvent event) {
         final Persistable pojo = Utils.persistenceCapableFor(event);
-        persistenceSession.enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(pojo);
+        if(pojo.dnGetStateManager().isNew(pojo)) {
+            persistenceSession.enlistCreatedAndInvokeIsisPersistedCallback(pojo);
+        } else {
+            persistenceSession.invokeIsisUpdatedCallback(pojo);
+        }
     }
 
     @Override
     public void preDirty(InstanceLifecycleEvent event) {
-        final Persistable pojo = Utils.persistenceCapableFor(event);
-        persistenceSession.enlistUpdatingAndInvokeIsisUpdatingCallback(pojo);
     }
 
     @Override
diff --git a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
index 720aeb2..1b307c3 100644
--- a/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
+++ b/persistence/jdo/datanucleus-5/src/main/java/org/apache/isis/persistence/jdo/datanucleus5/persistence/PersistenceSession5.java
@@ -740,44 +740,27 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
      * to determine which callback to fire.
      */
     @Override
-    public void enlistCreatedAndRemapIfRequiredThenInvokeIsisInvokePersistingOrUpdatedCallback(final Persistable pojo) {
-        val adapter = adapterFor(pojo);
-        
-        if (EntityUtil.isAttached(adapter)) {
-            // updating;
-            // the callback and transaction.enlist are done in the preDirty callback
-            // (can't be done here, as the enlist requires to capture the 'before' values)
-            CallbackFacet.Util.callCallback(adapter, UpdatedCallbackFacet.class);
-            objectAdapterContext.postLifecycleEventIfRequired(adapter, UpdatedLifecycleEventFacet.class);
+    public void enlistCreatedAndInvokeIsisPersistedCallback(final Persistable pojo) {
 
-        } else {
-            // persisting
+        val adapter = adapterFor(pojo);
 
-            objectAdapterContext.asPersistent(adapter, this);
+        final boolean wasAlreadyEnlisted = changedObjectsServiceProvider.get().isEnlisted(adapter);
+        changedObjectsServiceProvider.get().enlistCreated(adapter);
 
+        if(!wasAlreadyEnlisted) {
             CallbackFacet.Util.callCallback(adapter, PersistedCallbackFacet.class);
             objectAdapterContext.postLifecycleEventIfRequired(adapter, PersistedLifecycleEventFacet.class);
-
-            changedObjectsServiceProvider.get().enlistCreated(adapter);
         }
-        
+
     }
 
     @Override
     public void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
 
-        // seen this happen in the case when a parent entity (LeaseItem) has a collection of children
-        // objects (LeaseTerm) for which we haven't had a loaded callback fired and so are not yet
-        // mapped.
-
-        // it seems reasonable in this case to simply map into Isis here ("just-in-time"); presumably
-        // DN would not be calling this callback if the pojo was not persistent.
-
         final ObjectAdapter adapter = objectAdapterContext.fetchPersistent(pojo);
         if (adapter == null) {
             throw new RuntimeException(
-                    "DN could not find objectId for pojo (unexpected) and so could not map into Isis; pojo=["
-                            + pojo + "]");
+                    String.format("DN could not find objectId for pojo (unexpected); pojo=[%s]", pojo));
         }
 
         final boolean wasAlreadyEnlisted = changedObjectsServiceProvider.get().isEnlisted(adapter);
@@ -794,6 +777,21 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement {
 
     }
 
+    @Override
+    public void invokeIsisUpdatedCallback(Persistable pojo) {
+
+        final ObjectAdapter adapter = objectAdapterContext.fetchPersistent(pojo);
+        if (adapter == null) {
+            throw new RuntimeException(
+                    String.format("DN could not find objectId for pojo (unexpected); pojo=[%s]", pojo));
+        }
+
+        // the callback and transaction.enlist are done in the preStore callback
+        // (can't be done here, as the enlist requires to capture the 'before' values)
+        CallbackFacet.Util.callCallback(adapter, UpdatedCallbackFacet.class);
+        objectAdapterContext.postLifecycleEventIfRequired(adapter, UpdatedLifecycleEventFacet.class);
+    }
+
     /**
      * makes sure the entity is known to Isis and is a root
      * @param pojo