/**
* <copyright>
*
* Copyright (c) 2006-2017 Thales Global Services S.A.S.
* 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:
* Thales Global Services S.A.S. - initial API and implementation
*
* </copyright>
*/
package org.eclipse.emf.diffmerge.sirius;
import java.util.Arrays;
import java.util.Collection;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.diffmerge.gmf.GMFScope;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.edit.domain.EditingDomain;
import org.eclipse.gmf.runtime.notation.NotationPackage;
import org.eclipse.sirius.business.api.helper.SiriusUtil;
import org.eclipse.sirius.diagram.DiagramPackage;
import org.eclipse.sirius.viewpoint.DAnalysis;
import org.eclipse.sirius.viewpoint.DRepresentation;
import org.eclipse.sirius.viewpoint.DSemanticDecorator;
import org.eclipse.sirius.viewpoint.ViewpointPackage;
import org.eclipse.sirius.viewpoint.description.style.StylePackage;
/**
* A scope for fragmented Viewpoint files which covers the semantic elements.
*/
public class SiriusScope extends GMFScope {
/** The file extension for Sirius resource fragments */
public static final String SESSION_RESOURCE_FRAGMENT_EXTENSION = "airdfragment"; //$NON-NLS-1$
/** The set of Sirius file extensions */
public static final Collection<String> SIRIUS_FILE_EXTENSIONS = Arrays.asList(
SiriusUtil.SESSION_RESOURCE_EXTENSION,
SESSION_RESOURCE_FRAGMENT_EXTENSION);
/** The set of packages which can be used in Sirius resources */
protected static final Collection<? extends EPackage> SIRIUS_PACKAGES =
Arrays.asList(
ViewpointPackage.eINSTANCE,
StylePackage.eINSTANCE,
NotationPackage.eINSTANCE,
DiagramPackage.eINSTANCE
);
/**
* Constructor
* @param uri_p a non-null URI
* @param domain a non-null editing domain
* @param readOnly_p whether the scope is read-only
*/
public SiriusScope(URI uri_p, EditingDomain domain, boolean readOnly_p) {
super(uri_p, domain, readOnly_p);
}
/**
* Constructor
* @param uri_p a non-null URI
* @param resourceSet_p a non-null resource set
* @param readOnly_p whether the scope is read-only
*/
public SiriusScope(URI uri_p, ResourceSet resourceSet_p, boolean readOnly_p) {
super(uri_p, resourceSet_p, readOnly_p);
}
/**
* @see org.eclipse.emf.diffmerge.gmf.GMFScope#getCrossReferencesInScope(org.eclipse.emf.ecore.EObject)
*/
@Override
protected Collection<EReference> getCrossReferencesInScope(EObject element_p) {
Collection<EReference> result = super.getCrossReferencesInScope(element_p);
if (element_p instanceof DSemanticDecorator) {
// From Viewpoint to semantic
result.add(ViewpointPackage.eINSTANCE.getDSemanticDecorator_Target());
} else if (element_p instanceof DAnalysis) {
// From Viewpoint analysis to referenced AIRD fragments
result.add(ViewpointPackage.eINSTANCE.getDAnalysis_ReferencedAnalysis());
// From Viewpoint analysis to semantic models
result.add(ViewpointPackage.eINSTANCE.getDAnalysis_Models());
}
return result;
}
/**
* Return whether the given element can be included in a Sirius resource
* @param element_p a non-null element
*/
protected boolean isSiriusElement(EObject element_p) {
EPackage pack = element_p.eClass().getEPackage();
return SIRIUS_PACKAGES.contains(pack) || element_p instanceof DRepresentation;
}
/**
* Return whether the given resource is a Sirius model or model fragment
* @param resource_p a non-null resource
*/
protected boolean isSiriusResource(Resource resource_p) {
boolean result = false;
if (resource_p.getURI() != null) {
String extension = resource_p.getURI().fileExtension();
if (extension != null) {
extension = extension.toLowerCase();
result = SIRIUS_FILE_EXTENSIONS.contains(extension);
}
}
return result;
}
/**
* @see org.eclipse.emf.diffmerge.impl.scopes.FragmentedModelScope#isSuitableFor(org.eclipse.emf.ecore.resource.Resource, org.eclipse.emf.ecore.EObject)
*/
@Override
protected boolean isSuitableFor(Resource resource_p, EObject root_p) {
boolean result = isSiriusResource(resource_p) == isSiriusElement(root_p);
return result;
}
}