blob: b5321a4d67c37b932d610c273b5647165c611b1f [file] [log] [blame]
/**
********************************************************************************
* Copyright (c) 2017-2020 Robert Bosch GmbH.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Robert Bosch GmbH - initial API and implementation
********************************************************************************
*/
package org.eclipse.app4mc.emf.metamodelviewer.utils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
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.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
public class SubClassesListBuilder {
private final EClass eClass;
public SubClassesListBuilder(final EClass eClass) {
this.eClass = eClass;
}
private boolean isCalculated;
final Set<EClass> allSubClasses = new HashSet<>();
public Set<EClass> getAllSubClasses() {
if (!this.isCalculated) {
final List<EClass> eAllSuperTypes = getSubClasses(this.eClass);
this.allSubClasses.addAll(eAllSuperTypes);
for (final EClass subClass : eAllSuperTypes) {
final SubClassesListBuilder classList = new SubClassesListBuilder(subClass);
this.allSubClasses.addAll(classList.getAllSubClasses());
}
}
return this.allSubClasses;
}
private List<EClass> getSubClasses(final EClass selectedObjClass) {
final List<EClass> subClassList = new ArrayList<>();
final ResourceSet resourceSet = selectedObjClass.eResource().getResourceSet();
if (resourceSet != null) {
// With this approach check is made to find the Sub-Classes for the supplied EClass in all the packages
// belonging to the resourceset
final EList<Resource> resources = resourceSet.getResources();
for (final Resource resource : resources) {
final EList<EObject> contents = resource.getContents();
if (contents.size() > 0) {
// final EObject eObject = contents.get(0);
for (EObject eObj : contents) {
if (eObj instanceof EPackage) {
subClassList.addAll(getSubClasses(selectedObjClass, (EPackage) eObj));
}
}
}
}
} else {
final EPackage ePackage = selectedObjClass.getEPackage();
if (ePackage != null) {
EObject rootEPackage = org.eclipse.emf.ecore.util.EcoreUtil.getRootContainer(selectedObjClass);
if (rootEPackage instanceof EPackage) {
return getSubClasses(selectedObjClass, (EPackage) rootEPackage);
}
}
return getSubClasses(selectedObjClass, ePackage);
}
return subClassList;
}
private List<EClass> getSubClasses(final EClass selectedObjClass, final EPackage ePackage) {
final List<EClass> subClassList = new ArrayList<>();
EList<EPackage> eSubpackages = ePackage.getESubpackages();
for (EPackage eSubPackage : eSubpackages) {
subClassList.addAll(getSubClasses(selectedObjClass, eSubPackage));
}
final EList<EClassifier> eClassifiers = ePackage.getEClassifiers();
for (final EClassifier eClassifier : eClassifiers) {
if (eClassifier instanceof EClass) {
if (selectedObjClass != eClassifier && selectedObjClass.isSuperTypeOf((EClass) eClassifier)) {
subClassList.add((EClass) eClassifier);
}
}
}
return subClassList;
}
}