Eclipse Modeling Framework

Eclipse Modeling Framework (EMF) — фреймворк для моделирования, а также инфраструктура для генерации кода и приложений на основе структурированных моделей данных в области разработки программного обеспечения. Обычно, начиная со спецификации в виде модели XMI, EMF предоставляет инструменты для создания Java-классов, соответствующих модели, а также набор классов для адаптации элементов модели, чтобы их можно было визуализировать, редактировать с помощью командной системы и обрабатывать в редакторе.

История и разработка

Проект EMF был запущен компанией IBM с целью унификации инструментов разработки, использующих модели на основе EMOF. С открытием исходного кода платформы Eclipse, IBM передала проект EMF в Фонд Eclipse. Как и большинство проектов фонда, EMF распространяется под лицензией EPL. Разработка EMF ведётся на языке Java, исходный код проекта размещён на серверах фонда Eclipse. После перехода проектов фонда Eclipse на Git, код ряда подпроектов EMF доступен на GitHub[2]. В настоящее время EMF поддерживается фондом Eclipse. Высокая степень использования EMF в рамках проектов фонда обеспечивает их интероперабельность и возможность обмена данными с помощью моделей.

Структура проекта EMF

Проект EMF можно условно разделить на две основные части: ядро EMF и инструментарий EMF (EMFT).

EMF

Ядро EMF включает собственно фреймворк моделирования, инфраструктуру для генерации кода и обработки моделей EMF.

Моделирование

EMF позволяет создавать два типа моделей: с одной стороны, модели для определения концепций — так называемые метамодели, а с другой — экземпляры этих концепций. Например, можно определить метамодель с такими понятиями, как «Класс», «Операция» и «Атрибут», а затем использовать её для создания моделей, включающих, скажем, элемент «Класс» с именем «Автомобиль», «Операцию» с именем «ехать» и «Атрибут» «расход топлива». Любая модель EMF является экземпляром модели EMF, общей корневой точкой которой выступает модель Ecore, поставляемая с EMF. EMF даёт возможность не только создавать метамодель для нужных пользовательских концепций, но и создавать на её основе модели, манипулировать и расширять их с помощью соответствующих средств.

Пример моделирования

На первом этапе для простой работы с EMF создаётся Java-проект в Eclipse и определяется метамодель посредством создания нового файла типа «ecore» с помощью мастеров EMF.

Java-проект с моделью EMF

Внутри этой EMF-модели можно создать пакет, который является корнем определяемой метамодели. Представление «Свойства» в Eclipse позволяет указывать имя пакета, префикс и uri. Uri экземпляра пакета, полученного из Ecore, служит уникальным идентификатором метамодели.

Окно свойств для пакета в Eclipse

В пакете определяются различные понятия предметной области для их последующей обработки с помощью EMF. В приведённом примере заданы экземпляры классов Ecore, формализующие понятия простой библиотеки. На изображении ниже показан экземпляр понятия «пакет», четыре экземпляра класса, экземпляр перечисления, а также несколько экземпляров ссылок и атрибутов.

Метамодель «Library», определённая в EMF.

После создания метамодели её можно использовать в базовом редакторе файлов «ecore» для создания экземпляра понятия «Library». Следующая иллюстрация демонстрирует редактор EMF с экземплярами «Library», «Book», «Employee» и «Writer». При выборе элемента его атрибуты отображаются и доступны для редактирования в окне «Свойства».

Динамическая модель — экземпляр метамодели.

Этот пример иллюстрирует базовое использование EMF. Можно также инициализировать «ecore»-модель на основе набора Java-классов или файла «xsd». EMF поддерживает выбор формата сериализации моделей (по умолчанию XMI).

Ecore

Любая модель, созданная в EMF, так или иначе связана с Ecore. Ecore — это EMF-модель, формализующая основные концепты для работы с моделями в EMF. Все они имеют префикс «E»:

  • EAttribute
  • EAnnotation
  • EClass
  • EClassifier
  • EDataType
  • EEnum
  • EEnumLiteral
  • EFactory
  • EModelElement
  • ENamedElement
  • EObject
  • EOperation
  • EPackage
  • EParameter
  • EReference
  • EStructuralFeature
  • ETypedElement
  • EStringToStringMapEntry
  • EGenericType
  • ETypeParameter

Ecore включает также многочисленные типы данных, позволяя создавать EMF-модели без явного переопределения стандартных примитивов (EString, EBoolean, EInt, EFloat и др).

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

EMF содержит ряд генераторов кода для создания Java-классов из модели «ecore». Классическая генерация настраивается посредством EMF-модели с расширением «genmodel». Genmodel позволяет задать параметры генерации — авторские права, расположение файлов, соглашения по именованию, версию EMF и другие. Редактор genmodel предоставляет доступ к различным операциям генерации кода: можно создать как Java-код самого метамоделя, так и адаптерные классы для элементов модели, интегрированный в Eclipse редактор, а также тесты для экземпляров метамодели.

Сгенерированный EMF-код для модели.

В типовой ситуации EMF генерирует интерфейсы для концепций метамодели (например, в пакете org.eclipse.emf.model.library), классы-реализации соответствующих интерфейсов (в пакете org.eclipse.emf.model.library.impl) и два класса-утилиты, в том числе xxxFactory — реализация паттерна «Фабрика». Сгенерированный EMF-код включает множества механизмов по умолчанию, среди которых — нотификации о модификациях при работе с геттерами/сеттерами классов, отражательные методы доступа (например, «eGet», «eSet»). С помощью метода «eContainer()» можно легко определить контейнер экземпляра (например, для «Book» контейнером выступит корневая сущность «Library»).

В рамках Eclipse Modeling есть проекты для генерации кода по моделям EMF на различные платформы, например, Acceleo.

Визуализация

EMF позволяет по genmodel генерировать Java-код для визуализации EMF-моделей. Этот код формирует адаптеры для объектов метамодели, реализующие вывод текста и изображений для отображения элементов. Предоставляются иконки и локализованные описания по умолчанию.

Сгенерированный EMF-код для визуализации моделей.
Редактирование

EMF также генерирует Java-код для мастера и простого редактора EMF, который позволяет работать с метамоделью.

Сгенерированный EMF-код для редактора моделей.
Мастер создания нового экземпляра «Library»
Сгенерированный EMF-редактор в новой инстанции Eclipse.
Тесты

EMF может автоматически создавать структуру модульных тестов для проверки кода метамодели.

Сгенерированный EMF-код для тестирования моделей.

EMFT

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

Сравнение моделей

В EMFT существует проект EMF Compare для сравнения моделей, созданных с помощью EMF. EMF Compare позволяет выявлять различия и обеспечивать согласованность связанных EMF-моделей при выполнении, например, операций с системой управления версиями EGit. Если несколько моделей взаимозависимы, EMF Compare предотвращает частичное сохранение, при котором может быть нарушена согласованность между моделями. Доступно также графическое сравнение моделей.

Графическое сравнение моделей с EMF Compare.
Деревовидное сравнение с EMF Compare.
Обеспечение согласованности при помощи EMF Compare.

Совместное редактирование

В EMFT реализованы проекты для совместной работы с моделями EMF, например, CDO[3]. CDO — это фреймворк, позволяющий нескольким пользователям одновременно редактировать модели EMF, предотвращать конфликты, блокировать части модели и использовать систему контроля версий, аналогичную традиционным системам управления версиями.

CDO реализует транзакционное и многопользовательское хранение моделей EMF. Возможен ввод блокировок и точек сохранения, позволяющих откатить изменения. Внутри CDO модели могут эволюционировать параллельно с помощью системы ветвлений, схожей с SVN и Git. CDO поддерживает ленивую загрузку элементов моделей, что повышает масштабируемость EMF-приложений. Также предусмотрена работа в офлайн-режиме и механизмы устойчивости к ошибкам, например, автоматическое восстановление соединения.

Генерация графического интерфейса

Среди проектов EMFT есть EEF, целью которого является генерация более развитого графического интерфейса для редактирования моделей EMF по сравнению с базовым редактором. EEF позволяет создавать мастеры, редакторы и представления для Eclipse, предназначенные для редактирования EMF-моделей. Поддерживается и альтернативная генерация с помощью Acceleo.

Скриншот окна Eclipse, сгенерированного EEF.

Проект EMF и Eclipse Modeling

Популярность EMF привела к появлению многочисленных инициатив на его основе внутри фонда Eclipse в рамках проекта Eclipse Modeling, объединяющего решения, ориентированные на MDA.

Amalgamation

Проект Amalgamation управляет сборкой специализированного издания Eclipse для Eclipse Modeling. Дистрибутив доступен на странице загрузки Eclipse и включает набор средств, разработанных фондом Eclipse, для поддержки среды разработки под MDA. Для релиза Eclipse 3.7 Indigo сборка Amalgamation, помимо ядра платформы, содержит следующие инструменты:

  • org.eclipse.amalgam.discovery (специфические возможности сборки)
  • org.eclipse.cvs (инструменты для CVS)
  • org.eclipse.egit (инструменты для Git)
  • org.eclipse.emf.cdo.epp (CDO — фреймворк для совместной работы с моделями EMF)
  • org.eclipse.emf.compare.sdk (EMF Compare — фреймворк для сравнения моделей)
  • org.eclipse.emf.ecoretools.sdk (Ecore Tools — инструменты для EMF)
  • org.eclipse.emf.eef.codegen.ecore (EEF — генерация графического интерфейса для редактирования EMF-моделей)
  • org.eclipse.emf.query.sdk (EMF Query — фреймворк для запросов по моделям EMF)
  • org.eclipse.emf.sdk (EMF — фреймворк моделирования)
  • org.eclipse.emf.transaction.sdk (EMF Transaction — фреймворк транзакционного управления для EMF)
  • org.eclipse.emf.validation.sdk (EMF Validation — фреймворк валидации моделей EMF)
  • org.eclipse.gmf.runtime.sdk (GMF — фреймворк графического моделирования для EMF)
  • org.eclipse.mylyn (Mylyn — инструмент управления задачами)
  • org.eclipse.ocl.all.sdk (OCL — эталонная реализация языка OCL от OMG, используемого в частности для определения ограничений и запросов к моделям EMF)
  • org.eclipse.uml2.sdk (UML — реализация UML-метамодели на базе EMF и связанный инструментарий)
  • org.eclipse.xsd.sdk (XSD — средства для работы с XSD-файлами)

UML

В рамках Eclipse Modeling развивается реализация стандарта UML на базе EMF. Она включает UML-метамодель и редакторы для диаграмм классов, деятельности, вариантов использования и др.

Трансформация моделей в модели

Среди проектов Eclipse Modeling выделяется ATL, предназначенный для трансформации моделей в другие модели. ATL вдохновлён стандартом QVT, предложенным OMG.

Генерация кода

В Eclipse Modeling интегрированы проекты для генерации кода на основе EMF-моделей. Среди них — Acceleo, реализующий стандартный язык преобразования модели в текст (MOFM2T) от OMG. В отличие от базовой генерации кода в EMF, Acceleo позволяет создавать код для любых целевых технологий (Java, Scala, Ruby и др.). Поддержка EMF-моделей обеспечивает генерацию кода для любых метамоделей, включая UML, SysML, а также моделей из прикладных предметных областей (например, «Library»).

Графическое моделирование

Eclipse Modeling включает также проекты для графической работы с EMF-моделями, такие как Graphical Modeling Framework (GMF) и Graphiti.

Будущее EMF

Платформа Eclipse 4

За счёт широкого внедрения EMF во многих проектах фонда Eclipse, EMF вошёл в состав ядра новой платформы Eclipse 4.

Примечания

Ссылки