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 2021/01/07 14:24:06 UTC

[isis] branch 2033-Spring_Data_Integration updated: ISIS-2033: cleaning up JdoLifecycleListener

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

ahuber pushed a commit to branch 2033-Spring_Data_Integration
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/2033-Spring_Data_Integration by this push:
     new fcc50b9  ISIS-2033: cleaning up JdoLifecycleListener
fcc50b9 is described below

commit fcc50b9153e49e38f28334467a6b973cbc871c44
Author: Andi Huber <ah...@apache.org>
AuthorDate: Thu Jan 7 15:23:50 2021 +0100

    ISIS-2033: cleaning up JdoLifecycleListener
---
 .../changetracking/JdoLifecycleListener.java       | 129 ++++-----------------
 .../jdo/integration/changetracking/_Utils.java     |   2 +-
 .../isis/JdoIsisEntityChangesPublishingTest.java   |   3 -
 .../JdoIsisEntityPropertyChangePublishingTest.java |   3 -
 4 files changed, 26 insertions(+), 111 deletions(-)

diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/JdoLifecycleListener.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/JdoLifecycleListener.java
index 60365d5..d54d225 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/JdoLifecycleListener.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/JdoLifecycleListener.java
@@ -33,14 +33,11 @@ import javax.jdo.listener.StoreLifecycleListener;
 import org.datanucleus.enhancement.Persistable;
 
 import org.apache.isis.applib.services.eventbus.EventBusService;
-import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.context.MetaModelContext;
 import org.apache.isis.core.metamodel.spec.ManagedObject;
 import org.apache.isis.core.transaction.changetracking.EntityChangeTracker;
 import org.apache.isis.core.transaction.changetracking.events.PostStoreEvent;
 import org.apache.isis.core.transaction.changetracking.events.PreStoreEvent;
-import org.apache.isis.persistence.jdo.datanucleus.entities.DnEntityStateProvider;
-import org.apache.isis.persistence.jdo.integration.metamodel.JdoMetamodelUtil;
 
 import lombok.NonNull;
 import lombok.RequiredArgsConstructor;
@@ -86,42 +83,39 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
 
     @Override
     public void preStore(InstanceLifecycleEvent event) {
-
         log.debug("preStore {}", ()->_Utils.debug(event));
         
-        val persistableObject = event.getPersistentInstance();
-
-        if(persistableObject!=null 
-                && JdoMetamodelUtil.isPersistenceEnhanced(persistableObject.getClass())) {
+        final Persistable pojo = _Utils.persistableFor(event);
 
-            eventBusService.post(PreStoreEvent.of(persistableObject));
-        }
+        eventBusService.post(PreStoreEvent.of(pojo));
         
-        final Persistable pojo = _Utils.persistableFor(event);
+        /* Called either when an entity is initially persisted, or when an entity is updated; fires the appropriate
+         * lifecycle callback. So filter for those events when initially persisting. */
         if(pojo.dnGetStateManager().isNew(pojo)) {
-            invokeIsisPersistingCallback(pojo);
+            val entity = adaptEntity(pojo);
+            getEntityChangeTracker().recognizePersisting(entity);
         }
-        
     }
 
     @Override
     public void postStore(InstanceLifecycleEvent event) {
-        
         log.debug("postStore {}", ()->_Utils.debug(event));
 
-        val persistableObject = event.getPersistentInstance();
-
-        if(persistableObject!=null && 
-                JdoMetamodelUtil.isPersistenceEnhanced(persistableObject.getClass())) {
+        final Persistable pojo = _Utils.persistableFor(event);
 
-            eventBusService.post(PostStoreEvent.of(persistableObject));
-        }
+        val entity = adaptEntityAndInjectServices(pojo);
         
-        final Persistable pojo = _Utils.persistableFor(event);
+        eventBusService.post(PostStoreEvent.of(pojo));
+        
+        /* Called either when an entity is initially persisted, or when an entity is updated;
+         * fires the appropriate lifecycle callback.*/
         if(pojo.dnGetStateManager().isNew(pojo)) {
-            enlistCreatedAndInvokeIsisPersistedCallback(pojo);
+            
+            getEntityChangeTracker().enlistCreated(entity);
         } else {
-            invokeIsisUpdatedCallback(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)
+            getEntityChangeTracker().recognizeUpdating(entity);
         }
         
     }
@@ -129,46 +123,30 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
 
     @Override
     public void preDirty(InstanceLifecycleEvent event) {
-        
         log.debug("preDirty {}", ()->_Utils.debug(event));
         
         final Persistable pojo = _Utils.persistableFor(event);
-        enlistUpdatingAndInvokeIsisUpdatingCallback(pojo);
+        val entity = adaptEntity(pojo);
+        getEntityChangeTracker().enlistUpdating(entity);
     }
 
     @Override
     public void postDirty(InstanceLifecycleEvent event) {
-        
         log.debug("postDirty {}", ()->_Utils.debug(event));
-        
-        // cannot assert on the frameworks being in agreement, due to the scenario documented
-        // in the FrameworkSynchronizer#preDirtyProcessing(...)
-        //
-        // 1<->m bidirectional, persistence-by-reachability
-
-        // no-op
     }
 
     @Override
     public void preDelete(InstanceLifecycleEvent event) {
-        
         log.debug("preDelete {}", ()->_Utils.debug(event));
         
         final Persistable pojo = _Utils.persistableFor(event);
-        enlistDeletingAndInvokeIsisRemovingCallbackFacet(pojo);
+        val entity = adaptEntity(pojo);
+        getEntityChangeTracker().enlistDeleting(entity);
     }
 
     @Override
     public void postDelete(InstanceLifecycleEvent event) {
-        
         log.debug("postDelete {}", ()->_Utils.debug(event));
-
-        // previously we called the PersistenceSession to invoke the removed callback (if any).
-        // however, this is almost certainly incorrect, because DN will not allow us
-        // to "touch" the pojo once deleted.
-        //
-        // CallbackFacet.Util.callCallback(adapter, RemovedCallbackFacet.class);
-
     }
 
     /**
@@ -176,7 +154,6 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
      */
     @Override
     public void preClear(InstanceLifecycleEvent event) {
-        // ignoring, not important to us
         log.debug("preClear {}", ()->_Utils.debug(event));
     }
 
@@ -185,7 +162,6 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
      */
     @Override
     public void postClear(InstanceLifecycleEvent event) {
-        // ignoring, not important to us
         log.debug("postClear {}", ()->_Utils.debug(event));
     }
 
@@ -202,68 +178,13 @@ DetachLifecycleListener, DirtyLifecycleListener, LoadLifecycleListener, StoreLif
     
     // -- HELPER
     
+    private ManagedObject adaptEntity(final @NonNull Persistable pojo) {
+        return _Utils.adaptEntity(metaModelContext, pojo);
+    }
+    
     private ManagedObject adaptEntityAndInjectServices(final @NonNull Persistable pojo) {
         return _Utils.adaptEntityAndInjectServices(metaModelContext, pojo);
     }
-
-    private void enlistDeletingAndInvokeIsisRemovingCallbackFacet(final Persistable pojo) {
-        val entity = adaptEntityAndInjectServices(pojo);
-        getEntityChangeTracker().enlistDeleting(entity);
-    }
-
-    /**
-     * Called either when an entity is initially persisted, or when an entity is updated; fires the appropriate
-     * lifecycle callback.
-     *
-     * <p>
-     * The implementation therefore uses Isis' {@link Oid#isTransient() oid}
-     * to determine which callback to fire.
-     */
-    private void invokeIsisPersistingCallback(final Persistable pojo) {
-        if (DnEntityStateProvider.entityState(pojo).isDetached()) {
-            val entity = ManagedObject.of(
-                    metaModelContext.getSpecificationLoader()::loadSpecification, 
-                    pojo);
-
-            getEntityChangeTracker().recognizePersisting(entity);
-
-        } else {
-            // updating
-
-            // don't call here, already called in preDirty.
-
-            // CallbackFacet.Util.callCallback(adapter, UpdatingCallbackFacet.class);
-        }
-    }
-
-    /**
-     * Called either when an entity is initially persisted, or when an entity is updated;
-     * fires the appropriate lifecycle callback
-     *
-     * <p>
-     * The implementation therefore uses Isis' {@link Oid#isTransient() oid}
-     * to determine which callback to fire.
-     */
-    private void enlistCreatedAndInvokeIsisPersistedCallback(final Persistable pojo) {
-        val entity = adaptEntityAndInjectServices(pojo);
-        getEntityChangeTracker().enlistCreated(entity);
-    }
-
-    private void enlistUpdatingAndInvokeIsisUpdatingCallback(final Persistable pojo) {
-        val entity = ManagedObject.of(
-                metaModelContext.getSpecificationLoader()::loadSpecification, 
-                pojo);
-        getEntityChangeTracker().enlistUpdating(entity);
-    }
-
-    private void invokeIsisUpdatedCallback(Persistable pojo) {
-        val entity = ManagedObject.of(
-                metaModelContext.getSpecificationLoader()::loadSpecification, 
-                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)
-        getEntityChangeTracker().recognizeUpdating(entity);
-    }
             
     // -- DEPENDENCIES
     
diff --git a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/_Utils.java b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/_Utils.java
index 15040be..1cac69d 100644
--- a/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/_Utils.java
+++ b/persistence/jdo/integration/src/main/java/org/apache/isis/persistence/jdo/integration/changetracking/_Utils.java
@@ -36,7 +36,7 @@ import lombok.val;
 final class _Utils {
 
     static Persistable persistableFor(InstanceLifecycleEvent event) {
-        return (Persistable)event.getSource();
+        return (Persistable)event.getPersistentInstance();
     }
     
     static void resolveInjectionPoints(
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java
index 411a8ae..9604307 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityChangesPublishingTest.java
@@ -27,14 +27,12 @@ import static org.apache.isis.testdomain.applayer.publishing.EntityChangesSubscr
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.TestFactory;
-import org.junit.jupiter.api.Timeout;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
@@ -67,7 +65,6 @@ class JdoIsisEntityChangesPublishingTest extends IsisIntegrationTestAbstract {
 
     @DisplayName("Application Layer")
     @TestFactory
-    @Timeout(value = 1, unit = TimeUnit.DAYS)
     List<DynamicTest> generateTests() {
         return testFactory.generateTests(this::given, this::verify);
     }
diff --git a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java
index 1e3b268..a9bc60b 100644
--- a/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java
+++ b/regressiontests/stable/src/test/java/org/apache/isis/testdomain/applayer/publishing/jdo/isis/JdoIsisEntityPropertyChangePublishingTest.java
@@ -19,7 +19,6 @@
 package org.apache.isis.testdomain.applayer.publishing.jdo.isis;
 
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
@@ -28,7 +27,6 @@ import org.junit.jupiter.api.DynamicTest;
 import org.junit.jupiter.api.MethodOrderer;
 import org.junit.jupiter.api.TestFactory;
 import org.junit.jupiter.api.TestMethodOrder;
-import org.junit.jupiter.api.Timeout;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.TestPropertySource;
 
@@ -67,7 +65,6 @@ class JdoIsisEntityPropertyChangePublishingTest extends IsisIntegrationTestAbstr
 
     @DisplayName("Application Layer")
     @TestFactory
-    @Timeout(value = 1, unit = TimeUnit.DAYS)
     List<DynamicTest> generateTests() {
         return testFactory.generateTests(this::given, this::verify);
     }