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