Lars Vogel
Туториал описывает использование Eclipse EMF для моделирования модели данных и генерации Джава кода из нее. Туториал основан на Eclipse 4.2(Juno).
1. Модели и Eclipse EMF
Модель данных, иногда называемая моделью предметной области представляет собой данные, с которыми вы хотите работать. Например, если вы разрабатываете программное приложение для бронирования авиабилетов, вы можете смоделировать предметную область объектами типо Person, Flight, Booking и так далее. Общая рекомендация заключается в том, чтобы модель данных была независима от бизнес логики приложения. Данный подход приводит к созданию классов практически без логики, но со множеством полей, например Person должен иметь такие поля как firstName, lastName, Address, и так далее.
Eclipse EMF может быть использован при моделировании предметной области. В EMF есть различие между мета моделью и самой моделью. Мета модель описывает структуру модели. Модель является сущностью мета модели. EMF предоставляет расширяемый фреймворк для хранения информации о модели, по умолчанию используется XMI для сохранения определения модели.
EMF позволяет создавать мета модели разными способами, включая XMI, аннотации Java, UML или XML Schema. Дальнейшее описание будет использовать средства EMF напрямую для создания EMF модели.
Как только вы определили мета модель вы можете сгенерировать соответствующие классы Java (с помощью Expand – и другие языки // прим. меня). EMF обеспечивает возможность безопасного расширения сгенерированного кода.
1.3. Мета модели - Ecore и Genmodel
Ранее мы сказали, что у EMF есть мета модель. На самом деле EMF основан на двух мета моделях, Ecore и Genmodel. Первая содержит информацию о определяемых классах, вторая содержит доп. информацию для кодогенерации, например путь и информацию о файле. Genmodel также содержит контрольный параметр, который настраивает способ генерации.
Модель Ecore позволяет определять различные элементы.
· EClass : представляет собой класс с нулем или более атрибутов и нулем или более ссылок.
· EAttribute : представляет собой атрибут с именем и типом.
· EReference : представляет собой одну из сторон ассоциативной связи между классами. У этого элемента есть флаг, который показывает представляет ли собой данная связь композицию и указатель на тот класс, на который ссылаемся.
· EDataType : представляет собой тип атрибута, float или java.util.Date например.
Модель Ecore показывает корневой объект представляющий всю модель. Эта модель имеет детей, которые представляют собой пэкаджи, чьи дети представляют собой классы, а дети классов – это атрибуты этих классов.
1.4. Преимущества использования EMF
С EMF вы делаете ваши модели предметной области явными, что помогает обеспечить ясное понимание модели. EMF также обеспечивает уведомление о изменение в том случае, если модель меняется. EMF сгенерирует интерфейсы и фабрику для создания объектов, кроме того, он помогает вам не пачкать ваше приложение явным применением классов.
Еще одно преимущество – вы можете пересоздать код Java из модели в любой момент времени.
Установите EMF через Eclipse Update manager. Выберите Modelling и установите EMF – Eclipse Modelling Framewok SDK. Также выберите Ecore Tools SDK, что позволит вам моделировать на основе диаграмм.
Создайте новый проект, назовите его de.vogella.emf.webpage.model через File → New → Project... → Eclipse Modeling Framework → Empty EMF Project .
Выберите папку models и щелкнув правой кнопкой New → Other... → Ecore Tools → Ecore Diagram.
Введите webpage.ecore в качестве параметра Domain File Name.
Это должно открыть визуальный редактор для моделей EMF.
Откройте Properties view через Window → Show View → Other... → Properties. Это окно позволяет вам модифицировать ваших элементов модели.
Щелкните на EClass и нажмите на редакторе, чтобы создать новый класс. Создайте MyWeb, Webpage, Category и Article EClass
Используйте узел EAttribute для того, чтобы назначить каждому объекту атрибут name. Этот атрибут должен иметь тип EString.
Добавьте title, description и keywords атрибуты в MyWeb и Webpage элементы модели.
Мы хотим использовать тип данных «календарь» в нашей модели. Выберите “EDataType” и дайте ему имя «calendar» и введите «java.util.Calendar»ю Добавьте EAttribute «created» в «Article» и используйте ваш новый тип.
Выберите EReferences и создайте стрелку как на следующей картинке. Убедитесь, что верхняя граница установлена в «*» и что «Is Containment» включено.
Закройте диаграмму и откройте webpage.ecore. Результат должен выглядеть как на следующем скрине.
3.4. Создание EMF Generator Model
Щелкните правой на webpage.ecore файл и выберите File → New → Other... → EMF Generator model. Создайте webpage.genmodel основанный на вашей модели.
Выберите вашу модель и нажмите Load.
Откройте webpage.genmodel и выберите узел Webpage. Задайте base package свойство в de.vogella.emf.webpage.model.
4. Генерация классов предметной области
Вы создали два файла моделей.ecore и.genmodel. Based on these two model files you can generate Java code.
Кликнем правой кнопкой на корневом узле.genmodel файла и выберите Generate Model Code . Это создаст реализацию на Java для этой модели.
4.2. Обзор сгенерированного кода
Сгенерированный код состоит из следующего:
· model – Интерфейсы и фабрики для создания классов Java
· model.impl – Конкретная реализация интерфейсов определенных в модели.
· model.util -- AdapterFactory
Центральная фабрика обладает методами для создания всех определенных объектов через методы createObjectName().
Для каждого атрибута сгенерированный интерфейс и его реализация содержат и геттер и сеттер. Каждый сеттер также обладает уведомление для наблюдателей (Observer) модели. Это означает, что другие объекты могут присоединять их к модели и реагировать на изменения в модели.
Каждый сгенерированный интерфейс раскрывает интерфейс EObject. EObject это основа для любого EMF класс, эквивалентен явишному java.lang.Object. EObject и класс его реализующий EObjectImpl обеспечивают легкий базовый класс, который позволит участвовать сгенерированным интерфейсам и классам в механизме поддержки состояния и нотификации EMF.
Каждый сгенерированный метод помечен @generated. Если вы хотите вручную назначить метод, который вы хотите защитить от перезаписывания в течении следующей кодогенерации вам следует убрать эту метку
Если вы измение вашу .ecore модель, вы можете обновить .genmodel с помощью операции перезагрузки.
5. Создание плагинов редакторов
EMF может генерировать плагины, которые обеспечивают визарды для создания новых сущностей модели, что позволит в удобной форме вводить информацию о модели. (может быть для ЛИС получиться использовать такие штуки)
Следующие шаги предполагают, что вы уже знаете, как разрабатывать плагины Eclipse. Для большей информации об этом смотрите - Eclipse Plugin Tutorial
5.1. Генерация кода для редактирования и редакторов
Eclipse EMF позволяет вам создать редактор для вашей модели. Выберите файл .genmodel, кликните правой кнопкой и выберите Generate Edit Code, а затем Generate Editor Code .
Создадутся два проекта плагинов Eclipse "de.vogella.emf.webpage.model.edit" и "de.vogella.emf.webpage.model.editor".
Выберите *.editor проект и запустите новый инстанс Eclipse с помощью клика правой кнопки и выбора Run-As → Eclipse application .
Запустится новый инстанс, где можно создавать модели.
В этом новом инстансе создайте новый проект типа General, назовите его testing и папку website.
Выберите эту папку, кликните правой, выберите New → Other... → Example EMF Model Creation Wizards → Webpage Model.
In new Eclipse instance create a new project of type General called testing and a folder called website.
Назовите модель My.webpage.
В качестве Model Object выберите "My Web" и нажмите finish.
Теперь вы должны увидеть редактор для website.model.
Нажмите правой кнопкой на “My Web” и создайте новые элементы. Для редактирования элементов используйте «Properties View», который можно найти в Window -> Show View -> Properties.
Сохраните созданную модель
Сгенерированный код модели – это обычный код на Java и его можно использовать как обычно. Следующее описание демонстрирует как создавать объекты, основанные на сгенерированном коде.
Создайте новый проект для плагинов, назовите de.vogella.emf.webpage.usingmodel. Добавьте следующую зависимость в ваш MANIFEST.MF.
- org.eclipse.emf.ecore
- de.vogella.emf.webpage.model
Создайте следующий класс
package de.vogella.emf.webpage.usingmodel;
import de.vogella.emf.webpage.model.webpage.MyWeb;
import de.vogella.emf.webpage.model.webpage.Webpage;
import de.vogella.emf.webpage.model.webpage.WebpageFactory;
import de.vogella.emf.webpage.model.webpage.impl.WebpagePackageImpl;
public class UsingEMFModel {
public static void main(String[] args) {
WebpagePackageImpl.init();
// Получить синглтон фабрики
WebpageFactory factory = WebpageFactory .eINSTANCE;
// Создать инстанс MyWeb
MyWeb myWeb = factory.createMyWeb();
myWeb.setName("Hallo");
myWeb.setDescription("This is a description");
// Создать страницу
Webpage webpage = factory.createWebpage();
webpage.setTitle("This is a title");
// Добавить страницу в «интернет»
myWeb.getPages().add(webpage);
// И т.д и т.п
// Как видите, EMF модель может использовать обычный джава код.
}
}
Tip
Необходимо вызвать метод *PackageImpl.init() перед тем как что-нибудь делать, т.к этот метод инициализирует модель и слушателей.
Вы также можете создать Javadoc для ваших классов и методов. EMF использует аннотацию со специальным свойством. Самый простой способ добавить – использование диаграммы. Выберите класс и сохраните документацию в “GenModel Doc”
Ecore модель теперь выглядит следующим образом. Ключ в аннотации "http://www.eclipse.org/emf/2002/GenModel" обязателен и ключ внутри записи должен быть "documentation".
По умолчанию EMF генерирует геттер и сеттер для каждого класса. Вы также можете добавить операции или перезагрузить методы, например toString(). Для Article следующий toString метод был сгенерирован в ArticleImpl.
* @generated
*/
@Override
public String toString() {
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append(" (name: ");
result.append(name);
result.append(", created: ");
result.append(created);
result.append(')');
return result.toString();
}
Для того, чтобы перезагрузить его, добавьте EOperation в вашу модель и назовите toString. Введите для свойства EType EString в качестве возвращаемого типа.
Добавьте аннотацию ссылающуюся на http://www.eclipse.org/emf/2002/GenModel и введите запись с ключем “body”, значением будет являться код, который будет сгенерирован для метода.
if (eIsProxy()) return super.toString();
StringBuffer result = new StringBuffer(super.toString());
result.append("Article: ");
result.append(name);
return result.toString();
Можно также генерировать методы с входным параметром, просто его надо добавить в EOperation.
9. Расширение EMF Ecore модели (наследование)
EMF позволяет расширить существующие модели через наследование. Следующее определит базовую модель и расширение этой модели. Например, это можно использовать для расширения Eclipse e4 модели приложения. Так же мы покажем как работать с моделями EMF ecore без использования утилит ecore.
Создайте новый EMF проект "de.vogella.emf.inheritance". Создайте новую модель выбрав File -> New -> "Eclipse Modeling Framework" -> "Ecore Model". Назовите модель “base.ecore”. Выберите “EPackage” в качестве основы и введите следующие свойства в пэкадж.
Кликните правой кнопкой на пэкадже и выберите New Child -> EClass. Введите в “MyBaseClass” два атрибута типа EString. Создайте новую “Ecore” модель "extendedmodel.ecore”. Введите “extended” в качестве имя пэкаджа. Правой кнопкой нажмите на модели и выберите “Load resource”.
Создайте новый класс “MyExtendedClass” и нажмите “ESuperType”.
Добавьте ваш "MyBaseClass".
Введите новый атрибут "detailedField" в "MyExtendedClass".
Создайте новую genmodel “extended.genmodel” основанную на extended.ecore. Сгенерируется код Java и вы сможете увидеть, что “MyExtendedClass” расширяет “MyBaseClass”.
10. Задание пустой строки в качестве значения по умолчанию.
Достаточно неочевидно, как сделать пустую строку значением по умолчанию для строкового атрибута. Для этого сделайте следующее
· Выберите атрибут
· В Property View нажмите на значении поля "Default Value Literal"
· Не вводите ничего.
Чтобы убрать это нажмите "Restore Default Value" в панели инструментов
http://www.eclipse.org/modeling/emf Eclipse EMF Homepage
http://www.eclipse.org/modeling/emf/docs/ EMF Documentation
http://www.ibm.com/developerworks/opensource/library/os-ecemf1 Model with the Eclipse Modeling Framework, Part 1: Create UML models and generate code
http://www.ibm.com/developerworks/opensource/library/os-ecemf2 Model with the Eclipse Modeling Framework, Part 2: Generate code with Eclipse's Java Emitter Templates
http://www.raceeend.demon.nl/ How to extend / inheritant from an existing EMF model
http://www.eclipse.org/m2m/atl/ ATL allows model to model transformation for EMF
Оригинал: http://www.vogella.com/articles/EclipseEMF/article.html
Комментариев нет:
Отправить комментарий