четверг, 21 марта 2013 г.

Eclipse Modeling Framework (EMF) – Туториал

Lars Vogel

Eclipse EMF

Туториал описывает использование Eclipse EMF для моделирования модели данных и генерации Джава кода из нее. Туториал основан на Eclipse 4.2(Juno).

1. Модели и Eclipse EMF

1.1. Модель данных

Модель данных, иногда называемая моделью предметной области представляет собой данные, с которыми вы хотите работать. Например, если вы разрабатываете программное приложение для бронирования авиабилетов, вы можете смоделировать предметную область объектами типо Person, Flight, Booking и так далее. Общая рекомендация заключается в том, чтобы модель данных была независима от бизнес логики приложения. Данный подход приводит к созданию классов практически без логики, но со множеством полей, например Person должен иметь такие поля как firstName, lastName, Address, и так далее.

1.2. Eclipse EMF

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 из модели в любой момент времени.

2. Установка

Установите EMF через Eclipse Update manager. Выберите Modelling и установите EMF – Eclipse Modelling Framewok SDK. Также выберите Ecore Tools SDK, что позволит вам моделировать на основе диаграмм.

clip_image001

3. Определение модели EMF

3.1. Создание проекта

Создайте новый проект, назовите его de.vogella.emf.webpage.model через FileNewProject...Eclipse Modeling FrameworkEmpty EMF Project .

clip_image002

3.2. Создание диаграммы Ecore

Выберите папку models и щелкнув правой кнопкой NewOther...Ecore ToolsEcore Diagram.

clip_image003

Введите webpage.ecore в качестве параметра Domain File Name.

clip_image004

Это должно открыть визуальный редактор для моделей EMF.

clip_image005

Откройте Properties view через Window → Show View → Other... → Properties. Это окно позволяет вам модифицировать ваших элементов модели.

Щелкните на EClass и нажмите на редакторе, чтобы создать новый класс. Создайте MyWeb, Webpage, Category и Article EClass

clip_image006

Используйте узел EAttribute для того, чтобы назначить каждому объекту атрибут name. Этот атрибут должен иметь тип EString.

clip_image007

clip_image008

Добавьте title, description и keywords атрибуты в MyWeb и Webpage элементы модели.

clip_image009

Мы хотим использовать тип данных «календарь» в нашей модели. Выберите “EDataType” и дайте ему имя «calendar» и введите «java.util.Calendar»ю Добавьте EAttribute «created» в «Article» и используйте ваш новый тип.

clip_image010

Выберите EReferences и создайте стрелку как на следующей картинке. Убедитесь, что верхняя граница установлена в «*» и что «Is Containment» включено.

clip_image011

3.3. Просмотр диаграммы ECore

Закройте диаграмму и откройте webpage.ecore. Результат должен выглядеть как на следующем скрине.

clip_image012

3.4. Создание EMF Generator Model

Щелкните правой на webpage.ecore файл и выберите FileNewOther...EMF Generator model. Создайте webpage.genmodel основанный на вашей модели.

clip_image013

clip_image014

clip_image015

Выберите вашу модель и нажмите Load.

clip_image016

clip_image017

3.5. Задание пэкаджа

Откройте webpage.genmodel и выберите узел Webpage. Задайте base package свойство в de.vogella.emf.webpage.model.

clip_image018

4. Генерация классов предметной области

4.1. Генерация кода Java

Вы создали два файла моделей.ecore и.genmodel. Based on these two model files you can generate Java code.

Кликнем правой кнопкой на корневом узле.genmodel файла и выберите Generate Model Code . Это создаст реализацию на Java для этой модели.

clip_image019

4.2. Обзор сгенерированного кода

Сгенерированный код состоит из следующего:

· model – Интерфейсы и фабрики для создания классов Java

· model.impl – Конкретная реализация интерфейсов определенных в модели.

· model.util -- AdapterFactory

Центральная фабрика обладает методами для создания всех определенных объектов через методы createObjectName().

Для каждого атрибута сгенерированный интерфейс и его реализация содержат и геттер и сеттер. Каждый сеттер также обладает уведомление для наблюдателей (Observer) модели. Это означает, что другие объекты могут присоединять их к модели и реагировать на изменения в модели.

Каждый сгенерированный интерфейс раскрывает интерфейс EObject. EObject это основа для любого EMF класс, эквивалентен явишному java.lang.Object. EObject и класс его реализующий EObjectImpl обеспечивают легкий базовый класс, который позволит участвовать сгенерированным интерфейсам и классам в механизме поддержки состояния и нотификации EMF.

Каждый сгенерированный метод помечен @generated. Если вы хотите вручную назначить метод, который вы хотите защитить от перезаписывания в течении следующей кодогенерации вам следует убрать эту метку

4.3. Обновление модели

Если вы измение вашу .ecore модель, вы можете обновить .genmodel с помощью операции перезагрузки.

clip_image020

5. Создание плагинов редакторов

EMF может генерировать плагины, которые обеспечивают визарды для создания новых сущностей модели, что позволит в удобной форме вводить информацию о модели. (может быть для ЛИС получиться использовать такие штуки)

Следующие шаги предполагают, что вы уже знаете, как разрабатывать плагины Eclipse. Для большей информации об этом смотрите - Eclipse Plugin Tutorial

5.1. Генерация кода для редактирования и редакторов

Eclipse EMF позволяет вам создать редактор для вашей модели. Выберите файл .genmodel, кликните правой кнопкой и выберите Generate Edit Code, а затем Generate Editor Code .

clip_image021

Создадутся два проекта плагинов Eclipse "de.vogella.emf.webpage.model.edit" и "de.vogella.emf.webpage.model.editor".

5.2. Запуск плагинов

Выберите *.editor проект и запустите новый инстанс Eclipse с помощью клика правой кнопки и выбора Run-AsEclipse application .

Запустится новый инстанс, где можно создавать модели.

5.3. Создание модели

В этом новом инстансе создайте новый проект типа General, назовите его testing и папку website.

Выберите эту папку, кликните правой, выберите NewOther...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.

clip_image022

Назовите модель My.webpage.

clip_image023

В качестве Model Object выберите "My Web" и нажмите finish.

clip_image024

5.4. Редактирование модели

Теперь вы должны увидеть редактор для website.model.

clip_image025

Нажмите правой кнопкой на “My Web” и создайте новые элементы. Для редактирования элементов используйте «Properties View», который можно найти в Window -> Show View -> Properties.

clip_image026

clip_image027

Сохраните созданную модель

6. Использование кода модели

6.1. Обзор

Сгенерированный код модели – это обычный код на Java и его можно использовать как обычно. Следующее описание демонстрирует как создавать объекты, основанные на сгенерированном коде.

6.2. Пример

Создайте новый проект для плагинов, назовите 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() перед тем как что-нибудь делать, т.к этот метод инициализирует модель и слушателей.

7. Создание JavaDoc

Вы также можете создать Javadoc для ваших классов и методов. EMF использует аннотацию со специальным свойством. Самый простой способ добавить – использование диаграммы. Выберите класс и сохраните документацию в “GenModel Doc”

clip_image028

Ecore модель теперь выглядит следующим образом. Ключ в аннотации "http://www.eclipse.org/emf/2002/GenModel" обязателен и ключ внутри записи должен быть "documentation".

clip_image029

8. Генерация методов

По умолчанию 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 в качестве возвращаемого типа.

clip_image030

Добавьте аннотацию ссылающуюся на http://www.eclipse.org/emf/2002/GenModel и введите запись с ключем “body”, значением будет являться код, который будет сгенерирован для метода.

clip_image031

if (eIsProxy()) return super.toString();

StringBuffer result = new StringBuffer(super.toString());

result.append("Article: ");

result.append(name);

return result.toString();

Можно также генерировать методы с входным параметром, просто его надо добавить в EOperation.

clip_image032

clip_image033

9. Расширение EMF Ecore модели (наследование)

9.1. Обзор

EMF позволяет расширить существующие модели через наследование. Следующее определит базовую модель и расширение этой модели. Например, это можно использовать для расширения Eclipse e4 модели приложения. Так же мы покажем как работать с моделями EMF ecore без использования утилит ecore.

9.2. Пример

Создайте новый EMF проект "de.vogella.emf.inheritance". Создайте новую модель выбрав File -> New -> "Eclipse Modeling Framework" -> "Ecore Model". Назовите модель “base.ecore”. Выберите “EPackage” в качестве основы и введите следующие свойства в пэкадж.

clip_image034

Кликните правой кнопкой на пэкадже и выберите New Child -> EClass. Введите в “MyBaseClass” два атрибута типа EString. Создайте новую “Ecore” модель "extendedmodel.ecore”. Введите “extended” в качестве имя пэкаджа. Правой кнопкой нажмите на модели и выберите “Load resource”.

clip_image035

clip_image036

clip_image037

Создайте новый класс “MyExtendedClass” и нажмите “ESuperType”.

clip_image038

Добавьте ваш "MyBaseClass".

clip_image039

clip_image040

Введите новый атрибут "detailedField" в "MyExtendedClass".

clip_image041

Создайте новую genmodel “extended.genmodel” основанную на extended.ecore. Сгенерируется код Java и вы сможете увидеть, что “MyExtendedClass” расширяет “MyBaseClass”.

10. Задание пустой строки в качестве значения по умолчанию.

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

· Выберите атрибут

· В Property View нажмите на значении поля "Default Value Literal"

· Не вводите ничего.

Чтобы убрать это нажмите "Restore Default Value" в панели инструментов

14. Ссылки и литература

14.1. Код примеров

Source Code of Examples

14.2. EMF ресурсы

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

Комментариев нет:

Отправить комментарий