Использование и модификация Web-сервиса Free Time из IBM Lotus Domino V7

Источник: developerworks
Андрей Кувшинников, главный разработчик Domino-приложений, Botstation Technologies

Новый Web-сервис Free Time состоит из двух частей: задачи сервера Lotus Domino V7 под названием WSCONN и базы данных Lotus Domino V7, содержащей Web-сервис. Загрузить эту задачу и базу данных можно с ресурса IBM Passport Advantage. Во время поиска по IBM Passport Advantage ищите либо инвентарный номер C8525NA, либо текстовую строку " Free Time Web Service". База данных только с Web-сервисом доступна в разделе Загрузка этой статьи.

Серверная задача WSCONN

Серверная задача WSCONN отвечает за выполнение запроса Web-сервиса к Web-сервису Free Time, расположенному на другом сервере Lotus Domino V7. Когда клиент IBM Lotus Notes выполняет поиск по календарю на предмет доступности людей или ресурсов, сервер Lotus Domino V7 осуществляет поиск свободного времени для участников встречи. Если участник, имя которого представляет собой адрес электронной почты, находится в том же самом домене Lotus Domino, что и сервер, сервер получает информацию о свободном времени участника из базы данных Free Time (busytime.nsf). Если участник находится не в локальном каталоге Lotus Domino Directory, сервер отправляет запрос Web-сервиса на другой сервер Lotus Domino V7, используя в качестве шлюза WSCONN. WSCONN выполняет запрос к Web-сервису с помощью URL-адреса, определённого в переменной Notes.ini WSCALCONN_URL. Этот URL, ссылающийся на удалённый сервер Lotus Domino V7, выглядит следующим образом: http://host/busytimews.nsf/busytimelookup?OpenWebService.

Загрузить задачу WSCONN можно через консоль сервера Lotus Domino с помощью команды LOAD WSCONN. Для автоматического запуска задачи WSCONN во время запуска сервера добавьте WSCONN в переменную ServerTasks в файле Notes.ini.

ПРИМЕЧАНИЕ: Чтобы обеспечить работоспособность удалённого поиска, необходимо использовать имя контакта, представленное в виде адреса электронной почты. Если в вашей организации используется несколько доменов Lotus Domino, эту функциональность легко протестировать. При работе с каталогом Lotus Domino Directory из другого домена скопируйте адрес электронной почты контакта в буфер обмена. Затем откройте календарь и вставьте этот адрес в поле Invitees новой назначенной в календаре встречи. Нажмите Scheduler, чтобы увидеть доступность по календарю тех людей, которых вы выбрали. Запись, соответствующая человеку с указанным адресом, заполняется информацией о встречах, запланированных в календаре данного человека, как показано на рисунке 1, благодаря запросу Web-сервиса, выполненного сервером Lotus Domino V7.

Рисунок 1. Назначение встречи с удалённым пользователем

Здесь можно увидеть результат поиска Web-сервиса по стандартной почтовой базе данных Lotus Notes. Пользователь Lotus Notes создал приглашение на новую встречу для двух людей. Первый человек - Мэри Поппинс; другой - Питер Пэн. Мэри Поппинс - пользователь Lotus Notes из того же домена, что и владелец почтового файла, и её имя отображается в сокращённом формате Lotus Notes. Календарь Питера Пэна находится на удалённом сервере и недоступен напрямую текущему пользователю. Имя Питера Пэна вводится в виде электронного почтового адреса, что говорит серверу о том, что для получения информации о доступности из календаря на удалённом сервере через вызов Web-сервиса следует использовать задачу WSCONN. В графическом планировщике отображается информация о доступности по календарю для обоих людей, так что пользователь, создавший приглашение, не видит разницы между результатами поиска свободного времени по Lotus Notes и результатами запроса Web-сервиса.

Имеется возможность указания в переменной WSCALCONN_URL URL-адреса, ссылающегося на любой Web-хост; теоретически существует возможность выполнять запросы о свободном времени к серверам, на которых работает не Lotus Domino V7, а, например Apache Tomcat, IBM WebSphere Application Server и Microsoft Internet Information Services. Этот сервер может найти необходимую информацию в собственном календарном приложении и сформатировать ответ в соответствии с теми типами данных, которые ожидает получить сервер Lotus Domino. Таким образом, возможна бесшовная интеграция календарных запросов в реальном времени между двумя совершенно различными системами.

База данных busytimews.nsf

Другой частью Web-сервиса Free Time является база данных Lotus Domino busytimews.nsf. В этой базе данных нет документов, а единственным её компонентом является Web-сервис под названием BusyTimeLookup. Исходный код Web-сервиса на LotusScript доступен, и изучив его, можно понять, как он работает. Кроме того, можно создать копию этого Web-сервиса и модифицировать его согласно вашим требованиям. (Далее в статье будет описан процесс создания упрощённой версии этого сервиса). Сам по себе, Web-сервис не зависит от задачи WSCONN; вызов Web-сервиса можно осуществить через клиент-потребитель, не запуская задачу WSCONN.

Так как Web-сервис находится внутри обычной базы данных Lotus Domino, на доступ к Web-сервису распространяются правила безопасности обычных списков управления доступом (ACL) Lotus Domino. Для ограничения доступа к Web-сервису можно модифицировать ACL базы данных busytimews.nsf, чтобы запретить доступ пользователям по умолчанию и анонимным пользователям, и разрешить доступ только для чтения (Reader-level access) людям, которым позволено использовать данный Web-сервис. Чтобы разрешить другому серверу Lotus Domino V7 получать доступ к Web-сервису через задачу WSCONN, создайте нового Web-пользователя и назначьте этому пользователю HTTP-пароль. Затем можно поместить эти имя пользователя и пароль в переменную WSCALCONN_URL в файле Notes.ini:

WSCALCONN_URL=
http://username:password@host/busytimews.nsf/busytimelookup?OpenWebService

Можно добавить ещё один уровень безопасности, задействовав Secure Sockets Layer (SSL) для шифрования трафика между сервером и клиентом.

Для получения WSDL-определения Web-сервиса Free Time перейдите по ссылке http://host/busytimews.nsf/busytimelookup?WSDL. (Этот WSDL URL мы используем в примерах клиентов-потребителей Java и Microsoft SOAP - MSSOAP).

Ещё одна база данных, содержащая аналогичный Web-сервис Free Time, - cppfbws.nsf; эту базу данных можно использовать вместо busytimews.nsf для предоставления возможности поиска свободного времени Web-клиентам и клиентам Lotus Notes. Разница между двумя базами данных состоит в том, что структура данных, возвращаемая Web-сервисом в cppfbws.nsf, слегка отличается от структуры, возвращаемой Web-сервисом в busytimews.nsf. Структура базы данных cppfbws.nsf и исходный код Web-сервиса скрыты. Если вы желаете использовать эту базу данных вместо busytimews.nsf, измените переменную WSCALCONN_URL в файле Notes.ini следующим образом:

WSCALCONN_URL= http://host/cppfbws.nsf/busytimelookup?OpenWebService

Доступ к Web-сервису Free Time

LotusScript-код Web-сервиса довольно прост. Когда Web-сервис получает запрос, он с помощью функции FreeTimeSearch получает временные периоды, когда запрашиваемый контакт занят в пределах указанного времени. При помощи той же функции можно также определить наличие свободных помещений и ресурсов.

Доступ к Web-сервису Free Time можно получить с помощью различных типов клиентов-потребителей Web-сервисов, например Apache Axis, Microsoft .NET и MSSOAP. Эти клиенты-потребители сервисов должны иметь поддержку сложных типов данных для отправки и получения данных. В примере клиента-потребителя, о котором идёт речь в нашей статье, мы используем Java-классы Axis, входящие в состав Lotus Domino V7 и Lotus Notes V7. Для максимального облегчения создания необходимых Java-классов мы используем основанный на Lotus Domino инструмент с открытым исходным кодом под названием Stubby, созданный Джулианом Робишо и доступный для загрузки с Web-сайта OpenNTF.

У многих более старых клиентов-потребителей Web-сервисов могут быть проблемы с анализом сложных типов данных, возвращаемых в результате вызова Web-сервиса Free Time. Так как исходный код Web-сервиса открыт, можно изменить LotusScript-код Web-сервиса, чтобы он принимал и возвращал простые типы данных, например, текстовые строки. В результате Web-сервис становится легко доступным практически со всех клиентов-потребителей, особенно с тех, которые создают динамические вызовы с помощью WSDL.

Теперь давайте рассмотрим примеры Java-агента и LotusScript-агента, программируемых для доступа к Web-сервису Free Time.

Вызов Web-сервиса из Java-агента

С помощью базы данных Stubby можно быстро создавать файлы-заглушки, содержащие всю функциональность, необходимую для вызова определённого Web-сервиса. Всё, что нужно знать - это место размещения WSDL-файла Web-сервиса; остальное Stubby делает автоматически. Этот инструмент генерирует Java-файлы, файлы классов и JAR-файл. Позже можно отделить сгенерированный JAR-файл, разместив его на локальном жёстком диске и импортировав его в Java-агент с помощью кнопки Edit Project на панели проектирования агента. В Java-агент не нужно импортировать какие-либо другие библиотеки, чтобы позволить агенту вызывать указанный Web-сервис. Если вам нужна дополнительная информация о методах, параметрах и типах данных Web-сервиса, найти её можно в сгенерированных исходных Java-файлах.

В Stubby также имеется поддержка аутентификации с помощью либо имени пользователя/пароля, либо при помощи маркеров системы единого входа (single sign-on - SSO). Также имеется решение для доступа к URL-адресам, защищённым с помощью SSL. Использование SSL в значительной степени повышает безопасность Web-сервиса, поскольку входящие запросы и исходящие ответы шифруются, что делает их нечитаемыми для наблюдателей, которые могли получить доступ к сетевому трафику между клиентом и Web-сервером. Шифрование также защищает имя пользователя и пароль, которые передаются как часть запроса.

После включения BusytimeService.jar в Java-агент можно написать код для вызова метода LOOKUP Web-сервиса. Параметр, который вы посылаете Web-сервису, представляет собой сложный тип данных под названием REQUESTSTRUCTURE, состоящий из нескольких массивов. Возвращаемый тип данных называется RESPONSESTRUCTURE и содержит вложенные массивы.

Можно также поместить такой же Java-код в компонент библиотеки JavaScript и использовать его из LotusScript-агента через LotusScript to Java (LS2J). В листинге 1 показан исходный код агента.

Листинг 1. Код для библиотеки JavaScript

import lotus.domino.*;
import DefaultNamespace.*;
public class JavaAgent extends AgentBase {
 public void NotesMain() {
  try {
   String[] attendees = new String[2];
   String[] requestors = new String[1];
   String[] details = new String[1];
	
   attendees[0]="Peter Pan"; //имя первого человека
   attendees[1]="Mary Poppins"; //имя второго человека		
   requestors[0]="";   //Web-сервису не требуется этот параметр
   details[0]="";   //Web-сервису не требуется этот параметр

   BusytimeServiceLocator locator = new BusytimeServiceLocator();
   Busytime service = locator.getDomino();

   DefaultNamespace.REQUESTSTRUCTURE REQUEST=new DefaultNamespace.REQUESTSTRUCTURE();
   REQUEST.setATTENDEES(attendees);
   REQUEST.setDETAILS(details);
   REQUEST.setREQUESTORS(requestors);
   REQUEST.setSTART("2007-02-26 01:01");  //Время начала поиска
   REQUEST.setEND("2007-02-26 22:01");   //Время окончания поиска
			
   DefaultNamespace.RESPONSESTRUCTURE respstr=service.LOOKUP(REQUEST);

   DefaultNamespace.RESPONSE[] resp=respstr.getATTENDEES();
   for(int x=0;x<resp.length;x++){
    System.out.println("\nPerson: "+resp[x].getATTENDEE());
    DefaultNamespace.INTERVAL[] interval=resp[x].getBUSY();
    System.out.println("Found busy periods: "+String.valueOf(interval.length));
    for(int i=0;i<interval.length;i++){
     System.out.println("-----------------------------------");
     System.out.println("**** Busy interval "+String.valueOf(i+1)+" ****");
     System.out.println("Start: "+interval[i].getSTART());
     System.out.println("End: "+interval[i].getEND());
    }
   }			
  } catch(Exception e) {
    e.printStackTrace();
  }
 }
}

На рисунке 2 показаны выходные данные Java-агента.

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

Если взглянуть на код агента, вы увидите, что данные, полученные в результате вызова, вложены в несколько уровней массивов. RESPONSESTRUCTURE содержит массив типа RESPONSE, доступ к которому осуществляется через getATTENDEES(). В каждом RESPONSE содержится имя человека, доступное через функцию getATTENDEE(), а также массив временных промежутков, доступный через функцию getBUSY(). В каждом INTERVAL содержится время начала и время окончания, доступ к которым осуществляется через функции getSTART() и getEND(). Тип данных INTERVAL содержит тип данных DETAIL, не используемый в данный момент; планируется размещать в нём информацию о месте проведения, помещениях, теме и председателе собрания. Пока вы знаете, какова структура возвращаемых типов данных, их перечисление обычно не вызывает сложностей.

Внесение изменений в Web-сервис

Теперь давайте рассмотрим, как можно изменить Web-сервис, чтобы он работал с клиентом MSSOAP. Можно вызывать объекты-потребители MSSOAP из кода LotusScript; вызов выполняется быстро, поэтому его выгодно использовать из клиента Lotus Notes.

Модифицированный Web-сервис принимает три параметра:

  • Имя человека
  • Начало временного периода
  • Конец временного периода

Результатом вызова этого Web-сервиса является одна строка, в которой значения отделены точками с запятой. В агенте-потребителе LotusScript можно легко сконвертировать такую строку в массив, применив к строке функцию Split().

Разница между этим изменённым и первоначальным Web-сервисом состоит в том, что изменённый сервис возвращает временные периоды, во время которых возможно резервирование времени для встреч с определённым человеком; первоначальный Web-сервис возвращает временные периоды, во время которых этот человек недоступен . Есть и ещё одно отличие: первоначальный Web-сервис переводит местное время во время по Гринвичу (GMT), в то время как модифицированный Web-сервис сохраняет время того временного пояса, в котором оно было задано пользователем.

В листинге 2 показан код этого упрощённого Web-сервиса.

Листинг 2. Упрощённый Web-сервис

Class busytime
Function lookup(attendeename As String, PeriodStartTime As String, 
PeriodEndTime As String) As String
 On Error Resume Next 'required to handle non-existing names
 Dim session As New NotesSession
 Dim timewindow As NotesDateRange
 Dim startDateTime As New NotesDateTime(PeriodStartTime)
 Dim endDateTime As New NotesDateTime(PeriodEndTime)
 Dim busyTime As Variant
 		
 Set timewindow = session.CreateDateRange()
 Set  timewindow.StartDateTime = startDateTime
 Set  timewindow.EndDateTime = endDateTime
 busyTime = session.FreeTimeSearch ( timewindow, 5, attendeename, False)
 If (busyTime(0) Is Nothing) Then
  tmp="No Match Found"
 Else
  Forall x In busyTime 'loop through all free time periods
   tmp=tmp+ x.Text+";" 'concatenate times into a single string
  End Forall
 End If
 lookup=tmp
End Function
End Class

Очевидно, что код этого Web-сервиса значительно короче первоначального, однако он обеспечивает практически ту же функциональность.

Вызов модифицированного Web-сервиса из LotusScript с помощью MSSOAP

Используя простые типы данных, нетрудно получить доступ к Web-сервису и передать ему параметры. Модифицированный Web-сервис принимает три строковых параметра и возвращает текстовую строку. Возвращённую строку следует разбить, используя точки с запятой в качестве разделителей временных периодов, как показано в листинге 3.

Листинг 3. LotusScript-код для вызова модифицированного Web-сервиса

Sub Initialize
 Dim intervals As Variant

'Specify the location of the service's WSDL file
sWSDL = "http://host/busytimews.nsf/BusyTimeLookupSimple?wsdl"

'Create a new MSSOAP client object 
Set Client =CreateObject("MSSOAP.SoapClient")

'Initialize connection to the WSDL file and get WSDL structure
Call Client.mssoapinit (sWSDL)

'Call Lookup function provided by Web service
wsresult = Client.lookup("Peter Pan", "2007-02-26 00:01", "2007-02-26 23:59")

'Split the semicolon-concatenated string to get all individual values	
intervals = Split(wsresult, ";")

Forall v In intervals 'loop through results
 If v<>"" Then
  cnt=cnt+1
  tmp=tmp+ "Busy Period "+Cstr(cnt)+": "+v+Chr(10)
 End If
End Forall

Messagebox tmp, MB_OK, "Result"
End Sub

На рисунке 3 показаны выходные данные агента.

С помощью всего 13 строк LotusScript-кода мы создали клиент-потребитель для Web-сервиса. Кроме того, можно использовать базу данных Stubby для генерации файлов-заглушек и вызова этого модифицированного Web-сервиса из Java-агентов.

Заключение

Существует возможность интегрировать функцию определения доступности людей и ресурсов по календарю в Lotus Domino V7 и другое ПО с помощью Web-сервисов. При необходимости можно модифицировать Web-сервис таким образом, чтобы в нём не использовались сложные типы данных. Применив автоматическую генерацию необходимых Java-файлов в Stubby и других инструментах (например, WSDL2Java), можно сэкономить несколько часов вашего драгоценного времени.


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