blob: 293e1e4a32bef70c5694fdb81eee7b1c8e03b78f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015, 2019 THALES GLOBAL SERVICES.
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.sirius.tests.unit.api.tools;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashSet;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.Resource.Factory.Registry;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
import org.eclipse.emf.transaction.util.TransactionUtil;
import org.eclipse.sirius.business.api.control.SiriusControlCommand;
import org.eclipse.sirius.business.api.control.SiriusUncontrolCommand;
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.sirius.business.internal.session.danalysis.DAnalysisSessionImpl;
import org.eclipse.sirius.business.internal.session.danalysis.IResourceCollector;
import org.eclipse.sirius.tests.SiriusTestsPlugin;
import org.eclipse.sirius.tests.support.api.EclipseTestsSupportHelper;
import org.eclipse.sirius.tests.support.api.SiriusTestCase;
import org.eclipse.sirius.tools.api.command.ICommandFactory;
import org.eclipse.sirius.tools.api.command.ui.UICallBack;
import org.eclipse.sirius.viewpoint.DAnalysis;
import org.eclipse.sirius.viewpoint.DRepresentationDescriptor;
import org.eclipse.sirius.viewpoint.impl.DAnalysisSessionEObjectImpl;
import org.eclipse.sirius.viewpoint.provider.SiriusEditPlugin;
import com.google.common.collect.Iterators;
import com.google.common.collect.UnmodifiableIterator;
/**
* Test semantics resources and crossReferenceAdapter on semantic resources when (un)controlling a semantic resource.
* Test impact in the session itself and in an other session consuming the modified resources
*
* @author <a href="mailto:laurent.fasani@obeo.fr">Laurent Fasani</a>
*/
public class SiriusControlAndCrossReferenceInMultiSessionTest extends SiriusTestCase {
private static final String PATH = "/data/unit/control/multisession/";
private static final String CONSUMER_PROJECT = "SiriusConsumer";
private static final String SEMANTIC_MODEL_CONSUMER = "consumer.ecore";
private static final String AIRD_CONSUMER_1 = "consumer.aird";
private static final String LIBRARY_PROJECT = "SiriusLibrary";
private static final String SEMANTIC_MODEL_LIB = "lib.ecore";
private static final String SEMANTIC_MODEL_LIB_P1 = "lib_P1.ecore";
private static final String AIRD_LIB_1 = "lib.aird";
UICallBack originalSiriusUICallBack = SiriusEditPlugin.getPlugin().getUiCallback();
private Session sessionLibrary;
Object previousEcoreFactory;
@Override
protected void setUp() throws Exception {
previousEcoreFactory = Registry.INSTANCE.getExtensionToFactoryMap().get("ecore");
Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl() {
@Override
public Resource createResource(URI uri) {
return new XMIResourceImpl(uri) {
@Override
protected boolean useUUIDs() {
return false;
}
};
}
});
// Session library
// P0
// |_P1
// ..|_PC1
// ..|_PC2
// Consumer library
// ConsumerRoot
// |_C1
// ..|_toLibrary -->PC1
copyFilesToTestProject(SiriusTestsPlugin.PLUGIN_ID, LIBRARY_PROJECT, PATH, Arrays.asList(SEMANTIC_MODEL_LIB, AIRD_LIB_1));
genericSetUp(Collections.singletonList(toURI(LIBRARY_PROJECT + "/" + SEMANTIC_MODEL_LIB, ResourceURIType.RESOURCE_PLATFORM_URI)), Collections.<URI> emptyList(), true,
toURI(LIBRARY_PROJECT + "/" + AIRD_LIB_1, ResourceURIType.RESOURCE_PLATFORM_URI));
sessionLibrary = session;
copyFilesToTestProject(SiriusTestsPlugin.PLUGIN_ID, CONSUMER_PROJECT, PATH, Arrays.asList(SEMANTIC_MODEL_CONSUMER, AIRD_CONSUMER_1));
genericSetUp(Collections.singletonList(toURI(CONSUMER_PROJECT + "/" + SEMANTIC_MODEL_CONSUMER, ResourceURIType.RESOURCE_PLATFORM_URI)), Collections.<URI> emptyList(), true,
toURI(CONSUMER_PROJECT + "/" + AIRD_CONSUMER_1, ResourceURIType.RESOURCE_PLATFORM_URI));
}
@Override
protected void tearDown() throws Exception {
// Store locally the factory because the field is cleaned by the
// super.tearDown()
Object factory = previousEcoreFactory;
super.tearDown();
if (factory == null) {
Registry.INSTANCE.getExtensionToFactoryMap().remove("ecore");
} else {
Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", factory);
}
}
private void copyFilesToTestProject(String pluginID, String projetName, String pluginCommonPath, Collection<String> filePaths) {
EclipseTestsSupportHelper.INSTANCE.createProject(projetName);
for (final String path : filePaths) {
final String pluginFilePath = pluginCommonPath + path;
final String wksPath = projetName + "/" + path;
EclipseTestsSupportHelper.INSTANCE.copyFile(pluginID, pluginFilePath, wksPath);
}
}
/**
* @throws Exception
*/
public void testControlImpactOnSemanticResource() throws Exception {
// Check test data
EPackage mainPackage = (EPackage) sessionLibrary.getSemanticResources().iterator().next().getContents().get(0);
final EPackage packageToControl = mainPackage.getESubpackages().get(0);
EPackage mainPackageInConsumer = (EPackage) session.getSemanticResources().iterator().next().getContents().get(0);
EClassifier eTypePC1 = ((EClass) mainPackageInConsumer.getEClassifier("C1")).getEStructuralFeature("toLibrary").getEType();
assertFalse(eTypePC1.eIsProxy());
// check models tag
for (final DAnalysis analysis : ((DAnalysisSessionImpl) session).allAnalyses()) {
assertTrue(analysis.getModels().size() == 2);
}
// ######################################
// A - Control the package P1
URI controlledModelUri = URI.createPlatformResourceURI("/" + LIBRARY_PROJECT + "/" + SEMANTIC_MODEL_LIB_P1, true);
SiriusControlCommand controlCmd = new SiriusControlCommand(packageToControl, controlledModelUri, Collections.<DRepresentationDescriptor> emptySet(), null, true, new NullProgressMonitor());
TransactionUtil.getEditingDomain(mainPackage).getCommandStack().execute(controlCmd);
// --------- Library session checks --------
// 1 - Check that control occurs on LibraryProject
assertEquals(controlledModelUri, packageToControl.eResource().getURI());
EList<Resource> controlledResources = ((DAnalysisSessionEObjectImpl) sessionLibrary).getControlledResources();
assertEquals("Bad controlled resources size", 1, controlledResources.size());
Collection<Resource> semanticResources = sessionLibrary.getSemanticResources();
assertEquals("Bad semantic resources size", 1, semanticResources.size());
// check models tag
for (final DAnalysis analysis : ((DAnalysisSessionImpl) sessionLibrary).allAnalyses()) {
assertTrue(analysis.getModels().size() == 1);
}
// 2 - Check LocalResourceCollector
Resource resourcelib = semanticResources.iterator().next();
Method method = DAnalysisSessionImpl.class.getDeclaredMethod("collectAllReferencedResources", Resource.class);
method.setAccessible(true);
Collection<Resource> allReferencedResources = (Collection<Resource>) method.invoke(sessionLibrary, resourcelib);
UnmodifiableIterator<IResourceCollector> lcrIt = Iterators.filter(resourcelib.eAdapters().iterator(), IResourceCollector.class);
assertTrue("The LocalResourceCollector is not set on the analyzed resource", lcrIt.hasNext());
IResourceCollector lcr = lcrIt.next();
assertEquals(0, allReferencedResources.size());
assertEquals("size of resources referenced by " + SEMANTIC_MODEL_LIB, 0, lcr.getAllReferencedResources(resourcelib).size());
assertEquals("size of resources referencing " + SEMANTIC_MODEL_LIB, 0, lcr.getAllReferencingResources(resourcelib).size());
// --------- Consumer session checks --------
// 1 - Check that control occurs on ConsumerProject
EList<Resource> controlledResourcesInConsumer = ((DAnalysisSessionEObjectImpl) session).getControlledResources();
assertEquals("Bad controlled resources size", 1, controlledResourcesInConsumer.size());
assertTrue(controlledResourcesInConsumer.get(0).toString().contains(SEMANTIC_MODEL_LIB_P1));
Collection<Resource> semanticResourcesInConsumer = session.getSemanticResources();
assertEquals("Bad semantic resources size", 2, semanticResourcesInConsumer.size());
mainPackageInConsumer = (EPackage) session.getSemanticResources().iterator().next().getContents().get(0);
eTypePC1 = ((EClass) mainPackageInConsumer.getEClassifier("C1")).getEStructuralFeature("toLibrary").getEType();
assertFalse(eTypePC1.eIsProxy());
Resource eTypePC1Resource = eTypePC1.eResource();
assertEquals(controlledModelUri, eTypePC1Resource.getURI());
// check models tag
for (final DAnalysis analysis : ((DAnalysisSessionImpl) session).allAnalyses()) {
assertTrue(analysis.getModels().size() == 3);
assertTrue(analysis.getModels().get(2).eResource().toString().contains(SEMANTIC_MODEL_LIB_P1));
}
// 2 - Check LocalResourceCollector
Iterator<Resource> resItrInConsumer = semanticResourcesInConsumer.iterator();
Resource resourceConsumer = resItrInConsumer.next();
Resource resourceLib_P1InConsumer = controlledResourcesInConsumer.get(0);
Collection<Resource> resReferencedByConsumer = (Collection<Resource>) method.invoke(session, resourceConsumer);
UnmodifiableIterator<IResourceCollector> lcrItInconsumer = Iterators.filter(resourceConsumer.eAdapters().iterator(), IResourceCollector.class);
assertTrue("The LocalResourceCollector is not set on the analyzed resource", lcrItInconsumer.hasNext());
assertEquals(2, resReferencedByConsumer.size());
IResourceCollector lcrInConsumer = lcrItInconsumer.next();
// TODO : See Bug 461602, we should have:
// assertEquals(2, resReferencedByConsumer.size());
// assertTrue(resReferencedByConsumer.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_LIB_P1));
// We should not have SEMANTIC_MODEL_LIB in the referenced resources it should have been replaced by
// SEMANTIC_MODEL_LIB_P1.
Collection<Resource> resReferencingLib = lcrInConsumer.getAllReferencingResources(resourceLib_P1InConsumer);
assertEquals("size of resources referencing " + SEMANTIC_MODEL_LIB_P1, 1, resReferencingLib.size());
assertTrue(resReferencingLib.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_CONSUMER));
assertEquals("size of resources referenced by " + SEMANTIC_MODEL_LIB, 0, lcrInConsumer.getAllReferencedResources(resourceLib_P1InConsumer).size());
// ######################################
// B - Uncontrol the package
SiriusUncontrolCommand unControlCmd = new SiriusUncontrolCommand(packageToControl, true, true, new NullProgressMonitor());
TransactionUtil.getEditingDomain(mainPackage).getCommandStack().execute(unControlCmd);
// --------- Library session checks --------
// 1 - Check that uncontrol occurs on LibraryProject
URI libModelUri = URI.createPlatformResourceURI("/" + LIBRARY_PROJECT + "/" + SEMANTIC_MODEL_LIB, true);
assertEquals(libModelUri, packageToControl.eResource().getURI());
controlledResources = ((DAnalysisSessionEObjectImpl) sessionLibrary).getControlledResources();
assertEquals("Bad controlled resources size", 0, controlledResources.size());
semanticResources = sessionLibrary.getSemanticResources();
assertEquals("Bad semantic resources size", 1, semanticResources.size());
// check models tag
for (final DAnalysis analysis : ((DAnalysisSessionImpl) sessionLibrary).allAnalyses()) {
assertTrue(analysis.getModels().size() == 1);
}
// 2 - Check LocalResourceCollector
resourcelib = semanticResources.iterator().next();
lcrIt = Iterators.filter(resourcelib.eAdapters().iterator(), IResourceCollector.class);
lcr = lcrIt.next();
assertEquals("size of resources referenced by " + SEMANTIC_MODEL_LIB, 0, lcr.getAllReferencedResources(resourcelib).size());
assertEquals("size of resources referencing " + SEMANTIC_MODEL_LIB, 0, lcr.getAllReferencingResources(resourcelib).size());
// --------- Consumer session checks --------
// 1 - Check that uncontrol occurs on ConsumerProject
controlledResourcesInConsumer = ((DAnalysisSessionEObjectImpl) session).getControlledResources();
assertEquals("Bad controlled resources size", 0, controlledResourcesInConsumer.size());
semanticResourcesInConsumer = session.getSemanticResources();
assertEquals("Bad semantic resources size", 2, semanticResourcesInConsumer.size());
mainPackageInConsumer = (EPackage) session.getSemanticResources().iterator().next().getContents().get(0);
eTypePC1 = ((EClass) mainPackageInConsumer.getEClassifier("C1")).getEStructuralFeature("toLibrary").getEType();
// eTypePC1 is proxy because the URI contains the previously controlled
// resource lib_P1 that does not exists anymore
assertTrue(eTypePC1.eIsProxy());
eTypePC1Resource = eTypePC1.eResource();
assertNull(eTypePC1Resource);
// check models tag
for (final DAnalysis analysis : ((DAnalysisSessionImpl) session).allAnalyses()) {
assertEquals("Incorrect models size", 2, analysis.getModels().size());
assertTrue(analysis.getModels().get(1).eResource().toString().contains(SEMANTIC_MODEL_LIB));
}
// 2 - Check LocalResourceCollector
resItrInConsumer = semanticResourcesInConsumer.iterator();
resourceConsumer = resItrInConsumer.next();
Resource resourceLibInConsumer = resItrInConsumer.next();
lcrItInconsumer = Iterators.filter(resourceConsumer.eAdapters().iterator(), IResourceCollector.class);
lcrInConsumer = lcrItInconsumer.next();
resReferencedByConsumer = lcrInConsumer.getAllReferencedResources(resourceConsumer);
assertEquals("size of resources referenced by " + SEMANTIC_MODEL_CONSUMER, 1, resReferencedByConsumer.size());
assertTrue(resReferencedByConsumer.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_LIB));
resReferencingLib = lcrInConsumer.getAllReferencingResources(resourceLibInConsumer);
assertEquals(1, resReferencingLib.size());
assertTrue(resReferencingLib.iterator().next().getURI().toString().contains(SEMANTIC_MODEL_CONSUMER));
assertFalse("The LocalResourceCollector should not be set on resourceSet", Iterators.filter(resourceConsumer.getResourceSet().eAdapters().iterator(), IResourceCollector.class).hasNext());
LinkedHashSet<Resource> collectedResources = new LinkedHashSet<>();
collectedResources.addAll(((DAnalysisSessionImpl) session).getAllSessionResources());
collectedResources.addAll(((DAnalysisSessionImpl) session).getSemanticResources());
collectedResources.addAll(((DAnalysisSessionImpl) session).getControlledResources());
for (Resource res : collectedResources) {
assertTrue("The LocalResourceCollector should be installed on all managed resources", Iterators.filter(res.eAdapters().iterator(), IResourceCollector.class).hasNext());
}
}
@Override
protected ICommandFactory getCommandFactory() {
return null;
}
}