/*******************************************************************************
* Copyright (c) 2013, 2014 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.ide.ui.internal.structuremergeviewer;
import static com.google.common.base.Predicates.notNull;
import static com.google.common.collect.Iterables.addAll;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.transform;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Sets.newHashSet;
import com.google.common.base.Function;
import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Set;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.internal.merge.MergeDependenciesUtil;
import org.eclipse.emf.compare.internal.merge.MergeMode;
import org.eclipse.emf.compare.merge.IMerger;
import org.eclipse.emf.compare.rcp.ui.internal.configuration.IEMFCompareConfiguration;
import org.eclipse.emf.compare.rcp.ui.structuremergeviewer.groups.IDifferenceGroupProvider;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.edit.tree.TreeNode;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
/**
* @author <a href="mailto:mikael.barbero@obeo.fr">Mikael Barbero</a>
*/
public class DependencyData {
private final IEMFCompareConfiguration compareConfiguration;
private Set<Diff> requires;
private Set<Diff> rejectedDiffs;
public DependencyData(IEMFCompareConfiguration compareConfiguration) {
this.compareConfiguration = compareConfiguration;
requires = newHashSet();
rejectedDiffs = newHashSet();
}
/**
* @param selection
*/
public void updateDependencies(ISelection selection, IMerger.Registry mergerRegistry) {
boolean leftEditable = compareConfiguration.isLeftEditable();
boolean rightEditable = compareConfiguration.isRightEditable();
if (leftEditable || rightEditable) {
Iterable<Diff> selectedDiffs = filter(getSelectedComparisonObjects(selection), Diff.class);
MergeMode mergePreviewMode = compareConfiguration.getMergePreviewMode();
requires = newHashSet();
rejectedDiffs = newHashSet();
for (Diff diff : selectedDiffs) {
boolean leftToRight = mergePreviewMode.isLeftToRight(diff, leftEditable, rightEditable);
requires.addAll(
MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, !leftToRight));
requires.remove(diff);
rejectedDiffs.addAll(
MergeDependenciesUtil.getAllResultingRejections(diff, mergerRegistry, !leftToRight));
rejectedDiffs.remove(diff);
requires.removeAll(rejectedDiffs);
}
}
}
private static List<EObject> getSelectedComparisonObjects(ISelection selection) {
List<EObject> ret = newArrayList();
if (selection instanceof IStructuredSelection) {
List<?> selectedObjects = ((IStructuredSelection)selection).toList();
Iterable<EObject> data = transform(selectedObjects, ADAPTER__TARGET__DATA);
Iterable<EObject> notNullData = Iterables.filter(data, notNull());
addAll(ret, notNullData);
}
return ret;
}
private static final Function<Object, EObject> ADAPTER__TARGET__DATA = new Function<Object, EObject>() {
public EObject apply(Object object) {
return EMFCompareStructureMergeViewer.getDataOfTreeNodeOfAdapter(object);
}
};
/**
* @return the requires
*/
public Set<Diff> getRequires() {
return requires;
}
/**
* @return the unmergeables
*/
public Set<Diff> getRejections() {
return rejectedDiffs;
}
public Collection<TreeNode> getTreeNodes(Diff diff) {
final List<TreeNode> nodes = new ArrayList<TreeNode>();
IDifferenceGroupProvider groupProvider = compareConfiguration.getStructureMergeViewerGrouper()
.getProvider();
nodes.addAll(groupProvider.getTreeNodes(diff));
return nodes;
}
}