简体   繁体   English

以编程方式注册Ecore元模型

[英]Register Ecore meta-model programmatically

我使用转换引擎在运行时创建一个Ecore元模型,我想知道我们如何使用EMF注册该元模型,以便它可以识别元模型?

If you have the code generated by your metamodel: 如果您拥有元模型生成的代码:

resourceSet.getPackageRegistry()
  .put(org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE.getNsURI()
     , org.eclipse.emf.codegen.ecore.genmodel.GenModelPackage.eINSTANCE);

(here for the "genmodel" metamodel) (这里是“genmodel”元模型)

If you only have the .ecore file: 如果您只有.ecore文件:

// register globally the Ecore Resource Factory to the ".ecore" extension
// weird that we need to do this, but well...
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
    "ecore", new EcoreResourceFactoryImpl());

ResourceSet rs = new ResourceSetImpl();
// enable extended metadata
final ExtendedMetaData extendedMetaData = new BasicExtendedMetaData(rs.getPackageRegistry());
rs.getLoadOptions().put(XMLResource.OPTION_EXTENDED_META_DATA,
    extendedMetaData);

Resource r = rs.getResource(uriOfYourModel, true);
EObject eObject = r.getContents().get(0);
if (eObject instanceof EPackage) {
    EPackage p = (EPackage)eObject;
    rs.getPackageRegistry().put(p.getNsURI(), p);
}

You can find a bit more about this code here with the method named registerEcorePackages() , used to register .ecore file in the workspace (with their workspace fullpath) in our custom package registry. 您可以使用名为registerEcorePackages()的方法在此处找到有关此代码的更多信息,该方法用于在我们的自定义程序包注册表中在工作区中注册.ecore文件(带有工作区完整路径)。 If you want to register your metamodel in EMF global package registry, replace resourceSet.getPackageRegistry() by EPackage.Registry.INSTANCE . 如果要在EMF全局包注册表中注册元模型,请使用EPackage.Registry.INSTANCE替换resourceSet.getPackageRegistry()

I had to modify the code from @sbegaudeau a bit for it to work: 我不得不修改@sbegaudeau中的代码以使其工作:

Replace 更换

rs.getPackageRegistry().put(p.getNsURI(), p);

with

EPackage.Registry.INSTANCE.put(p.getNsURI(), p);

Also, somehow I cannot register the .ecore type. 另外,不知何故,我无法注册.ecore类型。 Had to use "*": Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl()); 不得不使用“*”: Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl()); Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM