diff options
author | Eike Stepper | 2010-08-09 16:33:35 +0000 |
---|---|---|
committer | Eike Stepper | 2010-08-09 16:33:35 +0000 |
commit | 8fb437a47c702e5312994ac526166274510aa8b5 (patch) | |
tree | 84e35143aff325498d35581c4ff265c99ee0af1c /plugins | |
parent | a2d3ddf0b78ca09b0359c0e8c56ee1aff8d7b54e (diff) | |
download | cdo-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')
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); + } + } + } } } |