package org.xpect.registry;
import java.lang.reflect.Field;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.plugin.EcorePlugin;
public class EPackageRegistrar {
protected static class EPackageDescriptorImpl implements EPackage.Descriptor {
private final IEPackageInfo info;
private EPackage pkg = null;
public EPackageDescriptorImpl(IEPackageInfo info) {
super();
this.info = info;
}
public EFactory getEFactory() {
if (pkg != null)
return pkg.getEFactoryInstance();
return null;
}
public EPackage getEPackage() {
if (pkg == null)
try {
Class<EPackage> clazz = info.getEPackage().load();
Field field = clazz.getField("eINSTANCE");
pkg = (EPackage) field.get(null);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (SecurityException e) {
throw new RuntimeException(e);
} catch (NoSuchFieldException e) {
throw new RuntimeException(e);
}
return pkg;
}
public IEPackageInfo getInfo() {
return info;
}
}
public static void register(IEPackageInfo info) {
EPackage.Registry.INSTANCE.put(info.getNamespaceURI(), new EPackageDescriptorImpl(info));
if (info.getGenmodel() != null)
EcorePlugin.getEPackageNsURIToGenModelLocationMap().put(info.getNamespaceURI(), URI.createURI(info.getGenmodel()));
}
}