我正在开发一个由两个 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 或其依赖项之一中的某个地方完成。我查看了源代码,但似乎找不到它在哪里完成。
plugin.xml
项目的是org.eclipse.emf.emfstore.perspective
指org.eclipse.emf.emfstore.emfperspective.EMFStorePerspective
我在源代码中找不到的类。我通过 Eclipse 导入插件和片段功能导入了项目,它没有源文件夹。在 EMFStore git 存储库中,我什至找不到该项目。
更新
我现在得到了包含使用生成的包的注册表EPackage.Registry.INSTANCE
。不幸的是,它包含的不仅仅是来自包含元数据的一个项目的 EPackage ( 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
}
}
我找不到过滤项目的方法,但幸运的是所有包都以相同的前缀开头。