Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEike Stepper2010-08-09 16:33:35 +0000
committerEike Stepper2010-08-09 16:33:35 +0000
commit8fb437a47c702e5312994ac526166274510aa8b5 (patch)
tree84e35143aff325498d35581c4ff265c99ee0af1c /plugins
parenta2d3ddf0b78ca09b0359c0e8c56ee1aff8d7b54e (diff)
downloadcdo-8fb437a47c702e5312994ac526166274510aa8b5.tar.gz
cdo-8fb437a47c702e5312994ac526166274510aa8b5.tar.xz
cdo-8fb437a47c702e5312994ac526166274510aa8b5.zip
[319090] Provide a CDOConflictResolver that uses a CDOMerger
https://bugs.eclipse.org/bugs/show_bug.cgi?id=319090
Diffstat (limited to 'plugins')
-rw-r--r--plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ConflictResolverTest.java13
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java45
2 files changed, 48 insertions, 10 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ConflictResolverTest.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ConflictResolverTest.java
index ee79b25315..96c8174d4c 100644
--- a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ConflictResolverTest.java
+++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/ConflictResolverTest.java
@@ -47,7 +47,7 @@ public class ConflictResolverTest extends AbstractCDOTest
transaction.commit();
- // Resolver should be triggered. Should we always used a timer ?
+ // Resolver should be triggered. Should we always use a timer ?
sleep(1000);
assertEquals(false, CDOUtil.getCDOObject(address2).cdoConflict());
@@ -99,30 +99,25 @@ public class ConflictResolverTest extends AbstractCDOTest
assertEquals("OTTAWA", address2.getCity());
}
- public void _testCDOMergingConflictResolver() throws Exception
+ public void testCDOMergingConflictResolver() throws Exception
{
- msg("Opening session");
CDOSession session = openSession();
-
CDOTransaction transaction = session.openTransaction();
Address address = getModel1Factory().createAddress();
-
transaction.getOrCreateResource("/res1").getContents().add(address);
-
transaction.commit();
CDOTransaction transaction2 = session.openTransaction();
transaction2.options().addConflictResolver(new CDOMergingConflictResolver());
- Address address2 = (Address)transaction2.getOrCreateResource("/res1").getContents().get(0);
+ Address address2 = (Address)transaction2.getOrCreateResource("/res1").getContents().get(0);
address2.setCity("OTTAWA");
address.setName("NAME1");
-
transaction.commit();
- // Resolver should be triggered. Should we always used a timer ?
+ // Resolver should be triggered. Should we always use a timer ?
sleep(1000);
assertEquals(false, CDOUtil.getCDOObject(address2).cdoConflict());
diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java
index 778f20f164..638dc377bc 100644
--- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java
+++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java
@@ -11,15 +11,21 @@
package org.eclipse.emf.spi.cdo;
import org.eclipse.emf.cdo.CDOObject;
+import org.eclipse.emf.cdo.CDOState;
import org.eclipse.emf.cdo.common.commit.CDOChangeSet;
import org.eclipse.emf.cdo.common.commit.CDOChangeSetData;
import org.eclipse.emf.cdo.common.id.CDOID;
import org.eclipse.emf.cdo.common.revision.CDORevision;
+import org.eclipse.emf.cdo.common.revision.CDORevisionKey;
import org.eclipse.emf.cdo.common.revision.CDORevisionProvider;
+import org.eclipse.emf.cdo.common.revision.delta.CDORevisionDelta;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevision;
+import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionDelta;
import org.eclipse.emf.cdo.spi.common.revision.InternalCDORevisionManager;
import org.eclipse.emf.cdo.transaction.CDOMerger;
import java.util.Set;
+import java.util.concurrent.ConcurrentMap;
/**
* @author Eike Stepper
@@ -50,6 +56,23 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
CDOChangeSet source = getRemoteChangeSet();
CDOChangeSetData result = merger.merge(target, source);
+ // Map<CDOID, InternalCDORevisionDelta> deltas = new HashMap<CDOID, InternalCDORevisionDelta>();
+ // for (CDORevisionKey key : result.getChangedObjects())
+ // {
+ // deltas.put(key.getID(), (InternalCDORevisionDelta)key);
+ // }
+ //
+ // for (CDORevisionKey key : source.getChangedObjects())
+ // {
+ // CDOID id = key.getID();
+ // InternalCDORevisionDelta delta = deltas.get(id);
+ // if (delta != null)
+ // {
+ // CDOBranchVersion branchVersion = ((CDORevisionDelta)key).getTarget();
+ // delta.setTarget(branchVersion.getBranch().getVersion(branchVersion.getVersion()));
+ // }
+ // }
+
final InternalCDOTransaction transaction = (InternalCDOTransaction)getTransaction();
final InternalCDOSession session = transaction.getSession();
final InternalCDORevisionManager revisionManager = session.getRevisionManager();
@@ -76,6 +99,26 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
}
};
- transaction.applyChangeSetData(result, ancestorProvider, targetProvider, transaction);
+ CDOChangeSetData applied = transaction.applyChangeSetData(result, ancestorProvider, targetProvider, transaction);
+
+ ConcurrentMap<CDOID, CDORevisionDelta> revisionDeltas = transaction.getLastSavepoint().getRevisionDeltas();
+ for (CDORevisionKey key : applied.getChangedObjects())
+ {
+ CDOID id = key.getID();
+ InternalCDOObject object = (InternalCDOObject)transaction.getObject(id, false);
+ if (object != null)
+ {
+ object.cdoInternalSetState(CDOState.DIRTY);
+ InternalCDORevision revision = object.cdoRevision();
+ int version = revision.getVersion() + 1;
+ revision.setVersion(version);
+
+ InternalCDORevisionDelta revisionDelta = (InternalCDORevisionDelta)revisionDeltas.get(id);
+ if (revisionDelta != null)
+ {
+ revisionDelta.setVersion(version);
+ }
+ }
+ }
}
}

Back to the top