вторник, июня 02, 2009

Eclipse Modeling Framework Overview

Я собираюсь разобраться с Eclipse Modeling Framework и поделиться своими открытиями.
Первое открытие: Eclipse (3.4.2) поддерживает UML 2.1.

Эта модель классов позволяет получить код.


Нужно создать EMF Model (файл .genmodel), импортируя созданную модель.


При импорте модель должна удовлетворять более строгим правилам, чем при создании. Поэтому в моей созданной модели обнаружились ошибки:


Здесь требуется указать тип-параметр у дженерика EEList. У меня это не получается. (Как позже выяснилось, нужно делать либо ассоциации-референсы, либо максимальную кратность атрибута *, по крайней мере в Ecore.)
Тогда, переделываю UML.
Т. к. нет простого пути указать кратность ассоциации, перехожу в ECore - модель промежуточного (канонического) формата EMF.


Перегенерирую UML (через контекстное меню genmodel'и) чтобы актуализировать изменения из ECore (это не обязательно, UML использовать вообще не обязательно):

Запускаю генерацию кода (Generator > Generate All). Второе открытие: для нашей модели даже генерируется по умолчанию какой-то пользовательский интерфейс. Получается 4 плагина:
  • model - это сама модель с фабриками для создания объектов
  • edit - промежуточный код редактирования объектов модели
  • editor - UI-код редактора модели
  • tests - скелеты тестов


Можно сгенерировать отдельные плугины по соответствующим пунктам меню Generator.
Запускаем плагин editor как часть Workbench'а... Вот он:


Это редактор инстансов объектов нашей модели, который можно даже немного настроить при генерации и, конечно, поправить исходники.
А код модели обладает (автоматически, бесплатно и по умолчанию) функциями оповещения наблюдателей об изменениях, персистенции в ресурсы (опять же настраиваемой опциями) и своим рефлексивным API.
В общем, ищу единомышленников по освоению Eclipse Modeling Framework и связанных с ним проектов.

P. S.
Основная книга Eclipse Modeling Framework: A Developer's Guide.
Еще есть перспективный проект по модели UI для нашей прикладной модели - Eclipse Presentation Modeling Framework (PMF) (пока к сожалению медленно развивающийся). Вот пример работы фреймворка, ложащегося в основу этого проекта.

3 комментария:

  1. Странные вещи в EMF:
    1. objectA.setField1( objectB.getField1() );
    В итоге в objectA.field1 будет скопировано значение, а objectB.field1 будет записано null. Нетипично для Java, C++ и других языков.

    2. EMF Factory -- это синглтон, поэтому он привязывается к ClassLoader. А это не есть хорошо.

    ОтветитьУдалить
  2. 1 У меня вроде работает как надо. этот код дает зеленую полосу:
    public void testEMFStrange1() {
    Object value = new Object();
    Test1 objectA = DefaultnameFactory.eINSTANCE.createTest1();
    Test1 objectB = DefaultnameFactory.eINSTANCE.createTest1();

    objectB.setField1(value);
    objectA.setField1(objectB.getField1());

    assertEquals(value, objectA.getField1());
    assertNotNull(objectB.getField1());
    }
    Что не так?

    2 В книжке написано, что можно через Registry создавать. Правда он тоже синглтон :)

    ОтветитьУдалить
  3. Upd:
    Ошибка валидации модели из статьи обходилась заданием типа дженерика с помощью редактора модели, который надо включить на показ их в меню Sample Ecore Editor -> Show Generics.

    Если надо генерировать RCP, включается параметром в genmodel при выделенной модели, Properties - Editor / Rich Client Platform = true

    Книги (и уже давно) вышла вторая редакция. http://books.google.ru/books?id=oAYcAAAACAAJ

    ОтветитьУдалить