Практика реализации модуля интеграции для Rational Software Architect. Часть 4

Источник: developerworks
Александр Новичков, руководитель отдела внедрения и консалтинга, СМ-Консалт, Алексей Черников, ведущий специалист отдела перспективных разработок, СМ-Консалт

Читать часть 3

Обеспечение связи созданного plug-in"а и IBM Rational ClearQuest 

Runtime Workbench можно закрыть, она нам больше не понадобится. А в среде с проектом откроем класс SampleAction.java. В функции run() можно увидеть код создания тестового окошка. Всё её содержимое можно стереть; здесь мы будем писать код работы с IBM Rational ClearQuest .

Первым делом нам потребуется добавить в проект декомпилированные классы CQJNI. Можно просто скопировать package из созданного ранее тестового проекта.

Наша цель - узнать и вывести состояния (state) и переходы (activity) для сущности. Для этого потребуется:

  1. узнать список баз данных, выбрать какую-то одну;
  2. узнать список сущностей в выбранной базе данных, выбрать одну;
  3. для выбранной сущности узнать состояния и переходы;
  4. вывести состояния и переходы.

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

Получение списка баз данных ClearQuest

Первым делом нужно узнать список баз данных. В Windows ClearQuest хранит эту информацию в реестре. Точное местоположение зависит от версии, которую тоже можно узнать через реестр. В данной статье будем предполагать, что используется 7-я версия ClearQuest (в коде, прилагаемом к статье, есть работа и с 6-й версией). Чтобы узнать версию, можно выполнить следующий запрос через консоль:

reg query "HKEY_CURRENT_USER\Software\Rational Software\ClearQuest"
 Если установлена 7-я версия, ответ будет содержать такую строчку: 
HKEY_CURRENT_USER\Software\Rational Software\ClearQuest\7.0.0
 Зная версию, можно узнать список баз данных по такому запросу: 
reg query "HKEY_CURRENT_USER\Software\Rational Software\ClearQuest\7.0.0\Core\Databases"
 Вернётся список папок, и названия баз данных
будут идти в этом списке сразу после "Databases\". 

Получение списка схем, находящихся в базе данных

Выбрав нужную нам базу данных из списка, с помощью CQ JNI можно узнать список схем. Мы уже пробовали делать простые обращения к ClearQuest, и в этом случае начало будет таким же, как и раньше:

	CQClearQuest cq = new CQClearQuest();/* Сначала создаётся приложение */
	CQAdminSession as = cq.CreateAdminSession();
	/* Нам требуется админский доступ для того, чтобы узнать список схем*/
	as.Logon(login, password, dbset);
	/* Здесь dbset - одна из баз данных, полученных в предыдущем пункте, 
	а login и password - админские, т.е. как при входе в ClearQuest Designer. 
	Для вызовов API ClearQuest"а порядок параметров лучше всего узнавать 
	в документации ClearQuest API, потому что в CQJNI параметры будут 
	без осмысленных названий. Ссылку можно найти в ресурсах к статье */

	CQSchemas ss = as.GetSchemas();/* Данный вызов выдаёт итерируемый список схем*/
List<String> = new ArrayList<String>(); 
/* В этом списке будем хранить имена схем */
/* Дальше поэлементно получаем эти самые имена: */
	for (int i = 0; i < ss.Count(); i++) {
	    CQSchema s = ss.Item(i);
	    schemas.add(s.GetName());
	}

В данном случае login, password и dbset должны быть те, что используются для доступа к ClearQuest Designer.

Получение списка имён сущностей

Здесь схема такая же, как и в предыдущем пункте; основная разница в том, что используется не админская сессия, а обычная. Соответственно, нужен тот логин/пароль, который используется для входа в клиент ClearQuest; в данном случае databaseName - это имя базы данных с запросами, а dbset такой же, как в предыдущем пункте:

CQClearQuest cq = new CQClearQuest(); CQSession session = cq.CreateUserSession(); session.UserLogon(login, password, databaseName, dbSet);/* Используется обычная пара login/password как для клиента ClearQuest, а не для ClearQuest Designer, в отличае от вызова в предыдущем пункте*/ String[] entities = session.GetEntityDefNames();

Получение состава состояний и переходов для сущности

Имея список имён сущностей, можно запросить отдельную сущность через сессию CQ. Имея сущность, можно узнать её состояния и переходы:

CQEntityDef entity = session.GetEntityDef(entityName); String[] actions = entity.GetActionDefNames(); String[] states = entity.GetStateDefNames();

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

Осталось визуализировать импортированную стейт-машину сущности. Наиболее естественный способ - визуализировать с помощью встроенных средств RSA, а именно с помощью такого элемента UML, как State Machine. Для этой цели к статье прилагается класс, который создаёт State-диаграмму; здесь рассмотрим основные проблемные моменты в этом классе.

Для работы с UML в RSA нужно сначала создать структуру UML, а затем отобразить её на визуальную диаграмму.

Для наших целей сначала потребуется Use Case, затем для этого Use Case нужно создать State Machine, а для неё - Region, в который можно уже добавлять стейты и переходы. При этом, если создать для State Machine диаграмму, все стейты и переходы будут добавляться на неё автоматически (для большинства других диаграмм нужно дублировать создание логического UML элемента вызовом, который этот элемент отобразит на диаграмму).

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

Чтобы иметь возможность что-либо создавать, нам потребуется UML Model. Её можно выбрать, например, из списка открытых моделей, который можно получить по вызову UMLModeler.getOpenedModels();

Можно открыть модель по имени, или создать новую:

model = UMLModeler.openModel(name); model = UMLModeler.createModel(name);

Так или иначе, имея на руках модель model, с которой мы будем работать, мы можем создать в ней Use Case:

UseCase uc = (UseCase) model.createPackagedElement(name, UMLPackage.eINSTANCE.getUseCase());

Стоит обратить внимание на вызов UMLPackage.eINSTANCE.getUseCase() - таким образом задаётся тип создаваемого элемента. В UMLPackage.eINSTANCE есть методы, чтобы задать большинство UML- элементов.

Все остальные элементы, которые мы обозначили, создаются похожим образом; точные процедуры создания можно посмотреть в прилагаемых исходниках.

Чтобы создать диаграмму для созданного UseCase, можно воспользоваться утилитой IBM Rational Software Architect  - UMLDiagramHelper.

Diagram d = UMLModeler.getUMLDiagramHelper().createDiagram(model, UMLDiagramKind.USECASE_LITERAL); UMLModeler.getUMLDiagramHelper().createNode(d, uc);

Второй вызов визуализирует созданный UseCase на диаграмме.

Заключение: объединяем всё воедино

К статье прилагаются исходные тексты plug-in"а. Для доступа к CQ реализован класс ClearQuestIntegration. Для визуализации - класс CQUMLStateVisualizer.

Чтобы создать работающий plug-in, осталось вернуться к методу run() в классе SampleAction; с использованием классов из данной статьи этот метод будет выглядеть примерно так:

try { int version = ClearQuestIntegration.getVersion(); /* Сначала получаем версию установленного CQ*/ List<String> databases = ClearQuestIntegration.getRepositories(version); /*Затем получаем список баз данных*/ new CQUMLStateVisualizer(new CQClearQuest(), "admin", "", "SAMPL", databases.get(0), "Defect");/* Для того чтобы отобразить сущность "Defect" (имя сущности передаётся в последнем параметре), потребуются логин и пароль от клиента ClearQuest, чтобы получить матрицу переходов сущности. Чтобы её узнать, потребуется обращаться к ClearQuest, для чего нужен экземпляр приложения ClearQuest. Остальные два параметра указывают, где искать указанную сущность ("SAMPL" - название встроенной в ClearQuest базы с запросами, а databases.get(0) - название базы данных со схемами) */ } catch (Exception e) { /* Если plug-in не может работать, напечатать причину, но кроме этого ничего не будем делать */ e.printStackTrace(); }

После этого, остаётся упаковать plug-in, чтобы можно было его эффективно поставлять конечным пользователям.

Как упоминалось ранее, для этого необходимо сделать Feature и Update Site.

Начнём с создания Feature. Для этого нужно зайти в File - New - Other и выбрать "Feature Project" (Рисунок 10).

Рисунок 10. Окно создания проекта, выбор Feature-проекта
Рисунок 10. Окно создания проекта, выбор Feature-проекта

Далее следует нажать "Next" и ввести имя Feature-проекта - например, IBM Rational Software Architect CQImport - и снова нажать "Next". В появившемся меню предлагается выбрать plug-in"ы, которые войдут в состав этого Feature. В нашем случае будет только один plug-in: RSACQIntegration (Рисунок 11).

Рисунок 11. Окно выбора plug-in"ов, которые войдут в состав Feature. В состав Feature войдёт отмеченный plug-in IBM Rational Software Architect CQIntegraion, который мы до этого создали
Рисунок 11. Окно выбора plug-in

Выбрав его, можно нажимать на Finish.

                                                                                                                                                                                                               Читать часть 5


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=23268