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 543759a46cf5772bc6404079103e7eb2fb634bdb Author: Andi Huber <ahu...@apache.org> AuthorDate: Wed Sep 5 17:31:09 2018 +0200 ISIS-1976: prepare removal of OA's replacePojo Task-Url: https://issues.apache.org/jira/browse/ISIS-1976 --- .../system/persistence/PersistenceSession4.java | 28 ++++++++++++++-------- .../system/persistence/PersistenceSession5.java | 26 +++++++++++++------- .../adaptermanager/ObjectAdapterContext.java | 23 +++++++++++++----- 3 files changed, 52 insertions(+), 25 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 7c554f6..d22ef39 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 @@ -1140,15 +1140,17 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement { final Version datastoreVersion = getVersionIfAny(pc); final RootOid originalOid; - ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo); - if (adapter != null) { - ensureRootObject(pojo); - originalOid = (RootOid) adapter.getOid(); + final ObjectAdapter originalAdapter = objectAdapterContext.lookupAdapterFor(pojo); + final ObjectAdapter newAdapter; + + if (originalAdapter != null) { + ensureRootObject(pojo); //[ahuber] while already mapped has no side-effect + originalOid = (RootOid) originalAdapter.getOid(); - final Version originalVersion = adapter.getVersion(); + final Version originalVersion = originalAdapter.getVersion(); // sync the pojo held by the adapter with that just loaded - objectAdapterContext.remapRecreatedPojo(adapter, pojo); + newAdapter = objectAdapterContext.remapRecreatedPojo(originalAdapter, pojo); // since there was already an adapter, do concurrency check // (but don't set abort cause if checking is suppressed through thread-local) @@ -1171,24 +1173,30 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement { LOG.info("concurrency conflict detected but suppressed, on {} ({})", thisOid, otherVersion); } } + } else { originalOid = createPersistentOrViewModelOid(pojo); + ObjectAdapter adapter; + // it appears to be possible that there is already an adapter for this Oid, // ie from ObjectStore#resolveImmediately() adapter = objectAdapterContext.lookupAdapterFor(originalOid); if (adapter != null) { - objectAdapterContext.remapRecreatedPojo(adapter, pojo); + adapter = objectAdapterContext.remapRecreatedPojo(adapter, pojo); } else { adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo); CallbackFacet.Util.callCallback(adapter, LoadedCallbackFacet.class); postLifecycleEventIfRequired(adapter, LoadedLifecycleEventFacet.class); } + + newAdapter = adapter; + } - - adapter.setVersion(datastoreVersion); - + + newAdapter.setVersion(datastoreVersion); + return objectAdapterContext.lookupAdapterFor(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 90886dc..8fdeef5 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 @@ -1132,15 +1132,17 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement { final Version datastoreVersion = getVersionIfAny(pc); final RootOid originalOid; - ObjectAdapter adapter = objectAdapterContext.lookupAdapterFor(pojo); - if (adapter != null) { + final ObjectAdapter originalAdapter = objectAdapterContext.lookupAdapterFor(pojo); + final ObjectAdapter newAdapter; + + if (originalAdapter != null) { ensureRootObject(pojo); //[ahuber] while already mapped has no side-effect - originalOid = (RootOid) adapter.getOid(); + originalOid = (RootOid) originalAdapter.getOid(); - final Version originalVersion = adapter.getVersion(); + final Version originalVersion = originalAdapter.getVersion(); // sync the pojo held by the adapter with that just loaded - objectAdapterContext.remapRecreatedPojo(adapter, pojo); + newAdapter = objectAdapterContext.remapRecreatedPojo(originalAdapter, pojo); // since there was already an adapter, do concurrency check // (but don't set abort cause if checking is suppressed through thread-local) @@ -1163,24 +1165,30 @@ implements IsisLifecycleListener.PersistenceSessionLifecycleManagement { LOG.info("concurrency conflict detected but suppressed, on {} ({})", thisOid, otherVersion); } } + } else { originalOid = createPersistentOrViewModelOid(pojo); + ObjectAdapter adapter; + // it appears to be possible that there is already an adapter for this Oid, // ie from ObjectStore#resolveImmediately() adapter = objectAdapterContext.lookupAdapterFor(originalOid); if (adapter != null) { - objectAdapterContext.remapRecreatedPojo(adapter, pojo); + adapter = objectAdapterContext.remapRecreatedPojo(adapter, pojo); } else { adapter = objectAdapterContext.addRecreatedPojoToCache(originalOid, pojo); CallbackFacet.Util.callCallback(adapter, LoadedCallbackFacet.class); postLifecycleEventIfRequired(adapter, LoadedLifecycleEventFacet.class); } + + newAdapter = adapter; + } - - adapter.setVersion(datastoreVersion); - + + newAdapter.setVersion(datastoreVersion); + return objectAdapterContext.lookupAdapterFor(pojo); } diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java index e7fd814..cc59c62 100644 --- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java +++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/persistence/adaptermanager/ObjectAdapterContext.java @@ -41,6 +41,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification; import org.apache.isis.core.metamodel.spec.feature.OneToManyAssociation; import org.apache.isis.core.metamodel.specloader.SpecificationLoader; import org.apache.isis.core.runtime.memento.Data; +import org.apache.isis.core.runtime.persistence.adapter.PojoAdapter; import org.apache.isis.core.runtime.system.persistence.PersistenceSession; /** @@ -468,14 +469,24 @@ public class ObjectAdapterContext { * @deprecated https://issues.apache.org/jira/browse/ISIS-1976 */ @Deprecated - public void remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) { - removeAdapterFromCache(adapter); + public ObjectAdapter remapRecreatedPojo(ObjectAdapter adapter, final Object pojo) { + final ObjectAdapter newAdapter = adapter.withPojo(pojo); + pojoAdapterMap.remove(adapter); + pojoAdapterMap.remove(newAdapter); - adapter.friend().replacePojo(pojo); - mapAndInjectServices(adapter); + oidAdapterMap.remove(adapter.getOid()); + oidAdapterMap.remove(newAdapter.getOid()); + + //FIXME[ISIS-1976] can't remove yet, does have strange side-effects + if(true){ + adapter.friend().replacePojo(pojo); + mapAndInjectServices(adapter); + return adapter; + } + //--- - //final ObjectAdapter newAdapter = adapter.withPojo(pojo); - //mapAndInjectServices(newAdapter); + mapAndInjectServices(newAdapter); + return newAdapter; }