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