diff options
Diffstat (limited to 'plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal')
6 files changed, 40 insertions, 118 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/provider/TreeMergeViewerItemContentProvider.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/provider/TreeMergeViewerItemContentProvider.java index 76ddd0009..4a02b6039 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/provider/TreeMergeViewerItemContentProvider.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/contentmergeviewer/tree/provider/TreeMergeViewerItemContentProvider.java @@ -20,6 +20,7 @@ import static com.google.common.collect.Iterables.size; import static com.google.common.collect.Lists.newArrayList; import static com.google.common.collect.Lists.newArrayListWithCapacity; import static java.util.Collections.emptyList; +import static org.eclipse.emf.compare.merge.AbstractMerger.isInTerminalState; import static org.eclipse.emf.compare.utils.EMFComparePredicates.CONTAINMENT_REFERENCE_CHANGE; import static org.eclipse.emf.compare.utils.EMFComparePredicates.anyRefining; import static org.eclipse.emf.compare.utils.EMFComparePredicates.fromSide; @@ -46,7 +47,6 @@ import org.eclipse.emf.compare.ConflictKind; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.DifferenceKind; import org.eclipse.emf.compare.DifferenceSource; -import org.eclipse.emf.compare.DifferenceState; import org.eclipse.emf.compare.Match; import org.eclipse.emf.compare.ResourceAttachmentChange; import org.eclipse.emf.compare.graph.IGraphView; @@ -343,7 +343,7 @@ public class TreeMergeViewerItemContentProvider implements IMergeViewerItemConte Match match = comparison.getMatch(value); if (!isPseudoAddConflict(diff) && (isAddOnOppositeSide(diff, side) || isDeleteOnSameSide(diff, side) || isInsertOnBothSides(diff, match))) { - if (match == null && diff.getState() == DifferenceState.MERGED) { + if (match == null && isInTerminalState(diff)) { EObject bestSideValue = (EObject)getBestSideValue(parent, configuration.getSide()); match = comparison.getMatch(bestSideValue); match = getMatchWithNullValues(match); @@ -520,7 +520,7 @@ public class TreeMergeViewerItemContentProvider implements IMergeViewerItemConte Match match = comparison.getMatch(value); if (isAddOnOppositeSide(diff, side) || isDeleteOnSameSide(diff, side) || isInsertOnBothSides(diff, match)) { - if (match == null && diff.getState() == DifferenceState.MERGED) { + if (match == null && isInTerminalState(diff)) { EObject bestSideValue = (EObject)getBestSideValue(parent, configuration.getSide()); match = comparison.getMatch(bestSideValue); match = getMatchWithNullValues(match); @@ -817,7 +817,7 @@ public class TreeMergeViewerItemContentProvider implements IMergeViewerItemConte * {@code false} otherwise. */ private boolean isInsertOnBothSides(Diff diff, Match match) { - return diff.getState() == DifferenceState.MERGED + return isInTerminalState(diff) && (match == null || (match.getLeft() == null && match.getRight() == null)); } @@ -861,7 +861,7 @@ public class TreeMergeViewerItemContentProvider implements IMergeViewerItemConte * otherwise. */ private boolean isAddOnOppositeSide(Diff diff, MergeViewerSide side) { - if (diff.getState() != DifferenceState.MERGED && diff.getKind() == DifferenceKind.ADD) { + if (!isInTerminalState(diff) && diff.getKind() == DifferenceKind.ADD) { DifferenceSource source = diff.getSource(); return (source == DifferenceSource.LEFT && side == MergeViewerSide.RIGHT) || (source == DifferenceSource.RIGHT && side == MergeViewerSide.LEFT); @@ -880,7 +880,7 @@ public class TreeMergeViewerItemContentProvider implements IMergeViewerItemConte * otherwise. */ private boolean isDeleteOnSameSide(Diff diff, MergeViewerSide side) { - if (diff.getState() != DifferenceState.MERGED && diff.getKind() == DifferenceKind.DELETE) { + if (!isInTerminalState(diff) && diff.getKind() == DifferenceKind.DELETE) { DifferenceSource source = diff.getSource(); return (source == DifferenceSource.LEFT && side == MergeViewerSide.LEFT) || (source == DifferenceSource.RIGHT && side == MergeViewerSide.RIGHT); diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties index 2f5eb787c..995c4e0dc 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/ide_ui_messages.properties @@ -101,6 +101,7 @@ ComparisonScopeBuilder.right = right ComparisonScopeBuilder.ancestor = ancestor ComparisonScopeBuilder.resourceSetDiagnostic = Problems occurred while loading resources from the {0} side ComparisonScopeBuilder.comparisonScopeDiagnostic = Problems occurred while creating the comparison scope +DiffStateAdapter_WrongAdapterInstalled=Unknown adapter for DiffStateAdapter installed on comparison SynchronizationModel.diagnosticMesg = Problems occurred while computing the synchronization model SynchronizationModel.root = Synchronization (EMF Compare) diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java index a13d292fc..35e0f0f55 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/EMFCompareStructureMergeViewer.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2016 Obeo and others. + * Copyright (c) 2013, 2017 Obeo and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -109,6 +109,7 @@ import org.eclipse.emf.compare.ide.ui.internal.util.CompareHandlerService; import org.eclipse.emf.compare.ide.ui.internal.util.FilteredIterator; import org.eclipse.emf.compare.ide.ui.internal.util.JFaceUtil; import org.eclipse.emf.compare.ide.ui.internal.util.PlatformElementUtil; +import org.eclipse.emf.compare.internal.merge.MergeDataImpl; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.compare.merge.AbstractMerger; import org.eclipse.emf.compare.merge.IMergeOptionAware; @@ -1243,6 +1244,11 @@ public class EMFCompareStructureMergeViewer extends AbstractStructuredViewerWrap } // Bug 501569: The cascading filter does not hide merged cascading diffs new MatchOfContainmentReferenceChangeProcessor().execute(compareResult); + + // Add a MergeData to handle status decorations on Diffs + MergeDataImpl mergeData = new MergeDataImpl(getCompareConfiguration().isLeftEditable(), + getCompareConfiguration().isRightEditable()); + compareResult.eAdapters().add(mergeData); } /** diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java index 851d36395..cdec275b8 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2015 Obeo. + * Copyright (c) 2014, 2017 Obeo. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,19 +10,20 @@ *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions; +import static org.eclipse.emf.compare.DifferenceState.DISCARDED; +import static org.eclipse.emf.compare.DifferenceState.MERGED; +import static org.eclipse.emf.compare.merge.AbstractMerger.isAccepting; +import static org.eclipse.emf.compare.merge.AbstractMerger.isInTerminalState; + import com.google.common.collect.Sets; import java.util.Collection; import java.util.Set; import org.eclipse.emf.compare.Diff; -import org.eclipse.emf.compare.DifferenceState; -import org.eclipse.emf.compare.internal.merge.IMergeData; -import org.eclipse.emf.compare.internal.merge.MergeDataImpl; import org.eclipse.emf.compare.internal.merge.MergeDependenciesUtil; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.compare.merge.IMerger.Registry; -import org.eclipse.emf.ecore.util.EcoreUtil; /** * Provides inheritable default behavior for the merge runnables. @@ -99,60 +100,26 @@ public abstract class AbstractMergeRunnable { */ protected void markAsMerged(Diff diff, MergeMode mode, boolean mergeRightToLeft, Registry mergerRegistry) { - if (diff.getState() == DifferenceState.MERGED) { + if (isInTerminalState(diff)) { return; } - - final Set<Diff> implied = MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, - mergeRightToLeft); - final Set<Diff> rejections = MergeDependenciesUtil.getAllResultingRejections(diff, mergerRegistry, - mergeRightToLeft); - for (Diff impliedDiff : Sets.difference(implied, rejections)) { - impliedDiff.setState(DifferenceState.MERGED); - addOrUpdateMergeData(impliedDiff, mode); - } - - for (Diff impliedRejection : rejections) { - impliedRejection.setState(DifferenceState.MERGED); - if (mergeMode == MergeMode.LEFT_TO_RIGHT || mergeMode == MergeMode.RIGHT_TO_LEFT) { - addOrUpdateMergeData(impliedRejection, mode); - } else { - addOrUpdateMergeData(impliedRejection, mode.inverse()); + if (isAccepting(diff, mergeRightToLeft)) { + final Set<Diff> implied = MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, + mergeRightToLeft); + final Set<Diff> rejections = MergeDependenciesUtil.getAllResultingRejections(diff, mergerRegistry, + mergeRightToLeft); + for (Diff impliedDiff : Sets.difference(implied, rejections)) { + impliedDiff.setState(MERGED); + } + for (Diff impliedRejection : rejections) { + impliedRejection.setState(DISCARDED); } - } - } - - /** - * Updates the IMergeData adapter for all of the given diffs. - * - * @param differences - * The differences for which to set or update the IMergeData adapter. - * @param mode - * Merge mode we wish to keep track of. - */ - protected void addOrUpdateMergeData(Collection<Diff> differences, MergeMode mode) { - for (Diff difference : differences) { - addOrUpdateMergeData(difference, mode); - } - } - - /** - * Updates the IMergeData adapter for the given diff. - * - * @param diff - * The difference for which to set or update the IMergeData adapter. - * @param mode - * Merge mode we wish to keep track of. - */ - private void addOrUpdateMergeData(Diff diff, MergeMode mode) { - IMergeData mergeData = (IMergeData)EcoreUtil.getExistingAdapter(diff, IMergeData.class); - if (mergeData != null) { - mergeData.setMergeMode(mode); - mergeData.setLeftEditable(isLeftEditable); - mergeData.setRightEditable(isRightEditable); } else { - mergeData = new MergeDataImpl(mode, isLeftEditable, isRightEditable); - diff.eAdapters().add(mergeData); + final Set<Diff> implied = MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, + mergeRightToLeft); + for (Diff impliedDiff : implied) { + impliedDiff.setState(DISCARDED); + } } } } diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeNonConflictingRunnable.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeNonConflictingRunnable.java index 640982da7..de5972c33 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeNonConflictingRunnable.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeNonConflictingRunnable.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2016 Obeo and others. + * Copyright (c) 2014, 2017 Obeo and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -35,7 +35,6 @@ import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.Set; @@ -48,7 +47,6 @@ import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.DifferenceSource; import org.eclipse.emf.compare.domain.IMergeRunnable; import org.eclipse.emf.compare.internal.domain.IMergeAllNonConflictingRunnable; -import org.eclipse.emf.compare.internal.merge.MergeDependenciesUtil; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.compare.internal.merge.MergeOperation; import org.eclipse.emf.compare.internal.utils.ComparisonUtil; @@ -58,7 +56,6 @@ import org.eclipse.emf.compare.merge.IBatchMerger; import org.eclipse.emf.compare.merge.IMerger; import org.eclipse.emf.compare.merge.IMerger.Registry; import org.eclipse.emf.compare.merge.IMerger.Registry2; -import org.eclipse.emf.compare.merge.IMerger2; import org.eclipse.emf.compare.merge.MergeBlockedByConflictException; /** @@ -155,16 +152,15 @@ public class MergeNonConflictingRunnable extends AbstractMergeRunnable implement Registry mergerRegistry) { final List<Diff> affectedDiffs; final IBatchMerger merger = new BatchMerger(mergerRegistry); + if (getMergeMode() == MergeMode.LEFT_TO_RIGHT) { affectedDiffs = Lists .newArrayList(Iterables.filter(differences, fromSide(DifferenceSource.LEFT))); merger.copyAllLeftToRight(affectedDiffs, new BasicMonitor()); - addOrUpdateMergeData(affectedDiffs, getMergeMode()); } else if (getMergeMode() == MergeMode.RIGHT_TO_LEFT) { affectedDiffs = Lists .newArrayList(Iterables.filter(differences, fromSide(DifferenceSource.RIGHT))); merger.copyAllRightToLeft(affectedDiffs, new BasicMonitor()); - addOrUpdateMergeData(affectedDiffs, getMergeMode()); } else if (getMergeMode() == MergeMode.ACCEPT || getMergeMode() == MergeMode.REJECT) { affectedDiffs = acceptOrRejectWithoutConflicts(differences, leftToRight, mergerRegistry, merger); } else { @@ -210,12 +206,10 @@ public class MergeNonConflictingRunnable extends AbstractMergeRunnable implement affectedDiffs = Lists .newArrayList(Iterables.filter(differences, fromSide(DifferenceSource.LEFT))); merger.copyAllLeftToRight(affectedDiffs, new BasicMonitor()); - addOrUpdateMergeData(affectedDiffs, getMergeMode()); } else if (getMergeMode() == MergeMode.RIGHT_TO_LEFT) { affectedDiffs = Lists .newArrayList(Iterables.filter(differences, fromSide(DifferenceSource.LEFT))); merger.copyAllRightToLeft(affectedDiffs, new BasicMonitor()); - addOrUpdateMergeData(affectedDiffs, getMergeMode()); } else if (getMergeMode() == MergeMode.ACCEPT || getMergeMode() == MergeMode.REJECT) { affectedDiffs = acceptOrRejectWithoutConflicts(differences, leftToRight, mergerRegistry, merger); } else { @@ -242,6 +236,7 @@ public class MergeNonConflictingRunnable extends AbstractMergeRunnable implement final Monitor emfMonitor = new BasicMonitor(); ComputeDiffsToMerge computer = new ComputeDiffsToMerge(!leftToRight, (Registry2)mergerRegistry) .failOnRealConflictUnless(alwaysFalse()); + final Predicate<? super Diff> filter; if (getMergeMode() == RIGHT_TO_LEFT) { filter = fromSide(RIGHT); @@ -265,7 +260,6 @@ public class MergeNonConflictingRunnable extends AbstractMergeRunnable implement } } - addOrUpdateMergeData(affectedDiffs, getMergeMode()); return affectedDiffs; } @@ -378,26 +372,5 @@ public class MergeNonConflictingRunnable extends AbstractMergeRunnable implement } else { merger.copyAllRightToLeft(differences, emfMonitor); } - - for (Diff difference : differences) { - final IMerger diffMerger = mergerRegistry.getHighestRankingMerger(difference); - - if (LOGGER.isDebugEnabled()) { - LOGGER.debug("mergeAll - Selected merger for diff " + difference.hashCode() //$NON-NLS-1$ - + ": " + merger.getClass().getSimpleName()); //$NON-NLS-1$ - } - - if (diffMerger instanceof IMerger2) { - final Set<Diff> resultingMerges = MergeDependenciesUtil.getAllResultingMerges(difference, - mergerRegistry, !leftToRight); - addOrUpdateMergeData(resultingMerges, getMergeMode()); - - final Set<Diff> resultingRejections = MergeDependenciesUtil - .getAllResultingRejections(difference, mergerRegistry, !leftToRight); - addOrUpdateMergeData(resultingRejections, getMergeMode().inverse()); - } else { - addOrUpdateMergeData(Collections.singleton(difference), getMergeMode()); - } - } } } diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeRunnableImpl.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeRunnableImpl.java index 46b70d23c..f692550b5 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeRunnableImpl.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/MergeRunnableImpl.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2013, 2014 Obeo. + * Copyright (c) 2013, 2017 Obeo. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,21 +15,16 @@ import static com.google.common.collect.Lists.newArrayList; import com.google.common.base.Preconditions; import java.util.Collection; -import java.util.Collections; import java.util.List; -import java.util.Set; import org.eclipse.emf.common.util.BasicMonitor; import org.eclipse.emf.compare.Diff; import org.eclipse.emf.compare.domain.IMergeRunnable; -import org.eclipse.emf.compare.internal.merge.MergeDependenciesUtil; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.compare.internal.merge.MergeOperation; import org.eclipse.emf.compare.merge.BatchMerger; import org.eclipse.emf.compare.merge.IBatchMerger; -import org.eclipse.emf.compare.merge.IMerger; import org.eclipse.emf.compare.merge.IMerger.Registry; -import org.eclipse.emf.compare.merge.IMerger2; /** * @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a> @@ -45,7 +40,6 @@ public final class MergeRunnableImpl extends AbstractMergeRunnable implements IM public void merge(List<? extends Diff> differences, boolean leftToRight, Registry mergerRegistry) { Preconditions .checkState(getMergeMode().isLeftToRight(isLeftEditable(), isRightEditable()) == leftToRight); - // Execute merge if (getMergeMode() == MergeMode.LEFT_TO_RIGHT || getMergeMode() == MergeMode.RIGHT_TO_LEFT) { mergeAll(differences, leftToRight, mergerRegistry); @@ -82,24 +76,5 @@ public final class MergeRunnableImpl extends AbstractMergeRunnable implements IM } else { merger.copyAllRightToLeft(differences, new BasicMonitor()); } - - for (Diff difference : differences) { - final IMerger diffMerger = mergerRegistry.getHighestRankingMerger(difference); - if (diffMerger instanceof IMerger2) { - final Set<Diff> resultingMerges = MergeDependenciesUtil.getAllResultingMerges(difference, - mergerRegistry, !leftToRight); - addOrUpdateMergeData(resultingMerges, getMergeMode()); - - final Set<Diff> resultingRejections = MergeDependenciesUtil - .getAllResultingRejections(difference, mergerRegistry, !leftToRight); - if (getMergeMode() == MergeMode.LEFT_TO_RIGHT || getMergeMode() == MergeMode.RIGHT_TO_LEFT) { - addOrUpdateMergeData(resultingRejections, getMergeMode()); - } else { - addOrUpdateMergeData(resultingRejections, getMergeMode().inverse()); - } - } else { - addOrUpdateMergeData(Collections.singleton(difference), getMergeMode()); - } - } } } |