|
|
|||||||||||||||||||||||||||||
|
Разработка элемента языка для Rational Software ArchitectИсточник: IBM developerWorks Россия Simon Джонстон (Simon Johnston), STSM, IBM Rational
В данной статье описаны методы, используемые для разработки элемента языка IBM Rational Software Architect (RSA), реализующего поддержку моделирования и генерирующего из UML-моделей исходный код на данном языке программирования. Данный элемент языка реализован в виде набора модулей для RSA, каждый из которых предоставляет определенный аспект решения по моделированию и генерации кода. В данной статье предполагается, что пользователи знакомы с архитектурой модулей Eclipse и способны разрабатывать модули для Eclipse или RSA. ВведениеВ данной статье описан процесс разработки примера элемента языка, предоставляющего среду моделирования и преобразования кода для генерации кода на языке Objective-C из UML-моделей в IBM Rational Software Architect (RSA). Для тех, кто не знает, Objective-C происходит от языка С с добавлением объектно-ориентированных конструкций программирования. Развитие Objective-C шло параллельно C++, хотя C++ получил более широкое распространение. Но язык по-прежнему используется, ядро API для операционной системы Apple Mac OS X было разработано на Objective-C. Разработчики, работающие с этой операционной системой, знакомы с такой средой, как Cocoa. Описанные в данной статье модули обеспечивают:
Структура элемента показана на рисунке 1. В данное время элемент состоит из трех модулей, которые подробней будут описаны в следующих разделах. Рисунок 1. Модули, входящие в состав элемента Моделирование на Objective-CПри использовании UML для моделирования на любом языке всегда имеются области, где UML более ограничен или более открыт в своем определении по сравнению с целевым языком. Например, в языках на основе С проблемой может стать отсутствие в UML структуры, позволяющей легко выполнить соответствие типам указателей. В Objective-C необходимо обратить внимание на отдельные элементы языка, требующиех при моделировании выполнения определенных правил. Среди них:
Затем для моделирования Objective-C необходима комбинация профиля (для определения элементов языка, которых нет в UML) и некоторых ограничений (для ограничения UML с учетом возможностей языка). Такой профиль кратно описан ниже в таблице.
На рисунке 2 показан пример модели, демонстрирующей общие структуры в контексте. Код, соответствующий интерфейсу класса для AddressModelClass, представлен в Листинге 1. Рисунок 2: Пример исходной модели
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin
id="com.ibm.xtools.sample.profiles.objectivec"
name="Objective-C Profile Plug-in"
version="1.0.0"
provider-name="IBM"
class="com.ibm.xtools.sample.profiles.objectivec.ObjectivecPlugin">
<runtime>
<library name="objc-profile.jar">
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="com.ibm.xtools.uml2.msl"/>
<import plugin="com.ibm.xtools.emf.msl"/>
</requires>
<!-- First the pathmap entry used in the profile extension -->
<extension
id="com.ibm.xtools.sample.profiles.objectivec.pathmap"
name="Objective-C Profile Pathmap"
point="com.ibm.xtools.emf.msl.Pathmaps">
<pathmap
name="OBJC_PROFILES"
plugin="com.ibm.xtools.sample.profiles.objectivec"
path=""/>
</extension>
<!-- Add the required profiles -->
<extension
id="com.ibm.xtools.sample.profiles.objectivec.profile"
name="ObjectiveCProfile"
point="com.ibm.xtools.uml2.msl.UMLProfiles">
<UMLProfile
id="com.ibm.xtools.sample.profiles.objectivec.profile"
name="Objective-C"
path="pathmap://OBJC_PROFILES/profiles/ObjCProfile.epx"
required="false"
visible="true">
</UMLProfile>
</extension>
<!-- Add the library data type model -->
<extension
id="objcdatatypes"
name="Objective-C Data Types Library"
point="com.ibm.xtools.uml2.msl.UMLLibraries">
<UMLLibrary
id="objcdatatypes"
name="Objective-C Data Types"
path="pathmap://OBJC_PROFILES/libraries/ObjCDataTypes.uml2"
required="false"
visible="true">
</UMLLibrary>
</extension>
</plugin>
|
Данный модуль создан.
Модель шаблона используется в Rational Software Architect, если пользователь выбирает меню File -> New -> UML Model; при этом открывается диалоговое окно, в котором можно выбрать модель из списка текущих зарегистрированных моделей шаблонов. После выбора модели Rational Software Architect обрабатывает копию шаблона в выбранном проекте. Пример модели берется в RSA в галерее Samples, по существу, это завершенный пример, использованный ранее (AddressModelClass).
Как и на рисунке 3, на рисунке 6 представлены зависимости этого модуля в Rational Software Architect и на платформе Eclipse. Таким же образом, как и профиль, создайте другой пустой модуль и назовите его com.ibm.xtools.sample.models.objectivec. Как и ранее, создайте две новых папки (examples и templates) для хранения содержимого.
Рисунок 6: Зависимости для модуля профиля

Для включения модели шаблона прежде всего необходимо запустить исполняемое приложение. Это необходимо для того, чтобы модель шаблонов в модуле профилей использовала библиотеку профилей и типов данных. Модуль профилей будет активироваться при запуске другого приложения. После запуска исполняемого приложения создайте новый проект моделирования и в нем новую пустую модель, назвав ее Objective-C Model.emx. Rational Software Architect автоматически открывает эту модель. Ключевые действия здесь необходимы для связи этой модели с ранее созданным профилем и библиотекой.
Сначала выберите саму модель и откройте панель Properties, затем на вкладке Profiles нажмите кнопку Add. Открывается диалоговое окно с двумя секциями: одна для зарегистрированных профилей, в другой можно выбрать профиль из файла. Нужный профиль должен находиться в списке зарегистрированных профилей (см. рисунок 7).
Если профиля нет в списке в диалоговом окне, вернитесь к приложениюе разработки и просмотрите в консоли возможные сообщения об ошибках. Убедитесь, что в конфигурации для исполняемого приложения модули выбраны.
Рисунок 7: Добавление профиля Deployed Profile
Далее необходимо подключить библиотеку типов данных. Для этого нажмите правой кнопкой мыши модель и выберите Import Model Library. Библиотека моделей должна появиться в списке зарегистрированных библиотек (см. рисунок 8).
Рисунок 8: Добавление развернутой библиотеки моделей
Перед сохранением и закрытием модели создайте новый пакет с именем MyFramework, а затем примените к нему стереотип «framework» из профиля Basic. Модель должна выглядеть аналогично рисунку 9.
Рисунок 9: Структура шаблона модели
Наконец, необходимо упаковать модель в виде шаблона в новый модуль. Для этого требуется создать в папке шаблонов в рабочем пространстве разработки файл .ve, содержимое которого показано в листинге 3. В эту папку также нужно поместить только что созданную модель, а также значок для отображения в диалоговом окне New UML Model (в данном случае использован значок стандартной модели из RSA). Разработка самого шаблона на этом закончена.
# # START NON-TRANSLATABLE # id=com.ibm.xtools.sample.models.objectivec.template templateFile=Objective-C Model.emx icon=Objective-C Model.gif # # END NON-TRANSLATABLE # name=Objective-C Model description=Create a new Model for designing frameworks and applications in Objective-C. |
Создайте снова пример модели, запустив исполняемое приложение и скопировав только что созданную модель шаблона. В результате создается корректная начальная точка, связанная со всеми необходимыми моделями. В этом примере основной пакет переименовывается, добавляется группа классов, некоторые стереотипы с протоколом и категорией. Создав нужную модель, добавьте необходимые комментарии, чтобы другие пользователи могли понять, для чего нужна модель и как ее использовать.
Еще нужен простой HTML-файл (overview_simple.html), описывающий созданный пример. Этот файл будет включен в галерею примеров. Файл полностью соответствует HTML-стандарту, но ссылка на действие Install the Sample является обратным вызовом в Rational Software Architect для выполнения установки. Это показано в листинге 4 (обратите внимание, что текст здесь переформатирован для более четкого представления, не используйте повторно следующий текст). Обратите внимание, что функция liveAction идентифицирует имя мастера, который будет определен в plug-in.xml. Это необходимо выполнить правильно.
Листинг 4. Оперативные действия на странице галереи примеров
<a href="#"
onclick='liveAction("com.ibm.xtools.sample",
"com.ibm.xtools.sample.internal.LiveActionDelegate",
"com.ibm.xtools.sample.models.objectivec.simplewizard")' >
<img src="/SampleGallery/topic?file=com.ibm.gallery.common/images\import_obj.gif"
border="0"
width="16"
height="16"
alt="Import icon">
</a>
<a href="#"
onclick='liveAction("com.ibm.xtools.sample",
"com.ibm.xtools.sample.internal.LiveActionDelegate",
"com.ibm.xtools.sample.models.objectivec.simplewizard")' >
Import the sample
</a>
|
Снова необходимо рассмотреть упаковку, хотя это относительно просто, так как основная часть работы будет связана с файлом plug-in.xml. Для упаковки примера, включенного в галерею примеров, необходимо создать .zip файл с примером модели и файл .project среды Eclipse. Это файл проекта довольно прост (см. листинг 5). После создания zip-файла добавьте его к папке примеров в проекте модуля.
Листинг 5. Пример файла проекта
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>SampleObjectiveCProject</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>com.ibm.sse.model.structuredbuilder</name>
<arguments></arguments>
</buildCommand>
</buildSpec>
<natures></natures>
</projectDescription>
|
Теперь имеются все ресурсы, необходимые для модуля, и можно заметить, что связи между модулями, требуемые сначала для разработки профилей, соответствуют шаблону и примеру. Далее будет показано, как этот модуль будет использовать в следующем шаге: преобразование.
Окончательный файл plugin.xml, связывающий все вместе, показан на листинге 6. Расширение для шаблонов модели очень простое: оно только определяет папку, в которой Rational Software Architect ищет файлы. С другой стороны, расширения для галереи примеров более сложные, для них требуется регистрации как обзорной HTML-страницы, так и мастера, запускаемого по действию установки.
Листинг 6. Шаблон и файл примера plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin
id="com.ibm.xtools.sample.models.objectivec"
name="Objective-C Models Plug-in"
version="1.0.0"
provider-name="IBM"
class="com.ibm.xtools.sample.models.objectivec.ObjectivecPlugin">
<runtime>
<library name="objc-models.jar">
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="com.ibm.xtools.modeler.ui.wizards"/>
<import plugin="com.ibm.xtools.sample"/>
</requires>
<!-- Add the model templates -->
<extension
point="com.ibm.xtools.modeler.ui.wizards.template">
<directory path="templates"/>
</extension>
<!-- Add the example model -->
<extension
id="umlmodels.samples"
point="com.ibm.samplegallery.sample">
<sample
href="examples/overview_simple.html"
name="Objective-C Simple Example"
category="com.ibm.samplegallery.category.technology.umlmodels"
id="com.ibm.xtools.sample.models.objectivec.overview_simple">
</sample>
</extension>
<extension
id="simplewizard"
point="com.ibm.samplegallery.importWizard">
<wizard
banner="com.ibm.xtools.sample.umlmodels/icons/model_wiz.gif"
name="Sample Objective-C UML Model Project"
class="com.ibm.xtools.sample.internal.InstallProjectWizard"
finalPerspective="com.ibm.xtools.modeler.internal.ui.perspectives.ModelingPerspective"
id="com.ibm.xtools.sample.models.objectivec.simplewizard">
<projectsetup
pagetitle="Import Objective-C UML Model Project"
name="SampleObjectiveCProject"
label="Project Name:"
open="Objective-C Model.emx"
pagedescription="Create a project with a sample Objective-C UML model.">
<import
dest=""
src="examples/simple.zip">
</import>
</projectsetup>
</wizard>
</extension>
</plugin>
|
Для проверки успешного добавления примера в галерею примеров прежде всего следует запустить исполняемое приложение. Запустив приложение, выберите меню Help -> Samples Gallery и откройте папку Technology Samples, а затем папку UML models. В этой папке должен находиться пример Objective-C. После прочтения связанного обзорного текста можно нажать ссылку установки. Ссылка установки вызывает мастера, создающего новый проект, и позволяющего переименовать проект перед его добавлением к рабочему пространства. На рисунке 10 показана галерея примеров с успешно интегрированным примером.
Рисунок 10: Samples Gallery
Разработка преобразования из UML в Objective-C
Преобразование представляет собой один из трех модулей, для которого требуется писать код. Код позволяет UML2 API считывать модель, технология JET помогает записать собственно преобразование и экспортировать текст в ресурсы файловой системы. На рисунке 11 показана отдельная точка расширения, используемая модулем.
Рисунок 11: Зависимости для модуля профиля
Создание модуля преобразования
Для создания скелета модуля используйте стандартный мастер модулей Eclipse, как и для создания предыдущих двух модулей. Но в этот раз выберите мастер содержимого. Сначала назовите модуль com.ibm.xtools.sample.transform.objectivec и переместите его в список шаблонов. Выберите из списка шаблон Plug-in with Transformation и переходите к следующей странице. На странице New Transformation Provider не изменяйте имя пакета, но измените имя класса на UML2ObjCTransformationProvider, затем переходите к следующей странице. На этой странице требуется сделать несколько изменений: необходимо сделать Name более читаемым, добавить префикс к имени Class и изменить Target Model Type на Resource (см. рисунок 12).
Рисунок 12: Свойства New Transformation
Перейдите к следующей странице мастера, где нужно ввести определения новых правил. Правила используются для сопоставления элементов модели в источнике и переключения правильного преобразования. Нужно добавить два новых правила.
Затем диалоговое окно можно закрыть. Создается код и модуль, результирующий файл plugin.xml выглядит так, как показано в листинге 7.
Листинг 7. Файл преобразования plugin.xml
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin
id="com.ibm.xtools.sample.transforms.objectivec"
name="Objective-C Transformation Plug-in"
version="1.0.0"
provider-name="IBM"
class="com.ibm.xtools.sample.transforms.objectivec.UML2ObjCPlugin">
<runtime>
<library name="objc.jar">
<export name="*"/>
</library>
</runtime>
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="com.ibm.xtools.common.core"/>
<import plugin="com.ibm.xtools.transform.core"/>
<import plugin="com.ibm.xtools.transform.uml2"/>
<import plugin="org.eclipse.uml2"/>
</requires>
<extension
point="com.ibm.xtools.transform.core.transformationProviders">
<TransformationProvider
class="com.ibm.xtools.sample.transforms.objectivec.transformationProvider.UML2ObjcCTransformationProvider">
<Priority
name="Highest">
</Priority>
<Transformation
version="1.0.0"
name="UML to Objective-C"
groupPath="com.ibm.xtools.sample.transforms.objectivec"
sourceModelType="UML2"
targetModelType="Resource"
id="com.ibm.xtools.sample.transforms.objectivec.transformation">
<Property
readonly="true"
name="system.transformation.property"
value="ClassName=
com.ibm.xtools.sample.transforms.objectivec.transformationProvider.UML2ObjCTransformation;
IsUMLKind=true;"
id="system.transformation.property">
</Property>
</Transformation>
</TransformationProvider>
</extension>
</plugin>
|
Следующий шаг - добавление к проекту JET-типа и создание JET-шаблонов, которые будут использоваться для генерации исходного кода. Сначала выберите меню File -> New -> Other. Выберите в списке папку Java Emitter Templates, а затем мастер Convert Projects to JET Projects. Выберите проект преобразования в списке проектов мастера и нажмите Finish. При этом к проекту добавляется не только JET-тип (и конструкторы), но в проекте также создается папка Templates. Наконец, перед записью первого шаблона, необходимо настроить последний шаг, представляющий собой запись JET своего исходного кода. Для этого выберите проект и откройте Properties, затем выберите JET Settings и убедитесь, что в поле Source Container установлено src (см. рисунок 13).
Рисунок 13: Настройка JET Settings
Теперь можно создавать собственные шаблоны! Во-первых, это файл скелета, который JET использует как контейнер для сгенерированного Java-класса. Для этого откройте папку шаблонов и создайте новый текстовый файл с именем JET.skeleton (File -> New -> File), а затем добавьте содержимое, показанное в листинге 8.
/**
* This class was generated automatically from a JET template.
* Copyright (c) 2005,2006 IBM Corporation.
*
* @author Simon Johnston
* @generated
*/
public class CLASS {
/**
* The body of this method is generated from a JET template and is intended to
* be called by an RSA Transformation Framework Rule class.
*
* @param argument a Map containing parameters required by the script.
* @return the text of the expanded template.
*/
public String generate(Object argument) {
return "";
}
}
|
Листинг 9. Шаблон ObjCClassHeadTemplate.javajet
<%@ jet package="com.ibm.xtools.sample.transforms.objectivec.jetsrc"
imports="java.util.* org.eclipse.uml2.*"
class="ObjCClassHeadTemplate"
skeleton="JET.skeleton"
%>
<%
/*
* This template will either generate the header (.h file) or body (.m file) consisting of the
* Objective-C representation of a given UML Class. The restriction on classes in UML are only
* that only single inheritance is supported. Also, Objective-C only supports public methods
* and so private and protected operations in the model will not be generated. Instance variables
* (attributes/properties) may be public, protected or private but may not be marked static.
*
* The UML Class may have the stereotype "category" applied (or a corresponding keyword) in which
* case the class is restricted also to not provide any additional instance variables.
*/
final Map parameterMap = (Map) argument;
if (parameterMap == null) {
return stringBuffer.toString();
}
%>
|
Листинг 10. Требуемые предложения импорта
import java.util.HashMap; import java.util.Map; import org.eclipse.core.resources.IFolder; import com.ibm.xtools.sample.transforms.objectivec.jetsrc.ObjCClassHeadTemplate; import com.ibm.xtools.sample.transforms.objectivec.utils.*; |
Замените метод createTarget кодом, приведенным в листинге 11. Обратите внимание, что код вызывает шаблон дважды, и использует класс утилит для создания в рабочем пространстве файла на основе шаблона. Также можно заметить, что Java-класс HashMap используется для передачи параметров в JET-шаблон. В шаблоне выше, сгенерированном Java, предполагалось, что параметр argument имеет значение Map.
Листинг 11. Метод createTarget в UML2ObjCClassRule.java
public Object createTarget(ITransformContext ruleContext) {
/*
* Extract the class and target from the rule context passed to us.
*/
org.eclipse.uml2.Class theClass = (org.eclipse.uml2.Class)ruleContext.getSource();
if (theClass != null) {
if (ruleContext.getTargetContainer() != null && ruleContext.getTargetContainer() instanceof IFolder) {
final IFolder folder = (IFolder)ruleContext.getTargetContainer();
/*
* Set up the arguments in a map in preparation to create the header file.
* Generate the header source using the JET template, passing in the map object.
*/
Map map = new HashMap();
map.put("GEN_CLASS", theClass);
map.put("GEN_BODY", new Boolean(false));
ObjCClassHeadTemplate template = new ObjCClassHeadTemplate();
String fileContent = template.generate(map);
ResourceUtils.createFile(folder, theClass.getName()
+ ".h", fileContent, this.getProgressMonitor(ruleContext));
/*
* Set up the arguments in a map in preparation to create the body file.
* Generate the header source using the JET template, passing in the map object.
*/
map.remove("GEN_BODY");
map.put("GEN_BODY", new Boolean(true));
fileContent = template.generate(map);
ResourceUtils.createFile(folder, theClass.getName()
+ ".m", fileContent, this.getProgressMonitor(ruleContext));
/*
* Refresh the workspace.
*/
try {
folder.refreshLocal(1, this.getProgressMonitor(ruleContext));
} catch (Exception ex) {
System.out.println("ERROR UML2ObjCClassRule.createTarget: exception refreshing folder.");
ex.printStackTrace();
}
} else {
System.out.println
("ERROR UML2ObjCClassRule.createTarget: targetContainer is either null or not an IFolder.");
}
}
return null;
}
|
Само преобразование состоит из двух проходов. За один проход генерируется заголовочный файл (.h), зав другой - файл реализации (.m). В данную статью не включен полный исходный код шаблона (его можно найти в загружаемых ресурсах), но логика кода довольно проста.
В Objective-C имеется несколько специальных методов, хотя в отличие от Java или C++ они не являются специальными собственно для языка. Скорее эти методы являются специальными в соответствии с соглашением по именованию. Эти специальные методы включают выделение ресурсов, освобождение ресурсов и инициализацию объектов. Наряду с такими методами в Objective-C для средств доступа имеются другие соглашения или идиомы. Для демонстрации специальных методов и идиом рассмотрим интерфейс класса, представленный в листинге 12.
Листинг 12. Пример интерфейса класса
@interface TestClass : NSObject
{
@private
NSString *name;
NSArray *knownAs;
}
+(id)alloc;
-dealloc;
-init;
-(void)setName:(NSString *)newName;
-(NSString*)name;
-(void)addKnownAs:(NSString *)newKnownAs;
-(void)removeKnownAs:(NSString *)oldKnownAs;
-(NSArray *)knownAs;
@end
|
Этот простой класс имеет отдельную переменную экземпляра name, методы доступа, а также специальные реализации методов alloc, dealloc и init (большинство классов не требует реализации alloc или dealloc). Методы выделения и освобождения ресурсов подобны понятиям конструкторов в Java/C++; но в Objective-C задания на выделение ресурсов и инициализацию разделены на два метода (листинг 13), поэтому значения по умолчанию для набора переменных экземпляра, а также другие операции по инициализации находятся в методе init.
Листинг 13. Пример реализации класса
@implementation TestClass
+(id)alloc
{
self = [super new];
return self;
}
-(void)dealloc
{
[name release];
[knownAs release];
[super dealloc];
}
- (id)init
{
self = [super init];
if (self) {
name = @"";
knownAs = [[NSArray alloc] init];
}
return self;
}
-(void)setName:(NSString *)newName
{
[newName retain];
[name release];
name = newName;
}
-(NSString *)name
{
return name;
}
-(void)addKnownAs:(NSString *)newKnownAs
{
[knownAs addObject: newKnownAs];
}
-(void)removeKnownAs:(NSString *)oldKnownAs
{
[knownAs removeObject: oldKnownAs];
}
-(NSArray *)knownAs
{
return knownAs;
}
|
Средства доступа в Objective-C немного более сложные, чем их аналоги в Java, вследствие протокола подсчета ссылок, реализованного всеми объектами, происходящими от NSObject. Рассматривать этот протокол подробно нет необходимости, поэтому рекомендуется использовать ранее представленные реализации.
Закодировав в JET-шаблоны правила, мы выполнили большую часть работы, и теперь можно протестировать преобразование.
Для запуска преобразования, как и для всех тестов, необходимо запустить исполняемое приложение. После его запуска необходимо использовать модель Objective-C. Можно создать полностью новую модель или использовать модель шаблона с помощью меню File -> New, а также можно воспользоваться примером модели из Samples Gallery! Открыв модель, можно нажать правой кнопкой мыши отдельный класс, интерфейс или пакет и вызвать преобразование. Появляется меню Transformation. При выполнении преобразования в первый раз оно находится в меню Run Transformation, которое представлено на рисунке 14.

При запуске преобразования в первый раз оно также должно собрать некоторые параметры. Очевидно, что источник уже выбран, так как это был элемент, нажатый правой кнопкой мыши, но необходимо выбрать целевую папку, в которой будут созданы исходные файлы (см. рисунок 15). Преобразование запускается после нажатия кнопки Run, выбирает отдельные ресурсы и обновляет панель проекта.
Рисунок 15: Диалоговое окно Transformation
Примечание: если используется перспектива Modeling, эти файлы в структуре проекта не отображаются. Для их просмотра переключитесь на перспективу Resource, файлы находятся в списке в Navigator.
Следует понимать, что упоминаемый выше шаблон не закончен, в данной статье полностью не приводится описание правила протокола или шаблона. Дополнительную информацию можно найти в исходных файлах проекта преобразования. Кроме того, имеется несколько вопросов, которые не описываются преобразованиями, например:
Более того, имеются дополнительные возможности, которые следует учитывать при разработке элемента языка, но это уже выходит за тему преобразования модели в код.;
Поэтому, как можно заметить, имеется множество упражнений, разобраться с которыми читатели смогут самостоятельно.
Теперь необходимо создать элемент, заключающий три модуля. Это относительно просто: создайте новый проект элемента (File -> New -> Feature Project), задайте имя проекта com.ibm.xtools.sample.language.objectivec и выберите три модуля, которые нужно включить в элемент. Когда мастер закончит работу, можно отредактировать файл feature.xml и добавить описание и т.д. В результате файл должен выглядеть примерно так, как показано на листинге 14.
<?xml version="1.0" encoding="UTF-8"?>
<feature
id="com.ibm.xtools.sample.language.objectivec"
label="com.ibm.xtools.sample.language.objectivec"
version="1.0.0"
provider-name="IBM">
<install-handler/>
<description>RSA Objective-C Language Modeling</description>
<copyright>(C) Copyright IBM Corp. 2004. All Rights Reserved.</copyright>
<requires>
<import plugin="org.eclipse.ui"/>
<import plugin="org.eclipse.core.runtime"/>
<import plugin="com.ibm.xtools.modeler.ui.wizards"/>
<import plugin="com.ibm.xtools.sample"/>
<import plugin="com.ibm.xtools.uml2.msl"/>
<import plugin="com.ibm.xtools.emf.msl"/>
<import plugin="com.ibm.xtools.common.core"/>
<import plugin="com.ibm.xtools.transform.core"/>
<import plugin="com.ibm.xtools.transform.uml2"/>
<import plugin="org.eclipse.uml2"/>
</requires>
<plugin
id="com.ibm.xtools.sample.models.objectivec"
download-size="0"
install-size="0"
version="1.0.0"/>
<plugin
id="com.ibm.xtools.sample.profiles.objectivec"
download-size="0"
install-size="0"
version="1.0.0"/>
<plugin
id="com.ibm.xtools.sample.transforms.objectivec"
download-size="0"
install-size="0"
version="1.0.0"/>
</feature>
|
Наконец, необходимо создать проект Update Site. Сделать это относительно просто: назовите проект com.ibm.xtools.sample.language.objectivec.site и включите в него ранее созданный элемент. Также стоит добавить к сайту категорию, чтобы облегчить пользователям навигацию при добавлении к своей конфигурации проекта update site. Все это представлено в листинге 15. Для распространения элемента теперь можно развернуть сайт в Интернете или создать сайт обновления архива (что очень просто: нужно заархивировать содержимое проекта Update Site, пользователи могут выполнить установку непосредственно из zip-файла).
<?xml version="1.0" encoding="UTF-8"?>
<site>
<feature
url="features/com.ibm.xtools.sample.language.objectivec_1.0.0.jar"
id="com.ibm.xtools.sample.language.objectivec" version="1.0.0">
<category name="Objective-C Language Feature"/>
</feature>
<category-def
name="Objective-C Language Feature"
label="language.objectivec">
<description>
Modeling profile, template and example for Objective-C with UML to source transformation.
</description>
</category-def>
</site>
|
В заключение можно заметить, что приложения Rational Software Architect в общем, и особенно приложение преобразования с JET, предоставляют замечательную базу для разработки элементов языка. Можно заметить, что при разработке такого элемента он не обязательно должен быть тривиальным, безусловно, получение рациональной функции «модель->код» не является таким уж сложным. Кроме того, хотя в этой статье описан подход, где цель заключается в полноценном языке программирования, этим подход не ограничивается: можно использовать генерацию для развертывания дескрипторов, конфигурации, определения данных и т.д.
| Главная страница - Программные продукты - Статьи - Управление разработкой ПО, CASE, Разработка ПО, IBM Rational |