blob: 072a5d6123125e9c4df8cbdcfa8562ab892ab6d4 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2015 THALES GLOBAL SERVICES.
* 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.sirius.tests.unit.common;
import java.io.File;
import java.util.Iterator;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.ILogListener;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.transaction.RecordingCommand;
import org.eclipse.emf.transaction.TransactionalEditingDomain;
import org.eclipse.emf.transaction.internal.EMFTransactionStatusCodes;
import org.eclipse.sirius.common.tools.api.resource.ResourceSetSync;
import org.eclipse.sirius.common.tools.api.util.LazyCrossReferencer;
import org.eclipse.sirius.common.tools.api.util.SiriusCrossReferenceAdapter;
import org.eclipse.sirius.tests.sample.component.Component;
import org.eclipse.sirius.tests.sample.component.ComponentFactory;
import org.eclipse.sirius.tests.support.api.SiriusTestCase;
import org.eclipse.sirius.tools.api.command.ICommandFactory;
import com.google.common.collect.LinkedHashMultimap;
/**
* Class containing tests to update of {@link SiriusCrossReferenceAdapter} after
* CRUD action on resources through DAnalysisSessionImpl such
* unload/reload/remove resource, close session.
*
* @author <a href="mailto:laurent.fasani@obeo.fr">Laurent Fasani</a>
*/
public class SiriusCrossReferenceAdapterTests extends SiriusTestCase {
private TransactionalEditingDomain editingDomain;
/**
* The platform error listener.
*/
private ILogListener logListener;
/**
* The reported warnings.
*/
protected final LinkedHashMultimap<String, IStatus> warnings = LinkedHashMultimap.create();
static final String fragmentFileName = "fragComponent.component";
@Override
protected void setUp() throws Exception {
super.setUp();
logListener = new ILogListener() {
@Override
public void logging(IStatus status, String plugin) {
if (status.getSeverity() == IStatus.WARNING) {
warnings.put(plugin, status);
}
}
};
Platform.addLogListener(logListener);
}
@Override
protected void tearDown() throws Exception {
Platform.removeLogListener(logListener);
super.tearDown();
}
/**
* Check that fragmented resource is not reloaded during its unload when it
* has been externally modified.
*
* @throws Exception
*/
public void testDisablingCrossReferencerWhileReloadingResource() throws Exception {
genericSetUp();
initSemanticResource();
// check that semantic crossRefAdapter is set on fragmented resource
Resource fragmentedResource = editingDomain.getResourceSet().getResources().get(2);
boolean found = false;
for (Adapter adapter : fragmentedResource.eAdapters()) {
if (adapter instanceof LazyCrossReferencer) {
found = true;
break;
}
}
assertTrue("The LazyCrossReferencer adapter is not set on fragmented resource", found);
// simulation an EXTERNAL CHANGE of fragmentResource
File fragFile = ResourcesPlugin.getWorkspace().getRoot().getProject(TEMPORARY_PROJECT_NAME).getFile(fragmentFileName).getLocation().toFile();
fragFile.setLastModified(System.currentTimeMillis());
ResourceSetSync resourceSetSync = ResourceSetSync.getResourceSetSync(editingDomain).get();
resourceSetSync.statusChanged(fragmentedResource, ResourceSetSync.ResourceStatus.SYNC, ResourceSetSync.ResourceStatus.EXTERNAL_CHANGED);
// check that no warning "loading resource while unloading it" has been
// dispatched
for (Iterator<IStatus> warning = warnings.values().iterator(); warning.hasNext();) {
IStatus status = warning.next();
if (status.getCode() == EMFTransactionStatusCodes.RELOAD_DURING_UNLOAD) {
fail("Resource is being reloaded during its unload.");
}
}
}
/**
* Initialize semantic resources
*/
private void initSemanticResource() {
final ResourceSet rset = session.getTransactionalEditingDomain().getResourceSet();
editingDomain = session.getTransactionalEditingDomain();
// initialize model
final Component componentRoot = ComponentFactory.eINSTANCE.createComponent();
componentRoot.setName("compoRoot");
componentRoot.setPayload(true);
final Component component1 = ComponentFactory.eINSTANCE.createComponent();
component1.setName("compo1");
component1.setPayload(true);
componentRoot.getChildren().add(component1);
Component component2 = ComponentFactory.eINSTANCE.createComponent();
component2.setName("compo2");
component1.getChildren().add(component2);
component2.setReference(component1);
// create resources
final URI fileMainComponentUri = URI.createPlatformResourceURI("/" + TEMPORARY_PROJECT_NAME + "/" + "Maincomponent.component", true);
final Resource rsMainComponent = rset.createResource(fileMainComponentUri);
final URI fileFragComponentUri = URI.createPlatformResourceURI("/" + TEMPORARY_PROJECT_NAME + "/" + fragmentFileName, true);
final Resource rsFragComponent = rset.createResource(fileFragComponentUri);
editingDomain.getCommandStack().execute(new RecordingCommand(editingDomain) {
@Override
protected void doExecute() {
// add content to resource
rsMainComponent.getContents().add(componentRoot);
rsFragComponent.getContents().add(component1);
// add resources to session
session.addSemanticResource(fileMainComponentUri, new NullProgressMonitor());
// save session
session.save(new NullProgressMonitor());
}
});
}
@Override
protected ICommandFactory getCommandFactory() {
return null;
}
}