Расширение преобразования UML-to-Java 5 при помощи Rational Software Architect Version 7Источник: IBM Developerworks Россия
IBM Rational Software Architect - это инструментальное средство для архитекторов и проектировщиков программных систем. Оно объединяет UML (Unified Modeling Language) и инструментальные средства разработки, включая редактор исходного кода, компилятор и отладчик. Для этого Rational Software Architect использует преобразование UML-to-Java™ 5, превращая UML-модели в классы, интерфейсы и перечисления в исходном коде Java 5. Хотя функциональность такого преобразования является полной, есть пользователи, которые возможно захотят расширить это преобразование для включения специализированных элементов или соглашений, а также для поддержки созданного ими расширения DSL (Domain Specific-Language). В данной статье на простом примере продемонстрированы базовые элементы расширения этого преобразования. О функциональности преобразования Java 5 в Rational Software Architect IBM Rational Software Architect имеет несколько предопределенных преобразований и некоторые из них преобразуют UML-модель в исходный код. В Version 7 появилось преобразование, использующее функциональные возможности Java 5. Как и его предшественники, это преобразование может быть расширено. В данной статье в пошаговом режиме рассматривается процесс создания простого примера, демонстрирующего базовые возможности этой функциональности. В данном случае, как и для большинства функциональных возможностей Rational Software Architect, используются обычные механизмы расширения Eclipse - создание плагина и реализация специализированных точек расширения. Данная статья не предназначена для обсуждения общих вопросов разработки плагинов (ссылки на рекомендованные статьи и примеры приведены в разделе "Ресурсы"). Она подразумевает наличие достаточных навыков в разработке плагинов, необходимых для создания и тестирования расширения преобразования. Рисунок 1. Общая структура преобразования Преобразование начинается с элемента UML-модели, пакета, класса, интерфейса или перечисления, в зависимости от того, что было выбрано при активизации преобразования. Преобразование будет работать с выбранным элементом (или с целой моделью, если элемент не выбран) и со всеми элементами, которые он содержит. Это дает автору расширения преобразования много возможностей для реализации специализированной логики в общем процессе преобразования. Расширение предназначается только для одной части общего преобразования. Полный список назначений приведен в приложении (см. раздел "Загрузка"). В данном примере мы определим простое расширение на уровне класса, которое активизируется каждый раз, когда преобразование готово преобразовать элемент UML-класс в исходный файл Java. Это расширение не будет делать ничего кроме поиска всех ключевых слов, определенных для этого класса, и использования их для добавления нового тега Javadoc, ассоциированного с классом в исходном коде. Мы выполним следующие действия:
Шаг 1. Создание и настройка нового проекта плагина Расширение преобразования начинается с нового проекта плагина:
Рисунок 2. Мастер New Plug-in Project
Рисунок 3. Страница Properties мастера New Plug-in Project На последней странице не нужно выбирать шаблон плагина, поскольку для расширений преобразования нет шаблонов; они есть только для новых полных преобразований. Рисунок 4. Последняя страница мастера New Plug-in Project
После завершения работы мастер создаст новый проект плагина и откроет страницу Overview дескриптора проекта (рисунок 5). Рисунок 5. Структура нового проекта Шаг 2. Добавление необходимых зависимых плагинов Следующий шаг - добавить несколько плагинов в качестве зависимостей. Эти плагины содержат определения точек расширения для реализации дополнительных API, которые будут использоваться при реализации расширения.
Шаг 3. Определение и реализация расширения Следующий шаг - объявить о том, что мы собираемся предоставить реализацию для одной или нескольких точек расширения. Перейдите в закладку Extensions и нажмите кнопку Add для добавления нового расширения. Отобразится диалоговое окно, показанное на рисунке 7. Введите следующую точку расширения: com.ibm.xtools.transform.core.transformationExtensions. После ее обнаружения выберите ее и нажмите кнопку Finish. Рисунок 7. Диалоговое окно New Extension
Листинг 1. Объявление расширения
Тело элемента extension определяется провайдером точки расширения. В данном случае это компонент Rational Software Architect Core Transformation. Это расширение ожидает дочерние элементы TransformationExtension (по одному на каждый тип расширяемого преобразования). Каждый из этих элементов определяет, какое преобразование расширяется.
Каждое расширение преобразования определяет как дочерние элементы определение правила, указывающее класс, который реализует интерфейс правила. Этот класс выполняет основную часть работы по преобразованию. Он определяется как отдельный элемент, поскольку один класс может принимать участие в нескольких частях преобразования (например, класс, свойство и операция). После определения все правила соответствуют частям преобразования, в которых будут принимать участие с элементами ExtendTransform. Этот элемент определяет часть преобразования, в котором будет принимать участие правило. В данном примере мы хотим участвовать в расширении при каждом преобразовании нового класса, и значением targetTransform должно быть Поскольку в любой конкретной части преобразования может участвовать более одного правила, они собираются как дочерние элементы элемента ExtendTransform. Здесь мы определяем только одно правило. Примечание: Шаг 4. Предоставление Java-реализации правила класса После завершения редактирования данного файла сохраните его. Вы должны заметить в файле plugin.xml маленькую пиктограмму ошибки в левом поле рядом со строкой, указывающей класс реализации. Это говорит о том, что файл не найден в проекте.
Каждый из этих методов принимает объект контекста преобразования, к которому можно выполнять запросы на получение доступа к исходному и целевому объектам. Используя данную информацию, можно решить, выполнять дальнейшую обработку конкретного класса (
Если ключевые слова есть, мы можем ожидать вызова метода createTarget(). Именно здесь мы вносим наш вклад в преобразование. Листинг 2. Java-реализация правила класса
Первое, что обычно делают разработчики при реализации метода createTarget(), - это обращение к исходному и целевому объектам для данной части преобразования. Поскольку мы определили, что это расширение активизируется при обработке преобразованием UML-класса, то можем смело ввести целевой объект в объект Abstract Syntax Tree (AST) TypeDeclaration. Проект Eclipse Java Developer Tools (JDT) предоставляет все API для манипулирования исходным Java-кодом. AST - это объектная модель, анализирующая синтаксис исходного кода для Eclipse. При активизации этого метода, интегрированной средой преобразования создается новый объект TypeDeclaration. Нужно отметить, что если есть какой-нибудь существующий Java-код, он не будет доступен в целевом объекте. Объединение сгенерированного кода с существующим происходит после преобразования всех элементов модели. Подробное обсуждение AST выходит за рамки данной статьи, но нужно отметить, что когда расширение нуждается в добавлении новых элементов к сгенерированному исходному коду, это делается путем вызова методов AST-объектов. В нашем простом примере мы просто добавим новый тег Javadoc в комментарии Javadoc определения класса. Javadoc - это тип объектов в AST, получаемый из объекта TypeDeclaration.
Метод должен возвратить целевой объект. Обычно это тот же объект, который был передан как назначение. На этом завершается процесс создания и реализации расширения преобразования. Шаг 5. Тестирование расширения Теперь после определения и реализации расширения пора приступить к его тестированию. Это делается путем создания новой отладочной конфигурации, которая открывает новую рабочую среду времени исполнения (runtime workbench).
Совет:
Рисунок 8. Новая отладочная конфигурация
Рисунок 9. Тестовый проект в рабочей среде времени исполнения Затем необходимо добавить в класс ключевое слово, поскольку ваше расширение будет работать только с классом, в котором определено ключевое слово.
Рисунок 10. Настройка свойства keywords После установки тестового проекта и модели необходимо создать новую конфигурацию преобразования, которая определяет основные параметры преобразования UML-to-Java 5.
Рисунок 11. Создание новой конфигурации преобразования
Рисунок 12. Выбор преобразования
Рисунок 13. Настройка источника и назначения преобразования
Рисунок 14. Параметры конфигурации преобразования Теперь после создания конфигурации ее можно активизировать. Для работы с данным проектом ее не нужно создавать повторно.
Рисунок 15. Активизация преобразования На рисунке 16 показаны результаты преобразования. Вы можете увидеть, что тег Javadoc, соответствующий добавленному вами значению ключевого слова, включен в Javadocs класса. Рисунок 16. Результаты генерирования кода Этот простой пример расширения преобразования UML-to-Java 5 демонстрирует базовый механизм создания расширений. Реальные расширения в своем большинстве наверняка будут более интеллектуальными, используя информацию в модели и выполняя более интересные изменения в сгенерированном коде или даже добавляя сопутствующие артефакты в исходный код. Важным заключением, которое можно сделать по данной статье, является то, что создание расширений существующих преобразований имеет большой смысл, когда нужно использовать возможности всего сделанного ранее и просто внести небольшие изменения или добавления в выходные данные. Наличие одного общего преобразования, генерирующего код, а также других артефактов (например, дескрипторы развертывания или сопутствующие файлы) также упрощает процесс разработки, поскольку нужно выполнить только одно, а не много преобразований. |