diff options
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java')
-rw-r--r-- | plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java | 42 |
1 files changed, 33 insertions, 9 deletions
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java index debdba0bb0..db69033adc 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/transaction/CDOSavepointImpl.java @@ -282,9 +282,10 @@ public class CDOSavepointImpl extends CDOUserSavepointImpl implements InternalCD { for (Entry<CDOID, CDOObject> entry : savepoint.getNewObjects().entrySet()) { - if (!getSharedDetachedObjects().contains(entry.getKey())) + CDOID id = entry.getKey(); + if (!getSharedDetachedObjects().contains(id)) { - newObjects.put(entry.getKey(), entry.getValue()); + newObjects.put(id, entry.getValue()); } } } @@ -334,16 +335,17 @@ public class CDOSavepointImpl extends CDOUserSavepointImpl implements InternalCD { for (Entry<CDOID, CDORevisionDelta> entry : savepoint.getRevisionDeltas().entrySet()) { - // Skipping temporary - if (entry.getKey().isTemporary() || getSharedDetachedObjects().contains(entry.getKey())) + // Skipping new or detached objects + CDOID id = entry.getKey(); + if (isNewObject(id) || getSharedDetachedObjects().contains(id)) { continue; } - CDORevisionDeltaImpl revisionDelta = (CDORevisionDeltaImpl)revisionDeltas.get(entry.getKey()); + CDORevisionDeltaImpl revisionDelta = (CDORevisionDeltaImpl)revisionDeltas.get(id); if (revisionDelta == null) { - revisionDeltas.put(entry.getKey(), entry.getValue().copy()); + revisionDeltas.put(id, entry.getValue().copy()); } else { @@ -376,13 +378,14 @@ public class CDOSavepointImpl extends CDOUserSavepointImpl implements InternalCD for (Entry<CDOID, CDOObject> entry : savepoint.getDetachedObjects().entrySet()) { - if (!entry.getKey().isTemporary()) + CDOID id = entry.getKey(); + if (!isNewObject(id)) { // Bug 283985 (Re-attachment): // Object is only included if it was not reattached in a later savepoint - if (!reattachedObjectIDs.contains(entry.getKey())) + if (!reattachedObjectIDs.contains(id)) { - detachedObjects.put(entry.getKey(), entry.getValue()); + detachedObjects.put(id, entry.getValue()); } } } @@ -407,6 +410,27 @@ public class CDOSavepointImpl extends CDOUserSavepointImpl implements InternalCD } } + public boolean isNewObject(CDOID id) + { + if (id.isTemporary()) + { + return true; + } + + synchronized (transaction) + { + for (InternalCDOSavepoint savepoint = this; savepoint != null; savepoint = savepoint.getPreviousSavepoint()) + { + if (savepoint.getNewObjects().containsKey(id)) + { + return true; + } + } + } + + return false; + } + public void rollback() { synchronized (transaction) |