/******************************************************************************* * 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; } }