Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2011-11-18 06:46:32 +0000
committerEike Stepper2011-11-18 06:46:32 +0000
commita796165694e896d97f1578d76a424493b0be36ae (patch)
tree21e909ec42bfc65da7504673708f45fccf751f8e
parent7ebfbd0e02f292513a2680b83987bf907813e9d5 (diff)
downloadcdo-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
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/TransactionCommitContext.java26
-rw-r--r--plugins/org.eclipse.emf.cdo.server/src/org/eclipse/emf/cdo/internal/server/syncing/ReplicatorCommitContext.java11
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

Back to the top