blob: 945a21514cbed03fa8eb1773847d00242a20f8bc [file] [log] [blame]
/*
* Copyright (c) 2012, 2013 Eike Stepper (Berlin, Germany) and others.
* 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:
* Eike Stepper - initial API and implementation
*/
package org.eclipse.emf.cdo.tests;
import org.eclipse.emf.cdo.CDOObject;
import org.eclipse.emf.cdo.common.commit.CDOCommitInfo;
import org.eclipse.emf.cdo.common.revision.CDORevision;
import org.eclipse.emf.cdo.compare.CDOCompare;
import org.eclipse.emf.cdo.compare.CDOCompareUtil;
import org.eclipse.emf.cdo.compare.CDOComparisonScope;
import org.eclipse.emf.cdo.eresource.CDOResource;
import org.eclipse.emf.cdo.session.CDOSession;
import org.eclipse.emf.cdo.tests.config.IRepositoryConfig;
import org.eclipse.emf.cdo.tests.config.impl.ConfigTest.Requires;
import org.eclipse.emf.cdo.tests.model1.Category;
import org.eclipse.emf.cdo.tests.model1.Company;
import org.eclipse.emf.cdo.tests.model1.Product1;
import org.eclipse.emf.cdo.tests.model1.legacy.Model1Factory;
import org.eclipse.emf.cdo.transaction.CDOTransaction;
import org.eclipse.emf.cdo.util.CDOUtil;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.compare.Comparison;
import org.eclipse.emf.compare.Diff;
import org.eclipse.emf.compare.EMFCompare;
import org.eclipse.emf.compare.Match;
import org.eclipse.emf.compare.diff.DefaultDiffEngine;
import org.eclipse.emf.compare.diff.DiffBuilder;
import org.eclipse.emf.compare.diff.FeatureFilter;
import org.eclipse.emf.compare.diff.IDiffEngine;
import org.eclipse.emf.compare.scope.DefaultComparisonScope;
import org.eclipse.emf.compare.scope.IComparisonScope;
import org.eclipse.emf.ecore.EAttribute;
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.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import java.util.Collections;
import java.util.Set;
/**
* @author Eike Stepper
*/
@Requires(IRepositoryConfig.CAPABILITY_AUDITING)
public class EMFCompareTest extends AbstractCDOTest
{
public void testAllContentsOfCompany() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Company company = createCompany();
company.setName("ESC");
resource.getContents().add(company);
resource.getContents().add(createCompany());
resource.getContents().add(createCompany());
transaction.commit();
company.setName("Sympedia");
CDOCommitInfo commit2 = transaction.commit();
company.setName("Eclipse");
transaction.commit();
Comparison comparison = CDOCompareUtil.compare(CDOUtil.getCDOObject(company), session.openView(commit2), null);
dump(comparison);
}
public void testAllContentsOfRoot() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Company company = createCompany();
company.setName("ESC");
resource.getContents().add(company);
resource.getContents().add(createCompany());
resource.getContents().add(createCompany());
transaction.commit();
company.setName("Sympedia");
CDOCommitInfo commit2 = transaction.commit();
company.setName("Eclipse");
transaction.commit();
Comparison comparison = CDOCompareUtil.compare(CDOUtil.getCDOObject(transaction.getRootResource()),
session.openView(commit2), null);
dump(comparison);
}
public void testMinimal() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Company company = createCompany();
resource.getContents().add(company);
resource.getContents().add(createCompany());
resource.getContents().add(createCompany());
transaction.commit();
company.setName("Sympedia");
CDOCommitInfo commit2 = transaction.commit();
company.setName("Eclipse");
transaction.commit();
Comparison comparison = CDOCompareUtil.compare(transaction, session.openView(commit2), null);
dump(comparison);
}
public void testContainmentProxy() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource1 = transaction.createResource(getResourcePath("/res1"));
CDOResource resource2 = transaction.createResource(getResourcePath("/res2"));
Company company = getModel1Factory().createCompany();
company.setName("Eclipse");
resource1.getContents().add(company);
Category categoryCrossContained = getModel1Factory().createCategory();
categoryCrossContained.setName("Category");
company.getCategories().add(categoryCrossContained);
resource2.getContents().add(categoryCrossContained);
for (int i = 0; i < 10; ++i)
{
Product1 product = getModel1Factory().createProduct1();
categoryCrossContained.getProducts().add(product);
}
CDOCommitInfo commitInfo = transaction.commit();
Product1 product0 = categoryCrossContained.getProducts().get(0);
product0.setName("CHANGED");
transaction.commit();
Comparison comparison = CDOCompareUtil.compare(transaction, session.openView(commitInfo), null);
dump(comparison);
assertEquals(0, comparison.getMatch(categoryCrossContained).getDifferences().size());
}
public void testContainmentProxyEMF() throws Exception
{
ResourceSet resourceSetA = createResourceSet();
Category categoryCrossContained = populate(resourceSetA);
ResourceSet resourceSetB = createResourceSet();
Product1 product0 = populate(resourceSetB).getProducts().get(0);
product0.setName("ProductB");
IComparisonScope scope = new DefaultComparisonScope(resourceSetA, resourceSetB, null);
// Configure EMF Compare
// IEObjectMatcher matcher = DefaultMatchEngine.createDefaultEObjectMatcher(UseIdentifiers.NEVER);
// IComparisonFactory comparisonFactory = new DefaultComparisonFactory(new DefaultEqualityHelperFactory());
// IMatchEngine matchEngine = new DefaultMatchEngine(matcher, comparisonFactory);
// EMFCompare comparator = EMFCompare.builder().setMatchEngine(matchEngine).build();
EMFCompare comparator = EMFCompare.builder().build();
// Compare the two models
Comparison comparison = comparator.compare(scope);
dump(comparison);
assertEquals(0, comparison.getMatch(categoryCrossContained).getDifferences().size());
assertEquals(1, comparison.getMatch(product0).getDifferences().size());
}
public void testNoContainmentProxy() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource1 = transaction.createResource(getResourcePath("/res1"));
Company company = getModel1Factory().createCompany();
company.setName("Company");
resource1.getContents().add(company);
Category category = getModel1Factory().createCategory();
category.setName("Category");
company.getCategories().add(category);
for (int i = 0; i < 10; ++i)
{
Product1 product = getModel1Factory().createProduct1();
category.getProducts().add(product);
}
company.setName("Company2");
CDOCommitInfo commitInfo = transaction.commit();
category.getProducts().get(0).setName("EclipseProduct");
transaction.commit();
Comparison comparison = CDOCompareUtil.compare(transaction, session.openView(commitInfo), null);
dump(comparison);
assertEquals(0, comparison.getMatch(category).getDifferences().size());
}
public void testChanges() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Company company = getModel1Factory().createCompany();
company.setName("Company");
resource.getContents().add(company);
Category category1 = getModel1Factory().createCategory();
category1.setName("Category1");
company.getCategories().add(category1);
transaction.commit();
// Change category1
category1.setName("CHANGED");
Category category2 = getModel1Factory().createCategory();
category2.setName("Category2");
// Change company, add category2
company.getCategories().add(category2);
Comparison comparison = CDOCompareUtil.compareUncommittedChanges(transaction);
dump(comparison);
assertEquals(1, comparison.getMatch(category1).getDifferences().size());
assertEquals(1, comparison.getMatch(company).getDifferences().size());
}
public void testChangesDelete() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Company company = getModel1Factory().createCompany();
company.setName("Company");
resource.getContents().add(company);
Category category = getModel1Factory().createCategory();
category.setName("Category");
company.getCategories().add(category);
transaction.commit();
company.getCategories().clear();
Comparison comparison = CDOCompareUtil.compareUncommittedChanges(transaction);
dump(comparison);
assertEquals(1, comparison.getMatch(company).getDifferences().size());
}
public void testFeatureFilter() throws Exception
{
CDOSession session = openSession();
CDOTransaction transaction = session.openTransaction();
CDOResource resource = transaction.createResource(getResourcePath("/res1"));
Company company = createCompany();
company.setName("ESC");
company.setCity("Berlin");
resource.getContents().add(company);
CDOCommitInfo commit1 = transaction.commit();
company.setName("Eclipse");
company.setCity("Ottawa");
transaction.commit();
IComparisonScope scope = CDOComparisonScope.Minimal.create(transaction, session.openView(commit1), null);
Comparison comparison = new CDOCompare()
{
@Override
protected IDiffEngine createDiffEngine()
{
return new DefaultDiffEngine(new DiffBuilder())
{
@Override
protected FeatureFilter createFeatureFilter()
{
return new FeatureFilter()
{
Set<? extends EStructuralFeature> ignored = Collections.singleton(getModel1Package().getAddress_City());
@Override
protected boolean isIgnoredAttribute(EAttribute attribute)
{
return ignored.contains(attribute);
}
};
}
};
}
}.compare(scope);
dump(comparison);
assertEquals(1, comparison.getMatch(company).getDifferences().size());
}
private Company createCompany()
{
Company company = getModel1Factory().createCompany();
company.getCategories().add(getModel1Factory().createCategory());
company.getCategories().add(getModel1Factory().createCategory());
company.getCategories().add(getModel1Factory().createCategory());
company.getCategories().add(getModel1Factory().createCategory());
company.getCategories().add(getModel1Factory().createCategory());
return company;
}
private static ResourceSet createResourceSet()
{
ResourceSet resourceSet = new ResourceSetImpl();
resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("*", new XMIResourceFactoryImpl());
return resourceSet;
}
private static Category populate(ResourceSet resourceSet)
{
Model1Factory factory = org.eclipse.emf.cdo.tests.model1.legacy.Model1Factory.eINSTANCE;
Resource resourceA1 = resourceSet.createResource(URI.createURI("res1"));
Resource resourceA2 = resourceSet.createResource(URI.createURI("res2"));
Company company = factory.createCompany();
company.setName("Eclipse");
resourceA1.getContents().add(company);
Category categoryCrossContained = factory.createCategory();
categoryCrossContained.setName("Category");
company.getCategories().add(categoryCrossContained);
resourceA2.getContents().add(categoryCrossContained);
for (int i = 0; i < 10; ++i)
{
Product1 product = factory.createProduct1();
product.setName("Product" + i);
categoryCrossContained.getProducts().add(product);
}
return categoryCrossContained;
}
private static void dump(Comparison comparison)
{
dump(comparison.getMatches(), "");
}
private static void dump(EList<Match> matches, String indent)
{
for (Match match : matches)
{
System.out.println(indent + "Match:");
System.out.println(indent + " Left: " + toString(match == null ? null : match.getLeft()));
System.out.println(indent + " Right: " + toString(match == null ? null : match.getRight()));
String origin = toString(match.getOrigin());
if (origin != null)
{
System.out.println(indent + " Origin: " + origin);
}
System.out.println(indent + " Differences:");
for (Diff diff : match.getDifferences())
{
System.out.println(indent + " " + diff);
}
dump(match.getSubmatches(), indent + " ");
}
}
private static String toString(EObject object)
{
if (object == null)
{
return null;
}
CDOObject cdoObject = CDOUtil.getCDOObject(object);
if (cdoObject != null)
{
CDORevision revision = cdoObject.cdoRevision();
if (revision != null)
{
return revision.toString();
}
}
return object.toString();
}
}