2016-08-31 85 views
1

我在現有的EMF項目中使用Ecore模型,並希望通過XTend將所有包含類的名稱打印到文本文件中。你如何做到這一點? XTend的例子沒有說明如何使用模型並從中獲取信息。通過XTend從Metamodel生成代碼

+0

看看[中的Xtend加載EMF模型實例(http://stackoverflow.com/questions/12458852/load-emf-model-instance-in-xtend) –

+0

我不需要模型的一個實例。我只需要元模型的類。 – landunder

回答

1

如果你只需要你的元模型的EClass,那麼你可以從你的模型包中得到它們: YourEMFModelPackage.eINSTANCE.getEClassifiers()它返回EList<EClassifier>。由於EClassEClassifier,所以您可以獲得您所有的EClass實現org.eclipse.emf.ecore.impl.EClassImpl。 對於類型安全問題,您可能會檢查此列表是否僅包含EClasses,因爲您所有的EDataTypes也是EClassifier

所以這應該給絕招: EcoreUtil.getObjectsByType(YourEMFModelPackage.eINSTANCE.getEClassifiers(), EcorePackage.eINSTANCE.getEClass())

或:

List<EClass> allEClasses = YourEMFModelPackage.eINSTANCE.getEClassifiers().stream().filter(p -> EClass.class.isInstance(p)).map(m -> EClass.class.cast(m)).collect(Collectors.toList());

更新: 如果你沒有你的模型的代碼生成您仍然可以做到這一點,您只需將您的Ecore加載到資源中:

ResourceSet resourceSet = new ResourceSetImpl(); 
    resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("ecore", 
      new EcoreResourceFactoryImpl()); 
    Resource resource = resourceSet.getResource(
      URI.createFileURI(
        "../path/to/your/Ecore.ecore"), 
      true); 
    EPackage model = (EPackage) resource.getContents().get(0); 

如果您擁有EPackage那麼你得到你的EClass像上面提到

+0

我在模型文件夾中有Ecore模型。我試圖通過在YourEMFModelPackage之類的Java文件中的包名來解決它,但它不起作用。我究竟做錯了什麼? – landunder

+0

您是否生成了模型代碼? –

+0

這個問題意味着無法在不生成代碼的情況下使用Ecore模型,這是否正確? – landunder