blob: 91a6cea69cb82c0bd54af9ec33df96e93a8f3c73 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 Obeo
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.ecoretools.design.internal;
import java.util.List;
import java.util.Map;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.XMLResource;
public class GenModelMissingPackageHandler {
public static void setupPackageHandler(final ResourceSet set) {
// If we're in the reflective editor, set up an option to handle missing
// packages.
//
final EPackage genModelEPackage = set.getPackageRegistry().getEPackage("http://www.eclipse.org/emf/2002/GenModel");
if (genModelEPackage != null) {
set.getLoadOptions().put(XMLResource.OPTION_MISSING_PACKAGE_HANDLER, new XMLResource.MissingPackageHandler() {
protected EClass genModelEClass;
protected EStructuralFeature genPackagesFeature;
protected EClass genPackageEClass;
protected EStructuralFeature ecorePackageFeature;
protected Map<String, URI> ePackageNsURIToGenModelLocationMap;
public EPackage getPackage(String nsURI) {
// Initialize the metadata for accessing the GenModel
// reflective the first time.
//
if (genModelEClass == null) {
genModelEClass = (EClass) genModelEPackage.getEClassifier("GenModel");
genPackagesFeature = genModelEClass.getEStructuralFeature("genPackages");
genPackageEClass = (EClass) genModelEPackage.getEClassifier("GenPackage");
ecorePackageFeature = genPackageEClass.getEStructuralFeature("ecorePackage");
}
// Initialize the map from registered package namespaces to
// their GenModel locations the first time.
//
if (ePackageNsURIToGenModelLocationMap == null) {
ePackageNsURIToGenModelLocationMap = EcorePlugin.getEPackageNsURIToGenModelLocationMap(true);
}
// Look up the namespace URI in the map.
//
EPackage ePackage = null;
URI uri = ePackageNsURIToGenModelLocationMap.get(nsURI);
if (uri != null) {
// If we find it, demand load the model.
//
Resource resource = set.getResource(uri, true);
// Locate the GenModel and fetech it's genPackages.
//
EObject genModel = (EObject) EcoreUtil.getObjectByType(resource.getContents(), genModelEClass);
@SuppressWarnings("unchecked")
List<EObject> genPackages = (List<EObject>) genModel.eGet(genPackagesFeature);
for (EObject genPackage : genPackages) {
// Check if that package's Ecore Package has them
// matching namespace URI.
//
EPackage dynamicEPackage = (EPackage) genPackage.eGet(ecorePackageFeature);
if (nsURI.equals(dynamicEPackage.getNsURI())) {
// If so, that's the package we want to return,
// and we add it to the registry so it's easy to
// find from now on.
//
ePackage = dynamicEPackage;
set.getPackageRegistry().put(nsURI, ePackage);
break;
}
}
}
return ePackage;
}
});
}
}
}