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 2018/09/06 16:12:52 UTC
[isis] 05/18: ISIS-1976: prepare removal of OA's replacePojo
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 <ah...@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;
}