0

我正在开发一个由两个 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扩展的地方EPackageorg.myproject.metamodel.MyModel还包含我需要列出的所有其他生成的类。我猜我可以使用该信息,但我仍然不知道如何使用。

更新

我正在从事的项目基于EMFStore。运行它会提供 EMFStore 透视图。如果我有一个项目的导航器视图,我可以右键单击该项目并选择New Model Element. 这将打开一个对话框,其中列出了我的元模型中的所有模型元素,因此它是可能的。它必须在 EMFStore 或其依赖项之一中的某个地方完成。我查看了源代码,但似乎找不到它在哪里完成。

plugin.xml项目的是org.eclipse.emf.emfstore.perspectiveorg.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
    }
}

我找不到过滤项目的方法,但幸运的是所有包都以相同的前缀开头。

4

1 回答 1

2

EPackage 可以通过EPackage.Registry注册。似乎可以通过ECorePlugin.getDefaultRegistryImplementation()获得一个全局使用的实例。但是,我对此不是 100% 确定的。

MoDisco带有一个 EMF 模型浏览器,您还可以在其中选择任何已注册的 EMF 模型。所以你也可以看看这些来源。

于 2013-03-12T14:22:39.720 回答