blob: 11f3a5ea657c1e33f704c4d9f7e2f98a4fec0761 [file] [log] [blame]
/*******************************************************************************
* 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.merge;
import com.google.common.base.Preconditions;
import java.util.Map;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.compare.Diff;
/**
* Wrapper of mergers that makes sure that a given {@link IMergeCriterion} is passed to the wrapped merger
* before calling its merge method, and that the former value of criterion used by the wrapped merger is
* restored afterwards.
*
* @author <a href="mailto:laurent.delaigue@obeo.fr">Laurent Delaigue</a>
* @since 3.4
*/
public class DelegatingMerger {
/** The wrapped merger, cannot be <code>null</code>. */
private final IMerger merger;
/** The criterion to use, can be <code>null</code>. */
private final IMergeCriterion criterion;
/**
* Constructor.
*
* @param merger
* The merger, cannot be <code>null</code>
* @param criterion
* The criterion, can be <code>null</code>
*/
public DelegatingMerger(IMerger merger, IMergeCriterion criterion) {
this.merger = Preconditions.checkNotNull(merger);
this.criterion = criterion;
}
/**
* Call copyRightToLeft on the wrapped merger with the right criterion.
*
* @param target
* the diff
* @param monitor
* the monitor
*/
public void copyRightToLeft(Diff target, Monitor monitor) {
if (merger instanceof IMergeOptionAware) {
Map<Object, Object> options = ((IMergeOptionAware)merger).getMergeOptions();
Object oldCriterion = options.get(IMergeCriterion.OPTION_MERGE_CRITERION);
try {
options.put(IMergeCriterion.OPTION_MERGE_CRITERION, criterion);
merger.copyRightToLeft(target, monitor);
} finally {
((IMergeOptionAware)merger).getMergeOptions().put(IMergeCriterion.OPTION_MERGE_CRITERION,
oldCriterion);
}
} else {
merger.copyRightToLeft(target, monitor);
}
}
/**
* Call copyLeftToRight on the wrapped merger with the right criterion.
*
* @param target
* the diff
* @param monitor
* the monitor
*/
public void copyLeftToRight(Diff target, Monitor monitor) {
if (merger instanceof IMergeOptionAware) {
Map<Object, Object> options = ((IMergeOptionAware)merger).getMergeOptions();
Object oldCriterion = options.get(IMergeCriterion.OPTION_MERGE_CRITERION);
try {
options.put(IMergeCriterion.OPTION_MERGE_CRITERION, criterion);
merger.copyLeftToRight(target, monitor);
} finally {
((IMergeOptionAware)merger).getMergeOptions().put(IMergeCriterion.OPTION_MERGE_CRITERION,
oldCriterion);
}
} else {
merger.copyLeftToRight(target, monitor);
}
}
public IMerger getMerger() {
return merger;
}
public IMergeCriterion getCriterion() {
return criterion;
}
}