blob: 13251e7c687adde9781e9ff0156d21022e2f757f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2017 Mia-Software, and Soft-Maint.
* 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:
* Nicolas Bros (Mia-Software) - Bug 361612 - New core for new version of the Facet metamodel
* Nicolas Bros (Mia-Software) - Bug 361817 - [Restructuring] Dynamic load to the facet catalog
* Gregoire Dupe (Mia-Software) - Bug 369987 - [Restructuring][Table] Switch to the new customization and facet framework
* Nicolas Bros (Mia-Software) - Bug 371367 - Hierarchical FacetSets
* Gregoire Dupe (Mia-Software) - Bug 371367 - Hierarchical FacetSets
* Gregoire Dupe (Mia-Software) - Bug 364325 - [Restructuring] The user must be able to navigate into a model using the Facet.
* Gregoire Dupe (Mia-Software) - Bug 373510 - EditingDomain, ResourceSet, Catalogs, etc. have to be properly managed between editors and views
* Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
* Gregoire Dupe (Mia-Software) - Bug 374903 - [Table] ITableWidget.setLoadedFacetSets
* Gregoire Dupe (Mia-Software) - Bug 375087 - [Table] ITableWidget.addColumn(List<ETypedElement>, List<FacetSet>)
* Olivier Remaud (Soft-Maint) - Bug 361794 - [Restructuring] EMF Facet customization meta-model
* Gregoire Dupe (Mia-Software) - Bug 364325 - [Restructuring] The user must be able to navigate into a model using the Facet.
* Gregoire Dupe (Mia-Software) - Bug 361794 - [Restructuring] EMF Facet customization meta-model
* Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
* Gregoire Dupe (Mia-Software) - Bug 372626 - Aggregates
* Nicolas Bros (Mia-Software) - Bug 372626 - Aggregates
* Gregoire Dupe (Mia-Software) - Bug 376576 - [EFacet] Change the multiplicity of Facet::extendedFacet
* Vincent Lorenzo (CEA-LIST) - Bug 357621 - Improve the label displayed for Customization and Facets
* Grégoire Dupé (Mia-Software) - Bug 387470 - [EFacet][Custom] Editors
* Alban Ménager (Soft-Maint) - Bug 387470 - [EFacet][Custom] Editors
* Gregoire Dupe (Mia-Software) - Bug 377870 - [EFacet] ETypedElementDialog doesn't show all available ETypedElement (library example problem?)
* Grégoire Dupé (Mia-Software) - Bug 387470 - [EFacet][Custom] Editors
* Grégoire Dupé (Mia-Software) - Bug 391442 - Select ETypedElement Dialog doesn't used the subpackages (subEFacetSet)
* Gregoire Dupe (Mia-Software) - Bug 443682 - Access to the super facet
* Jonathan Pepin (Soft-Maint) - Bug 463898 - Create FacetReference not derived, without query and with opposite mechanism
* Grégoire Dupé (Mia-Software) - Bug 472146 - Fail to open 'Navigation View'
* Grégoire Dupé (Mia-Software) - Bug 472151 - The navigation view fails if an EPackage load fails.
* Grégoire Dupé (Mia-Software) - Bug 474289 - ConcurrentModificationException in FacetUtils.getETypedElements (301)
* Jonathan Pepin (Soft-Maint) - Bug 512179 - Table widget refactoring.
* Jonathan Pepin (Soft-Maint) - Bug 514489 - Order problem on header columns
*******************************************************************************/
package org.eclipse.modisco.facet.efacet.core;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EClassifier;
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.ETypedElement;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.modisco.facet.efacet.core.exception.FacetManagerException;
import org.eclipse.modisco.facet.efacet.core.internal.Activator;
import org.eclipse.modisco.facet.efacet.core.internal.exported.IResolverManager;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.DerivedTypedElement;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.Facet;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.FacetOperation;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.FacetSet;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.runtime.ETypedElementEObjectListResult;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.runtime.ETypedElementEObjectResult;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.runtime.ETypedElementPrimitiveTypeListResult;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.runtime.ETypedElementPrimitiveTypeResult;
import org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.runtime.ETypedElementResult;
import org.eclipse.modisco.facet.util.core.Logger;
import org.eclipse.modisco.facet.util.emf.core.ModelUtils;
import org.eclipse.modisco.facet.util.emf.core.internal.EMFUtils;
/**
* @since 0.2
*/
public final class FacetUtils {
private FacetUtils() {
// static methods only
}
/**
* Find a Facet in a FacetSet
*
* @param facetSet
* the FacetSet
* @param facetName
* the name of the Facet to look for
* @return the Facet with the given name in the given FacetSet
*/
public static Facet getFacet(final FacetSet facetSet, final String facetName) {
Facet result = null;
final List<Facet> facets = FacetUtils.getFacets(facetSet);
for (Facet facet : facets) {
if (facetName.equals(facet.getName())) {
result = facet;
break;
}
}
return result;
}
public static <T extends ETypedElement> T getETypedElement(
final Facet facet, final String name, final Class<T> classs) {
T result = null;
final List<ETypedElement> eTypedElements = new ArrayList<ETypedElement>();
eTypedElements.addAll(facet.getFacetElements());
eTypedElements.addAll(facet.getFacetOperations());
for (ETypedElement eTypedElement : eTypedElements) {
if (name.equals(eTypedElement.getName())
&& classs.isInstance(eTypedElement)) {
@SuppressWarnings("unchecked")
// @SuppressWarnings("unchecked") This assignment is check by
// the call 'classs.isInstance(structuralFeature)'
final T castResult = (T) eTypedElement;
result = castResult;
break;
}
}
return result;
}
public static Object getResultValue(final ETypedElementResult eTEresult) {
Object result = null;
if (eTEresult instanceof ETypedElementEObjectListResult<?>) {
final ETypedElementEObjectListResult<?> eObjectList = (ETypedElementEObjectListResult<?>) eTEresult;
result = eObjectList.getResultList();
} else if (eTEresult instanceof ETypedElementEObjectResult<?>) {
final ETypedElementEObjectResult<?> eObjectRef = (ETypedElementEObjectResult<?>) eTEresult;
result = eObjectRef.getResult();
} else if (eTEresult instanceof ETypedElementPrimitiveTypeListResult<?>) {
final ETypedElementPrimitiveTypeListResult<?> objectList = (ETypedElementPrimitiveTypeListResult<?>) eTEresult;
result = objectList.getDerivedTypedElement();
} else if (eTEresult instanceof ETypedElementPrimitiveTypeResult<?>) {
final ETypedElementPrimitiveTypeResult<?> objectRef = (ETypedElementPrimitiveTypeResult<?>) eTEresult;
result = objectRef.getResult();
} else {
throw new IllegalStateException(
"Unknown ETypedElementResult type: " + eTEresult.getClass()); //$NON-NLS-1$
}
return result;
}
/**
* Find a FacetSet with the given name among the given list of FacetSets. If several FacetSets have the same name,
* then return the first one.
*
* @param facetSets
* where to look for
* @param name
* the name of the FacetSet to find
* @return the FacetSet, or <code>null</code> if not found in the given list
*/
public static FacetSet getFacetSet(final Collection<FacetSet> facetSets, final String name) {
FacetSet result = null;
for (FacetSet facetSet : facetSets) {
if (name.equals(facetSet.getName())) {
result = facetSet;
}
}
return result;
}
/**
* Find all FacetSets with the given name among the given list of FacetSets.
*
* @param facetSets
* where to look for
* @param name
* the name of the FacetSets to find
* @return the FacetSets with the given name
*/
public static List<FacetSet> getFacetSets(
final Collection<FacetSet> facetSets, final String name) {
final List<FacetSet> result = new ArrayList<FacetSet>();
for (FacetSet facetSet : facetSets) {
if (name.equals(facetSet.getName())) {
result.add(facetSet);
}
}
return result;
}
/**
*
* @param facetSet
* a facetSet
* @return a set with all the EPackage extended by the facetSet and its
* owned facetSet
* @since 0.2
*/
public static Set<EPackage> getAllExtendedEPackage(final FacetSet facetSet) {
final Set<EPackage> extendedEPackages = new HashSet<EPackage>();
final EPackage res1 = getExtendedEPackage(facetSet);
if (res1 != null) {
extendedEPackages.add(res1);
}
for (FacetSet current : facetSet.getFacetSets()) {
extendedEPackages.addAll(getAllExtendedEPackage(current));
}
final EList<EPackage> pack = facetSet.getESubpackages();
for (EPackage current : pack) {
if (current instanceof FacetSet) {
extendedEPackages
.addAll(getAllExtendedEPackage((FacetSet) current));
}
}
return extendedEPackages;
}
/**
* Find all the FacetSets with the given path among the given list of root
* FacetSets. For example: <code>getFacetSetsByPath("a", "b", "c")</code>
* returns a FacetSet named "c", contained in a FacetSet named "b",
* contained in a registered FacetSet named "a".
*
* @param path
* a list of FacetSet names, starting from the root registered
* FacetSets, and leading to the wanted FacetSet(s)
* @return the FacetSets that have the given path
*/
public static List<FacetSet> getFacetSetsByPath(
final Collection<FacetSet> rootFacetSets, final String... path) {
if (path.length == 0) {
throw new IllegalArgumentException("The given path cannot be empty"); //$NON-NLS-1$
}
List<FacetSet> facetSets = new ArrayList<FacetSet>(rootFacetSets);
for (int i = 0; i < path.length; i++) {
if (i > 0) {
facetSets = getSubFacetSets(facetSets);
}
final String name = path[i];
facetSets = getFacetSets(facetSets, name);
if (facetSets.isEmpty()) {
break;
}
}
return facetSets;
}
private static List<FacetSet> getSubFacetSets(
final Collection<FacetSet> parents) {
final List<FacetSet> subFacetSets = new ArrayList<FacetSet>();
for (FacetSet facetSet : parents) {
final EList<EPackage> eSubpackages = facetSet.getESubpackages();
for (EPackage ePackage : eSubpackages) {
if (ePackage instanceof FacetSet) {
final FacetSet subFacetSet = (FacetSet) ePackage;
subFacetSets.add(subFacetSet);
}
}
}
return subFacetSets;
}
/**
* Find a Facet with the given name among the given list of Facets.
*
* @param facets
* where to look
* @param name
* the name of the Facet that is being looked for
* @return the first {@link Facet} with this name, or <code>null</code> if
* none
*/
public static Facet getFacet(final Collection<Facet> facets,
final String name) {
Facet result = null;
for (Facet facet : facets) {
if (name.equals(facet.getName())) {
result = facet;
}
}
return result;
}
public static FacetSet getRootFacetSet(final Facet facet) {
FacetSet result = (FacetSet) facet.eContainer();
while (result != null && result.eContainer() instanceof FacetSet) {
result = (FacetSet) result.eContainer();
}
return result;
}
public static FacetSet getRootFacetSet(final FacetSet facetSet) {
FacetSet result = facetSet;
while (result != null && result.eContainer() instanceof FacetSet) {
result = (FacetSet) result.eContainer();
}
return result;
}
/**
* This methods returns all the known (registered) eTypedElements.
*
* @param resourceSet
* the eTypedElement search will be done in/using this resourceSet
* @return all the known (registered) eTypedElements
*/
public static Set<? extends ETypedElement> getETypedElements(
final ResourceSet resourceSet) {
final Set<ETypedElement> result = new HashSet<ETypedElement>();
final Collection<Object> ePackages = EPackage.Registry.INSTANCE
.values();
/*
* gdupe> Creating a copy of the ePackages list to avoid
* ConcurrentModificationException. cf.
* https://bugs.eclipse.org/bugs/show_bug.cgi?id=474289
*/
final Collection<Object> localEPackages = new ArrayList<Object>(ePackages);
for (Object object : localEPackages) {
EPackage ePackage = null;
try {
if (object instanceof EPackage) {
ePackage = (EPackage) object;
} else if (object instanceof EPackage.Descriptor) {
final EPackage.Descriptor descriptor = (EPackage.Descriptor) object;
ePackage = descriptor.getEPackage();
}
if (ePackage != null) {
result.addAll(getETypedElements(ePackage));
}
} catch (Exception e) {
String nsURI;
if (ePackage == null) {
nsURI = "<unknown ePacakge>"; //$NON-NLS-1$
} else {
nsURI = ePackage.getNsURI();
}
final String message = String.format("Failed to acces to %s.", //$NON-NLS-1$
nsURI);
Logger.logError(e, message , Activator.getDefault());
}
}
result.addAll(getFacetETypedElements(resourceSet));
return result;
}
/**
* @since 0.3
*/
public static Set<? extends ETypedElement> getFacetETypedElements(
final ResourceSet resourceSet) {
final Set<ETypedElement> result = new HashSet<ETypedElement>();
final Collection<FacetSet> facetSets = IFacetSetCatalogManagerFactory.DEFAULT
.getOrCreateFacetSetCatalogManager(resourceSet)
.getRegisteredFacetSets();
for (FacetSet facetSet : facetSets) {
result.addAll(getETypedElements(facetSet));
}
return result;
}
public static List<ETypedElement> getETypedElements(final EPackage ePackage) {
final List<ETypedElement> result = new LinkedList<ETypedElement>();
for (EClassifier eClassifier : ePackage.getEClassifiers()) {
result.addAll(getETypedElements(eClassifier));
}
for (EPackage subPackage : ePackage.getESubpackages()) {
result.addAll(getETypedElements(subPackage));
}
return result;
}
/**
* @since 0.3
*/
public static List<ETypedElement> getETypedElements(
final EClassifier eClassifier) {
final List<ETypedElement> result = new ArrayList<ETypedElement>();
if (eClassifier instanceof Facet) {
final Facet facet = (Facet) eClassifier;
result.addAll(facet.getFacetElements());
result.addAll(facet.getFacetOperations());
} else if (eClassifier instanceof EClass) {
final EClass eClass = (EClass) eClassifier;
result.addAll(eClass.getEAllStructuralFeatures());
result.addAll(eClass.getEAllOperations());
}
return result;
}
public static List<Facet> getFacets(final FacetSet facetSet) {
final List<Facet> result = new LinkedList<Facet>();
for (EClassifier eClassifier : facetSet.getEClassifiers()) {
if (eClassifier instanceof Facet) {
final Facet facet = (Facet) eClassifier;
result.add(facet);
}
}
return result;
}
public static FacetSet getFacetSet(final Facet facet) {
FacetSet result = null;
if (facet.getEPackage() instanceof FacetSet) {
result = (FacetSet) facet.getEPackage();
}
return result;
}
// Moved from
// org.eclipse.modisco.facet.efacet.metamodel.v0_2_0.efacet.impl.FacetSetImpl
public static EPackage getExtendedEPackage(final FacetSet facetSet) {
final List<Facet> facets = FacetUtils.getFacets(facetSet);
EPackage result = null;
for (Facet facet : facets) {
final EClass extendedMetaclass = facet.getExtendedMetaclass();
if (extendedMetaclass != null) {
final EPackage ePackage = extendedMetaclass.getEPackage();
if (ePackage != null) {
if (result != null && !ePackage.equals(result)) {
throw new IllegalStateException(
"The Facets in a FacetSet must all extend EClasses from the same EPackage"); //$NON-NLS-1$
}
result = ePackage;
}
}
}
return result;
}
// Copied (and refactored) from
// org.eclipse.modisco.facet.efacet.core.internal.FacetManager
public static <T extends ETypedElement> Set<T> getETypedElements(
final EObject eObject, final Class<T> classs,
final IFacetManager facetManager) throws FacetManagerException {
final Set<T> result = new HashSet<T>();
for (FacetSet facetSet : facetManager.getManagedFacetSets()) {
result.addAll(getETypedElements(eObject, facetSet, classs,
facetManager));
}
return result;
}
// Copied (and refactored) from
// org.eclipse.modisco.facet.efacet.core.internal.FacetManager
private static <T extends ETypedElement> Set<T> getETypedElements(
final EObject eObject, final FacetSet facetSet,
final Class<T> classs, final IFacetManager manager)
throws FacetManagerException {
final Set<T> result = new HashSet<T>();
for (EClassifier eClassifier : facetSet.getEClassifiers()) {
if (eClassifier instanceof Facet) {
final Facet facet = (Facet) eClassifier;
if (manager.isConforming(eObject, facet)) {
result.addAll(getETypedElement(classs, facet));
}
}
}
// hierarchical FacetSets
for (EPackage ePackage : facetSet.getESubpackages()) {
if (ePackage instanceof FacetSet) {
final FacetSet subFacetSet = (FacetSet) ePackage;
result.addAll(getETypedElements(eObject, subFacetSet, classs,
manager));
}
}
// aggregates
for (FacetSet subFacetSet : facetSet.getFacetSets()) {
result.addAll(getETypedElements(eObject, subFacetSet, classs,
manager));
}
return result;
}
private static <T> Set<T> getETypedElement(final Class<T> classs,
final Facet facet) {
final Set<T> result = new HashSet<T>();
for (ETypedElement eTypedElement : getAllETypedElements(facet)) {
if (classs.isInstance(eTypedElement)) {
@SuppressWarnings("unchecked")
// @SuppressWarnings("unchecked") This type has been
// checked using isInstance
final T typedSF = (T) eTypedElement;
final T resolvedTE = IResolverManager.DEFAULT
.resolve(typedSF, classs);
if (resolvedTE == null) {
result.add(typedSF);
} else {
result.add(resolvedTE);
}
}
}
return result;
}
// Copied (and refactored) from
// org.eclipse.modisco.facet.efacet.core.internal.FacetManager
private static List<ETypedElement> getAllETypedElements(
final Facet facet) {
final List<ETypedElement> structFeatures = new LinkedList<ETypedElement>();
structFeatures.addAll(facet.getFacetElements());
structFeatures.addAll(facet.getFacetOperations());
for (Facet extFacet : facet.getExtendedFacets()) {
structFeatures.addAll(getAllETypedElements(extFacet));
}
return structFeatures;
}
/**
* @param eTypedElement
* @return
* @since 0.2
*/
public static FacetSet getFacetSet(final ETypedElement eTypedElement) {
FacetSet result = null;
if (eTypedElement.eContainer() instanceof Facet) {
final Facet facet = (Facet) eTypedElement.eContainer();
if (facet.eContainer() instanceof FacetSet) {
result = (FacetSet) facet.eContainer();
}
}
return result;
}
/**
*
* @param facetOperation
* @return
* @since 0.2
*/
public static DerivedTypedElement getSignature(
final FacetOperation facetOperation) {
DerivedTypedElement current = facetOperation;
while (current.getOverride() != null) {
current = current.getOverride();
}
return current;
}
/**
*
* @param facet
* @return
* @since 0.2
*/
public static EClass getExtendedMetaclass(final Facet facet) {
EClass result = facet.getExtendedMetaclass();
if (result == null) {
final List<EClass> eClasses = new LinkedList<EClass>();
for (Facet extfacet : facet.getExtendedFacets()) {
eClasses.add(getExtendedMetaclass(extfacet));
}
result = EMFUtils.computeLeastCommonSupertype(eClasses);
}
return result;
}
/**
* Find the top level feature in the override chain
*
* @param feature
* @return The top level feature in the override chain or the feature
* parameter itself if no override
* @throws FacetManagerException
* @since 0.2
*
*/
// Copied from
// org.eclipse.modisco.facet.efacet.core.internal.FacetManagerContext
// * Contributors:
// * Olivier Remaud (Soft-Maint) - Bug 361794 - [Restructuring] EMF Facet
// customization meta-model
// * Gregoire Dupe (Mia-Software) - Bug 364325 - [Restructuring] The user
// must be able to navigate into a model using the Facet.
// * Gregoire Dupe (Mia-Software) - Bug 361794 - [Restructuring] EMF Facet
// customization meta-model
// * Gregoire Dupe (Mia-Software) - Bug 373078 - API Cleaning
@SuppressWarnings("unchecked")
// @SuppressWarnings("unchecked") cf. comment in the method body
public static <T extends DerivedTypedElement> T getTopOverrideFeature(
final T feature) throws FacetManagerException {
T signatureFeature = feature;
while (signatureFeature.getOverride() != null) {
if (feature.getClass().isInstance(signatureFeature.getOverride())) {
// @SuppressWarnings("unchecked") the if test check the
// assignment using the method 'isInstance'
signatureFeature = (T) signatureFeature.getOverride();
} else {
// signature feature type name
final String sfTypeName = signatureFeature.eClass().getName();
// signature feature name
final String sfName = ModelUtils
.getQualifiedName(signatureFeature);
final String ofName = signatureFeature.getOverride().eClass()
.getName(); // overridden feature type name
throw new FacetManagerException("The " + sfTypeName + " '" //$NON-NLS-1$ //$NON-NLS-2$
+ sfName + "' overides a " + ofName); //$NON-NLS-1$
}
}
return signatureFeature;
}
/**
* @since 0.3
*/
public static EClass findExtendedEClass(final Facet facet) {
EClass result = facet.getExtendedMetaclass();
if (result == null) {
for (Facet extFacet : facet.getExtendedFacets()) {
result = findExtendedEClass(extFacet);
if (result != null) {
break;
}
}
}
return result;
}
/**
* @since 0.3
*/
public static DerivedTypedElement getContainingDerivedTypedElement(
final EObject eObject) {
DerivedTypedElement dte = null;
if (eObject instanceof DerivedTypedElement) {
dte = (DerivedTypedElement) eObject;
} else if (eObject != null) {
dte = getContainingDerivedTypedElement(eObject.eContainer());
}
return dte;
}
/**
* Return the main facetSet.
*
* @param eObject
* the element in the model selected.
* @return the main facetSet.
* @since 0.3
*/
public static FacetSet getContainingFacetSet(final EObject eObject) {
FacetSet result = null;
if (eObject instanceof FacetSet) {
result = (FacetSet) eObject;
} else {
final EObject container = eObject.eContainer();
if (container != null) {
result = getContainingFacetSet(container);
}
}
return result;
}
/**
* Return all the operations of the model.
*
* @param parent
* the first FacetSet of the model.
* @return the list of operations.
* @since 0.3
*/
public static Map<String, FacetOperation> getAllOperationsByName(
final FacetSet parent) {
final Map<String, FacetOperation> operations = new HashMap<String, FacetOperation>();
for (final EClassifier facet : parent.getEClassifiers()) {
for (final FacetOperation operation : ((Facet) facet)
.getFacetOperations()) {
operations.put(operation.getName(), operation);
}
}
for (final EPackage element : parent.getESubpackages()) {
operations.putAll(getAllOperationsByName((FacetSet) element));
}
return operations;
}
/**
* Return all the facets of the model.
*
* @param parent
* the first FacetSet of the model.
* @return the list of facets.
* @since 0.3
*/
public static Map<String, Facet> getAllFacetsByName(final FacetSet parent) {
final Map<String, Facet> facets = new HashMap<String, Facet>();
for (final EClassifier facet : parent.getEClassifiers()) {
facets.put(facet.getName(), (Facet) facet);
}
for (final EPackage element : parent.getESubpackages()) {
facets.putAll(getAllFacetsByName((FacetSet) element));
}
return facets;
}
/**
* Return all the facets of the model.
*
* @param parent
* the first FacetSet of the model.
* @return the list of facets.
* @since 0.3
*/
public static Map<String, FacetSet> getAllFacetSetsByName(
final EPackage parent) {
final Map<String, FacetSet> facetSets = new HashMap<String, FacetSet>();
if (parent instanceof FacetSet) {
final FacetSet facetSet = (FacetSet) parent;
facetSets.put(parent.getName(), facetSet);
}
for (final EPackage element : parent.getESubpackages()) {
facetSets.putAll(getAllFacetSetsByName(element));
}
return facetSets;
}
/**
* @since 0.3
*/
public static List<Facet> getAllFacet(final FacetSet facetSet) {
final List<Facet> result = new ArrayList<Facet>();
for (EClassifier eClassifier : facetSet.getEClassifiers()) {
if (eClassifier instanceof Facet) {
final Facet facet = (Facet) eClassifier;
result.add(facet);
}
}
for (EPackage ePackage : facetSet.getESubpackages()) {
if (ePackage instanceof FacetSet) {
final FacetSet subFacetSet = (FacetSet) ePackage;
result.addAll(getAllFacet(subFacetSet));
}
}
return result;
}
/**
* @since 1.2
*/
public static Set<EStructuralFeature> getAllStructrualFeatures(
final EObject eObject, final IFacetManager facetMgr)
throws FacetManagerException {
final Set<EStructuralFeature> result = new LinkedHashSet<EStructuralFeature>();
result.addAll(eObject.eClass().getEAllStructuralFeatures());
final Set<EStructuralFeature> typedElements = FacetUtils
.getETypedElements(eObject, EStructuralFeature.class, facetMgr);
result.addAll(typedElements);
return result;
}
/**
* @since 1.0
*/
public static String toString(final DerivedTypedElement feature) {
final StringBuffer result = new StringBuffer();
result.append(feature.eResource().getURI());
result.append(" -> "); //$NON-NLS-1$
final EObject eContainer = feature.eContainer();
if (eContainer instanceof ENamedElement) {
final ENamedElement parent = (ENamedElement) eContainer;
result.append(parent.getName());
result.append('.');
}
result.append(feature.getName());
return result.toString();
}
}