Saturday, April 11, 2015

Introduction to Model-Driven Development, UML-EMF Modeling in Eclipse IDE

C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\sirius_ecore_tools.png

Eclipse - популярная free open source IDE для разработки софта на Java. Альтернативы: IntelliJ IDEA, Android Studio (based on IntelliJ IDEA), Oracle NetBeans. В этой статье рассказывается об особенностях Model-Driven Development в Eclipse. 

При помощи UML/MDD в Eclipse можно генерить для вашего DSL типовые редакторы  следующих типов: IDE типа Eclipse, редактор диаграмм типа Visio, стандартные treeview/table/forms редакторы. Например, можно сгенерить custom IDE с syntax highlighting и компилятором для специализированного DSL языка программирования с заданным вами custom syntax или редактор диаграмм типа Visio с drag-and-drop и др. функциональностью для вашей конкретной задачи или набор UI диалогов для DB-приложения с auto-validation всех полей ввода итд. Статья является обзором Modeling тулов под Eclipse, при помощи кот. все это делается.




Rev.1.0 / 15.03.2015 / Work in Progress...

Read this article in Google Docs: Full Article in Google Doc, paginated


5)    Sirius   
6)    EcoreTools   
7)    Extended Editing Framework (EEF)   
8)    EMF Client Platform (ECP)/EMF Forms   
9)    eTrice   
10)    Sphinx   
11)    xText   
12)    Papyrus   
13)    ObjectAid UML Explorer   
14)    Acceleo   
15)    UML2   
16)    UML2Tools   
Сводная таблица функциональности   
Ссылки   


Introduction





Model-Driven Development/Engineering/Architecture (MDD/MDE/MDA) или CASE/UML - все эти термины относятся к Rapid/Agile Development (быстрая разработка кода) и обозначают процесс разработки софта, при кот. программист-архитектор в специальном CASE/UML tool/framework сначала создает архитектуру системы, описывает ее structurе (модель данных из классов с основными атрибутами и методами, взаимосвязи между ними) и behavior (process flow, activity, sequence, use cases сценарии работы пользователей). Затем генерится код на указанном языке и под нужную платформу уже с UI, auto-validation и шаблонами методов. После этого в код и исходную модель можно продолжать вносить изменения и генерить новый код с их сохранением после каждой итерации.

В MDD различают модели: Platform-Independent (PIM, бизнес-логика системы), Platform-Specific (PSM, конкретная реализация PIM для данной OS, данного языка программирования, заданного UI renderer и с учетом др. ограничений) и Code model (сгенеренный по PSM код). Весь сгенеренный код еще называют implementation artifacts, т.к. кроме executable кода могут генериться XML/Database Schema/XSD с данными/стилями. Ключевое понятие MDD - MetaObject Facility (MOF) - спецификация для meta modeling languages, кот. гарантирует сохранение семантики UML structural/behavioral models, CWM data models при импорте/экспорте через XMI и обработке разными генераторами кода.

MDD в основном используется для создания Enterprise приложений, разработки архитектуры сложных систем, но его можно использовать и для обычных приложений. Термины MDD/MDA используются для обозначения процесса разработки по стандартам Object Management Group (OMG), а MDE - более общий термин, не предполагающий строгое соответствие OMG стандарту.

MDD позволяет генерить готовые типовые приложения, но, как правило, это лишь удобное визуальное представление declaration классов со стандартными методами и databinding привязкой к базовому UI через XML и соотв. listeners, готовый примитивный wireframe каркас для будущего приложения. Программисту все равно нужно следить за dependencies, самому писать implementation всех application-specific методов, реализовывать thread-safe и async если нужно, file/data/resource management, запросы к web/database итд.

MDD предполагает, что ваша задача может быть представлена в виде конечной модели или набора моделей, в кот. описаны базовые взаимодействия между всеми элементами, и в итоге вы хотите получить некий редактор для работы с данными/анализа этой модели или моделирования других моделей на ее основе. В общем случае таким типовым редактором будет: IDE (текстовый редактор, готовая среда программирования типа Eclipse для вашего custom syntax языка), редактор диаграмм (visual редактор типа Visio с custom tools/templates для манипуляций элементами вашей модели в виде shapes), treeview редактор (в нем элементы представляются в виде дерева, у кот. можно редактировать nodes), table/forms редактор (в нем значения данных задаются в текстовых полях форм и ячейках таблиц).

Желаемый тип редактора и особенности задачи уже диктуют выбор тула. Редактор диаграмм имеет смысл когда множество данных модели конечно - манипулировать тысячами элементов в Visio будет неудобно. В этом случае скорее подойдет treeview/forms редактор, но, поскольку все данные модели редактор хранит в XML, нативная работа с большой database в виде XML скорее будет медленной и неэффективной.

Преимущества MDD:

  • multi-platform, multi-language - нет привязки модели к конкретному языку/платформе/IDE. Модели реализуют спецификацию UML2/BPNM, данные хранятся в XML формате XMI, кот. поддерживается многими modeling tools. Весь код под нужную платформу генерит platform-specific renderer MDD тула.
  • ускоряет процесс создания приложений на 30%, т.к. программисту приходится писать меньше кода самому. Одним кликом генерятся тысячи строк кода.
  • снижается количество ошибок, потому что сгенеренный код по определению "правильный", имеет типовую структуру. Это особенно актуально на ранних этапах разработки когда очень часто меняются модель и UI по feedback от юзера.
  • для того чтобы понять большой код, взаимодействие и наследование между основными классами, достаточно одного взгляда на диаграмму модели данных, это упрощает ведение документации и review кода при работе в команде.
  • shared код можно использовать в других проектах даже не на уровне библиотек, а на уровне моделей данных. Над моделями можно проводить операции: отображать модели одна в другую, строить новые модели на их основе.
  • можно генерить готовые типовые приложения с базовой функциональностью, заменять/дополнять ее своей, писать custom UI, подключать внешние библиотеки.

Чтобы было понятнее, о чем пойдет речь и для каких приложений применимо MDD, ниже приводятся примеры visual редакторов диаграмм, созданных на базе Sirius (см. https://www.eclipse.org/sirius/gallery.html):

UML Designer:


Ecore Tools Designer:

Database Designer:
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\sirius_database.png

Arduino Designer:

C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\sirius_arduino.png

Intel Home Designer:

C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\sirius_intelhome.png

MIMIC - MDD средство разработки mobile приложений под iOS/Android
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\sirius_mimic.png
Risk Analysis Designer:

C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\sirius-risk_analysis_designer.png

Eclipse


Eclipse является open source IDE с очень гибкой конфигурацией и функциональностью. У нее модульная структура, она сама является готовой RCP framework платформой для запуска приложений. Различные версии модулей могут конфликтовать друг с другом и требовать разные версии Java и используемых API, поэтому лучше устанавливать готовую package сборку с сайта. У Eclipse есть базовая IDE/документация и отдельные Projects (official и нет), кот. устанавливаются дополнительно - они описываются на сайте Eclipse и поддерживаются благодаря конкретным людям. Поэтому, в отличие от solid Visual Studio, Eclipse выглядит разрозненным набором модулей: часто под рукой нет полной, исчерпывающей, актуальной документации с нужными примерами и в удобном формате - приходится собирать информацию по крупицам или читать длинные книжки, тратить много времени. Обычно есть API в javadoc, краткое описание и пара примеров/demo (иногда уже устаревших), какой-нибудь example project тоже бывает сложно найти.

Какая-либо видимая стандартизация в подходах к разработке модулей (кроме того факта, что они все друг друга используют) также отсутствует. Кроме того, в Eclipse мало visual tools, например, Java программисты каждый раз пишут классы для UI приложения с нуля (это вызывает удивление) при помощи базовых frameworks и по мере разработки устанавливают и подключают новые модули. С другой стороны, в отличие от монстра Visual Studio, установка Eclipse - просто распаковка архива в папку (и, соответственно, удаление), поиск и загрузка нужных модулей с web hubs через IDE занимают пару минут, есть Installation History, conflict resolution при установке модулей, интеграция с GitHub, в общем, это популярная, легкая, удобная и гибкая IDE.

Отличия Eclipse от Visual Studio:

  • есть x64 версия
  • быстрая установка/удаление - распаковка архива package в любую папку
  • поддержка Android (это тоже Java) через доп.модули
  • поддержка multi-platform - есть версии Eclipse под разные платформы кот. работают с Java.
  • Eclipse является RCP platform под кот. можно разрабатывать конечные приложения в виде плагинов. При помощи modeling tools Eclipse может за пару кликов сгенерить, например, полную custom версию IDE с syntax highlighting созданного вами специализированного языка программирования со своим custom syntax или полнофункциональный редактор диаграмм типа Visio для вашей конкретной задачи или набор UI диалогов для DB-приложения с auto-validation всех полей ввода.
  • есть real-time perspective - полностью контекстная фильтрация IDE UI: всех меню, project tree, всех windows итд - в зависимости от выбранного типа задачи отображаются только необходимые элементы UI и появляется новая функциональность.
  • всегда может сгенерить UML диаграмму по коду
  • проблемы с документацией
  • могут быть конфликты между модулями и API разных версий/сборок
  • built-in поиск и загрузка нужных модулей через IDE, history, conflict resolution
  • интеграция с GitHub


Eclipse IDE работает на Java, поэтому перед запуском Eclipse нужно поставить Java SE SDK (текущая версия Java SE 8) - одного только JRE будет недостаточно.  http://www.oracle.com/technetwork/java/javase/downloads/index.html Если у вас Windows x64 и вы сомневаетесь - ставьте Java JDK x64 и Eclipse x64. Если установлено несколько версий Java можно указать в IDE какую из них использовать.

Eclipse распространяется в виде нескольких packages (актуальная версия 4.4 Luna). В каждой версии Eclipse указано какую min версию Java она поддерживает. Для работы с CASE/UML вам понадобится Eclipse Modeling Tools package. Названия packages могут меняться - если вы не можете найти Modeling Tools на http://www.eclipse.org/downloads/ - попробуйте установить базовый Eclipse IDE for Java Developers. Вообще, неважно, какой package вы установите - все нужные модули можно скачать и установить позже из IDE. Для некоторых модулей нужно также прописывать path к Java root или bin в JAVA_HOME или Options.


Особенности работы с EMF/UML в Eclipse

Забегая вперед, для разработки приложений под Eclipse при помощи UML диаграмм вам понадобятся модули:
  • IDE: Eclipse Modeling Tools или Eclipse IDE for Java Developers + EMF/GMF/EEF/Acceleo + EcoreTools2 + UML2. Перечисленные модули входят в Eclipse Modeling Tools. EEF SDK нужно устанавливать дополнительно.
  • EcoreTools 2 - для создания EMF meta-моделей с нуля в удобном visual редакторе диаграмм типа Visio.
  • EMF Client Platform - для разработки приложений с form-based UI/table editors для instance EMF моделей (в тч. databases с master-detail диалогами)
  • Graphiti/Sirius/Papyrus - для разработки visual editors типа Visio для создания диаграмм EMF instance моделей с custom shapes, стилями и функциональностью.
  • eTrice - для создания и разработки visual editors для ROOM state-based моделей, отличных от EMF
  • xText/Sphinx/Papyrus для создания специализированных IDE для разработки DSL языков с custom syntax на базе EMF модели
  • ObjectAid - для отображения имеющегося Java кода в виде UML диаграммы
  • Acceleo - для генерации Java кода по EMF/UML модели и custom M2T template, acceleo expressions, отличающейся от используемых в EMF/GMF
  • UML2/UMLTools/UML Designer/txtUML/Papyrus - в случае если необходима более полная поддержка UML 2.x, моделирование на UML

Ниже приведена диаграмма архитектуры/взаимосвязей между различными EMF Modeling Tools в Eclipse. Верхние слои построены на базе/используют нижние. Синим цветом обозначены тулы, созданные при помощи IDE xText (инструменты для создания редакторов, генерящие код), оранжевым - при помощи Sirius (готовые редакторы диаграмм, кот. ничего не генерят).
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0433_EMF_tools_architecture.jpg

UML моделирование под Eclipse основано на EMF/Ecore (EMF = MOF subset of UML, см. EMF). Принятые в Eclipse модели не строго соответствуют стандартам OMG: реализации Ecore, M2M, M2Т лишь частично аппроксимируют соотв. спецификации EMOF, QVT, MOF2Text.

При разработке EMF/UML приложений в Eclipse используется 2 Eclipse-окна: основное и runtime-окно. Почти все упомянутые тулы/frameworks используют EMF/GMF и принцип работы везде один и тот же. В дальнейшем нужно различать visual редакторы диаграмм для основного и runtime окна. Первый является частью тула и предоставляется по умолчанию для редактирования исходной meta-модели в основном окне, второй - генерится тулом полностью или наполовину для редактирования instance-модели в runtime окне и последующей модификации функциональности.

Эти редакторы внешне очень похожи, просто в одном случае вы манипулируете классами модели (например, EClass Author ссылается на Book - между квадратиками классов рисуется стрелочка), в другом - их конкретными значениями (например, instance класса Author с именем John написал/ссылается на instances класса Book с названиями Bible и Moby-Dick - между John и Bible, John и Moby-Dick рисуются стрелочки). Объекты John, Bible, Moby-Dick - образуют DSL - Domain Specific Language. Частным случаем DSL может быть EClass нотация, т.е. мы можем генерить свой visual редактор для EClass EMF instance-моделей в runtime окне (аналог EcoreTools) с какой-то новой функциональностью, используя visual редактор тула на базе этих же EClass EMF meta-моделей в основном окне (Sirius, EcoreTools). И это вносит определенную путаницу.

Итак, сначала вы создаете meta-model (platform-independent PIM) в основном окне Eclipse IDE: либо импортируете, либо пишете код вручную, либо в удобном визуальном редакторе диаграмм одного из тулов, либо в примитивном treeview редакторе EMF. Затем генерите по ней .genmodel (платформозависимая часть meta-модели PSM для привязки параметров генератора, путей к файлам итд к meta-model) - при изменении meta-model IDE обновляет .genmodel автоматически. Затем по genmodel пишется вручную с нуля (GEF) или генерится (Sirius, GMF итд) platform-specific редактор для модели в виде плагина для Eclipse. Причем, treeview/forms based редактор генерится готовый целиком, а графический редактор диаграмм только наполовину - все стили для отображения элементов instance-модели надо задавать вручную - присваивать им shapes, цвета, типы линий, создавать виды для их отображения.

Полученный редактор запускается во втором окне Eclipse и в нем вы создаете проект с instance model, вводите данные, делаете валидацию, сохраняете. После этого вносите изменения в модель/код модели (проект model), код редактора (проект .edit) в первом окне и стили/виды элементов instance модели во втором окне и цикл повторяется. То что вы видите во втором окне - результат вашей работы - специализированный редактор данных для вашей модели. Вся оставшаяся функциональность, не связанная с отображением и редактированием элементов модели, реализуется программистом отдельно самостоятельно (можно без использования модели через вызовы внешних библиотек).

C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0435_EMF_workflow.jpg

Вместе с готовым кодом в EObject нотации также генерится Factory для объектов и методов модели. Factory является одним из ключевых понятий UML/EMF моделирования и позволяет программно создавать/обращаться к любым элементам модели в коде.


Основные этапы:
  • создать Modeling Project или конвертировать в него имеющийся обычный Project, выставить Modeling perspective или perspective конкретного модуля в UI (например Sirius perspective)
  • создать Ecore EMF/UML meta-модель с данными и properties (platform-independent PIM) или импортировать (XMI, UML, import/export/map to other model etc), описать все взаимосвязи/constraints между ними, указать package dependencies, добавить комментарии/документацию.
  • создать привязку genmodel (platform-specific PSM) к meta-модели, задать параметры генерации кода, namespaces, пути к файлам итд. Некоторые тулы автоматически создают genmodel и этот шаг не нужен.
  • по genmodel сгенерить 3 sibling проекта: сам проект model (в src будет Java код модели с использованием EMF EObject нотации и Factory для объектов), .edit (platform-specific редактор модели и его adapters/listeners с использованием GEF API), .editor (вспомогательный код для запуска редактора модели .edit в виде плагина для Eclipse)
  • запустить model проект во втором runtime Eclipse окне через Run As Eclipse Application или через созданный в Options спец. configuration с параметрами для его запуска.
  • в runtime Eclipse окне создать проект с instance модели, ввести в нее данные (populate, или inflate в Java)
  • добавить/изменить функциональность. Менять функциональность можно как в основном так и в runtime Eclipse окне. Если нужно внести изменения в саму модель и ее UI - сгенерите заново файлы в основном окне. Если же нужно просто изменить стиль отображения элементов instance-модели в одном из видов и visual editor тула это позволяет - можно это сделать прямо в runtime-окне.
  • сделать tests/validation
  • Цель: в итоге получить готовое специализированное приложение-редактор данных для вашей модели. Условно редактор может быть IDE, диаграмм, treeview или табличного/forms типа.


Нужно отметить, что в конце всех манипуляций с EML/UML вы получаете не просто java код с main, а специализированное RCP (Rich Client Platform) приложение-плагин для Eclipse IDE с EObject API. Т.е. созданные вами модель и редактор для нее будут работать только в виде плагина под Eclipse IDE с EMF. В самом конце вы просто убираете из окна Eclipse IDE весь UI не относящийся к редактору модели и ненужные модули, оставляете только пустой Canvas и ядро Eclipse с Core классами + все dependencies EMF и использованного поверх него тула (все это задается в опциях компиляции/запуска приложения) и компилируете финальный RCP. Это и будет вашим результатом.

Основные Modeling Tools для Eclipse

  1. Eclipse Modeling Framework (EMF)


EMF - built-in framework под Eclipse для разработки и хранения Ecore моделей данных и взаимосвязей между ними. Основной modeling framework, используется всеми остальными. EMF для моделирования meta-модели в чистом виде не используется, т.к. рисовать диаграммы классов, например, в EcoreTools гораздо удобнее, чем бесконечно добавлять узлы в treeview/table. Редактор instance-модели он тоже генерит совсем простенький - для этого больше подходит более мощная надстройка ECP/EMF Forms. Тем не менее, EMF имеет смысл знать, т.к. чтобы реализовать какую-нибудь custom функциональность вам все равно придется манипулировать данными модели в сгенеренном коде, независимо от выбранного тула-надстройки. Особенности EMF:

  • Есть: Treeview редактор EMF meta-модели. Генерит: Treeview редактор EMF instance-модели
  • EMF/ECore - подмножество стандарта UML, состоящее из диаграмм классов/Entities, без диаграмм Actors/Use Cases и других. При этом вместо диаграмм - treeview редактор для дерева модели, в кот. узлы являются классами. Отображение/редактирование модели в виде диаграмм реализуют другие модули (GMF, EcoreTools итд).
  • в EMF различают 2 типа моделей: абстрактная meta-model (состоящая из платформо-независимой .ecore части и дополняющей ее платформозависимой .genmodel с привязкой к параметрам генератора) и созданная на основе genmodel instance-model с уже конкретными заданными значениями.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0436_EMF_models.jpg
  • все данные модели хранятся в model.ecore проекте в XML файле, есть import/export данных модели в формате XMI (XML). В проекте может быть несколько моделей, их данные могут взаимодействовать друг с другом как классы, можно импортировать модели из других проектов.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0354_EMF_ecore.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0378_EMF_ecore.jpg
  • для работы со всеми типами моделей используется примитивный визуальный TreeView XMI editor, в кот. можно создавать/копировать nodes узлы модели и задавать их Properties, Operations (методы класса) и связи References между ними. В случае meta-model вы создаете Properties (например, name: AgentName, type: EString), а в случае instance model - присваиваете им значения (например, AgentName: Jack Bauer).
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0356_EMF_genmodel.jpgC:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0369_EMF_add_node.jpg
  • в EMF есть следующие типы EReference: Association (объект класса A ссылается на объект класса B, обычная ссылка отношений 1:1, 1:N или N:N между объектами), Aggregation/Composition (объект класса A содержит объект класса B, containment, для каскадного удаления есть спец. поле в properties EReference), Generalization/Inheritance (объект класса A наследуется от объекта класса B, inheritance, ссылка на super class)
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0438_aggregation_composition.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0439_UML_connectors.jpg
  • в общем случае для графа модели EMF генерит несвязанный набор Treeview редакторов для каждой hierarchy модели с заданным root узлом в кот. есть lookup полей других treeviews. Таких treeviews для работы с деревьями на базе одной модели может быть несколько. Например, в отдельном treeview редакторе вы заводите имена игроков, затем в другом типовом treeview редакторе вы создаете команды из конкретных игроков, используя примитивный lookup. Поля для lookup надо задавать вручную - по умолчанию эти редакторы и поля в них никак не связаны. Все это похоже лишь на примитивный каркас, а не на UI для конечного юзера.
  • модели также можно создавать программно в Java коде с использованием специальной EObject (EClass/EAttribute/EReference/EOperation) Java нотации, в кот. все базовые Java-классы заменяются соответствующими E-классами. См. EObject/EClass API http://download.eclipse.org/modeling/emf/emf/javadoc/2.4.3/org/eclipse/emf/ecore/package-summary.html и XMI spec http://www.omg.org/spec/XMI/
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\EcoreHierarchy.gif
  • Java код, кот. генерится - это не чистая POJO Java, а EСlass Java-нотация. Это нужно для повышения эффективности кода и reverse engineering модели - возможности вносить/сохранять изменения в Java коде. Генерить обычный Java код нельзя, во всяком случае Suppress EMF Types в genmodel параметрах это не делает и нужны сложные custom доработки генератора.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0357_EMF_genmodel.jpg
  • кроме созданных в модели EClass Java классов также генерится куча вспомогательного кода - Factory и Package классы - это сам EMF/EClass framework со своими dependencies. Factory и Package - model-specific классы. Factory позволяет программно создавать EClass объекты данной модели в Java коде, а Package нужен для доступа к meta-данным модели или поддержки работы с классами в редакторе модели.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0375_EMF_AdapterFactory.jpg
  • на одном уровне с ecore model проектом также генерятся вспомогательные проекты .edit, .editor, .tests - это код для редактора модели и его Adapters (Listeners), код для запуска редактора модели через Eclipse plugin и unit tests модели.
  • процесс разработки итерационный: создаются meta-модель и genmodel, генерится EClass Java-код, в модель/код вносятся изменения, снова генерится новый код с учетом изменений, создается instance model и редактор для нее, вводятся данные, делается их validation итд. Чтобы сохранить изменения нужно в коде у класса убрать метку @generated или добавить @generated NOT и он больше не будет генериться. Диаграмму EMF workflow см. выше в особенностях работы с EMF.
  • можно cгенерить Ecore модель из имеющегося обычного Java-кода при помощи спец.плагина, но эта операция не полностью автоматическая и требует вмешательства программиста. Такая модель генерится по выборке Java-классов, надо указывать доп. параметры, видимость и подключаемые через import библиотеки и в итоге вы все равно получите новый код в EClass нотации + XML с данными.
  • все классы в EClass нотации для более эффективной работы с кодом принудительно разделяются на interface (содержат только определения методов) и implementation (содержат override-реализацию методов) составляющие и разносятся в различные файлы.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0374_EMF_library.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0359_EMF_LibraryImpl.jpg

  • все классы в EClass нотации автоматом генерятся с соотв. get/set методами, причем в каждый set встроен Push Notification для соотв. UI listener редактора модели - default bi-directional data binding автоматический. Также можно подписываться и самому обрабатывать события изменения данных.
  • EMF не thread-safe, Data structures are unsynchronized, т.е. все работает на одном UI thread и предполагается что вся модель целиком и все данные доступны локально, синхронизацию и внешний data access нужно реализовывать отдельно.
  • полученный treeview editor модели будет RCP приложением, кот. работает только как плагин под Eclipse



Для Java класса Item:

// declare class
public class Item {
  String type;
  int quantity;
  float price;

  public Item() {
  }

  public void setType(String _type) {
     type = _type;
  }

  public void setQuantity(int _quantity) {
     quantity = _quantity;
  }

  public void setPrice(float _price) {
     price = _price;
  }

  public static void main(String[] args){
     // create class instance and initialize properties
     Item myItem = new Item();
     myItem.setType("Apples");
     myItem.setQuantity(12);
     myItem.setPrice(0.50);
  }

}

Пример XMI файла с объектом модели Item:

<?xml version="1.0" encoding="UTF-8"?>
<ecore:EPackage xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="po"
   nsURI="http://www.example.com/SimplePO" nsPrefix="po">
 <eClassifiers xsi:type="ecore:EClass" name="Item">
   <eStructuralFeatures xsi:type="ecore:EAttribute" name="type"
       eType="ecore:EDataType
              http://www.eclipse.org/emf/2002/Ecore#//EString"/>
   <eStructuralFeatures xsi:type="ecore:EAttribute" name="quantity"
       eType="ecore:EDataType
              http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
   <eStructuralFeatures xsi:type="ecore:EAttribute" name="price"
       eType="ecore:EDataType
              http://www.eclipse.org/emf/2002/Ecore#//EFloat"/>
 </eClassifiers>
</ecore:EPackage>

Пример создания объекта Item и присвоения значений его атрибутам в EClass нотации:

EPackage itemsPackage = EcoreFactory.eINSTANCE.createEPackage();

// declare class
EClass itemClass = EcoreFactory.eINSTANCE.createEClass();
itemClass.setName("Item");

EAttribute typeAttribute = EcoreFactory.eINSTANCE.createEAttribute();
typeAttribute.setName("Type");
typeAttribute.setEType(EcorePackage.eINSTANCE.getEString());
itemClass.getEAttributes().add(typeAttribute);

EAttribute quantityAttribute = EcoreFactory.eINSTANCE.createEAttribute();
quantityAttribute.setName("Quantity");
quantityAttribute.setEType(EcorePackage.eINSTANCE.getEInt());
itemClass.getEAttributes().add(quantityAttribute);

EAttribute priceAttribute = EcoreFactory.eINSTANCE.createEAttribute();
priceAttribute.setName("Price");
priceAttribute.setEType(EcorePackage.eINSTANCE.getEDouble());
itemClass.getEAttributes().add(priceAttribute);

itemsPackage.getEClassifiers().add(itemClass);

// create class instance and initialize attributes
Item myItem = ItemsFactory.eINSTANCE.createItem();
myItem.setType("Apples");
myItem.setQuantity(12);
myItem.setPrice(0.50);
itemClass.getItems().add(myItem);



  1. Graphical Editing Framework (GEF)


GEF - built-in framework под Eclipse для разработки специализированных графических редакторов для Ecore моделей вручную. Основной modeling framework для графики, используется всеми остальными. GEF не имеет смысла изучать, т.к. над ним есть как минимум надстройка GMF (и еще несколько), кот. генерит GEF код редактора автоматом. Особенности GEF:
  • Есть: нет редактора, весь код пишется вручную. Генерит: ничего не генерит.
  • GEF - это отдельный EClass API кот. позволяет манипулировать в коде данными исходной EMF Ecore модели, привязывать их к элементам UI и программировать их функциональность для создания специализированного visual редактора под Eclipse для этой модели. Принципиальные отличия от EMF: 1. GEF сам не создает EMF модель, а использует готовую 2. вместо примитивного default Treeview редактора, кот. генерит EMF, можно написать полноценный visual редактор диаграмм типа Visio, но вручную. 3. нет отдельного wizard для создания GEF проекта - за основу берется готовая EMF модель и вручную модифицируется сгенеренный по ней код.
  • GEF состоит из 3 базовых компонентов: Draw2d, Zest (JFace wrapper for GEF), GEF (использует стандартную MVC модель: Model-View-Controller кот. соответствуют Model, View, EditorParts классы). См. API http://help.eclipse.org/luna/nav/26_1_0  Текущая версия GEF4 находится в разработке, для нее нет API.
  • полученный visual editor модели все равно будет RCP приложением, кот. работает только как плагин под Eclipse, хотя в доках есть упоминание о JavaFX layer, кот. позволяет обойтись без Eclipse.
  • ограниченная поддержка multi-touch в Zest
  • потенциальные ограничения GEF (и, как следствие, GMF): int координаты, нет alpha channel, нет hardware acceleration. 


Пример кода на GEF:

public class View extends ViewPart {
    // Use a standard Viewer for the Draw2d canvas
    private ScrollingGraphicalViewer viewer = new ScrollingGraphicalViewer();
    // Use standard RootEditPart as holder for all other edit parts
    private RootEditPart rootEditPart = new FreeformGraphicalRootEditPart();
    // Custom EditPartFactory
    private EditPartFactory editPartFactory = new GraphicalPartFactory();
    // The model
    private Model model;
    // create and initialize the viewer
    public void createPartControl(Composite parent) {
        // Create a dummy model
        model = new Model();
        // Initialize the viewer with RCP parent window
        viewer.createControl(parent);
        viewer.setRootEditPart(rootEditPart);
        viewer.setEditPartFactory(editPartFactory);
        // Inject the model into the viewer
        viewer.setContents(model);
        // Set view background to white
        viewer.getControl().setBackground(new Color(null, 255, 255, 255));
    }
}

  1. Graphical Modeling Framework (GMF)


GMF - built-in framework под Eclipse для создания visual редактора модели с использованием GEF API, общий термин для EMF и GEF. В GMF есть примитивный visual редактор диаграмм, GMF позволяет полуавтоматически генерить специализированные графические редакторы для Ecore моделей типа очень урезанного Visio. GMF морально устарел, сейчас есть более удобные visual тулы для создания редакторов типа Papyrus и Sirius и производные от них. GMF имеет смысл устанавливать только для быстрого отображения ecore моделей в виде диаграмм, если не нравится новый более удобный EcoreTools. Особенности GMF:
  • Есть: visual редактор диаграмм EMF meta-модели. Генерит: наполовину готовый visual редактор диаграмм EMF instance-модели, кот. доводится вручную в mapping редакторе.
  • GEF позволяет манипулировать данными EMF модели и кодить UI и функциональность будущего редактора вручную, а GMF может мапить семантику исходной модели на ее графическое представление (в специальном mapping редакторе) и потом сам генерит готовый примитивный visual редактор c default функциональностью, используя GEF API.
  • GMF - это также визуальное дополнение к GEF, примитивный visual редактор диаграмм meta-модели для основного окна Eclipse вместо стандартного Treeview редактора EMF.
  • чтобы открыть *.ecore в виде диаграммы нужно сделать стандартный для GMF right-click/Initialize ecore_diagram diagram.
  • в редакторе диаграмм можно с нуля создавать диаграммы из EClasses EMF модели и из обычных shapes, указывать EAttributes, EDatatypes, EOperations и их взаимосвязи EReferences. Эти диаграммы сохраняются в gmf файле, данные о модели - в файле модели. Можно писать комменты к элементам диаграммы в виде сносок. На экране внизу - Ecore модель и соответствующая ей GMF диаграмма.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0395_GMF_sample_model_diagram.jpg
  • данные исходной модели и новой диаграммы synchronized, т.е. по умолчанию создается диаграмма со всеми классами модели и их взаимосвязями, добавлять другие классы через Add related или drag&drop нельзя.
  • есть tools palette, стили, element selection и auto layout, можно задавать тип connection стрелки, можно редактировать названия элементов и properties прямо на диаграмме. Можно строить диаграммы из базовых shapes. Редактор примитивный и не всегда интуитивный. Нет custom toolbar, использует общий с IDE main toolbar.
  • GMF использует: GMFGraph (graphical definition model - описывает графическое представление shapes элементов диаграммы), GMFTool (tooling definition model - описывает функциональность tool palette редактора диаграмм), GMFMap (mapping definition model - привязка функциональности редактора к EMF meta-модели, graphical definition и tooling definition. Для всех моделей используется стандартный EMF treeview редактор.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0412_GMFGraph_editor.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0420_GMFTool_editor.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0417_GMFMap_editor.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0425_GMFGen_editor.jpg
  • процесс разработки по прежнему итерационный: создаются EMF meta-модель и genmodel, генерится EClass Java-код для модели model и редактора .edit, последовательно генерятся GMFGraph, GMFTool, в Mapping редакторе вручную задаются взаимосвязи между элементами всех моделей для GMFMap, генерится gmf код редактора, в модель/код вносятся изменения (включая UI функциональность редактора), генерится новый код с учетом изменений, создается instance model и запускается visual редактор для нее, в instance создается диаграмма с данными итд. Все то же самое, только вместо Treeview - Visio с диаграммой модели. Чтобы не запутаться в последовательности действий лучше создать пустой GMF проект с Dashboard галкой и делать все по стрелкам Dashboard (derive/select/create/combine/generate). На диаграмме синим обозначен традиционный EMF workflow, зеленым - новые процессы от GMF.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0421_GMF_dashboard.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0441_GMF_models.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0454_GMF_workflow.jpg

  • Во время пошагового выполнения tutorial нужно быть очень внимательным при создании GMFGraph и GMFTool, и не забыть сделать deselect all в диалоге редактора перед выставлением окончательных галок для всего кроме двух topics на скринах.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0398_GMF_tooling_dialog.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0411_GMF_graphical_definition_dialog.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0413_GMF_Mapping_dialog.jpg
  • в случае ошибки в OCL из-за Java версии во время генерации кода Error: Problems while generating code Exception (Boolean expected (was: org.eclipse.ocl.ecore.internal.OCLStandardLibraryImpl$)) нужно выставить в properties .genmodel Compliance level = 6.0 вместо 7.0 или 8.0
  • потенциальные ограничения GMF и всех прочих тулов-надстроек, использующих GEF: int координаты, нет alpha channel, нет hardware acceleration. 
  • есть поддержка UML/BPNM диаграмм
  • полученный visual editor модели все равно будет RCP приложением, кот. работает только как плагин под Eclipse.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0426_GMF_diagram_editor.jpg




Пример Zest API кода, кот. генерится GMF:

public static void main(String[] args) {
    // Create the shell
    Display d = new Display();
    Shell shell = new Shell(d);
    shell.setText("GraphSnippet1");
    shell.setLayout(new FillLayout());
    shell.setSize(400, 400);

    Graph g = new Graph(shell, SWT.NONE);

    GraphNode n = new GraphNode(g, SWT.NONE, "Paper");
    GraphNode n2 = new GraphNode(g, SWT.NONE, "Rock");
    GraphNode n3 = new GraphNode(g, SWT.NONE, "Scissors");
    new GraphConnection(g, SWT.NONE, n, n2);
    new GraphConnection(g, SWT.NONE, n2, n3);
    new GraphConnection(g, SWT.NONE, n3, n);
         g.setLayoutAlgorithm(new SpringLayoutAlgorithm(
                   LayoutStyles.NO_LAYOUT_NODE_RESIZING),true);

    shell.open();
    while (!shell.isDisposed()) {
        while (!d.readAndDispatch()) {
            d.sleep();
        }
    }
}


  1. Graphiti


Graphiti - альт. framework под Eclipse для создания visual редактора модели с использованием GEF API. Graphiti заявлен как альтернатива GMF, но это, скорее, аналог GEF - он позволяет вручную кодить специализированные графические редакторы типа Visio для Ecore моделей. Graphiti морально устарел и частично не работает, его имеет смысл использовать если нужно писать редактор вручную, max приближенно к pure POJO Java и при этом не хочется разбираться со сложным GEF. Особенности Graphiti:
  • Есть: нет редактора, весь код пишется вручную. Генерит: ничего не генерит, хоть и пишет, что генерит. Позволяет вручную написать visual редактор диаграмм EMF instance-модели, используя шаблон проекта с Java кодом.
  • Graphiti - это plain Java wrapper для GEF API (используются только модули GEF и Draw2D) с Graphiti-specific objects для доступа к Eclipse extension points (imageProviders, diagramTypes) и подробным описанием как этим API пользоваться. Кроме того, сама модель может задаваться обычными Java objects и конвертироваться в Ecore модель. UI полученного редактора - self-contained (min/zero framework dependency), а у GMF - зависит от GEF API. Программист работает только с Graphiti API, кот. полностью заменяет собой GEF. См. Graphiti API http://help.eclipse.org/kepler/nav/27
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0479_Graphiti_extensions.jpg
  • в Graphiti обычно вместо реализации интерфейсов с нуля через implements interface ICopyFeature, IAddFeature, IMoveFeature, IDrillDownFeature, IToolBehaviorProvider новая функциональность добавляется поверх уже существующей при помощи соотв. extends AbstractCopyFeature, AbstractAddShapeFeature, DefaultMoveShapeFeature, AbstractDrillDownFeature, DefaultToolBehaviorProvider итд. Пример готового кода (chess example) на экране внизу.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0478_Graphiti_src.jpg
  • стандартный tutorial visual редактора диаграмм meta-модели создается через New/Other/Other/Graphiti Example Diagram с type tutorial. Чтобы работал drag-and-drop EСlass классов из дерева проекта (перетаскивать на диаграмму можно, удалять нет) надо перейти в Project Exporer вместо Package Explorer и выставить Graphiti perspective. Редактор бесполезен: добавить в класс properties и методы нельзя, имеющуюся EMF модель в нем открыть нельзя, можно только создать ее с нуля (drag-and-drop модели на диаграмму с последующей ее отрисовкой не работает, right-click меню для создания диаграммы нет), сохранить как .ecore тоже нельзя - Graphiti создает только голый EMF root node без .ecore wrapper кот. нельзя редактировать, прячет его right-click опции. Mini-preview окно с outline диаграммы не обновляется и бесполезно. В общем просто demo.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0428_Graphiti_diagram_editor.jpg
  • в tutorial редакторе meta-модели заявлена поддержка горячих клавиш full keyboard access to all functionality, themes, zoom, print итд, можно добавлять свою - direct editing, context menus etc. Стандартные features: create/delete, add/remove, update, custom (open dialog), create connection, direct editing, copy/paste, move, resize, auto layout, expand/collapse.
  • В Graphiti нет никаких тулов для разработки редактора instance-модели, есть только пара готовых примеров и Java-шаблон проекта плагина для Eclipse с min  функциональностью - все нужно дописывать самому. Вы создаете New Plugin Project по Graphiti Editor template, указываете Domain Object и Connection (например, EObject и EReference, указать объекты ecore модели нельзя), генерится шаблон для плагина с шапками основных java классов, вы запускаете плагин в Runtime окне, создаете там Graphiti проект, а в нем Graphiti Example Diagram с типом по названию проекта шаблона. После этого открывается абсолютно голый редактор диаграмм в кот. можно создавать только объекты и связи (rename, add methods, context menu, direct editing, properties - вообще ничего нет)
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0474_Graphiti_plugin_dialog.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0475_Graphiti_plugin_dialog2.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0471_Graphiti_create_diagram_dialog.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0470_Graphiti_create_diagram_dialog2.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0477_Graphiti_diagram_editor.jpg
  • примеры для Graphiti старые, расчитаны на версию Graphiti 0.7 и Java 1.6 и не всегда корректно компилируются/работают под Graphiti 0.11 (Library example). Не работает drag-and-drop модели на диаграмму как заявлено. Ecore модели иногда называются *.lib. Структура проектов в примерах различается, в одних - src и src-gen внутри одного проекта (Chess), в других - для model/genmodel один проект, для кода Graphiti - другой (Library). При этом в них часть кода для runtime окна работает - его можно там импортировать и открыть в редакторе instance-модели. Интересный пример с chess: в редакторе шахматных партий фигуры перемещаются по доске не произвольно, а в соответствии с правилами шахмат. По сути genmodel генерит только model проект с java классами и Factory, а аналог .edit и .editor проектов вы пишете сами на Graphiti. Шаблон для этого проекта создает Plugin Project c Graphiti Editor template, после чего надо писать код по Developer Guide.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0480_Graphiti_template.jpg
  • процесс разработки по прежнему итерационный: создаются EMF meta-модель и genmodel, генерится EClass Java-код (только для model), программист вручную creates/extends функциональность Feature/behavior и задает graphical representation объектов модели, в runtime окне создается и тестируется visual редактор диаграмм для instance model, в meta-модель и код вносятся изменения до достижения нужного результата.
  • в Graphiti заложена поддержка multi-platform. Пока реализован только Eclipse GEF-renderer, но в будущем он может быть заменен на другой renderer, например на Flash в броузере. Platform-specific custom UI можно генерить уже сейчас.
  • Graphiti также генерит BPMN (Businesses Process Modeling Notation) редакторы
  • Есть поддержка внешних алгоритмов для автосортировки auto arrange layout диаграммы
  • полученный visual editor модели все равно будет RCP приложением, кот. работает только как плагин под Eclipse.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0429_Graphiti_FileSystem.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0467_Graphiti_chess.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0469_Graphiti_Library.jpg




Пример кода на Graphiti - add feature:

public PictogramElement add(IAddContext context) {
    IColorConstant E_CLASS_TEXT_FOREGROUND = IColorConstant.BLACK;

    EClass addedClass = (EClass) context.getNewObject();
    Diagram targetDiagram = (Diagram) context.getTargetContainer();
    // container shape and Graphiti service
    IPeCreateService peCreateService = Graphiti.getPeCreateService();
    ContainerShape containerShape =
                 peCreateService.createContainerShape(targetDiagram, true);
    IGaService gaService = Graphiti.getGaService();

    // create shape for text
    Shape shape = peCreateService.createShape(containerShape, false);
 
    // create and set text graphics algorithm
    Text text = gaService.createText(shape, addedClass.getName());
    text.setForeground(manageColor(E_CLASS_TEXT_FOREGROUND));
    text.setHorizontalAlignment(Orientation.ALIGNMENT_CENTER );
    // vertical alignment has default value "center"
    text.setFont(gaService.manageDefaultFont(getDiagram(), false, true));
    gaService.setLocationAndSize(text, 0, 0, 100, 20);
 
    // create link and wire it
    link(shape, addedClass);
}


Пример кода на Graphiti - рисуем треугольник:

// triangle through points: top-middle, bottom-right, bottom-left
int xy[] = new int[] { 50, 0, 100, 100, 0, 100 };
IGaService gaService = Graphiti.getGaService();
Polygon p = gaService.createPolygon(container, xy);
IImageProvider - AbstractImageProvider



  1. Sirius


Sirius - альт. framework под Eclipse для создания visual редактора модели на базе EMF/GMF. Sirius как Graphiti может автоматически генерить специализированные графические редакторы типа Visio для Ecore моделей. Sirius актуальный мощный тул, используется для визуализации system/software architecture engineering of data processing, signal processing or information systems, electrical/thermal power systems, позволяет архитектору системы проанализировать модель с разных viewpoints на соответствие заданным производственным параметрам (цена, performance, safety итд). Особенности Sirius:
  • Есть: visual редактор диаграмм EMF meta-модели, treeview редактор стилей/представлений/функционала элементов модели. Генерит: наполовину готовый visual редактор диаграмм или table/treeview редактор EMF instance-модели кот. доводятся вручную в спец. treeview редакторе.
  • работа в Sirius состоит из следующих этапов: импорт или создание EMF meta-модели с нуля (для этого есть visual редактор диаграмм типа EcoreTools), создание привязки genmodel к meta-модели стандартными средствами EMF (сам Sirius этот код не генерит) и ее запуск в runtime-окне, создание viewpoints/задание стилей для объектов полученной instance-модели, описание функциональности палитры tools будущего редактора модели в спец. treeview/table редакторе представлений в runtime окне, и, наконец, отображение instance-модели в созданном представлении в runtime-окне для тестирования и ввода данных. Все изменения на этапах редактирования meta-модели разными редакторами и instance-модели параллельно с созданием для нее представления синхронизируются автоматом. Но код по genmodel сам заново не генерится. Для описания функциональности требуется знание Acceleo expressions. На диаграмме синим обозначен традиционный EMF workflow, зеленым - новые процессы от Sirius.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0448_Sirius_workflow.jpg
  • Sirius использует GMF, но, в отличие от Graphiti и GMF, генерит наполовину готовый visual редактор модели типа Visio с нуля для заданной модели EMF или UML. После этого не нужно модифицировать сгенеренный код, но придется вручную создавать в treeview редакторе виды/представления для отображения элементов модели, задавать их стили и иконки - все это сохраняется в конфигурационных файлах *.odesign. Пока представление модели не создано готового редактора instance-модели не получится. По умолчанию нет даже отображения элементов модели в виде простейшей иерархии с заданным root. Акцент в Sirius сделан на создании в treeview редакторе custom views/representations и применение стилей для объектов вместо кодирования/визуального моделирования.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0389_Sirius_runtime_1.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0388_Sirius_runtime_2.jpg
  • Sirius генерит редакторы, кот. могут отображать/редактировать модель в виде dialects: diagrams, tables, and trees. Можно разрабатывать свои альт. dialects графические представления модели.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\Sirius_4mtuto_50.png
  • принципиальное отличие Sirius - большая интерактивность в рамках Modeling Project. После любого изменения meta-модели и последующего Save, Sirius запускает свой incremental refresh и текущая model и ее representation обновляются в real-time в сгенеренном редакторе вместо создания new representation, т.е. можно работать одновременно с meta-model и ее instance в редакторе, не требуется заново генерить и открывать текущий *.aird и при этом не сбрасываются layout и view настройки. Код модели все равно генерится отдельно вручную через EMF genmodel. Импортированные модели нужно генерить в их исходных проектах.
  • функциональность сгенеренного редактора Sirius можно расширять за счет новых представлений данных, new query languages, прямых вызовов Java. См. Sirius API, EMF/GMF extension points http://www.eclipse.org/sirius/doc/developer/Sirius%20Developer%20Manual.html
  • в Sirius похожий на EcoreTools visual редактор для основного окна Eclipse вместо стандартного EMF Treeview, но без слоев. В нем также можно с нуля создавать диаграммы и таблицы из EClasses EMF модели, указывать EAttributes, EDatatypes, EOperations и их взаимосвязи EReferences. Эти диаграммы сохраняются в файле представлений, данные о модели - в файле модели. Диаграммы могут иллюстрировать различные взаимодействия между классами на базе одной или набора моделей.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0385_Sirius.jpg
  • для хранения представлений данных используются *.aird файлы, для конфигурационных файлов - *.odesign
  • ключевое понятие Sirius API - Session - это wrapper Transactional Editing Domain и его Resource Set, благодаря кот. модель со всеми данными отображается корректно в виде графических элементов в нужных views с учетом viewport configurations в рамках данной сессии. У каждого Modeling Project своя Session. Сессия работает с семантическими данными модели, их представлениями и viewpoints. Для работы с сессиями есть глобальный SessionManager.
  • в Sirius есть 2 класса юзеров: архитекторы систем и юзеры. Архитекторы работают с meta-моделью, создают для нее универсальный графический редактор. Юзеры работают уже с конкретным instance модели, наполняют модель данными и анализируют эффективность при помощи диаграмм.
  • Sirius использует модульность: tooling API архитекторов отделено от runtime API для юзеров, т.е. для юзеров редактора модели поставляется RCP runtime plugin меньшего размера без лишних dependencies. Core API также отделено от реализации dialect-specific parts.
  • для работы с Sirius нужно выставить Sirius perspective чтобы элементы модели и виды отображения были видны как ее children в project tree.
  • есть Synchronized mode в кот. диаграмма is automatically populated related данными (например всеми классами package). В Unsynchronized mode юзер сам выбирает какие элементы данных показывать на диаграмме.
  • есть Layout copy/paste графических элементов
  • есть поддержка Acceleo expressions в properties модели
  • полученный visual editor модели все равно будет RCP приложением, кот. работает только как плагин под Eclipse.
  • Под Sirius очень мало готовых sample projects. На Obeo marketplace http://marketplace.obeonetwork.com есть samples для прошлой версии Sirius, кот. называлась Viewpoint и была компонентом Obeo Designer - для них надо устанавливать Obeo trial (тогда будут работать ссылки на ресурсы типа platform:/resource/com.obeodesigner.sample.family.demo.other/MyFamily.uml).




Пример кода на Sirius - создание Session:

URI sessionResourceURI = URI.createPlatformResourceURI("/Project/archi.aird", true);
Session createdSession = SessionManager.INSTANCE.getSession(sessionResourceURI);
createdSession.open();

Пример кода на Sirius - Сustom Save Dialog:

import com.google.common.collect.Lists;
import java.util.Collection;
import org.eclipse.sirius.business.api.session.Session;
import org.eclipse.ui.ISaveablePart2;

public class CustomSaveDialogExtension {

   public Collection<String> getButtons() {
       return Lists.newArrayList("Save", "Custom Save", "Discard");
   }

   public int reactToValue(Object objectToSave, int temporaryResult) {
       Session session = (Session) objectToSave;
       int returnedValue = ISaveablePart2.YES;

       switch (temporaryResult) {
       // Case 0 : "Save"
       case 0: // return ISaveablePart2.YES => save session normally
           break;
       // Case 1 : "Custom Save"
       case 1: // for instance, return CANCEL => nothing else willl be done
           customSave(session);
           returnedValue = ISaveablePart2.CANCEL;
           break;
       // Case 2 : "Discard"
       case 2: // return NO => changes are discarded
           returnedValue = ISaveablePart2.NO;
           break;
       // Default : "CANCEL" or any other
       default:
           returnedValue = ISaveablePart2.CANCEL;
           break;
       }

       return returnedValue;
   }
}


  1. EcoreTools


EcoreTools - плагин под Eclipse для visual редактирования Ecore meta-модели при помощи диаграмм, созданный на базе Sirius, Extended Editing Framework (EEF). Наиболее удобный редактор диаграмм для EMF meta-модели из всех имеющихся.
  • Есть: visual редактор диаграмм EMF meta-модели. Генерит: ничего не генерит.
  • EcoreTools 2.0 - конечный продукт для юзеров-архитекторов, visual редактор диаграмм для EMF, результат работы Sirius для DSL = EMF. EcoreTools 1.0 был основан на GMF. Форматы данных версий 1.0 (.ecorediag) и 2.0 (.aird) несовместимы.
  • EcoreTools - это визуальное дополнение к EMF, удобный visual редактор meta-модели для основного окна Eclipse вместо стандартного Treeview редактора EMF и примитивного visual редактора диаграмм GMF. На диаграмме синим обозначен традиционный EMF workflow, зеленым - новые процессы от EcoreTools.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0449_EcoreTools_workflow.jpg
  • для работы с EcoreTools нужно выставить Modeling/Sirius perspective чтобы элементы модели и виды отображения были видны как ее children в project tree.
  • принципиальное отличие EcoreTools - это не framework, у него нет API и код сам не генерит, с его помощью нельзя создать редактор модели и ее протестировать. Если требуется внести изменения в UI/функциональность редактора нужно смотреть Sirius API - его функциональность во многом дублируется. Если нужно просто изменить стили и добавить виды для отображения элементов EMF модели все сводится к редактированию конфигурационных файлов Sirius. Также можно взять исходники EcoreTools, модифицировать и сгенерить в Sirius свою custom версию редактора с нужными видами и стилями.
  • Modeling Project - фича Sirius, кот. автоматически генерит meta-model и genmodel в процессе редактирования, следит за их синхронизацией. В проект можно импортировать внешние EMF модели.
  • основные режимы работы - Design/Review/Generation. В Design mode можно с нуля создавать диаграммы и таблицы (representations) из EClasses EMF модели, указывать EAttributes, EDatatypes, EOperations их  взаимосвязи EReferences. Эти диаграммы сохраняются в файле представлений, данные о модели - в файле модели. Файлов представлений в проекте может быть несколько. Диаграммы могут иллюстрировать различные взаимодействия между классами на базе этой модели или набора моделей, их тоже может быть несколько. В слое Constraints можно задавать список из названий методов для классов. В Review mode можно писать комменты к элементам диаграммы в виде сносок, вставлять текст документации для javadoc, есть Dependencies diagram. В Generation - можно редактировать некоторые instance properties имеющейся genmodel.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0352_Ecore_diagram.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0353_Ecore_diagram.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0350_Ecore_table.jpg
  • данные исходной модели и новой диаграммы unsynchronized, т.е. по умолчанию создается пустая диаграмма, нужно выбрать базовые классы из списка и добавлять остальные через Add related, либо сделать select all - все связи отрисуются автоматически.
  • есть слои, tools palette, стили, element selection и auto layout, можно задавать тип connection стрелки, есть подсветка классов с учетом наследования, можно редактировать названия элементов и properties прямо на диаграмме.
  • для представлений данных используются стандартные для Sirius *.aird файлы. Поддерживаются dialect представления tables и diagrams.
  • при помощи Dynamic Instance прямо из EcoreTools можно генерить XMI и запускать редактор instance модели для ввода данных в основном окне Eclipse.
  • окно Ctrl-O позволяет быстро найти элемент на схеме
  • есть поддержка EOperation

Ссылки
Url
Пример/Tutorial
API
нет
Sample Project
нет
Editor UI/Features
нет


  1. Extended Editing Framework (EEF)


Extended Editing Framework (EEF) - built-in framework под Eclipse для разработки редакторов Ecore моделей со стандартным table-based UI. Расширяет стандартный EMF Treeview editor модели, позволяет создавать advanced custom controls/widgets поля UI для редактирования элементов модели (spinner, date selector итд), Master-Detail диалоги с lookup. EEF нишевый framework, редко используется. Особенности EEF:
  • Есть: нет редактора. Генерит: EMF Treeview редактор instance-модели с advanced полями ввода, tabs и привязкой доп. полей, требуется много ручной доводки кода
  • один из базовых frameworks, иногда используется другими
  • генерит advanced editing components/custom properties в стандартном EMF treeview/forms UI редакторе для properties элементов EMF meta-model
  • использует готовую EMF модель и сгенеренный по ней .edit проект для редактора в качестве основы для своего кода, сам их не генерит. Проект .editor также нужен для запуска плагина в runtime окне.
  • для генерации EEF моделей на *.genmodel делается right-click/EEF/Initialize EEF models (не путать с right-click на .ecore), указывается target папка для моделей .components и .eefgen. Эти файлы рекомендуется генерить в папке .edit/model.
  • при генерации кода EEF использует модели: views (UI представления, набор ElementEditors с widgets для редактирования элементов модели), components (controller для привязки элементов EMF модели к элементам views UI), eefgen (настройки генератора)
  • для генерации кода редактора на *.eefgen делается right-click/EEF/Generate EEF architecture. Перед этим нужно добавить в Manifest/Dependencies .edit проекта dependency для EEF runtime org.eclipse.emf.eef.runtime с галкой Reexport в ее properties, чтобы генератор видел extension points описанные в EFF runtime, иначе сгенерится некорректный код.
  • EEF использует неск. extension points для EMF .edit и генерит Java код для EEF views, parts и providers в .edit/src-gen и XML в _properties.plugin.xml. весь XML код внутри раздела <plugin> надо вручную скопировать в соотв. <plugin> раздел plugin.xml проекта .edit, чтобы заменить стандартный properties view с grid layout на EEF properties view. После этого нужно написать имплементацию для некоторых методов.
  • этапы разработки: modeling, generation, customization
  • процесс разработки по прежнему итерационный: создаются EMF meta-модель и genmodel, генерится EClass Java-код, генерятся EEF модели .components, .eefgen, в EMF treeview редакторе вручную делается привязка элементов модели к UI controls/custom widgets и layout views, генерится eef код редактора, редактируется plugin.xml чтобы подцепить код для views/components, пишется имплементация для неск. методов, создается instance model и запускается forms UI редактор для нее с EEF Property Views вместо стандартных, в модель/код вносятся изменения (включая UI функциональность редактора), генерится новый код с учетом изменений итд до достижения нужной функциональности редактора.
  • поддерживает блокировку lock/unlock редактирования данных EMF instance-модели в редакторе в зависимости от context
  • генерит код, совместимый с SWT/JFace UI
  • может встраиваться как Properties View в редактор, написанный на Graphiti
  • есть поддержка Acceleo expressions в properties модели, для генерации кода используется Acceleo, можно генерить свои custom template widgets для UI редактора.



Пример кода на EEF:

// create age spinner widget
protected Composite createAgeSpinner(FormToolkit widgetFactory, Composite parent) {
    createDescription(parent, CustomsampleViewsRepository.Person.Properties.age,                 CustomsampleMessages.PersonPropertiesEditionPart_AgeLabel);
    age = new Spinner(parent, SWT.NONE);
    age.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
    widgetFactory.paintBordersFor(parent);
    GridData ageData = new GridData(GridData.FILL_HORIZONTAL);
    age.setLayoutData(ageData);
    FormUtils.createHelpButton(widgetFactory, parent,                         propertiesEditionComponent.getHelpContent(CustomsampleViewsRepository.Person.Properties.age, CustomsampleViewsRepository.FORM_KIND), null);
    return parent;
}


  1. EMF Client Platform (ECP)/EMF Forms


EMF Client Platform (ECP)/EMF Forms - built-in framework под Eclipse для разработки приложений для Ecore моделей со стандартным form-based UI. EMF Forms - независимый компонент EMF Client Platform. ECP/EMF Forms актуальны и нужны для разработки любых EMF-based Java приложений со стандартным forms-based UI под Eclipse RCP или Web. Если голый EMF генерит скорее набор несвязанных wireframe прототипов, то при помощи ECP/EMF Forms можно создать уже редактор с конечным custom UI для юзера. Особенности ECP:
  • Есть: treeview/forms редакторы EMF meta-модели, view model editor. Генерит: Ничего не генерит. ECP Demo - готовая болванка treeview/forms based редактора для редактирования любых EMF instance-моделей с учетом возможного view model/layout заданного в EMF Forms. EMF Forms как GMFMap привязывает элементы модели к готовым UI controls в зависимости от типа, в нем нет generate для кода плагина. ECP/EMF Forms предоставляют широкие возможности для кастомизации.
  • есть ECP SDK версий 1.3, 1.4, 1.5. Первая отличается от остальных.
  • ECP позволяет генерить для моделей приложения с обычным table/forms/Web UI для ввода данных вместо графических visual редакторов диаграмм GEF/GMF.
  • ECP использует готовую EMF модель и сгенеренный по ней .edit проект для редактора, сам не генерит. Пример с New/Example/EMF Forms/make it happen example model комплектуется диаграммой в старом GMF формате .ecorediag - ее нельзя открыть, я сгенерил в новом .ecore_diagram. Ниже экран с sample project.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0484_EMF_Forms_dialog.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0515_EMF_Forms_sample_project.jpg
  • treeview редактор View Editor EMF Forms позволяет описать form-based UI приложения при помощи View Model модели, привязать элементы meta-модели к их графическому представлению - view с UI controls. Для каждого класса meta-модели создается свой view, генерятся его all/selected properties/references, для каждой property/reference, в зависимости от ее типа, генерится привязка к своему дефалтному control. Можно добавлять/удалять узлы дерева, перетаскивать их drag-and-drop, помещать в container/group, заменять их своими controls. Есть preview с auto validation полей и auto refresh (иконка в правом верхнем углу).
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\ecp_view_model_2.png
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0493_EMF_Forms_view_editor.jpg

  • для сохранения EMF Forms View Model используются XML файлы *.view
  • View Editor поддерживает conditional visibility rules. Если нужно удалить (сделать hidden) property элемента можно создать rule в редакторе или выставить для нее type=none в параметрах генератора genmodel.
  • во View Editor также можно задавать свой layout для controls внутри view. EMF Forms поддерживают groups, horiz/vertical layout, table, grid, master-detail, hierarchical forms. По умолчанию для view используется вертикальный layout. Компоненты EMF Forms можно встраивать в Editor или в любой view/диалог ECP. В EMF Forms можно создать готовый конечный UI для юзера с master-detail диалогами, подкрутить UI и функциональность. Нижен приводится пример группировки controls в 2 колонки.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0491_EMF_Forms_view_editor_menu.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0495_EMF_Forms_view_editor2.jpg
  • в EMF Forms можно добавлять для forms редактора свою функциональность, embed components, писать custom layout templates и создавать custom UI controls для полей элементов модели. См. ECP API http://download.eclipse.org/ecp/releases/javadoc/index.html
  • процесс разработки по прежнему итерационный: создаются meta-модель и genmodel, генерится EClass Java-код (model и .edit), во View Editor создается viewmodel привязка элементов модели к GUI, для запуска модели создается Runtime Config для Eclipse плагина с dependency от viewmodel или используется ECP demo, в runtime окне создается instance model и запускается сгенеренный для нее forms редактор, вводятся данные, делается их validation, в модель/код вносятся изменения, генерится новый код с учетом изменений итд. до достижения нужной функциональности редактора.
  • Поскольку EMF Forms, в отличие от GMF, сам не генерит код для запуска viewmodel как плагина для Eclipse в runtime окне, необходимо сначала создать Runtime Configuration на базе ECP Demo project с нужными dependencies. В меню Run/Runtime Configurations создается новая конфигурация на базе Eclipse Application, в Main tab указываются name, location и run application как emf.ecp.application.e3.application. В Plugins tab выбирается Launch with Features selected below, deselect all, выбирается только feature emf.ecp.demo.e3.feature и делается Select Required для нее, затем делается Add Plug-Ins и добавляются makeithappen .model, .edit, .viewmodel. В конце Apply, Run. В runtime окне создается New Project с Provider EMFStore, в нем создается New Model Element task/user, после чего можно вводить данные в карточку юзера. По умолчанию EMFStore создает для локальных проектов общий local repository. Для создания отдельных хранилищ под каждый проект нужно в Run Configuration/Arguments добавить опцию: -profile=myprojectname.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0504_EMF_Forms_Run_Config_dialog1.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0505_EMF_Forms_Run_Config_dialog2.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0499_EMF_Forms_Run_Config_dialog4.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0506_EMF_Forms_Run_Config_dialog3.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0507_EMF_Forms_create_project_dialog.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0508_EMF_Forms_add_element_menu.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0509_EMF_Forms_add_element_dialog.jpg
  • сгенеренный ECP редактор instance-модели состоит из 3 частей (обозначены разными цветами): Explorer (treeview компонент с элементами модели), Editor/EMF Forms (forms-based редактор с полями ввода для элементов), Repository Explorer с Data Providers (список используемых ресурсов/database/файлов/CDO/EMFStore). В Explorer есть drag-and-drop/поиск/создание/удаление, фильтрация элементов модели. Они хранятся в выбранном data provider (например, EMFStore) и по double-click отображаются в Editor в виде EMF Forms для редактирования с auto validation. В Editor есть default layout для отображения/редактирования любых EObject, наличие для них viewmodel с custom layout необязательно. ECP также предоставляет API для доступа к другим типам data providers (файлам/database/repositories на web server итд). В Repository Explorer можно создавать data providers, логиниться на сервер Git/SVN и создавать новые проекты.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\ecp_image07.png
  • Можно легко генерить Swing, SWT (default), JavaFX (limited beta) or Web UI (RAP) совместимый код меняя только renderer. Есть Tabris mobile renderer for iOS and Android. В планах поддержка других renderers: AngularJS, Vaadin (Web).
  • полученное EMF Forms viewmodel-based приложение c forms UI может быть либо RCP приложением, кот. работает как плагин под Eclipse, является компонентом EMF Client Platform и запускается через ECP Demo болванку, либо может быть самостоятельным компонентом и встраиваться отдельно в ваш Java код. RCP версия на базе ECP Demo с EMFStore Project приводится ниже.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0514_EMF_Forms_instance_editor.jpg



Пример кода EMF Forms - enable JavaFX renderer, validation:

ECPFXView ecpfxView = ECPFXViewRenderer.INSTANCE.render(submission);
pane.setCenter(ecpfxView.getFXNode());

public class EmailControlRendererTest implements ECPRendererTester {
 @Override
 public int isApplicable(VElement vElement,
                         ViewModelContext context) {
   if (!VControl.class.isInstance(vElement)) {
     return NOT_APPLICABLE;
   }
   EStructuralFeature feature = VControl.class.cast(vElement)
                                  .getDomainModelReference()
                                  .getEStructuralFeatureIterator()
                                  .next();
   if (feature.equals(TaskPackage.eINSTANCE.getUser_Email())) {
     return 10;
   }
   return NOT_APPLICABLE;
 }
}


  1. eTrice


eTrice - RoomModel Text Editor, плагин под Eclipse для редактирования ROOM (Real-Time Object-Oriented Modeling) state-based models в языковом формате xText, созданный на базе Graphiti, xText. Нишевый тул, используется редко. Особенности eTrice:
  • Есть: visual редактор диаграмм ROOM/XText meta-модели. Генерит: visual редактор диаграмм ROOM/XText instance-модели.
  • работает с Actors, system states, основная идея ROOM - система постоянно переходит из одного заданного конечного состояния в другое, переключатель состояний по типу светофора, есть поддержка hierarchical state machines
  • модель задается на спец. ROOM DSL языке, разработанном на Xtext (не EMF). При помощи Graphiti реализуется визуализация, функциональность/behaviors и редактор модели.
  • Есть 3 редактора: Textual Model Editor, Graphical Structure Editor, Graphical Behavior Editor - можно редактировать state behaviors.
  • собственный code generator, генерит код на Java/C++. Для генерации C++ должен быть установлен модуль CDT - C++ Development Tools. JDT (Java) уже установлен by default.

Ссылки
Url
Пример/Tutorial

API

Sample Project

Editor UI/Features



Пример кода на eTrice:

RoomModel HelloWorld_Model {
    LogicalSystem LogSys1 {
        SubSystemRef subSysRef1:SubSysClass1
    }
    SubSystemClass SubSysClass1 {
        ActorRef actorRef1:HelloWorldTop
        LogicalThread defaultThread
    }
    ActorClass HelloWorldTop {
        Structure { }
        Behavior {
              StateMachine {
                Transition init: initial -> state0 {
                         action {
                        "System.out.println(\"Hello World\");"
                          }
                }
                     State state0
            }
        }
    }
}


  1. Sphinx


Sphinx - language development framework плагин под Eclipse на базе EMF/GMF моделей, среда разработки готовых IDE для создания native DSL (Domain Specific Language) или UML-based custom языков программирования. Не путать с другим Sphinx - Python documentation generator. Про Sphinx известно очень мало, в основном все пользуются xText. Особенности Sphinx под Eclipse:

  • Есть: нет редактора. Генерит: IDE редактор DSL/UML-based языка EMF instance-модели.
  • может работать с моделями, состоящими из нескольких файлов
  • Sphinx использует AUTOSAR для генерации documentation
  • автоматом синхронизирует данные модели и их визуальные представления во views используя refresh.
  • полученная IDE будет RCP приложением, кот. работает только как плагин под Eclipse.

Ссылки
Url
Пример/Tutorial

API
Sample Project

Editor UI/Features



Пример кода на Sphinx:

@Override
public void notifyChanged(Notification notification) {
 updateChildren(notification);
 // For refreshing the view if source port and/or target component references are update
 switch (notification.getFeatureID(Connection.class)) {
   case InstanceModel20Package.CONNECTION__SOURCE_PORT:
     fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
     return;
   case InstanceModel20Package.CONNECTION__TARGET_COMPONENT:
     fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
     return;
 }
 super.notifyChanged(notification);
}

Пример DSL языка, разработанного на Sphinx:

Platform "MyPlatform" {
    componentTypes {
        componentType "Timer" {
            providedInterfaces ("ITimerHost")
            ports {
                Port "out" { minProviderCount 0 maxProviderCount -1 }
            }
        },
        componentType "LightLEDBar" {
            providedInterfaces ("ITimerHandler")
            ports {
                Port "out" { minProviderCount 1 maxProviderCount -1 }
            }
            parameters {
                Parameter "Timer_ID" { datatype "byte" }
                Parameter "Timer_Resolution" { datatype "word" }
                Parameter "Timer_Alert_Interval" { datatype "word" }
            }
        }
    }
}


  1. xText


xText - аналог Sphinx, language development framework плагин под Eclipse/IntelliJ IDEA на базе EMF/GMF моделей, мощная среда разработки готовых IDE для создания native DSL (Domain Specific Language) или UML-based custom языков программирования. Особенности xText:
  • Есть: нет редактора. Генерит: IDE редактор DSL/UML-based языка EMF instance-модели.
  • сгенеренный xText язык содержит компоненты: parser, type-safe abstract syntax tree (AST), serializer and code formatter, scoping framework and linking, compiler checks and static analysis aka validation, code generator or interpreter.
  • порядок работы: создать xText проект, задать DSL grammar/syntax, generate DSL artifacts, map to Java JVM concepts, Run and test editor in IDE.
  • DSL examples: SQL, regexp, XML-based, MathLab-based; GPL examples: Java, C#
  • в сгенеренной IDE можно заменить Google Guice default behavior на свою реализацию
  • в полученной IDE будет все что обычно есть в Eclipse: syntax highlighting, object browser, code completion, refactoring итд.
  • полученная IDE будет RCP приложением, кот. работает только как плагин под Eclipse/ IntelliJ IDEA. Сompiler components вашего языка не зависят от Eclipse и будут работать в любом Java Environment.

Ссылки
Url
Пример/Tutorial
API
Sample Project

Editor UI/Features



Пример syntax DSL языка, разработанного на xText:

datatype String

entity Blog {
   title: String
   many posts: Post
}
    
entity HasAuthor {
   author: String
}
    
entity Post extends HasAuthor {
   title: String
   content: String
   many comments: Comment
}

entity Comment extends HasAuthor {
   content: String
}

Пример его grammar definition:

grammar org.example.domainmodel.Domainmodel with
org.eclipse.xtext.common.Terminals
    
generate domainmodel "http://www.eclipse.org/xtext/example/Domainmodel"
    
Domainmodel:
    (elements += AbstractElement)*
;
PackageDeclaration:
    'package' name = QualifiedName '{'
        (elements += AbstractElement)*
    '}'
;
AbstractElement:
    PackageDeclaration | Type | Import
;
QualifiedName:
    ID ('.' ID)*
;
Import:
    'import' importedNamespace = QualifiedNameWithWildcard
;
QualifiedNameWithWildcard:
    QualifiedName '.*'?
;
Type:
    DataType | Entity
;
DataType:
    'datatype' name=ID
;
Entity:
    'entity' name = ID
        ('extends' superType = [Entity | QualifiedName])?
    '{'
        (features += Feature)*
    '}'
;
Feature:
    (many ?= 'many')? name = ID ':' type = [Type | QualifiedName]
;

Пример http routing language:

   String url =  request.getRequestURL().toString();
   «FOR route : routes»
     {
       //java.util.regex.Matcher will be imported in the generated Java file
       «Matcher» _matcher = _pattern«route.index».matcher(url);
       if (_matcher.find()) {
         «FOR variable : route.url.variables»
             String «variable.name» = _matcher.group(«variable.index + 1»);
         «ENDFOR»
         «IF route.condition != null»
           if («route.nameOfRouteMethod»Condition(request, response
             «FOR v : route.url.variables
              BEFORE ", "
              SEPARATOR ", "»«v.name»«ENDFOR»))
         «ENDIF»
         «route.nameOfRouteMethod»(request, response
           «FOR v : route.url.variables», «v.name»«ENDFOR»);
       }
     }
   «ENDFOR»

Пример кода на xText для syntax highlight DSL языка:

public class DefaultHighlightingConfiguration implements IHighlightingConfiguration {
    public static final String KEYWORD_ID = "keyword";
    public static final String COMMENT_ID = "comment";
    
    public void configure(IHighlightingConfigurationAcceptor acceptor) {
        acceptor.acceptDefaultHighlighting(KEYWORD_ID, "Keyword", keywordTextStyle());
        acceptor.acceptDefaultHighlighting(COMMENT_ID, "Comment", // ...
    }
    public TextStyle keywordTextStyle() {
        TextStyle textStyle = new TextStyle();
        textStyle.setColor(new RGB(127, 0, 85));
        textStyle.setStyle(SWT.BOLD);
        return textStyle;
      }
}


  1. Papyrus


Papyrus - мощная готовая среда разработки IDE на базе Eclipse для создания редакторов DSL и визуального/текстового редактирования EMF/GMF моделей с поддержкой UML/SysML/MARTE, созданная в xText. Из всего, что есть под Eclipse, Papyrus - единственная среда, кот. генерит любые типы редакторов, наиболее полно поддерживает UML. Популярный в прошлом UML редактор Topcased теперь входит в Papyrus. Особенности Papyrus:
  • Есть: visual редактор UML/SysML/EMF meta-моделей. Генерит: все типы редакторов: IDE редактор DSL/UML-based языка EMF instance-модели или visual редактор диаграмм или table/treeview редактор EMF.
  • основные отличия: заменяет собой Eclipse IDE, встроенный редактор диаграмм UML/SysML (не только EMF), генерит все типы редакторов.
  • Papyrus устанавливается поверх и заменяет собой Eclipse, появляются новые элементы UI и функциональность (Model Explorer, Outline view, Papyrus perspective), графический редактор UML/EMF моделей, custom keyboard shortcuts, syntax highlight, completion and content assist. В Papyrus есть свои marketplace и plugins. Можно задавать custom CSS стили для визуализации диаграмм, создавать свои user perspectives итд.
  • в Papyrus есть широкая поддержка UML2 на базе EMF: Class/Package/Profile diagrams, Activity/State/Use Case/Interaction behavior diagrams, можно создавать модели UML/SysML есть параллельная работа с несколькими диаграммами, каждая в отдельном окне.
  • поддержка UML profiles
  • графические редакторы Papyrus используют GMF, но может быть реализована поддержка других frameworks, например, Graphiti через dedicated connectors
  • можно комментировать диаграмму



Пример кода на Papyrus - выборка selected object в редакторе:

// Lookup selected objects in UI.
protected List<Object> lookupSelectedElements() {
   IWorkbenchPage page =     PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
   ISelection selection = page.getSelection();
   if(selection instanceof IStructuredSelection) {
    IStructuredSelection structuredSelection = (IStructuredSelection)selection;
    return structuredSelection.toList();
   }
   else if( selection instanceof TreeSelection) {
    TreeSelection treeSelection = (TreeSelection)selection;
    return treeSelection.toList();
   }
   return null;
}


  1. ObjectAid UML Explorer


ObjectAid UML Explorer - популярный плагин под Eclipse для визуализации существующего Java кода в виде UML Class/Sequence Diagram с использованием GEF API. Редактировать и рефакторить код можно - диаграмма при этом обновляется, но редактировать диаграмму нельзя. Аналоги: eUML2, inFusion, Class Visualizer. Особенности ObjectAID:
  • Есть: есть visual редактор-viewer Java meta-модели. Генерит: ничего не генерит.
  • для построения диаграммы нужно перетащить нужные классы в окно viewer. Затем можно отобразить related классы, есть auto layout итд.
  • для ObjectAid нужен online account на их сайте и license, кот. нужно обновлять 1 раз/неделю. generate UML Class Diagram from Java - free, Sequence Diagram - paid.
  • не поддерживает XMI, не open source, нет API

Ссылки
Url
Пример/Tutorial

API

Sample Project

Editor UI/Features


  1. Acceleo


Acceleo - built-in текстовый code generator для Eclipse на базе стандарта Model to Text Language (MTL). Особенности Acceleo:
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0466_Acceleo_models.jpg
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0463_Acceleo_workflow.jpg



Пример template кода на M2T в Acceleo:

[comment encoding = UTF-8 /]
[template public generate(aClass : Class)]
[file (aClass.name.concat('.java'), false)]
  public class [aClass.name.toUpperFirst()/] {
  [for (p: Property | aClass.attribute) separator('\n')]
    private [p.type.name/] [p.name/];
  [/for]
  [for (p: Property | aClass.attribute) separator('\n')]
    public [p.type.name/] get[p.name.toUpperFirst()/]() {
      return this.[p.name/];
    }
  [/for]
  [for (o: Operation | aClass.ownedOperation) separator('\n')]
    public [o.type.name/] [o.name/]() {
      // TODO should be implemented
    }
  [/for]
  }
[/file]
[/template]

  1. UML2


UML2 - built-in framework под Eclipse на базе EMF для разработки UML 2.x моделей данных и взаимосвязей между ними. Особенности UML2:

  • Есть: Treeview редактор UML meta-модели. Генерит: ничего не генерит.
  • в UML2 нет visual редактора диаграмм, он есть в UML2Tools, UML Designer или Papyrus/Topcased.
  • есть поддержка импорта *.uml файлов и конвертор для создания EMF .ecore и genmodel. *.uml файлы хранятся формате EMF.
  • поскольку UML meta-модель строится на базе EMF meta-модели, это создает доп. meta- уровень и небольшую путаницу. Таким образом, семантика UML meta-meta-модели (PIM) преобразуется в EMF meta-модель (EMF = PSM относительно UML, PIM относительно DSL), по кот. генерится genmodel (PSM относительно EMF) и создается instance-модель (DSL).
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0456_UML2_models.jpg
  • для приведения platform independent UML meta-модели (PIM) к ее platform-specific реализации используется UML profile (EMF genmodel - аналог UML Profile). Это набор UML stereotypes и constraints для элементов модели, при помощи кот. generic UML отображается на specific problem domain/implementation.
  • Object Constraint Language (OCL) - default constraint language для UML/MOF.
  • порядок создания UML диаграмм: начинают с use-case diagram (отражает requirements поставленной задачи) и постепенно детализируют семантику модели в activity, class, sequence, state и communication diagrams. Как правило, по UML class/sequence/state diagram достаточно просто сгенерить код. По activity/process flow diagram теоретически тоже можно генерить код (Enterprise Architect, UModel), но могут накладываться опред. ограничения или для этого нужно создавать свою M2T template (Visual Studio). В общем случае не существует универсального мапинга для отображения модели в код, все зависит от конкретной задачи.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0460_UML_diagram_dev_order.jpg
  • процесс разработки: создается UML meta-meta-модель, к ней применяется Ecore UML Profile для конвертирования в EMF meta-модель. При этом происходит приведение типов данных UML к EMF: описанные в UML Profile Stereotypes extend instances соотв. meta-классов UML, дополняют их соотв. Stereotype properties, кот. затем вручную в treeview редакторе присваиваются необх. значения. Далее по стандартной схеме EMF. На диаграмме синим обозначен традиционный EMF workflow, зеленым - новые процессы от UML2.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0457_UML2_workflow.jpg
  • Альт. standalone тулы для UML разработки: ArgoUML, Enterprise Architect, UModel. Ограниченная поддержка UML также есть в Visual Studio. Есть много тулов для UML разработки. При выборе тула нужно учитывать: есть ли нативная поддержка UML, есть ли редактор диаграмм, генерит ли код вообще или только рисует, генерит ли код по behavior (activity, process flow) диаграммам, создает ли UML диаграммы по имеющемуся коду, сохраняются ли внесенные в сгенеренный код изменения после новой генерации, есть ли export в XMI, работает ли сразу с неск. моделями, генерит ли по ним код итд. Различают fixed metamodel tools (заточены под конкретную версию UML) и variable metamodel tool (MDA Compliant, благодаря MOF/XMI, сохраняют семантику UML независимо от версии UML спецификации).

Ссылки
Url
Пример/Tutorial
API
нет
Sample Project
в SDK
Editor UI/Features
нет


Отличия UML от Ecore:
  • в UML больше диаграмм и можно более точно описать модель
  • в UML для описания модели требуется больше конструкций
  • Ecore <= EMOF (Essential MOF), UML = CMOF (Complete MOF). EMOF <= CMOF, В CMOF есть subsetting и redefinition элементов модели.
  • в UML нет аналога Multiple bounds в ETypeParameter. Для этого в Ecore Profile есть <<eTypeParameter>> stereotype
  • в UML нельзя задать Upper/Lower bounds для EGenericTypes (через ClassifierTemplateParameter::constrainingClassifier property тоже нельзя). Для этого в Ecore Profile есть <<eGenericType>> stereotype
  • в UML для bound generic types используются доп. classifiers, кот. нужно удалять при конвертации в EMF. Для этого в Ecore Profile <<eGenericType>> stereotype используется как маркер для таких типов.


  1. UML2Tools


UML2Tools - плагин под Eclipse на базе EMF/GMF для visual редактирования UML meta-модели при помощи диаграмм. UML2Tools устарел и не поддерживается, лучше использовать Papyrus.
  • Есть: visual редактор диаграмм UML meta-модели. Генерит: ничего не генерит.
  • UML2Tools основан на GMF, это визуальное дополнение к UML2, visual редактор UML meta-модели для основного окна Eclipse вместо стандартного Treeview редактора.
  • для хранения диаграмм UML2Tools используются стандартные для GMF *.umlclass_diagram, *.umlstatemachine_diagram, *.umlclass, *.umlcomp
  • чтобы открыть *.uml в виде диаграммы нужно сделать стандартный для GMF right-click/Initialize Class Diagram. Есть аналогичные контекстные меню для Component, Activity, State Machine diagrams. На диаграмме синим обозначен традиционный EMF workflow, зеленым - новые процессы от UML/UML2Tools.
C:\My Works\Documents\Blogs\VIP Tech tips\Introduction to MDD in Eclipse\embeded images\images\snap0458_UML2Tools_workflow.jpg
  • в примитивном редакторе диаграмм можно с нуля создавать диаграммы UML модели.
  • есть tools palette, стили, element selection и auto layout, можно задавать тип connection стрелки, можно редактировать названия элементов и properties прямо на диаграмме. Редактор примитивный и не всегда интуитивный. Нет custom toolbar, использует общий с IDE main toolbar.


Ссылки
Url
Пример/Tutorial
API
нет
Sample Project
в SDK
Editor UI/Features
нет


Сводная таблица функциональности



Tool
Тип
Инструменты
Генерит
Eclipse Modeling Framework (EMF)
core framework
treeview редактор EMF meta-модели
treeview редактор EMF instance-модели
Graphical Editing Framework (GEF)
basic framework
нет редактора, весь код пишется вручную
ничего не генерит, можно вручную написать visual редактор диаграмм типа Visio
Graphical Modeling Framework (GMF)
basic framework
примитивный visual редактор диаграмм EMF meta-модели, treeview редакторы для элементов модели и тулбара редактора instance-модели, mapping редактор
примитивный visual редактор диаграмм EMF instance-модели, для кот. нужно вручную сделать привязку элементов к функциональности в mapping редакторе
Extended Editing Framework (EEF)
basic framework
нет редактора, весь код пишется вручную
treeview редактор EMF instance-модели с advanced полями ввода (spinner итд)
EMF Client Platform/Forms
advanced framework
treeview/forms редакторы EMF meta-модели, view model
ничего не генерит. Есть Demo болванка, готовый treeview/forms based редактор EMF instance-модели с возможностью кастомизации
EcoreTools
plugin
visual редактор диаграмм EMF meta-модели
ничего не генерит
Graphiti
basic framework
нет редактора, весь код пишется вручную
ничего не генерит, можно вручную написать visual редактор диаграмм EMF instance-модели
eTrice
framework
visual редактор диаграмм ROOM/XText meta-модели
visual редактор диаграмм ROOM/XText instance-модели
xText
advanced framework
нет редактора, весь код пишется вручную
IDE редактор DSL/UML-based языка EMF instance-модели
Sirius
advanced framework
visual редактор диаграмм EMF meta-модели, treeview редактор стилей/представлений/функционала элементов модели
visual редактор диаграмм или table/treeview редактор EMF instance-модели кот. доводятся вручную в спец. treeview редакторе
Sphinx
advanced framework
нет редактора, весь код пишется вручную
IDE редактор DSL/UML-based языка EMF instance-модели.
Papyrus
advanced framework
visual редактор диаграмм UML/SysML/EMF meta-модели
IDE редактор DSL/UML-based языка EMF instance-модели или visual редактор диаграмм или table/treeview редактор EMF
Acceleo
basic framework
нет редактора, весь код пишется вручную
Java код по M2T template
ObjectAid UML Explorer
plugin
visual viewer диаграмм Java meta-модели
ничего не генерит
UML2
basic framework
treeview редактор EMF meta-модели
ничего не генерит
UML2Tools
plugin
visual редактор диаграмм UML meta-модели
ничего не генерит
UML Designer
plugin
visual редактор диаграмм UML meta-модели
ничего не генерит


Ссылки


полезные ссылки на документацию и описание базовых frameworks для Eclipse приводятся ниже:

No comments:

Post a Comment