Обновлен: 29 июня 2004 года
В этом справочнике приведено последовательное описание процесса создания модели EMF и генерации для нее простого редактора модели. Показано, с какой легкостью EMF позволяет перейти от простого определения модели к полнофункциональному редактору для этой модели.
Модель, которая будет генерироваться, на диаграмме UML выглядит следующим образом: (описание этой модели приведено в документе Eclipse Modeling Framework (EMF) - Обзор):
Ниже будет показано, как можно генерировать модель EMF на основе одного из двух возможных источников: из модели, созданной с помощью инструмента моделирования Rational Rose, или из набора интерфейсов и классов Java с аннотациями.
Моментальные копии экрана соответствуют версии Eclipse SDK версии 3.0 и версии 2.0 среды EMF.
Пакет EMF Runtime содержит генератор EMF и несколько связанных модулей. После установки этого пакета проверьте, все ли его компоненты доступны в среде Eclipse:
Другие модули EMF, которые не выделены в показанном выше окне, для работы с данным справочником не требуются. В зависимости от того, какая версия пакетов EMF установлена, эти модули могут отображаться или не отображаться в этом окне.
Файл Rose для модели библиотеки можно найти здесь: library.mdl. Сохраните его в каком-нибудь каталоге на вашей рабочей станции.
Создайте в рабочей области новый проект EMF:
Вместо того, чтобы импортировать модель из диаграммы 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:
Модель генератора отображает корневой объект, представляющий всю модель целиком. Дочерние объекты этого объекта представляют его пакеты, для которых, в свою очередь, существуют дочерние объекты, представляющие классификаторы (классы и типы данных, в том числе перечислимые типы). Дочерние элементы классов - это атрибуты, ссылки и операции классов; дочерние элементы перечислимых типов - это перечислимые (литеральные) константы.
В большинстве случаев не требуется изменять значения по умолчанию для этих свойств, однако эти опции могут обеспечить слишком строгий контроль над генерированным кодом. Эта тема будет рассмотрена более полно в одном из последующих разделов справочника; сейчас выберем несколько разных объектов модели генератора и будем наблюдать за их свойствами.
Модель генератора представляет собой точку, в которой запускается генерация кода. Для того чтобы генерировать код для какого-либо объекта модели, щелкните на этом объекте правой кнопкой мыши.
В процессе генерации должны быть созданы (если модель импортировалась из Rose) или дополнены (если модель определялась с помощью аннотаций Java) интерфейсы классов и класс enum; кроме того, создается новая пара интерфейсов для самого пакета и для фабрики. Создаются также два новый пакета с расширением "impl" и "util", которые содержат реализации этих интерфейсов и дополнительные служебные классы, и файл манифеста "plugin.xml" для модуля модели.
Если модель определялась с помощью Java с аннотациями, то в панели Неполадки будет показано предупреждение: "Директива импорта java.util.List никогда не используется". Это ожидаемое предупреждение, и оно не мешает переходу к следующему шагу.
Если вы изменили модель, то можете выполнить повторную генерацию кода; при этом изменения будут слиты с любыми модификациями кода, выполненными вручную. Кроме того, можно выборочно генерировать фрагменты кода модели. Для этого достаточно щелкнуть правой кнопкой мыши на пакете, классе или перечислимом объекте и затем выбрать из всплывающего меню пункт "Генерировать код модели".
Для любой модели можно создать полнофункциональный редактор Eclipse. По умолчанию, он включает два модуля: модуль "edit" содержит адаптеры, которые предоставляют структурированное представление и выполняют изменение объектов модели на основе команд, и модуль "editor", предоставляющий пользовательский интерфейс для редактора и мастера.
В общем случае, если требуется генерировать модуль модели, модуль edit и модуль editor на одном шаге, то это можно сделать, выбрав во всплывающем меню пункт "Генерировать все".
При создании кода должна автоматически выполняться его компиляция, а при изменении - повторная компиляция. Компиляцию можно запускать вручную, если в параметрах рабочей области отключить автоматическую компоновку:
Для того чтобы протестировать созданные модули, необходимо запустить второй экземпляр Eclipse, называемый рабочей средой выполнения. Модули будут запускаться в этой рабочей среде.
Теперь для создания нового экземпляра модели можно использовать мастер создания модели library.
Корневой объект в этом редакторе соответствует ресурсу My.library. Под ним лежит одна библиотека, - это объект, выбранный в качестве объекта модели в мастере.