diff options
| author | Axel Richard | 2015-09-14 15:08:44 +0000 |
|---|---|---|
| committer | Axel RICHARD | 2015-09-24 14:39:10 +0000 |
| commit | 22248a081fcb594d7a8730cc0438540e092dc97e (patch) | |
| tree | ee86cb86f3e6feaa4ead08371953d7a2ce9eea3a | |
| parent | 3410ddeb2a72e45ae68e8f705a5d38669b5f2f97 (diff) | |
| download | org.eclipse.emf.compare-22248a081fcb594d7a8730cc0438540e092dc97e.tar.gz org.eclipse.emf.compare-22248a081fcb594d7a8730cc0438540e092dc97e.tar.xz org.eclipse.emf.compare-22248a081fcb594d7a8730cc0438540e092dc97e.zip | |
[464739] ResourceLocationChanges become ResourceattachmentChanges.MOVE
ResourceLocationChanges are now deprecated. They are replaced by
ResourceAttachmentChanges of kind Move instead.
Change-Id: Ic66d5551a08b45a508d27038f264a8412fff4ed7
Signed-off-by: Axel Richard <axel.richard@obeo.fr>
14 files changed, 140 insertions, 144 deletions
diff --git a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/postprocessor/AddEquivalencesBetweenPapyrusRenames.java b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/postprocessor/AddEquivalencesBetweenPapyrusRenames.java index 6afadeacc..5b3d3509e 100644 --- a/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/postprocessor/AddEquivalencesBetweenPapyrusRenames.java +++ b/plugins/org.eclipse.emf.compare.diagram.ide.ui.papyrus/src/org/eclipse/emf/compare/diagram/ide/ui/papyrus/internal/postprocessor/AddEquivalencesBetweenPapyrusRenames.java @@ -11,14 +11,19 @@ package org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal.postprocessor; import static com.google.common.base.Preconditions.checkNotNull; +import static com.google.common.base.Predicates.and; +import static com.google.common.base.Predicates.instanceOf; +import static com.google.common.collect.Iterables.filter; +import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import org.eclipse.emf.common.util.Monitor; import org.eclipse.emf.compare.Comparison; -import org.eclipse.emf.compare.MatchResource; -import org.eclipse.emf.compare.ResourceLocationChange; +import org.eclipse.emf.compare.Diff; +import org.eclipse.emf.compare.DifferenceKind; +import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.diagram.ide.ui.papyrus.internal.CompareUIPapyrusMessages; import org.eclipse.papyrus.uml.tools.model.UmlModel; @@ -40,7 +45,7 @@ public class AddEquivalencesBetweenPapyrusRenames { private final Monitor monitor; /** Index used to easily find changes. */ - private final Multimap<String, ResourceLocationChange> changesByTrimmedURI = LinkedHashMultimap.create( + private final Multimap<String, ResourceAttachmentChange> changesByTrimmedURI = LinkedHashMultimap.create( 10, 4); /** @@ -60,20 +65,20 @@ public class AddEquivalencesBetweenPapyrusRenames { public void run() { monitor.subTask(CompareUIPapyrusMessages.getString("AddEquivalencesBetweenPapyrusRenames.TaskLabel")); //$NON-NLS-1$ indexLocationChanges(); - for (ResourceLocationChange resourceLocationChange : changesByTrimmedURI.values()) { - final String baseLocation = resourceLocationChange.getBaseLocation(); - if (baseLocation.endsWith(UML_EXTENSION)) { - addEquivalences(resourceLocationChange); + for (ResourceAttachmentChange resourceAttachmentChange : changesByTrimmedURI.values()) { + final String resourceURI = resourceAttachmentChange.getResourceURI(); + if (resourceURI.endsWith(UML_EXTENSION)) { + addEquivalences(resourceAttachmentChange); } } } /** Index the location changes in the model. */ private void indexLocationChanges() { - for (MatchResource matchResource : comparison.getMatchedResources()) { - for (ResourceLocationChange change : matchResource.getLocationChanges()) { - changesByTrimmedURI.put(getIndexKey(change), change); - } + for (Diff change : filter(comparison.getDifferences(), and( + instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE)))) { + changesByTrimmedURI.put(getIndexKey((ResourceAttachmentChange)change), + (ResourceAttachmentChange)change); } } @@ -83,8 +88,8 @@ public class AddEquivalencesBetweenPapyrusRenames { * @param umlLocationChange * The change */ - private void addEquivalences(ResourceLocationChange umlLocationChange) { - for (ResourceLocationChange relatedChange : changesByTrimmedURI.get(getIndexKey(umlLocationChange))) { + private void addEquivalences(ResourceAttachmentChange umlLocationChange) { + for (ResourceAttachmentChange relatedChange : changesByTrimmedURI.get(getIndexKey(umlLocationChange))) { if (relatedChange != umlLocationChange && relatedChange.getSource() == umlLocationChange.getSource()) { umlLocationChange.getRequires().add(relatedChange); @@ -100,8 +105,8 @@ public class AddEquivalencesBetweenPapyrusRenames { * The change * @return the key that should identify the given change in the index. */ - private String getIndexKey(ResourceLocationChange change) { - String uri = change.getBaseLocation(); + private String getIndexKey(ResourceAttachmentChange change) { + String uri = change.getResourceURI(); int dot = uri.lastIndexOf("."); //$NON-NLS-1$ if (dot >= 0) { return uri.substring(0, dot); diff --git a/plugins/org.eclipse.emf.compare.egit/src/org/eclipse/emf/compare/egit/internal/postprocessor/EgitPostProcessor.java b/plugins/org.eclipse.emf.compare.egit/src/org/eclipse/emf/compare/egit/internal/postprocessor/EgitPostProcessor.java index 3faf9267d..3d003b814 100644 --- a/plugins/org.eclipse.emf.compare.egit/src/org/eclipse/emf/compare/egit/internal/postprocessor/EgitPostProcessor.java +++ b/plugins/org.eclipse.emf.compare.egit/src/org/eclipse/emf/compare/egit/internal/postprocessor/EgitPostProcessor.java @@ -23,6 +23,7 @@ import org.eclipse.emf.compare.diff.IDiffProcessor; import org.eclipse.emf.compare.ide.internal.utils.StoragePathAdapter; import org.eclipse.emf.compare.postprocessor.IPostProcessor; import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.InternalEObject; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.util.EcoreUtil; @@ -76,7 +77,7 @@ public class EgitPostProcessor implements IPostProcessor { */ public void postDiff(Comparison comparison, Monitor monitor) { for (Match rootMatch : comparison.getMatches()) { - checkResourceAttachment(rootMatch, monitor); + checkForDifferences(rootMatch, monitor); } } @@ -135,6 +136,21 @@ public class EgitPostProcessor implements IPostProcessor { } /** + * Check all matches. + * + * @param match + * The match that is to be checked. + * @param monitor + * The monitor to report progress or to check for cancellation. + */ + protected void checkForDifferences(Match match, Monitor monitor) { + checkResourceAttachment(match, monitor); + for (Match subMatch : match.getSubmatches()) { + checkForDifferences(subMatch, monitor); + } + } + + /** * Checks whether the given {@link Match}'s sides have changed resources of kind Move. This will only be * called for {@link Match} elements referencing the root(s) of an EMF Resource. We also create resource * attachment of kind Move only for non-local comparison. This is why this check is made in the EMf @@ -244,13 +260,13 @@ public class EgitPostProcessor implements IPostProcessor { final String leftURI; final String rightURI; - if (left != null) { - leftResource = left.eResource(); + if (left instanceof InternalEObject) { + leftResource = ((InternalEObject)left).eDirectResource(); } else { leftResource = null; } - if (right != null) { - rightResource = right.eResource(); + if (right instanceof InternalEObject) { + rightResource = ((InternalEObject)right).eDirectResource(); } else { rightResource = null; } diff --git a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/merge/RenamedControlledResourceTests.java b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/merge/RenamedControlledResourceTests.java index 380192e91..406b0677f 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/merge/RenamedControlledResourceTests.java +++ b/plugins/org.eclipse.emf.compare.ide.ui.tests.git/src/org/eclipse/emf/compare/ide/ui/tests/merge/RenamedControlledResourceTests.java @@ -8,9 +8,11 @@ *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.tests.merge; +import static com.google.common.base.Predicates.and; import static com.google.common.base.Predicates.instanceOf; import static com.google.common.collect.Iterables.filter; import static com.google.common.collect.Iterables.size; +import static org.eclipse.emf.compare.utils.EMFComparePredicates.ofKind; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertSame; @@ -27,8 +29,9 @@ import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.Comparison; +import org.eclipse.emf.compare.DifferenceKind; import org.eclipse.emf.compare.ReferenceChange; -import org.eclipse.emf.compare.ResourceLocationChange; +import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.ide.ui.tests.egit.CompareGitTestCase; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EPackage; @@ -39,7 +42,6 @@ import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.jgit.api.ResetCommand.ResetType; import org.eclipse.jgit.lib.Constants; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; /** @@ -85,7 +87,6 @@ public class RenamedControlledResourceTests extends CompareGitTestCase { resource2 = connectResource(iFile2, resourceSet); } - @Ignore("Due to Bug 464379, this test no longer works. It needs management of resource renaming via ResourceAttachmentChange.MOVE") @Test public void testMergeNoConflictRemoteRename() throws Exception { setUpRenameNoConflict(); @@ -146,7 +147,6 @@ public class RenamedControlledResourceTests extends CompareGitTestCase { assertEquals("C1", testC1.getName()); } - @Ignore("Due to Bug 464379, this test no longer works. It needs management of resource renaming via ResourceAttachmentChange.MOVE") @Test public void testMergeNoConflictRemoteRenameLocalChanges() throws Exception { setUpRenameNoConflictLocalChanges(); @@ -178,7 +178,6 @@ public class RenamedControlledResourceTests extends CompareGitTestCase { assertEquals("NewClassInRemotelyRenamedPackage", testNewClass.getName()); } - @Ignore("Due to Bug 464379, this test no longer works. It needs management of resource renaming via ResourceAttachmentChange.MOVE") @Test public void testComparisonNoConflictRemoteRename() throws Exception { setUpRenameNoConflict(); @@ -187,17 +186,17 @@ public class RenamedControlledResourceTests extends CompareGitTestCase { assertTrue(comparison.getConflicts().isEmpty()); assertEquals(0, comparison.getDiagnostic().getCode()); - // 2 resource matches - assertEquals(2, comparison.getMatchedResources().size()); + // 3 resource matches + assertEquals(3, comparison.getMatchedResources().size()); // 2 diffs: // 1- added class "NotConflicting" in MASTER // 2- renamed file2 to file2_new assertEquals(2, comparison.getDifferences().size()); assertEquals(1, size(filter(comparison.getDifferences(), instanceOf(ReferenceChange.class)))); - assertEquals(1, size(filter(comparison.getDifferences(), instanceOf(ResourceLocationChange.class)))); + assertEquals(1, size(filter(comparison.getDifferences(), and( + instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE))))); } - @Ignore("Due to Bug 464379, this test no longer works. It needs management of resource renaming via ResourceAttachmentChange.MOVE") @Test public void testComparisonNoConflictLocalRename() throws Exception { setUpRenameNoConflict(); @@ -206,14 +205,15 @@ public class RenamedControlledResourceTests extends CompareGitTestCase { assertTrue(comparison.getConflicts().isEmpty()); assertEquals(0, comparison.getDiagnostic().getCode()); - // 2 resource matches - assertEquals(2, comparison.getMatchedResources().size()); + // 3 resource matches + assertEquals(3, comparison.getMatchedResources().size()); // 2 diffs: // 1- added class "NotConflicting" in MASTER // 2- renamed file2 to file2_new assertEquals(2, comparison.getDifferences().size()); assertEquals(1, size(filter(comparison.getDifferences(), instanceOf(ReferenceChange.class)))); - assertEquals(1, size(filter(comparison.getDifferences(), instanceOf(ResourceLocationChange.class)))); + assertEquals(1, size(filter(comparison.getDifferences(), and( + instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE))))); } @Test @@ -248,12 +248,13 @@ public class RenamedControlledResourceTests extends CompareGitTestCase { // 2 diffs: // 2- renamed file2 to file2_new (remote) and to file_other (local) assertEquals(2, comparison.getDifferences().size()); - assertEquals(2, size(filter(comparison.getDifferences(), instanceOf(ResourceLocationChange.class)))); + assertEquals(2, size(filter(comparison.getDifferences(), and( + instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE))))); // 2 diffs in conflict assertEquals(2, comparison.getConflicts().get(0).getDifferences().size()); // Both a re resource location changes - assertEquals(2, size(filter(comparison.getConflicts().get(0).getDifferences(), - instanceOf(ResourceLocationChange.class)))); + assertEquals(2, size(filter(comparison.getConflicts().get(0).getDifferences(), and( + instanceOf(ResourceAttachmentChange.class), ofKind(DifferenceKind.MOVE))))); } protected void setUpRenameNoConflict() throws Exception { diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/factory/impl/ResourceLocationChangeAccessorFactory.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/factory/impl/ResourceLocationChangeAccessorFactory.java index cf66e5528..3500f577d 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/factory/impl/ResourceLocationChangeAccessorFactory.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/factory/impl/ResourceLocationChangeAccessorFactory.java @@ -11,6 +11,7 @@ package org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.factory.impl; import org.eclipse.emf.common.notify.AdapterFactory; +import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.ResourceLocationChange; import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.legacy.ITypedElement; import org.eclipse.emf.compare.rcp.ui.internal.contentmergeviewer.accessor.impl.ResourceLocationChangeAccessorImpl; @@ -22,7 +23,10 @@ import org.eclipse.emf.compare.rcp.ui.mergeviewer.IMergeViewer.MergeViewerSide; * * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> * @since 4.1 + * @deprecated {@link org.eclipse.emf.compare.ResourceLocationChange}s have been replaced by + * {@link ResourceAttachmentChange}s of kind Move. */ +@Deprecated public class ResourceLocationChangeAccessorFactory extends AbstractAccessorFactory { /** diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/impl/ResourceLocationChangeAccessorImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/impl/ResourceLocationChangeAccessorImpl.java index 81633859c..81d40f4c4 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/impl/ResourceLocationChangeAccessorImpl.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/contentmergeviewer/accessor/impl/ResourceLocationChangeAccessorImpl.java @@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableList; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.MatchResource; +import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.ResourceLocationChange; import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.ICompareAccessor; import org.eclipse.emf.compare.rcp.ui.contentmergeviewer.accessor.IResourceContentsAccessor; @@ -32,7 +33,10 @@ import org.eclipse.swt.graphics.Image; * * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> * @since 4.0 + * @deprecated {@link org.eclipse.emf.compare.ResourceLocationChange}s have been replaced by + * {@link ResourceAttachmentChange}s of kind Move. */ +@Deprecated public class ResourceLocationChangeAccessorImpl extends AbstractTypedElementAdapter implements ICompareAccessor { /** The difference performed. */ diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java index b7af47ac8..d241354cf 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/BasicDifferenceGroupImpl.java @@ -56,7 +56,6 @@ import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.MatchResource; import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.ResourceAttachmentChange; -import org.eclipse.emf.compare.ResourceLocationChange; import org.eclipse.emf.compare.match.impl.NotLoadedFragmentMatch; import org.eclipse.emf.compare.provider.utils.ComposedStyledString; import org.eclipse.emf.compare.provider.utils.IStyledString; @@ -624,10 +623,6 @@ public class BasicDifferenceGroupImpl extends AdapterImpl implements IDifference TreeNode buildSubTree = buildSubTree(matchResource, racForMatchResource); if (buildSubTree != null) { matchResourceSubTrees.add(buildSubTree); - // Add ResourceLocationChanges - for (ResourceLocationChange rlc : filter(matchResource.getLocationChanges(), filter)) { - buildSubTree.getChildren().add(wrap(rlc)); - } } } diff --git a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java index 4e1d6fd76..5798a7084 100644 --- a/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java +++ b/plugins/org.eclipse.emf.compare.rcp.ui/src/org/eclipse/emf/compare/rcp/ui/internal/structuremergeviewer/groups/impl/ThreeWayComparisonGroupProvider.java @@ -12,8 +12,6 @@ package org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.impl import static com.google.common.base.Predicates.and; import static com.google.common.collect.Iterables.any; -import static com.google.common.collect.Iterables.filter; -import static com.google.common.collect.Iterables.size; import static com.google.common.collect.Iterators.concat; import static com.google.common.collect.Iterators.filter; import static com.google.common.collect.Iterators.transform; @@ -42,7 +40,6 @@ import org.eclipse.emf.compare.DifferenceSource; import org.eclipse.emf.compare.DifferenceState; import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.ReferenceChange; -import org.eclipse.emf.compare.ResourceLocationChange; import org.eclipse.emf.compare.internal.utils.ComparisonUtil; import org.eclipse.emf.compare.provider.utils.ComposedStyledString; import org.eclipse.emf.compare.provider.utils.IStyledString; @@ -149,14 +146,8 @@ public class ThreeWayComparisonGroupProvider extends AbstractDifferenceGroupProv protected TreeNode buildSubTree(Conflict conflict) { TreeNode ret = wrap(conflict); - if (isResourceLocationConflict(conflict)) { - for (Diff diff : conflict.getDifferences()) { - ret.getChildren().add(wrap(diff)); - } - } else { - for (Match match : getComparison().getMatches()) { - buildSubTree(ret, conflict, match); - } + for (Match match : getComparison().getMatches()) { + buildSubTree(ret, conflict, match); } return ret; @@ -164,15 +155,6 @@ public class ThreeWayComparisonGroupProvider extends AbstractDifferenceGroupProv } /** - * @param conflict - * @return - */ - private boolean isResourceLocationConflict(Conflict conflict) { - return conflict != null - && size(filter(conflict.getDifferences(), ResourceLocationChange.class)) > 0; - } - - /** * Build sub tree for the given Match. * * @param parentNode diff --git a/plugins/org.eclipse.emf.compare.rcp/plugin.xml b/plugins/org.eclipse.emf.compare.rcp/plugin.xml index e69340679..c2756d4eb 100644 --- a/plugins/org.eclipse.emf.compare.rcp/plugin.xml +++ b/plugins/org.eclipse.emf.compare.rcp/plugin.xml @@ -57,10 +57,6 @@ class="org.eclipse.emf.compare.merge.ConflictMerger" ranking="100"> </merger> - <merger - class="org.eclipse.emf.compare.merge.ResourceLocationChangeMerger" - ranking="10"> - </merger> </extension> <extension point="org.eclipse.core.contenttype.contentTypes"> diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/conflict/DefaultConflictDetector.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/conflict/DefaultConflictDetector.java index 7d5323292..cda18e7bc 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/conflict/DefaultConflictDetector.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/conflict/DefaultConflictDetector.java @@ -113,32 +113,6 @@ public class DefaultConflictDetector implements IConflictDetector { handlePseudoUnderRealAdd(comparison); - handleResourceLocationChangesConflicts(comparison); - } - - /** - * Handles conflicts on resource location changes. - * - * @param comparison - * The originating comparison of those diffs. - */ - private void handleResourceLocationChangesConflicts(Comparison comparison) { - for (MatchResource matchResource : comparison.getMatchedResources()) { - List<ResourceLocationChange> changes = matchResource.getLocationChanges(); - if (changes.size() == 2) { - Conflict conflict = CompareFactory.eINSTANCE.createConflict(); - conflict.getDifferences().addAll(changes); - comparison.getConflicts().add(conflict); - final String origin = matchResource.getOriginURI(); - final String left = matchResource.getLeftURI(); - final String right = matchResource.getRightURI(); - if (origin != null && !origin.equals(left) && !origin.equals(right)) { - conflict.setKind(ConflictKind.REAL); - } else { - conflict.setKind(ConflictKind.PSEUDO); - } - } - } } /** diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DefaultDiffEngine.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DefaultDiffEngine.java index 8adbd62d7..24e853391 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DefaultDiffEngine.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DefaultDiffEngine.java @@ -27,6 +27,7 @@ import org.eclipse.emf.compare.DifferenceSource; import org.eclipse.emf.compare.EMFCompareMessages; import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.MatchResource; +import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.internal.utils.ComparisonUtil; import org.eclipse.emf.compare.internal.utils.DiffUtil; import org.eclipse.emf.compare.utils.IEqualityHelper; @@ -115,9 +116,6 @@ public class DefaultDiffEngine implements IDiffEngine { for (Match rootMatch : comparison.getMatches()) { checkForDifferences(rootMatch, monitor); } - for (MatchResource matchResource : comparison.getMatchedResources()) { - checkResourceLocationChange(matchResource, monitor); - } } /** @@ -230,44 +228,12 @@ public class DefaultDiffEngine implements IDiffEngine { * The matchResource that is to be checked. * @param monitor * The monitor to report progress or to check for cancellation. + * @deprecated {@link org.eclipse.emf.compare.ResourceLocationChange}s have been replaced by + * {@link ResourceAttachmentChange}s of kind Move. */ + @Deprecated protected void checkResourceLocationChange(MatchResource matchResource, Monitor monitor) { - final String left = matchResource.getLeftURI(); - final String right = matchResource.getRightURI(); - - // It is a local comparison, we don't handle it for now. - final Resource leftResource = matchResource.getLeft(); - final Resource rightResource = matchResource.getRight(); - if (!ComparisonUtil.bothResourceHaveResourceSet(leftResource, rightResource) - || !ComparisonUtil.bothArePlatformResourcesAndOnlyOneExists(leftResource, rightResource)) { - return; - } - - if (matchResource.getComparison().isThreeWay()) { - final String origin = matchResource.getOriginURI(); - // If a side of the comparison is null, then it is not a renaming, it is a deletion of a resource. - if (left == null || right == null || origin == null) { - return; - } - if (!left.equals(right) && left.equals(origin)) { - // Only right location has changed - getDiffProcessor().resourceLocationChange(matchResource, left, right, DifferenceKind.CHANGE, - DifferenceSource.RIGHT); - } else if (!right.equals(left) && right.equals(origin)) { - // Only left location has changed - getDiffProcessor().resourceLocationChange(matchResource, right, left, DifferenceKind.CHANGE, - DifferenceSource.LEFT); - } else if (!origin.equals(left) && !origin.equals(right)) { - // left & right locations have changed - getDiffProcessor().resourceLocationChange(matchResource, origin, left, DifferenceKind.CHANGE, - DifferenceSource.LEFT); - getDiffProcessor().resourceLocationChange(matchResource, origin, right, - DifferenceKind.CHANGE, DifferenceSource.RIGHT); - } - } else if (left != null && right != null && !left.equals(right)) { - getDiffProcessor().resourceLocationChange(matchResource, left, right, DifferenceKind.CHANGE, - DifferenceSource.LEFT); - } + // Nothing to do here. } /** diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DiffBuilder.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DiffBuilder.java index c97be21d7..6cadec727 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DiffBuilder.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/diff/DiffBuilder.java @@ -19,7 +19,6 @@ import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.MatchResource; import org.eclipse.emf.compare.ReferenceChange; import org.eclipse.emf.compare.ResourceAttachmentChange; -import org.eclipse.emf.compare.ResourceLocationChange; import org.eclipse.emf.ecore.EAttribute; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; @@ -104,14 +103,12 @@ public class DiffBuilder implements IDiffProcessor { * @see org.eclipse.emf.compare.diff.IDiffProcessor#resourceLocationChange(org.eclipse.emf.compare. * MatchResource, java.lang.String, java.lang.String org.eclipse.emf.compare.DifferenceKind, * org.eclipse.emf.compare.DifferenceSource) + * @deprecated {@link org.eclipse.emf.compare.ResourceLocationChange}s have been replaced by + * {@link ResourceAttachmentChange}s of kind Move. */ + @Deprecated public void resourceLocationChange(MatchResource matchResource, String baseLocation, String changedLocation, DifferenceKind kind, DifferenceSource source) { - final ResourceLocationChange change = CompareFactory.eINSTANCE.createResourceLocationChange(); - change.setBaseLocation(baseLocation); - change.setChangedLocation(changedLocation); - change.setKind(kind); - change.setSource(source); - matchResource.getLocationChanges().add(change); + // Nothing to do here. } } diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/IMerger.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/IMerger.java index 383eb04ae..1fd6cb4d8 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/IMerger.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/IMerger.java @@ -193,8 +193,6 @@ public interface IMerger { featureMapMerger.setRanking(defaultRanking); final IMerger resourceAttachmentMerger = new ResourceAttachmentChangeMerger(); resourceAttachmentMerger.setRanking(defaultRanking); - final IMerger resourceLocationMerger = new ResourceLocationChangeMerger(); - resourceLocationMerger.setRanking(defaultRanking); final IMerger pseudoConflictMerger = new PseudoConflictMerger(); pseudoConflictMerger.setRanking(pseudoConflictRanking); final IMerger conflictMerger = new ConflictMerger(); diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceAttachmentChangeMerger.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceAttachmentChangeMerger.java index 26b3511cf..3e5809030 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceAttachmentChangeMerger.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceAttachmentChangeMerger.java @@ -11,9 +11,11 @@ *******************************************************************************/ package org.eclipse.emf.compare.merge; +import java.io.IOException; import java.util.Collections; import java.util.List; +import org.eclipse.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.Comparison; import org.eclipse.emf.compare.Diff; @@ -113,7 +115,55 @@ public class ResourceAttachmentChangeMerger extends AbstractMerger { * Tells us whether we are to add an object on the left or right side. */ protected void move(ResourceAttachmentChange diff, boolean rightToLeft) { - addInTarget(diff, rightToLeft); + final Match match = diff.getMatch(); + final Comparison comparison = match.getComparison(); + final Resource expectedContainer = findOrCreateTargetResource(match, rightToLeft); + + if (expectedContainer == null) { + // TODO log + diff.setState(DifferenceState.UNRESOLVED); + return; + } + + // This is a move, match.getRight() & match.getLeft() can't be null + final EObject sourceValue; + if (rightToLeft) { + sourceValue = match.getRight(); + } else { + sourceValue = match.getLeft(); + } + + final EObject expectedValue; + if (rightToLeft) { + expectedValue = match.getLeft(); + } else { + expectedValue = match.getRight(); + } + + // We have the container, reference and value. We need to know the insertion index. + final Resource initialResource = sourceValue.eResource(); + final Resource oldResource = expectedValue.eResource(); + final List<EObject> sourceList = initialResource.getContents(); + final List<EObject> targetList = expectedContainer.getContents(); + final int insertionIndex = findInsertionIndex(comparison, sourceList, targetList, expectedValue); + addAt(targetList, expectedValue, insertionIndex); + + // Copy XMI ID when applicable. + if (initialResource instanceof XMIResource && expectedContainer instanceof XMIResource) { + ((XMIResource)expectedContainer).setID(expectedValue, ((XMIResource)initialResource) + .getID(sourceValue)); + } + + // If after a move of a {@link ResourceAttachmentChange} the initial resource is empty, we have to + // delete this resource + EList<EObject> contents = oldResource.getContents(); + if (contents == null || contents.isEmpty()) { + try { + oldResource.delete(Collections.emptyMap()); + } catch (IOException e) { + // FIXME log exception. + } + } } /** @@ -320,10 +370,14 @@ public class ResourceAttachmentChangeMerger extends AbstractMerger { currentFromSourceSide = matchCurrent.getLeft(); } - // Case of control/uncontrol - final URI relativeTargetURI = sourceResource.getURI().deresolve(currentFromSourceSide.getURI()); - - return relativeTargetURI.resolve(currentResource.getURI()); + if (currentFromSourceSide != null) { + // Case of control/uncontrol + final URI relativeTargetURI = sourceResource.getURI().deresolve(currentFromSourceSide.getURI()); + return relativeTargetURI.resolve(currentResource.getURI()); + } else { + // Case of move + return sourceResource.getURI(); + } } /** diff --git a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceLocationChangeMerger.java b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceLocationChangeMerger.java index bee630e1e..5e5e332cd 100644 --- a/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceLocationChangeMerger.java +++ b/plugins/org.eclipse.emf.compare/src/org/eclipse/emf/compare/merge/ResourceLocationChangeMerger.java @@ -19,6 +19,7 @@ import org.eclipse.emf.common.util.URI; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.DifferenceSource; import org.eclipse.emf.compare.MatchResource; +import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.ResourceLocationChange; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.resource.Resource; @@ -28,7 +29,10 @@ import org.eclipse.emf.ecore.resource.ResourceSet; * This specific implementation of {@link AbstractMerger} will be used to merge resource location changes. * * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> + * @deprecated {@link org.eclipse.emf.compare.ResourceLocationChange}s have been replaced by + * {@link ResourceAttachmentChange}s of kind Move. */ +@Deprecated public class ResourceLocationChangeMerger extends AbstractMerger { /** @@ -37,7 +41,7 @@ public class ResourceLocationChangeMerger extends AbstractMerger { * @see org.eclipse.emf.compare.merge.IMerger#isMergerFor(org.eclipse.emf.compare.Diff) */ public boolean isMergerFor(Diff target) { - return target instanceof ResourceLocationChange; + return false; } @Override |
