| /******************************************************************************* |
| * Copyright (c) 2016 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 |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Obeo - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.emf.compare.diagram.internal.merge; |
| |
| import static org.eclipse.emf.compare.DifferenceKind.DELETE; |
| import static org.eclipse.emf.compare.DifferenceSource.LEFT; |
| import static org.eclipse.emf.compare.DifferenceSource.RIGHT; |
| import static org.eclipse.emf.compare.DifferenceState.MERGED; |
| |
| import java.util.Set; |
| |
| import org.eclipse.emf.common.util.Monitor; |
| import org.eclipse.emf.compare.Diff; |
| import org.eclipse.emf.compare.merge.AbstractMerger; |
| import org.eclipse.emf.compare.merge.AdditiveMergeCriterion; |
| import org.eclipse.emf.compare.merge.IMergeCriterion; |
| |
| /** |
| * This specific implementation of {@link AbstractMerger} will be used to merge conflicts in an additive merge |
| * context. |
| * |
| * @author <a href="mailto:mathieu.cartaud@obeo.fr">Mathieu Cartaud</a> |
| */ |
| public class AdditiveCompareDiagramMerger extends CompareDiagramMerger { |
| |
| /** |
| * The constructor specify the context where this merger can be used. |
| */ |
| public AdditiveCompareDiagramMerger() { |
| super(); |
| mergeOptions.put(IMergeCriterion.OPTION_MERGE_CRITERION, AdditiveMergeCriterion.INSTANCE); |
| } |
| |
| @Override |
| public boolean apply(IMergeCriterion criterion) { |
| return criterion == AdditiveMergeCriterion.INSTANCE; |
| } |
| |
| @Override |
| public void copyRightToLeft(Diff target, Monitor monitor) { |
| if (isInTerminalState(target)) { |
| return; |
| } |
| |
| if (target.getSource() == RIGHT && target.getKind() != DELETE) { |
| super.copyRightToLeft(target, monitor); |
| } else if (target.getSource() == LEFT && target.getKind() == DELETE) { |
| super.copyRightToLeft(target, monitor); |
| } else { |
| target.setState(MERGED); |
| for (Diff refiningDiff : target.getRefinedBy()) { |
| refiningDiff.setState(MERGED); |
| } |
| } |
| } |
| |
| @Override |
| public Set<Diff> getDirectMergeDependencies(Diff target, boolean mergeRightToLeft) { |
| if (target.getSource() == RIGHT && target.getKind() != DELETE) { |
| return super.getDirectMergeDependencies(target, mergeRightToLeft); |
| } else if (target.getSource() == LEFT && target.getKind() == DELETE) { |
| return super.getDirectMergeDependencies(target, mergeRightToLeft); |
| } else { |
| return super.getDirectMergeDependencies(target, !mergeRightToLeft); |
| } |
| } |
| |
| @Override |
| public Set<Diff> getDirectResultingMerges(Diff target, boolean mergeRightToLeft) { |
| if (target.getSource() == RIGHT && target.getKind() != DELETE) { |
| return super.getDirectResultingMerges(target, mergeRightToLeft); |
| } else if (target.getSource() == LEFT && target.getKind() == DELETE) { |
| return super.getDirectResultingMerges(target, mergeRightToLeft); |
| } else { |
| return super.getDirectResultingMerges(target, !mergeRightToLeft); |
| } |
| } |
| } |