Генерация модели EMF

Обновлен: 29 июня 2004 года

В этом справочнике приведено последовательное описание процесса создания модели EMF и генерации для нее простого редактора модели. Показано, с какой легкостью EMF позволяет перейти от простого определения модели к полнофункциональному редактору для этой модели.

Модель, которая будет генерироваться, на диаграмме UML выглядит следующим образом: (описание этой модели приведено в документе Eclipse Modeling Framework (EMF) - Обзор):

Диаграмма UML для модели библиотеки

Ниже будет показано, как можно генерировать модель EMF на основе одного из двух возможных источников: из модели, созданной с помощью инструмента моделирования Rational Rose, или из набора интерфейсов и классов Java с аннотациями.

Моментальные копии экрана соответствуют версии Eclipse SDK версии 3.0 и версии 2.0 среды EMF.


Оглавление

Шаг 0: Предварительные требования
Шаг 1: Импорт модели из инструмента Rose или Определение модели с помощью Java с аннотациями
Шаг 2: Генерация кода модели EMF
Шаг 3: Генерация редактора для модели
Шаг 4: Запуск генерированного редактора


 оглавление

Шаг 0: Предварительные требования

Пакет EMF Runtime содержит генератор EMF и несколько связанных модулей. После установки этого пакета проверьте, все ли его компоненты доступны в среде Eclipse:

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


 оглавление

Шаг 1а: Импорт модели из инструмента моделирования Rose

Файл Rose для модели библиотеки можно найти здесь: library.mdl. Сохраните его в каком-нибудь каталоге на вашей рабочей станции.

Создайте в рабочей области новый проект EMF:


 оглавление

Шаг 1б: Определение модели с помощью Java с аннотациями

Вместо того, чтобы импортировать модель из диаграммы Rose, можно использовать набор интерфейсов и классов Java, которые соответствуют классам и перечислимым типам в модели library. Этот код представляет собой минимум, необходимый для иллюстрации нужных сущностей. На его основе создаются базовая модель и модель генератора, которая затем управляет генерацией остального кода. Этот код, аннотируемый тегами "@model" в комментариях Javadoc, позволяет указать любые, отличные от значений по умолчанию, значения атрибутов и ссылок объектов Ecore.

Library.java 
package org.eclipse.example.library;
import java.util.List;

/**
 * @model
 */
public interface Library
{
  /**
   * @model
   */
  String getName();

  /**
   * @model type="Writer" containment="true"
   */
  List getWriters();

  /**
   * @model type="Book" containment="true"
   */
  List getBooks();
}
Book.java 
package org.eclipse.example.library;

/**
 * @model
 */
public interface Book
{
  /**
   * @model
   */
  String getTitle();

  /**
   * @model default="100"
   */
  int getPages();

  /**
   * @model
   */
  BookCategory getCategory();

  /**
   * @model opposite="books"
   */
  Writer getAuthor();
}
Writer.java 
package org.eclipse.example.library;

/**
 * @model
 */
public interface Writer
{
  /**
   * @model
   */
  String getName();

  /**
   * @model type="Book" opposite="author"
   */
  java.util.List getBooks();
}
BookCategory.java 
package org.eclipse.example.library;

/**
 * @model
 */
public class BookCategory
{
  /**
   * @model name="Mystery"
   */
  public static final int MYSTERY = 0;

  /**
   * @model name="ScienceFiction"
   */
  public static final int SCIENCE_FICTION = 1;

  /**
   * @model name="Biography"
   */
  public static final int BIOGRAPHY = 2;
}

Создайте в рабочей области новый проект Java:

Создайте первый интерфейс Java:

Таким же образом создайте два других интерфейса (Book.java и Writer.java) и класс (BookCategory.java). Для создания класса, конечно же, из всплывающего меню следует выбирать не "Создать/Интерфейс", а "Создать/Класс".

Создайте модели EMF:


 оглавление

Шаг 2: Генерация кода модели EMF

Модель генератора отображает корневой объект, представляющий всю модель целиком. Дочерние объекты этого объекта представляют его пакеты, для которых, в свою очередь, существуют дочерние объекты, представляющие классификаторы (классы и типы данных, в том числе перечислимые типы). Дочерние элементы классов - это атрибуты, ссылки и операции классов; дочерние элементы перечислимых типов - это перечислимые (литеральные) константы.

В большинстве случаев не требуется изменять значения по умолчанию для этих свойств, однако эти опции могут обеспечить слишком строгий контроль над генерированным кодом. Эта тема будет рассмотрена более полно в одном из последующих разделов справочника; сейчас выберем несколько разных объектов модели генератора и будем наблюдать за их свойствами.

Модель генератора представляет собой точку, в которой запускается генерация кода. Для того чтобы генерировать код для какого-либо объекта модели, щелкните на этом объекте правой кнопкой мыши.

В процессе генерации должны быть созданы (если модель импортировалась из Rose) или дополнены (если модель определялась с помощью аннотаций Java) интерфейсы классов и класс enum; кроме того, создается новая пара интерфейсов для самого пакета и для фабрики. Создаются также два новый пакета с расширением "impl" и "util", которые содержат реализации этих интерфейсов и дополнительные служебные классы, и файл манифеста "plugin.xml" для модуля модели.

Если модель определялась с помощью Java с аннотациями, то в панели Неполадки будет показано предупреждение: "Директива импорта java.util.List никогда не используется". Это ожидаемое предупреждение, и оно не мешает переходу к следующему шагу.

Если вы изменили модель, то можете выполнить повторную генерацию кода; при этом изменения будут слиты с любыми модификациями кода, выполненными вручную. Кроме того, можно выборочно генерировать фрагменты кода модели. Для этого достаточно щелкнуть правой кнопкой мыши на пакете, классе или перечислимом объекте и затем выбрать из всплывающего меню пункт "Генерировать код модели".


 оглавление

Шаг 3: Генерация редактора для модели

Для любой модели можно создать полнофункциональный редактор Eclipse. По умолчанию, он включает два модуля: модуль "edit" содержит адаптеры, которые предоставляют структурированное представление и выполняют изменение объектов модели на основе команд, и модуль "editor", предоставляющий пользовательский интерфейс для редактора и мастера.

В общем случае, если требуется генерировать модуль модели, модуль edit и модуль editor на одном шаге, то это можно сделать, выбрав во всплывающем меню пункт "Генерировать все".

При создании кода должна автоматически выполняться его компиляция, а при изменении - повторная компиляция. Компиляцию можно запускать вручную, если в параметрах рабочей области отключить автоматическую компоновку:


 оглавление

Шаг 4: Запуск генерированного редактора

Для того чтобы протестировать созданные модули, необходимо запустить второй экземпляр Eclipse, называемый рабочей средой выполнения. Модули будут запускаться в этой рабочей среде.

Теперь для создания нового экземпляра модели можно использовать мастер создания модели library.

Корневой объект в этом редакторе соответствует ресурсу My.library. Под ним лежит одна библиотека, - это объект, выбранный в качестве объекта модели в мастере.


оглавление