以编程方式注册Ecore元模型



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

如果您有由元模型生成的代码:

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

(此处为"genmodel"元模型)

如果您只有.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);
}

您可以在这里使用名为registerEcorePackages()的方法找到更多关于此代码的信息,该方法用于在我们的自定义包注册表中的工作区中注册.ecore文件(使用其工作区完整路径)。如果要在EMF全局包注册表中注册元模型,请将resourceSet.getPackageRegistry()替换为EPackage.Registry.INSTANCE

我不得不修改@sbegaudeau中的代码以使其工作:

更换

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

带有

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

此外,不知何故,我无法注册.ecore类型。必须使用"*":Resource.Factory.Registry.INSTANCE. getExtensionToFactoryMap().put("*", new EcoreResourceFactoryImpl());

相关内容

  • 没有找到相关文章

最新更新