簡體   English   中英

以編程方式注冊Ecore元模型

[英]Register Ecore meta-model programmatically

我使用轉換引擎在運行時創建一個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全局包注冊表中注冊元模型,請使用EPackage.Registry.INSTANCE替換resourceSet.getPackageRegistry()

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

更換

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

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

另外,不知何故,我無法注冊.ecore類型。 不得不使用“*”: 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