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 2013/07/09 09:42:30 UTC

[2/4] git commit: ISIS-460: synchronize adapters for deleted pojos.

ISIS-460: synchronize adapters for deleted pojos.

This follows on from ISIS-459.


Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/5bbaa954
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/5bbaa954
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/5bbaa954

Branch: refs/heads/master
Commit: 5bbaa954222303d4674ac0157636680f08079a06
Parents: 4ab4ac0
Author: Dan Haywood <da...@apache.org>
Authored: Tue Jul 9 08:38:24 2013 +0100
Committer: Dan Haywood <da...@apache.org>
Committed: Tue Jul 9 08:38:24 2013 +0100

----------------------------------------------------------------------
 .../persistence/FrameworkSynchronizer.java      | 32 +++++++++++++++++++-
 .../persistence/IsisLifecycleListener.java      |  8 ++++-
 .../system/transaction/IsisTransaction.java     |  4 ++-
 3 files changed, 41 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/isis/blob/5bbaa954/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
index 35e6099..fd11872 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/FrameworkSynchronizer.java
@@ -34,6 +34,7 @@ import org.apache.isis.applib.filter.Filter;
 import org.apache.isis.core.commons.authentication.AuthenticationSession;
 import org.apache.isis.core.commons.exceptions.IsisException;
 import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.ResolveState;
 import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
 import org.apache.isis.core.metamodel.adapter.oid.Oid;
 import org.apache.isis.core.metamodel.adapter.oid.RootOid;
@@ -46,6 +47,7 @@ import org.apache.isis.core.metamodel.facets.object.callbacks.UpdatedCallbackFac
 import org.apache.isis.core.metamodel.spec.feature.ObjectAssociation;
 import org.apache.isis.core.runtime.persistence.PersistorUtil;
 import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.core.runtime.system.persistence.AdapterManagerSpi;
 import org.apache.isis.core.runtime.system.persistence.OidGenerator;
 import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
 import org.apache.isis.core.runtime.system.transaction.IsisTransaction;
@@ -63,7 +65,7 @@ public class FrameworkSynchronizer {
      * Just used for logging.
      */
     public enum CalledFrom {
-        EVENT_LOAD, EVENT_STORE, EVENT_PREDIRTY, OS_QUERY, OS_RESOLVE, OS_LAZILYLOADED, EVENT_PREDELETE
+        EVENT_LOAD, EVENT_STORE, EVENT_PREDIRTY, OS_QUERY, OS_RESOLVE, OS_LAZILYLOADED, EVENT_PREDELETE, EVENT_POSTDELETE
     }
 
 
@@ -109,6 +111,9 @@ public class FrameworkSynchronizer {
                     PersistorUtil.toEndState(adapter);
                 }
                 adapter.setVersion(datastoreVersion);
+                if(pojo.jdoIsDeleted()) {
+                    adapter.changeState(ResolveState.DESTROYED);
+                }
 
                 ensureFrameworksInAgreement(pojo);
             }
@@ -229,6 +234,21 @@ public class FrameworkSynchronizer {
         
     }
 
+    public void postDeleteProcessingFor(final PersistenceCapable pojo, final CalledFrom calledFrom) {
+        withLogging(pojo, new Runnable() {
+            @Override
+            public void run() {
+                ObjectAdapter adapter = getAdapterManager().getAdapterFor(pojo);
+                if(!adapter.isDestroyed()) {
+                    adapter.changeState(ResolveState.DESTROYED);
+                }
+                
+                ensureFrameworksInAgreement(pojo);
+            }
+        }, calledFrom);
+        
+    }
+    
     // /////////////////////////////////////////////////////////
     // Helpers
     // /////////////////////////////////////////////////////////
@@ -287,7 +307,17 @@ public class FrameworkSynchronizer {
                 throw new IsisException(MessageFormat.format("adapter oid={0} has oid in invalid state; should be transient; pojo: {1}", oid, pojo));
             }
 
+        } else if(pojo.jdoIsDeleted()) {
+            
+            // make sure the adapter is destroyed
+            if (!adapter.getResolveState().isDestroyed()) {
+                throw new IsisException(MessageFormat.format("adapter oid={0} has resolve state in invalid state; should be destroyed but is {1}; pojo: {2}", oid, adapter.getResolveState(), pojo));
+            }
+            
         } else {
+            
+            
+            
             // make sure the adapter is persistent
             if (!adapter.getResolveState().representsPersistent()) {
                 throw new IsisException(MessageFormat.format("adapter oid={0} has resolve state in invalid state; should be in a persistent but is {1}; pojo: {2}", oid, adapter.getResolveState(), pojo));

http://git-wip-us.apache.org/repos/asf/isis/blob/5bbaa954/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
----------------------------------------------------------------------
diff --git a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
index c9118a8..1362d88 100644
--- a/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
+++ b/component/objectstore/jdo/jdo-datanucleus/src/main/java/org/apache/isis/objectstore/jdo/datanucleus/persistence/IsisLifecycleListener.java
@@ -131,7 +131,13 @@ public class IsisLifecycleListener implements AttachLifecycleListener, ClearLife
 
     @Override
     public void postDelete(InstanceLifecycleEvent event) {
-        withLogging(Phase.POST, event, new RunnableEnsureFrameworksInAgreement(event));
+        withLogging(Phase.POST, event, new RunnableAbstract(event){
+            @Override
+            protected void doRun() {
+                final PersistenceCapable pojo = Utils.persistenceCapableFor(event);
+                synchronizer.postDeleteProcessingFor(pojo, CalledFrom.EVENT_POSTDELETE);
+            }
+        });
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/isis/blob/5bbaa954/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
index f4b91b5..76f1df3 100644
--- a/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
+++ b/core/runtime/src/main/java/org/apache/isis/core/runtime/system/transaction/IsisTransaction.java
@@ -370,7 +370,9 @@ public class IsisTransaction implements TransactionScopedComponent {
                 if (command instanceof DestroyObjectCommand) {
                     final ObjectAdapter adapter = command.onAdapter();
                     adapter.setVersion(null);
-                    adapter.changeState(ResolveState.DESTROYED);
+                    if(!adapter.isDestroyed()) {
+                        adapter.changeState(ResolveState.DESTROYED);
+                    }
                 }
             }
         } finally {