blob: 06405b2d13344cd94cb3ab041d5e9d6152e89a8f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2010, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Bros (Mia-Software) - Bug 366367 - To be able to change the "CanBePresentedInTheTable" query
* Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
* Laurent Pichierri (Soft-Maint) - Bug 371204 - Compatibility with Helios
* Gregoire Dupe (Mia-Software) - Bug 371367 - Hierarchical FacetSets
* Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
* Gregoire Dupe (Mia-Software) - Bug 387470 - [EFacet][Custom] Editors
*******************************************************************************/
package org.eclipse.modisco.facet.util.emf.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EAttribute;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.ENamedElement;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
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.util.FeatureMap;
import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
import org.eclipse.emf.edit.provider.IItemLabelProvider;
import org.eclipse.modisco.facet.util.core.Logger;
import org.eclipse.modisco.facet.util.core.internal.exported.StringUtils;
import org.eclipse.modisco.facet.util.emf.core.internal.Activator;
/**
* Utility class for models.
* @since 0.2
*/
public final class ModelUtils {
/**
* Meta-model qualified name separator
*/
private static final String MM_QNAME_SEPARATOR = "::"; //$NON-NLS-1$
/**
* Utility classes don't need to (and shouldn't) be instantiated.
*/
private ModelUtils() {
// prevents instantiation
}
/**
* Computes a list of {@link EObject}s from the same {@link ResourceSet} as
* <code>source</code> that can be assigned to the given feature.
*/
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.computeAssignableElements(EStructuralFeature, EObject)
public static List<EObject> computeAssignableElements(final EStructuralFeature feature,
final EObject source) {
EClassifier eType = feature.getEType();
// build a list of EObjects assignable to the EReference
List<EObject> list = new ArrayList<EObject>();
Resource eResource = source.eResource();
ResourceSet resourceSet = eResource.getResourceSet();
TreeIterator<Notifier> allContents = resourceSet.getAllContents();
while (allContents.hasNext()) {
Notifier notifier = allContents.next();
if (notifier instanceof EObject) {
EObject eObject = (EObject) notifier;
if (eType.isInstance(eObject)) {
list.add(eObject);
}
}
}
return list;
}
public static boolean isBooleanDataType(final EClassifier classifier) {
if (classifier instanceof EDataType) {
EDataType dataType = (EDataType) classifier;
Class<?> instanceClass = dataType.getInstanceClass();
return instanceClass == Boolean.class || instanceClass == boolean.class;
}
return false;
}
/**
* Find all subclasses of the given metaclass in the package registry
*
* @param context
* the metaclass whose subclasses must be found
* @return all the subclasses
*/
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.allSubClasses(final EClass context)
public static List<EClass> allSubClasses(final EClass context) {
List<EClass> result = new ArrayList<EClass>();
// Set<Resource> resources = new HashSet<Resource>();
Collection<String> uris = new ArrayList<String>(EPackage.Registry.INSTANCE.keySet());
for (String ePackageURI : uris) {
try {
EPackage ePackage = EPackage.Registry.INSTANCE.getEPackage(ePackageURI);
EList<EClassifier> eClassifiers = ePackage.getEClassifiers();
for (EClassifier eClassifier : eClassifiers) {
if (eClassifier instanceof EClass) {
EClass eClass = (EClass) eClassifier;
if (isSuperTypeOf(context, eClass)) {
result.add(eClass);
}
}
}
} catch (Exception e) {
Logger.logError(e, Activator.getDefault());
}
}
return result;
}
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.isSuperTypeOf(final EClass self, final EClass typeDeclaration)
public static boolean isSuperTypeOf(final EClass self, final EClass typeDeclaration) {
return typeDeclaration.getEAllSuperTypes().contains(self);
}
/** @return the qualified name of the given metaclass */
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.getMetaclassQualifiedName(final EClassifier eClass)
public static String getMetaclassQualifiedName(final EClassifier eClass) {
final ArrayList<String> qualifiedNameParts = new ArrayList<String>();
final StringBuilder builder = new StringBuilder();
EPackage ePackage = eClass.getEPackage();
while (ePackage != null) {
qualifiedNameParts.add(ePackage.getName());
ePackage = ePackage.getESuperPackage();
}
for (int i = qualifiedNameParts.size() - 1; i >= 0; i--) {
builder.append(qualifiedNameParts.get(i) + "."); //$NON-NLS-1$
}
builder.append(eClass.getName());
return builder.toString();
}
/**
* Returns a name for the given model element from the EMF global registry,
* or use a default name taken from a String attribute.
*
* @return a name for the given element
*/
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.getName(EObject)
public static String getName(final EObject eObject) {
IItemLabelProvider itemLabelProvider = (IItemLabelProvider) new ComposedAdapterFactory(
ComposedAdapterFactory.Descriptor.Registry.INSTANCE).adapt(eObject, IItemLabelProvider.class);
if (itemLabelProvider != null) {
return itemLabelProvider.getText(eObject);
}
return ModelUtils.getDefaultName(eObject);
}
/**
* @return a default name based on a string feature of the given
* {@link EObject}
*/
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.getDefaultName(EObject)
public static String getDefaultName(final EObject eObject) {
// find a feature that can be used as a name
final EStructuralFeature feature = ModelUtils.getLabelFeature(eObject.eClass());
if (feature != null) {
final Object value = eObject.eGet(feature);
if (value != null) {
return StringUtils.truncateBeforeNewline(value.toString());
}
}
return ""; //$NON-NLS-1$
}
//Copied from ReflectiveItemProvider class
//Copied from org.eclipse.modisco.facet.infra.common.core.internal.utils.ModelUtils.getLabelFeature(EClass)
private static EStructuralFeature getLabelFeature(final EClass eClass) {
EAttribute result = null;
for (final EAttribute eAttribute : eClass.getEAllAttributes()) {
if (!eAttribute.isMany()
&& eAttribute.getEType().getInstanceClass() != FeatureMap.Entry.class) {
if ("name".equalsIgnoreCase(eAttribute.getName())) { //$NON-NLS-1$
result = eAttribute;
break;
} else if (result == null) {
result = eAttribute;
} else if (eAttribute.getEAttributeType().getInstanceClass() == String.class
&& result.getEAttributeType().getInstanceClass() != String.class) {
result = eAttribute;
}
}
}
return result;
}
/**
* @author Gregoire Dupe (Mia-Software)
* @param namedElement
* @return
*/
public static String getQualifiedName(final ENamedElement namedElement) {
String parentQName = ""; //$NON-NLS-1$
if (namedElement.eContainer() instanceof ENamedElement) {
ENamedElement parent = (ENamedElement) namedElement.eContainer();
parentQName = getQualifiedName(parent) + ModelUtils.MM_QNAME_SEPARATOR;
}
return parentQName + namedElement.getName();
}
/**
* @since 0.3
*/
public static ResourceSet getOrCreateResourceSet(final EObject eObject) {
ResourceSet resourceSet = null;
if (eObject.eResource() == null) {
resourceSet = new ResourceSetImpl();
} else {
resourceSet = eObject.eResource().getResourceSet();
}
return resourceSet;
}
/**
* @since 0.3
*/
public static IProject getProject(final EObject eObject) {
IProject result = null;
final Resource resource = eObject.eResource();
final URI uri = resource.getURI();
if (uri.isPlatformResource()) {
final String projectName = uri.segment(1);
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
result = workspace.getRoot()
.getProject(projectName);
}
return result;
}
}