2013-03-01 3 views
0

Я работаю над проектом, состоящим из двух проектов плагина Eclipse. Один из них - проект EMF и содержит метамодель для приложения. Другой - это активный плагин, работающий над этой метамодели.Список всех доступных моделей в приложении 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 содержит также все другие созданные классы, мне нужно, чтобы перечислить. Я предполагаю, что могу использовать эту информацию, но я до сих пор не знаю, как это сделать.

Update

Проект Я работаю над основан на EMFStore. Выполнение этой задачи предлагает перспективу EMFStore. Если у меня есть представление Navigator с проектом, я могу щелкнуть правой кнопкой мыши по этому проекту и выбрать New Model Element. Это откроет диалог, в котором все элементы модели из моей метамодели перечислены так, чтобы это было возможно. Это должно быть сделано где-то в EMFStore или одной из его зависимостей. Я просмотрел исходный код, но не могу найти, где это делается.

Проект plugin.xml проекта org.eclipse.emf.emfstore.perspective относится к классу org.eclipse.emf.emfstore.emfperspective.EMFStorePerspective, которого я не могу найти в источниках. Я импортировал проект через Eclipse Import Plug-Ins и Fragments, и у него нет исходной папки. В хранилищах хранилищ EMFStore я даже не могу найти этот проект.

Update

теперь я получил реестр, который содержит сгенерированные пакеты с помощью EPackage.Registry.INSTANCE. К сожалению, он содержит больше, чем EPackages из одного проекта, содержащего метаданные (org.myproject.metamodel). Теперь я просто ищу подходящий способ отфильтровать его, но все равно не могу его повесить.

Update

Как фильтрация не является частью моего первоначального вопроса я принял ответ на @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 
    } 
} 

Я не нашел способ фильтрации для проекта, но, к счастью, все пакеты начинаются с той же приставкой.

ответ

2

EPackages может быть зарегистрирован через EPackage.Registry. Кажется, что используется глобально используемый экземпляр, доступный через ECorePlugin.getDefaultRegistryImplementation(). Однако я не уверен на это на 100%.

MoDisco поставляется с EMF Model Browser, где вы также можете выбрать любую зарегистрированную модель EMF. Таким образом, вы также можете посмотреть на эти источники.

+0

Звучит многообещающе. Проект уже имеет зависимость от MoDisco. Будет несколько дней, пока я не смогу заглянуть в нее снова, но спасибо заранее. –

+0

'ECorePlugin.getDefaultRegistryImplementation()' возвращает 'null', но ваш ответ указал мне в правильном направлении.Я сейчас еще шаг и отредактирую свой вопрос. –

Смежные вопросы