Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java')
-rw-r--r--plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/spi/cdo/CDOMergingConflictResolver.java145
1 files changed, 71 insertions, 74 deletions
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 82df8c422a..0814783223 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
@@ -83,12 +83,12 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
CDOChangeSet remoteChangeSet = getRemoteChangeSet();
while (remoteChangeSet != null)
{
- resolveConflicts(remoteChangeSet);
+ resolveConflicts(conflicts, remoteChangeSet);
remoteChangeSet = getRemoteChangeSet();
}
}
- private void resolveConflicts(CDOChangeSet remoteChangeSet)
+ private void resolveConflicts(Set<CDOObject> conflicts, CDOChangeSet remoteChangeSet)
{
CDOChangeSet localChangeSet = getLocalChangeSet();
CDOChangeSetData result;
@@ -117,11 +117,14 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
{
InternalCDORevisionDelta resultDelta = (InternalCDORevisionDelta)key;
CDOID id = resultDelta.getID();
+
InternalCDOObject object = (InternalCDOObject)transaction.getObject(id, false);
- if (object != null)
+ if (object != null && conflicts.contains(object))
{
+ // TODO Should the merge result be compared to non-conflicting revisions, too?
+
int newVersion = computeNewVersion(object);
- InternalCDORevision cleanRevision = computeOldCleanRevision(object, cleanRevisions);
+ InternalCDORevision cleanRevision = cleanRevisions.get(object);
InternalCDORevision newLocalRevision = computeNewLocalRevision(resultDelta, newVersion, cleanRevision);
// Adjust local object
@@ -147,64 +150,7 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
cleanRevisions.put(object, newCleanRevision);
dirtyObjects.put(id, object);
- newLocalDelta.accept(new CDOFeatureDeltaVisitorImpl()
- {
- @Override
- public void visit(CDOAddFeatureDelta delta)
- {
- // recurse(newObjectsUpdater, (CDOID)delta.getValue());
- }
-
- @Override
- public void visit(CDOClearFeatureDelta delta)
- {
- // TODO Only for reference features?
- CDOList list = newCleanRevision.getList(delta.getFeature());
- for (Object id : list)
- {
- recurse(detachedObjectsUpdater, (CDOID)id);
- }
- }
-
- @Override
- public void visit(CDORemoveFeatureDelta delta)
- {
- // TODO Only for reference features?
- recurse(detachedObjectsUpdater, (CDOID)delta.getValue());
- }
-
- @Override
- public void visit(CDOSetFeatureDelta delta)
- {
- // recurse(detachedObjectsUpdater, (CDOID)delta.getOldValue());
- // recurse(newObjectsUpdater, (CDOID)delta.getValue());
- }
-
- @Override
- public void visit(CDOUnsetFeatureDelta delta)
- {
- // TODO: implement CDOMergingConflictResolver.resolveConflicts(...).new CDOFeatureDeltaVisitorImpl()
- }
-
- private void recurse(final ObjectsMapUpdater objectsUpdater, CDOID id)
- {
- CDOObject object = objectsUpdater.update(id);
- if (object != null)
- {
- InternalCDORevision revision = (InternalCDORevision)object.cdoRevision();
- if (revision != null)
- {
- revision.accept(new CDORevisionValueVisitor()
- {
- public void visit(EStructuralFeature feature, Object value, int index)
- {
- recurse(objectsUpdater, (CDOID)value);
- }
- }, EMFUtil.CONTAINMENT_REFERENCES);
- }
- }
- }
- }, EMFUtil.CONTAINMENT_REFERENCES);
+ updateObjects(newCleanRevision, newLocalDelta, detachedObjectsUpdater);
}
}
}
@@ -217,18 +163,6 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
return newVersion;
}
- private InternalCDORevision computeOldCleanRevision(InternalCDOObject object,
- Map<InternalCDOObject, InternalCDORevision> cleanRevisions)
- {
- InternalCDORevision cleanRevision = cleanRevisions.get(object);
- if (cleanRevision == null)
- {
- // In this case the object revision *is clean*
- cleanRevision = object.cdoRevision();
- }
- return cleanRevision;
- }
-
private InternalCDORevision computeNewLocalRevision(InternalCDORevisionDelta resultDelta, int newVersion,
InternalCDORevision cleanRevision)
{
@@ -253,6 +187,69 @@ public class CDOMergingConflictResolver extends AbstractChangeSetsConflictResolv
return cleanRevision;
}
+ private void updateObjects(final InternalCDORevision newCleanRevision, InternalCDORevisionDelta newLocalDelta,
+ final ObjectsMapUpdater detachedObjectsUpdater)
+ {
+ newLocalDelta.accept(new CDOFeatureDeltaVisitorImpl()
+ {
+ @Override
+ public void visit(CDOAddFeatureDelta delta)
+ {
+ // recurse(newObjectsUpdater, (CDOID)delta.getValue());
+ }
+
+ @Override
+ public void visit(CDOClearFeatureDelta delta)
+ {
+ // TODO Only for reference features?
+ CDOList list = newCleanRevision.getList(delta.getFeature());
+ for (Object id : list)
+ {
+ recurse(detachedObjectsUpdater, (CDOID)id);
+ }
+ }
+
+ @Override
+ public void visit(CDORemoveFeatureDelta delta)
+ {
+ // TODO Only for reference features?
+ recurse(detachedObjectsUpdater, (CDOID)delta.getValue());
+ }
+
+ @Override
+ public void visit(CDOSetFeatureDelta delta)
+ {
+ // recurse(detachedObjectsUpdater, (CDOID)delta.getOldValue());
+ // recurse(newObjectsUpdater, (CDOID)delta.getValue());
+ }
+
+ @Override
+ public void visit(CDOUnsetFeatureDelta delta)
+ {
+ // TODO: implement CDOMergingConflictResolver.resolveConflicts(...).new CDOFeatureDeltaVisitorImpl()
+ }
+
+ private void recurse(final ObjectsMapUpdater objectsUpdater, CDOID id)
+ {
+ CDOObject object = objectsUpdater.update(id);
+ if (object != null)
+ {
+ InternalCDORevision revision = (InternalCDORevision)object.cdoRevision();
+ if (revision != null)
+ {
+ revision.accept(new CDORevisionValueVisitor()
+ {
+ public void visit(EStructuralFeature feature, Object value, int index)
+ {
+ recurse(objectsUpdater, (CDOID)value);
+ }
+ }, EMFUtil.CONTAINMENT_REFERENCES);
+ }
+ }
+ }
+ }, EMFUtil.CONTAINMENT_REFERENCES);
+ }
+
private Map<CDOID, CDORevisionDelta> getRemoteDeltas(CDOChangeSet remoteChangeSet)
{
Map<CDOID, CDORevisionDelta> remoteDeltas = CDOIDUtil.createMap();

Back to the top