Question

I'm working on a project consisting of two Eclipse plugin projects. One is an EMF project and contains the metamodel for the application. The other one is the acctual plugin working on that metamodel.

I'm now looking for a way to list all types of models available in the metamodel project. Since I basically need all generated classes I could use reflections to iterate through the metamodel package but I'd prefer an easier way if there is one.

The models are already listed as extensions in the plugin.xml like this:

<plugin>
    <extension point="org.eclipse.emf.ecore.generated_package">
        <package
            uri="MyModel"
            class="org.myproject.metamodel.MyModel.MyModelPackage"
            genModel="model/MetaModel.genmodel"/>
    </extension>
</plugin>

where the class MyModelPackage extends EPackage and org.myproject.metamodel.MyModel also contains all the other generated classes I need to list. I'm guessing that I can use that information but I still don't know how.

Update

The project I'm working on is based on EMFStore. Running it offers the EMFStore perspective. If I have the Navigator view with a project I can right click on that project and select New Model Element. This opens a dialog where all the model elements from my metamodel are listed so it is possible. It must be done somewhere in EMFStore or one of it's dependencies. I looked through the source code but can't seem to find where it's done.

The plugin.xml of the project org.eclipse.emf.emfstore.perspective refers to the class org.eclipse.emf.emfstore.emfperspective.EMFStorePerspective which I can't find in the sources. I imported the project via the Eclipse Import Plug-Ins and Fragments functionality and it has no source folder. In the EMFStore git repositories I can't even find that project.

Update

I now got the registry that contains the generated packages using EPackage.Registry.INSTANCE. Unfortunately it contains more than the EPackages from the one project containing the metadata (org.myproject.metamodel). Now I'm just looking for a proper way to filter it, but still can't get the hang of it.

Update

As the filtering is not part of my original question I accepted the answer by @SpaceTrucker. For those who are curious, this is how I've done it now:

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
    }
}

I found no way to filter for the project but luckily all the packages start with the same prefix.

Was it helpful?

Solution

EPackages may be registered via an EPackage.Registry. There seems to be a globally used instance available via ECorePlugin.getDefaultRegistryImplementation(). However I'm not 100% sure on that.

MoDisco comes with a EMF Model Browser, where you are also able to select any registered EMF model. So you also could have a look at those sources.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top