diff options
author | Eike Stepper | 2011-11-18 06:46:32 +0000 |
---|---|---|
committer | Eike Stepper | 2011-11-18 06:46:32 +0000 |
commit | a796165694e896d97f1578d76a424493b0be36ae (patch) | |
tree | 21e909ec42bfc65da7504673708f45fccf751f8e | |
parent | 7ebfbd0e02f292513a2680b83987bf907813e9d5 (diff) | |
download | cdo-a796165694e896d97f1578d76a424493b0be36ae.tar.gz cdo-a796165694e896d97f1578d76a424493b0be36ae.tar.xz cdo-a796165694e896d97f1578d76a424493b0be36ae.zip |
[364107] WriteAccessHandler.handleTransactionBeforeCommitting() is called before the tempIDs are mapped
https://bugs.eclipse.org/bugs/show_bug.cgi?id=364107
2 files changed, 29 insertions, 8 deletions
diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java index c8d220e616..905e88d7f2 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java @@ -327,16 +327,24 @@ public class TransactionCommitContext implements InternalCommitContext public void applyIDMappings(OMMonitor monitor) { + boolean mapIDs = !idMappings.isEmpty(); + monitor.begin(1 + (mapIDs ? newObjects.length + dirtyObjects.length + dirtyObjectDeltas.length : 0)); + try { - monitor.begin(newObjects.length + dirtyObjects.length + dirtyObjectDeltas.length); - applyIDMappings(newObjects, monitor.fork(newObjects.length)); - applyIDMappings(dirtyObjects, monitor.fork(dirtyObjects.length)); - for (CDORevisionDelta dirtyObjectDelta : dirtyObjectDeltas) + if (mapIDs) { - ((InternalCDORevisionDelta)dirtyObjectDelta).adjustReferences(idMapper); - monitor.worked(); + applyIDMappings(newObjects, monitor.fork(newObjects.length)); + applyIDMappings(dirtyObjects, monitor.fork(dirtyObjects.length)); + for (CDORevisionDelta dirtyObjectDelta : dirtyObjectDeltas) + { + ((InternalCDORevisionDelta)dirtyObjectDelta).adjustReferences(idMapper); + monitor.worked(); + } } + + // Do not notify handlers before the IDs are fully mapped! + notifyBeforeCommitting(monitor); } finally { @@ -344,6 +352,11 @@ public class TransactionCommitContext implements InternalCommitContext } } + protected void notifyBeforeCommitting(OMMonitor monitor) + { + repository.notifyWriteAccessHandlers(transaction, this, true, monitor.fork()); + } + public void preWrite() { // Allocate a store writer @@ -447,7 +460,6 @@ public class TransactionCommitContext implements InternalCommitContext if (rollbackMessage == null) { detachObjects(monitor.fork()); - repository.notifyWriteAccessHandlers(transaction, this, true, monitor.fork()); accessor.write(this, monitor.fork(100)); } } diff --git a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java index e69b5a6858..ed96fd4caf 100644 --- a/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java +++ b/plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java @@ -86,7 +86,16 @@ public final class ReplicatorCommitContext extends TransactionCommitContext @Override public void applyIDMappings(OMMonitor monitor) { - monitor.done(); + monitor.begin(); + + try + { + notifyBeforeCommitting(monitor); + } + finally + { + monitor.done(); + } } @Override |