【发布时间】:2013-04-16 20:09:17
【问题描述】:
我正在开发一个由两个 Eclipse 插件项目组成的项目。一个是 EMF 项目,包含应用程序的元模型。另一个是处理该元模型的实际插件。
我现在正在寻找一种方法来列出元模型项目中可用的所有模型类型。因为我基本上需要所有生成的类,所以我可以使用反射来遍历元模型包,但如果有的话,我更喜欢更简单的方法。
这些模型已经在plugin.xml 中列为扩展,如下所示:
<plugin>
<extension point="org.eclipse.emf.ecore.generated_package">
<package
uri="MyModel"
class="org.myproject.metamodel.MyModel.MyModelPackage"
genModel="model/MetaModel.genmodel"/>
</extension>
</plugin>
类MyModelPackage 扩展EPackage 和org.myproject.metamodel.MyModel 还包含我需要列出的所有其他生成的类。我猜我可以使用该信息,但我仍然不知道如何使用。
更新
我正在进行的项目基于EMFStore。运行它会提供 EMFStore 透视图。如果我有一个项目的导航器视图,我可以右键单击该项目并选择New Model Element。这将打开一个对话框,其中列出了我的元模型中的所有模型元素,因此它是可能的。它必须在 EMFStore 或其依赖项之一中的某个地方完成。我查看了源代码,但似乎找不到它在哪里完成。
项目org.eclipse.emf.emfstore.perspective 的plugin.xml 指的是我在源代码中找不到的类org.eclipse.emf.emfstore.emfperspective.EMFStorePerspective。我通过 Eclipse 导入插件和片段功能导入了项目,它没有源文件夹。在 EMFStore git 存储库中,我什至找不到那个项目。
更新
我现在得到了包含使用EPackage.Registry.INSTANCE 生成的包的注册表。不幸的是,它包含的不仅仅是包含元数据的一个项目中的 EPackages (org.myproject.metamodel)。现在我只是在寻找一种适当的方法来过滤它,但仍然无法掌握它。
更新
由于过滤不是我最初问题的一部分,我接受了@SpaceTrucker 的回答。对于那些好奇的人,这就是我现在的做法:
Registry registry = EPackage.Registry.INSTANCE;
for (String key : new HashSet<String>(registry.keySet())) {
EPackage ePackage = registry.getEPackage(key);
if (ePackage.getClass().getName().startsWith("org.myproject.metamodel")) {
//do stuf
}
}
我没有找到过滤项目的方法,但幸运的是所有包都以相同的前缀开头。
【问题讨论】:
标签: eclipse-emf emf