blob: b7967c0c57adfd4a2a093165698e8f7a630b1df6 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2013, 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.rcp.ui.tests.structuremergeviewer.groups.provider;
import static com.google.common.collect.Iterables.filter;
import static com.google.common.collect.Iterables.find;
import java.io.IOException;
import java.util.Iterator;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.compare.AttributeChange;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.EMFCompare.Builder;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.ReferenceChange;
import org.eclipse.emf.compare.rcp.internal.extension.impl.EMFCompareBuilderConfigurator;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.filters.StructureMergeViewerFilter;
import org.eclipse.emf.compare.rcp.ui.internal.structuremergeviewer.groups.provider.TreeItemProviderAdapterFactorySpec;
import org.eclipse.emf.compare.scope.DefaultComparisonScope;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.compare.tests.edit.data.ResourceScopeProvider;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
import org.eclipse.emf.edit.tree.TreeNode;
import org.junit.Before;
import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.base.Predicate;
import com.google.common.eventbus.EventBus;
/**
* @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a>
*/
@SuppressWarnings("restriction")
public class AbstractTestTreeNodeItemProviderAdapter {
protected TreeItemProviderAdapterFactorySpec treeItemProviderAdapterFactory;
protected EventBus eventBus;
@Before
public void before() throws IOException {
eventBus = new EventBus();
treeItemProviderAdapterFactory = new TreeItemProviderAdapterFactorySpec(
new StructureMergeViewerFilter(eventBus));
}
/**
* @return the comparison
* @throws IOException
*/
public static Comparison getComparison(ResourceScopeProvider scopeProvider) throws IOException {
Resource left = scopeProvider.getLeft();
ResourceSet leftResourceSet = null;
if (left != null) {
leftResourceSet = left.getResourceSet();
if (leftResourceSet != null) {
EcoreUtil.resolveAll(leftResourceSet);
}
}
Resource right = scopeProvider.getRight();
ResourceSet rightResourceSet = null;
if (right != null) {
rightResourceSet = right.getResourceSet();
if (rightResourceSet != null) {
EcoreUtil.resolveAll(rightResourceSet);
}
}
Resource origin = scopeProvider.getOrigin();
ResourceSet originResourceSet = null;
if (origin != null) {
originResourceSet = origin.getResourceSet();
if (originResourceSet != null) {
EcoreUtil.resolveAll(originResourceSet);
}
}
final IComparisonScope scope;
if (leftResourceSet != null && rightResourceSet != null) {
scope = new DefaultComparisonScope(leftResourceSet, rightResourceSet, originResourceSet);
} else {
scope = new DefaultComparisonScope(left, right, origin);
}
final Builder builder = EMFCompare.builder();
EMFCompareBuilderConfigurator.createDefault().configure(builder);
return builder.build().compare(scope);
}
/**
* Function that retrieve the data of the given TreeNode.
*/
public static final Function<Object, EObject> TREE_NODE_DATA = new Function<Object, EObject>() {
public EObject apply(Object node) {
if (node instanceof TreeNode) {
return ((TreeNode)node).getData();
} else if (node instanceof EObject) {
return (EObject)node;
}
return null;
}
};
/**
* Function that returns all contents of the given EObject.
*/
public static final Function<Object, Iterator<EObject>> E_ALL_CONTENTS = new Function<Object, Iterator<EObject>>() {
public Iterator<EObject> apply(Object object) {
if (object instanceof EObject) {
return ((EObject)object).eAllContents();
}
return null;
}
};
public static TreeNode getTreeNode(TreeNode parent, EObject eObject) {
for (TreeNode child : parent.getChildren()) {
EObject data = child.getData();
if (eObject.equals(data)) {
return child;
}
}
return null;
}
public static Predicate<Object> matchTreeNode = new Predicate<Object>() {
public boolean apply(Object object) {
if (object instanceof TreeNode) {
EObject data = ((TreeNode)object).getData();
if (data instanceof Match) {
return true;
}
}
return false;
}
};
protected Match getMatchWithFeatureValue(Iterable<?> c, final String featureName, final Object value) {
Iterable<Match> matches = filter(c, Match.class);
Predicate<Match> predicate = hasFeatureValue(featureName, value);
return find(matches, predicate);
}
protected ReferenceChange getReferenceChangeWithFeatureValue(Iterable<?> c, final String featureName,
final Object value) {
Iterable<ReferenceChange> matches = filter(c, ReferenceChange.class);
Predicate<ReferenceChange> predicate = new Predicate<ReferenceChange>() {
public boolean apply(ReferenceChange referenceChange) {
EObject referenceChangeValue = referenceChange.getValue();
if (referenceChangeValue != null) {
return Objects.equal(eGet(referenceChangeValue, featureName), value);
}
return false;
}
};
return find(matches, predicate);
}
protected AttributeChange getAttributeChangeWithFeatureValue(Iterable<?> c, final String featureName,
final Object value) {
Iterable<AttributeChange> matches = filter(c, AttributeChange.class);
Predicate<AttributeChange> predicate = new Predicate<AttributeChange>() {
public boolean apply(AttributeChange attributeChange) {
Object attributeChangeValue = attributeChange.getValue();
if (attributeChangeValue instanceof EObject) {
return Objects.equal(eGet((EObject)attributeChangeValue, featureName), value);
} else if (attributeChangeValue instanceof String) {
return featureName.equals(attributeChange.getAttribute().getName())
&& value.equals(attributeChangeValue);
} else {
// attributeChangeValue can be an instance of Integer or something else that has not been
// managed yet.
throw new IllegalStateException("Developers need to implement missing cases.");
}
}
};
return find(matches, predicate);
}
protected Predicate<Match> hasFeatureValue(final String featureName, final Object value) {
Predicate<Match> predicate = new Predicate<Match>() {
public boolean apply(Match match) {
final boolean ret;
final EObject left = match.getLeft();
final EObject right = match.getRight();
final EObject origin = match.getOrigin();
if (left != null) {
ret = Objects.equal(value, eGet(left, featureName));
} else if (right != null) {
ret = Objects.equal(value, eGet(right, featureName));
} else if (origin != null) {
ret = Objects.equal(value, eGet(origin, featureName));
} else {
ret = false;
}
return ret;
}
};
return predicate;
}
protected Object eGet(EObject eObject, String featureName) {
EStructuralFeature eStructuralFeature = eObject.eClass().getEStructuralFeature(featureName);
return eObject.eGet(eStructuralFeature);
}
protected ITreeItemContentProvider adaptAsITreeItemContentProvider(Notifier notifier) {
ITreeItemContentProvider contentProvider = (ITreeItemContentProvider)treeItemProviderAdapterFactory
.adapt(notifier, ITreeItemContentProvider.class);
return contentProvider;
}
}