OV SD 4.5 Notifier: Менеджер уведомлений для HP OpenView Service Desk (краткое техническое описание)
Описание программы находится на Хабрахабре.
Скачать руководство пользователя и саму программу можно с Bitbucket.
Данная статья содержит технические детали реализации программы. Она будет полезна тем, кто захочет адаптировать её для своей организации.

Необходимые библиотеки и файлы

Программа основана на web-api.
Поэтому для начала требуется его сгенерировать. Выполняем скрипт:
cd %SD_CLIENTHOME%
mkdir webapi
jview /cp lib/servicepack.jar; lib/util.jar; lib/hotfix.jar; lib/common.jar; lib/ui.jar; lib/JClark.zip com.hp.util.AppGenWebApi webapi

, где webapi - каталог для сгенерированных исходных кодов.
В появившемся окне вводите свой логин и пароль и ждете завершения операции.
Далее по инструкции itsm008292.

Для работы программы также понадобятся библиотеки: Log4j, JavaMail, SWT, Velocity.

В рабочем каталоге программы должны находится файлы:
conf/log4j.xml — настройки логирования
conf/ovsd45notifier.properties — настройки программы
conf/mail.vm — шаблон почтового уведомления
log — каталог для логирования.

Структура программы

Программу можно разделить на четыре основные части.
  1. Основной поток — это главный Shell программы. По его части - иконка в области уведомлений, хранение полученных и не просмотренных уведомлений, отображение уведомлений. Сюда можно отнести классы: TrayManager, NoticeManager, Notification.
  2. Мониторы — отвечают за получение заявок. Передают заявки для уведомления в TrayManager и в почту.
  3. Модуль работы с почтой — работает с почтой.
  4. Классы для работы с Service Desk — управление сессией, получение данных по заявке.

Запуск программы происходит в классе Notifier. Он настраивает логирование, создает TrayManager, запускает потоки мониторов.

TrayManager создает иконку в области уведомлений и ждет появления заявок. Заявки передаются от монитора с помощью статического метода static void flash(List serviceCalls). TrayManager сохраняет поступившие заявки и при необходимости удаляет их. Для отображения заявок он обращается к NoticeManager.

NoticeManager создает всплывающие уведомления. Хранит список активных уведомлений, чтобы сдвигать их вверх, при появлении нового уведомления. Львиную долю кода данного класса занимает работа с окном для отображения всех заявок (методы showAllNotice и redrawWindow). Отрисовкой всплывающего уведомления занимается Notification, который является потоком.

Мониторы EmailMonitor и ViewMonitor реализуют абстрактный класс Monitor, унаследованный от Thread. Мониторы имеют три основных метода: showNotice, getServiceCall и sendMail. Различаются только последние два. Причем sendMail различается только темой сообщения.

IMAPMailer и POPMailer реализуют абстрактный Mailer, который содержит общие настройки для почты, общий фильтр сообщений, общие методы создания почтового уведоммления. IMAPMailer и POPMailer отличаются характером работы с почтой. Работа по протоколу POP последовательна и очевидна. В методах получения и отправки почты каждый раз создается соединение с сервером. В IMAPMailer соединение устанавливается один раз при старте. На ящик назначается прослушиватель количества сообщений. Метод получения почты только опрашивает количество сообщений и забирает полученные сообщения. Получением и фильтрацией сообщений занимается прослушиватель. А так как он работает в своем потоке, для передачи сообщений используется синхронизация.

Для получения и хранения информации по заявке используется класс ServiceCall. В нем почти все методы дублируют медоты интерфейса IServicecall из web-api. Это сделано, чтобы перекрыть методы с непонятными именами. IServicecall, Iperson, IOrganization содержат множество метод с именами, которые отличаются только индексом на конце. Для поиска нужных данных очень помогает Reflection API. Кроме этого в методах класса ServiceCall осуществляется дополнительная проверка и преобразование данных в нужный формат. Все данные с сервера загружаются при создании экземпляра ServiceCall. Это сделано для того, чтобы соединение не находилось в открытом состоянии долгое время. Для соединения существует таймаут. Если в заявке хранить только интерфейсы из web-api, то после обрыва соединения эти данные становятся неактуальными (они привязаны к идентификатору соединения). Заявка же должна жить в программе продолжительный промежуток времени, пока пользователь не просмотрит её.

Работа программы с EmailMonitor и с POPMailer может быть представлена следующей диаграммой последовательности.