/** * <copyright> * * Copyright (c) 2011 Christian Kerl * 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: * Christian Kerl - Initial API and implementation * * </copyright> */ package org.eclipselab.emf.ecore.protobuf.util; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; import org.eclipse.emf.common.notify.impl.AdapterImpl; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EClassifier; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.util.EcoreUtil; public class EPackageDependencyAnalyzer extends AdapterImpl { public static EPackageDependencyAnalyzer get(EPackage ePackage) { EPackageDependencyAnalyzer analyzer = (EPackageDependencyAnalyzer)EcoreUtil.getExistingAdapter(ePackage, EPackageDependencyAnalyzer.class); if(analyzer == null) { analyzer = new EPackageDependencyAnalyzer(); ePackage.eAdapters().add(analyzer); } return analyzer; } private List<EPackage> dependencies; private EPackageDependencyAnalyzer() { } @Override public boolean isAdapterForType(Object type) { return EPackageDependencyAnalyzer.class.equals(type); } public EPackage getEPackage() { return (EPackage)getTarget(); } public List<EPackage> getDependencies() { if(dependencies == null) { dependencies = new ArrayList<EPackage>(getReferencedRootPackages(getEPackage())); } return dependencies; } private static Set<EPackage> getReferencedRootPackages(EPackage ePackage) { Set<EPackage> ePackages = new HashSet<EPackage>(); List<EClassifier> eClassifiers = EcoreUtil2.getAllClassifiersFromPackageHierarchy(ePackage); for(EClassifier eClassifier : eClassifiers) { if(eClassifier instanceof EClass) { EClass eClass = (EClass)eClassifier; for(EClass eSuperClass : eClass.getEAllSuperTypes()) { ePackages.add(EcoreUtil2.getRootPackage(eSuperClass)); } for(EReference eReference : eClass.getEAllReferences()) { ePackages.add(EcoreUtil2.getRootPackage(eReference.getEReferenceType())); } } } ePackages.remove(ePackage); return ePackages; } }