| /** |
| ******************************************************************************** |
| * 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<EClass>(); |
| |
| 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> allSubClasses = new ArrayList<EClass>(); |
| |
| 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) { |
| allSubClasses.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 allSubClasses; |
| |
| } |
| |
| private List<EClass> getSubClasses(final EClass selectedObjClass, final EPackage ePackage) { |
| |
| final List<EClass> allSubClasses = new ArrayList<EClass>(); |
| |
| EList<EPackage> eSubpackages = ePackage.getESubpackages(); |
| |
| for (EPackage eSubPackage : eSubpackages) { |
| allSubClasses.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)) { |
| allSubClasses.add((EClass) eClassifier); |
| } |
| |
| } |
| } |
| return allSubClasses; |
| } |
| |
| } |