/******************************************************************************* * Copyright (c) 2014, 2015 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.tests.performance; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.List; import org.eclipse.compare.ITypedElement; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.FileLocator; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.compare.ide.ui.internal.EMFCompareIDEUIPlugin; import org.eclipse.emf.compare.ide.ui.internal.logical.resolver.CrossReferenceResolutionScope; import org.eclipse.emf.compare.ide.ui.internal.preferences.EMFCompareUIPreferences; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.jface.preference.IPreferenceStore; import org.junit.Assert; import org.junit.FixMethodOrder; import org.junit.Test; import org.junit.runners.MethodSorters; import org.osgi.framework.Bundle; import data.models.Data; import data.models.NominalInputData; import data.models.NominalSplitInputData; import data.models.SmallInputData; import data.models.SmallSplitInputData; import data.models.StorageTypedElement; import fr.obeo.performance.api.PerformanceMonitor; /** * @author <a href="mailto:axel.richard@obeo.fr">Axel Richard</a> */ @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class TestLogicalModel extends AbstractEMFComparePerformanceTest { /** * {@inheritDoc} * * @see org.eclipse.emf.compare.tests.performance.AbstractEMFComparePerformanceTest#setSUTName() */ @Override protected void setSUTName() { getPerformance().getSystemUnderTest().setName(TestLogicalModel.class.getSimpleName()); } @Test public void a_logicalModelUMLSmall() { try { PerformanceMonitor monitor = getPerformance().createMonitor("logicalModelUMLSmall"); final Data data = new SmallInputData(); Bundle bundle = Platform.getBundle("org.eclipse.emf.compare.tests.performance"); URL entry = bundle.getEntry("src/data/models/model_size_small/.project"); URL fileURL = FileLocator.toFileURL(entry); IProjectDescription description = ResourcesPlugin.getWorkspace() .loadProjectDescription(new Path(fileURL.getPath())); IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(description.getName()); project.create(description, new NullProgressMonitor()); project.open(new NullProgressMonitor()); final IFile leftFile = project.getFile(new Path("original/model.uml")); final IFile rightFile = project.getFile(new Path("modified/model.uml")); final ITypedElement leftTypedElement = new StorageTypedElement(leftFile, leftFile.getFullPath().toOSString()); final ITypedElement rightTypedElement = new StorageTypedElement(rightFile, rightFile.getFullPath().toOSString()); monitor.measure(false, getStepsNumber(), new Runnable() { public void run() { data.logicalModel(leftTypedElement, rightTypedElement); } }); data.dispose(); project.close(new NullProgressMonitor()); project.delete(false, new NullProgressMonitor()); } catch (Exception e) { e.printStackTrace(); Assert.fail(); } } @Test public void b_logicalModelUMLNominal() { try { PerformanceMonitor monitor = getPerformance().createMonitor("logicalModelUMLNominal"); final Data data = new NominalInputData(); Bundle bundle = Platform.getBundle("org.eclipse.emf.compare.tests.performance"); URL entry = bundle.getEntry("src/data/models/model_size_nominal/.project"); URL fileURL = FileLocator.toFileURL(entry); IProjectDescription description = ResourcesPlugin.getWorkspace() .loadProjectDescription(new Path(fileURL.getPath())); IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(description.getName()); project.create(description, new NullProgressMonitor()); project.open(new NullProgressMonitor()); final IFile leftFile = project.getFile(new Path("original/model.uml")); final IFile rightFile = project.getFile(new Path("modified/model.uml")); final ITypedElement leftTypedElement = new StorageTypedElement(leftFile, leftFile.getFullPath().toOSString()); final ITypedElement rightTypedElement = new StorageTypedElement(rightFile, rightFile.getFullPath().toOSString()); monitor.measure(false, getStepsNumber(), new Runnable() { public void run() { data.logicalModel(leftTypedElement, rightTypedElement); } }); data.dispose(); project.close(new NullProgressMonitor()); project.delete(false, new NullProgressMonitor()); } catch (Exception e) { e.printStackTrace(); Assert.fail(); } } @SuppressWarnings("restriction") @Test public void c_logicalModelUMLSmallSplit() { try { PerformanceMonitor monitor = getPerformance().createMonitor("logicalModelUMLSmallSplit"); final Data data = new SmallSplitInputData(); Bundle bundle = Platform.getBundle("org.eclipse.emf.compare.tests.performance"); final ResourceSet leftResourceSet = (ResourceSet)data.getLeft(); final ResourceSet rightResourceSet = (ResourceSet)data.getRight(); IFile leftFile = null; IFile rightFile = null; final List<IProject> projects = new ArrayList<IProject>(); leftFile = createProjects(bundle, leftResourceSet, "model_size_small_split", "model_size_small_original_model", projects); rightFile = createProjects(bundle, rightResourceSet, "model_size_small_split", "model_size_small_modified_model", projects); final ITypedElement leftTypedElement = new StorageTypedElement(leftFile, leftFile.getFullPath().toOSString()); final ITypedElement rightTypedElement = new StorageTypedElement(rightFile, rightFile.getFullPath().toOSString()); final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore(); monitor.measure(false, getStepsNumber(), new Runnable() { public void run() { store.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE, CrossReferenceResolutionScope.WORKSPACE.name()); data.logicalModel(leftTypedElement, rightTypedElement); store.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE, store.getDefaultString(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE)); } }); data.dispose(); for (IProject project : projects) { project.close(new NullProgressMonitor()); project.delete(false, new NullProgressMonitor()); } projects.clear(); } catch (Exception e) { e.printStackTrace(); Assert.fail(); } } @SuppressWarnings("restriction") @Test public void d_logicalModelUMLNominalSplit() { try { PerformanceMonitor monitor = getPerformance().createMonitor("logicalModelUMLNominalSplit"); final Data data = new NominalSplitInputData(); Bundle bundle = Platform.getBundle("org.eclipse.emf.compare.tests.performance"); final ResourceSet leftResourceSet = (ResourceSet)data.getLeft(); final ResourceSet rightResourceSet = (ResourceSet)data.getRight(); IFile leftFile = null; IFile rightFile = null; final List<IProject> projects = new ArrayList<IProject>(); leftFile = createProjects(bundle, leftResourceSet, "model_size_nominal_split", "model_size_nominal_original_model", projects); rightFile = createProjects(bundle, rightResourceSet, "model_size_nominal_split", "model_size_nominal_modified_model", projects); final ITypedElement leftTypedElement = new StorageTypedElement(leftFile, leftFile.getFullPath().toOSString()); final ITypedElement rightTypedElement = new StorageTypedElement(rightFile, rightFile.getFullPath().toOSString()); final IPreferenceStore store = EMFCompareIDEUIPlugin.getDefault().getPreferenceStore(); monitor.measure(false, getStepsNumber(), new Runnable() { public void run() { store.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE, CrossReferenceResolutionScope.WORKSPACE.name()); data.logicalModel(leftTypedElement, rightTypedElement); store.setValue(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE, store.getDefaultString(EMFCompareUIPreferences.RESOLUTION_SCOPE_PREFERENCE)); } }); data.dispose(); for (IProject project : projects) { project.close(new NullProgressMonitor()); project.delete(false, new NullProgressMonitor()); } projects.clear(); } catch (Exception e) { e.printStackTrace(); Assert.fail(); } } private IFile createProjects(Bundle bundle, final ResourceSet rightResourceSet, String sourceProjectName, String projectName, final List<IProject> projects) throws IOException, CoreException { IFile file = null; for (Resource right : rightResourceSet.getResources()) { // URIs pattern : // bundleresource://149.fwk766258359/data/models/model_size_small_split/model_size_small_original_model/model.uml // We have to retrieve the second to last segment String projectPartName = right.getURI().segment(3); URL entry = bundle .getEntry("src/data/models/" + sourceProjectName + "/" + projectPartName + "/.project"); URL fileURL = FileLocator.toFileURL(entry); IProjectDescription description = ResourcesPlugin.getWorkspace() .loadProjectDescription(new Path(fileURL.getPath())); IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(description.getName()); project.create(description, new NullProgressMonitor()); project.open(new NullProgressMonitor()); projects.add(project); if (file == null && projectPartName.equals(projectName)) { file = project.getFile(new Path("model.uml")); } } return file; } }