我在现有的EMF项目中有一个Ecore模型,并希望通过XTend将所有包含类的名称打印到文本文件中。你是如何实现这一目标的? XTend示例未显示如何使用模型并从中获取信息。
答案 0 :(得分:1)
如果您只需要元模型的EClasses,那么您可以从模型包中获取它们:
YourEMFModelPackage.eINSTANCE.getEClassifiers()
,返回EList<EClassifier>
。由于EClass
是EClassifier
,因此您可以获得所有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