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

Reply via email to