/******************************************************************************* * Copyright (c) 2007, 2008 Borland Software Corporation and others. * * 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: * Borland Software Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.m2m.internal.qvt.oml.emf.util.mmregistry; import java.util.LinkedHashSet; import java.util.Set; 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.EReference; import org.eclipse.emf.ecore.EcorePackage; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.ecore.util.EcoreUtil; public class DependencyHelper { private DependencyHelper(EPackage pack) { myPackage = pack; myReferencedPackages = new LinkedHashSet<EPackage>(); myResourceSet = new ResourceSetImpl(); } public static EPackage[] getReferencedPackages(EPackage pack) { DependencyHelper helper = new DependencyHelper(pack); helper.findReferencedPackages(pack); return (EPackage[])helper.myReferencedPackages.toArray(new EPackage[helper.myReferencedPackages.size()]); } private void findReferencedPackages(EPackage pack) { for(EClassifier classifier : pack.getEClassifiers()) { findReferencedPackages(classifier); } for(EPackage childPack : pack.getESubpackages()) { findReferencedPackages(childPack); } } private void findReferencedPackages(EClassifier classifier) { if (classifier instanceof EClass == false) { return; } EClass cls = (EClass)classifier; for(EClass superClass : cls.getEAllSuperTypes()) { referenced(superClass); } for(EReference ref : cls.getEAllReferences()) { EClassifier type = ref.getEType(); if(type != null) { referenced(type); } } } private void referenced(EClassifier classifier) { classifier = (EClassifier)resolveProxy(classifier); EObject rootContainer = EcoreUtil.getRootContainer(classifier); if(rootContainer instanceof EPackage && rootContainer != myPackage && rootContainer != EcorePackage.eINSTANCE) { myReferencedPackages.add((EPackage)rootContainer); } } public EObject resolveProxy(EObject obj) { if (!obj.eIsProxy()) { return obj; } else { return EcoreUtil.resolve(obj, myResourceSet); } } private final EPackage myPackage; private final Set<EPackage> myReferencedPackages; private final ResourceSet myResourceSet; }