レベル: 中級 Andrei Kouvchinnikov, Developer and consultant, Botstation Technologies
2007年 4月 17日 2007年 12月 19日 更新 IBM Lotus Notes のユーザーや開発者にとって、IBM Lotus Domino V7 の新しい Free Time Web サービスがどのように役立つかを学びましょう。そしてLotus Domino サーバーが他のサーバーのカレンダーの空き状況を参照できるようにし、またリモートの Domino サーバーからプログラムによって空き時間情報を取得するエージェントの作成方法を学びましょう。
この記事では、Free Time Web サービスと呼ばれる IBM Lotus Domino V7 の新しい Web サービスについて学びます。そして、このサービスが
Lotus Domino でどのように実装されているか、また Lotus Domino や Java の開発者が人間とリソース両方のカレンダーの空き状況を入手する上で、どのようにしてこの
Web サービスを利用することができるかを学びます。
この新しい Free Time Web サービスは、WSCONN と呼ばれる Lotus Domino V7 サーバー・タスクと、この Web
サービスを含む Lotus Domino V7 データベースという、2 つの部分から構成されています。このタスク・プログラムとデータベースは、IBM Passport Advantage からダウンロードすることができます。IBM Passport Advantage 内で検索を行うときは、part number を C8525A として検索するか、テキスト・ストリングを「Free Time Web Service」として検索してください。またこの Web サービスを含むデータベースに関しては、この記事の「ダウンロード」セクションから入手することもできます。
WSCONN サーバー・タスク
WSCONN サーバー・タスクは、別の Lotus Domino V7 サーバー上の Free Time Web サービスに対して Web サービスのリクエストを行います。IBM
Lotus Notes のクライアントが、人間の、あるいはリソースのカレンダーの空き状況を検索すると、Lotus Domino V7 サーバーは、ミーティング出席者の空き時間を参照します。もし出席者
(名前はインターネット E メールのアドレスです) が Lotus Domino V7 サーバーと同じ Lotus Domino ドメインにいる場合、サーバーはその出席者の空き時間情報を、Free
Time データベース (busytime.nsf) から取得します。もし出席者のアドレスがローカルの Lotus Domino Directory
にない場合、サーバーは WSCONN をゲートウェイに使って別の Lotus Domino V7 サーバーに Web サービスのリクエストを送信します。WSCONN
は、Notes.ini 変数の WSCALCONN_URL で定義される URL を使って、この Web サービスに対してリクエストを行います。この、リモートの
Lotus Domino V7 サーバーを指す URL は、http://host/busytimews.nsf/busytimelookup?OpenWebService
のようになります。
Lotus Domino サーバーのコンソールから、LOAD WSCONN コマンドを使って WSCONN タスクをロードすることができます。サーバーの起動時に
WSCONN タスクを自動的に実行させるためには、Notes.ini の変数 ServerTasks に WSCONN を追加します。
注意: このリモート検索機能が動作するためには、人の名前がインターネット E メール・アドレスのフォーマットになっている必要があります。もし組織の中にいくつかの
Lotus Domino ドメインがある場合には、容易にこの機能をテストすることができます。まず、他のドメインの Lotus Domino Directory
の中で、ある人の E メール・アドレスをクリップボードにコピーします。次にカレンダーを開き、その E メール・アドレスを、新しいカレンダー予約の
Invitees フィールドに貼り付けます。そして、ミーティングに招集された人達のカレンダーの空き状況を調べるために Scheduler をクリックします。すると、Lotus
Domino V7 サーバーが実行する Web サービス参照のおかげで、E メール・アドレスのエントリーにその人のカレンダー予約データが追加されます
(図 1)。
図 1. リモート・ユーザーに対してミーティングを予約する
ここでは、ある Web サービスが標準の Lotus Notes メール・データベースの中で参照した結果を見ることができます。ある Lotus
Notes ユーザーが、2 人の人間に対して、新規にミーティングへの招集をかけています。出席者の 1 人は Mary Poppins であり、もう
1 人は Peter Pan です。Mary Poppins はメール・ファイルの所有者と同じドメインにいる Lotus Notes ユーザーであり、この人の名前は省略形の
Lotus Notes フォーマットで表示されます。Peter Pan のカレンダーはリモート・サーバーにあり、現行ユーザーは直接アクセスできません。Peter
Pan の名前はインターネット E メール・アドレスとして入力されていますが、これによりサーバーに対して WSCONN タスクを使ってリモート・サーバーから
Web サービス呼び出しでカレンダーの空き状況を入手するように命令が送られます。視覚的なスケジューラーには両者のカレンダーの空き状況が表示され、招集をかけた人には
Lotus Notes 本来の機能による空き時間参照の結果と Web サービスによる参照の結果との違いはまったくわかりません。
WSCALCONN_URL 変数の中で、任意の Web ホストを指す URL を指定することができます。理論的には、Lotus Domino
V7 以外のサーバー (Apache Tomcat や IBM WebSphere Application Server、Microsoft
Internet Information Services など) に対して空き時間のリクエストを行えるはずです。そうしたサーバーは、そのサーバー自体のカレンダー・アプリケーションの中でカレンダー情報を見つけ、Lotus
Domino サーバーが想定するデータ型に従ってレスポンスをフォーマットします。こうすることで、2 つのまったく異なるシステムの間で、ライブのカレンダー参照をシームレスに統合することができます。
busytimews.nsf データベース
Free Time Web サービスの、もう 1 つの部分が Lotus Domino のデータベース、busytimews.nsf です。このデータベースは何も文書を含んでおらず、設計要素は
BusyTimeLookup と呼ばれる Web サービスのみです。この Web サービスの LotusScript ソース・コードは公開されているため、このサービスがどのように動作するのかを調べることができます。また、この
Web サービスのコピーを作成し、必要に応じて変更することもできます。(この記事の後の方で、このサービスを単純化したものを説明します。) この
Web サービス自体は WSCONN タスクに依存するわけではなく、WSCONN タスクが実行していなくても、この Web サービスをコンシューマー・クライアントから呼び出すことができます。
この Web サービスは通常の Lotus Domino データベースの内部に常駐しているため、この Web サービスにアクセスする場合には、通常の
Lotus Domino の ACL (access control list) セキュリティーが適用されます。この Web サービスへのアクセスを制限するためには、busytimews.nsf
データベースの ACL を変更して Default ユーザーと Anonymous ユーザーにはアクセスを不許可にし、この Web サービスを使うことを許可されている人に
Reader レベルのアクセスを認可します。別の Lotus Domino V7 サーバーが WSCONN タスクを介してこの Web サービスにアクセスするためには、新しい
Web ユーザーを作成し、そのユーザーに HTTP パスワードを割り当てます。次に、そうしたログイン資格情報を Notes.ini ファイルの
WSCALCONN_URL 変数に設定しておきます (下記)。
WSCALCONN_URL=
http://username:password@host/busytimews.nsf/busytimelookup?OpenWebService
また、SSL (Secure Sockets Layer) を使ってサーバーとクライアントとの間の通信を暗号化することで、別のレベルのセキュリティーを追加することもできます。
Free Time Web サービスの WSDL (Web Services Description Language) 定義を取得するためには、URL
http://host/busytimews.nsf/busytimelookup?WSDL を使います。(私達はこの WSDL を使った URL
を、Java とMicrosoft SOAP (MSSOAP) のコンシューマー・クライアントの例で使っています。)
同じような Free Time Web サービスを含む、もう 1 つのデータベースが cppfbws.nsf です。このデータベースを busytimews.nsf
の代わりに使って、Lotus Notes クライアントと Web クライアントに空き時間の参照機能を提供することができます。この 2 つのデータベースの間の違いは、この
Web サービスが cppfbws.nsf で返すデータ構造と busytimews.nsf で返すデータ構造とが少し異なる点です。cppfbws.nsf
データベースの設計と、この Web サービスのソース・コードは公開されていません。busytimews.nsf ではなく cppfbws.nsf
データベースを使いたい場合には、Notes.ini ファイルの WSCALCONN_URL 変数を次のように変更します。
WSCALCONN_URL= http://host/cppfbws.nsf/busytimelookup?OpenWebService
Free Time Web サービスにアクセスする
Free Time Web サービスの LotusScript コードはかなり単純です。この Web サービスがリクエストを受信すると、このサービスは
FreeTimeSearch 関数を使って、要求された名前が指定された時間枠内でビジーな期間を取得します。この同じ関数を使って、会議室やリソースの空き状況を判断することもできます。
Free Time Web サービスに対して、別の種類の Web サービスのコンシューマー・クライアント (Apache Axis や Microsoft
.NET、MSSOAP など) を使ってアクセスすることもできます。こうしたサービスのコンシューマー・クライアントは、データを送受信するための複合データ型をサポートしている必要があります。この記事ではコンシューマー・クライアントの例として、Lotus
Domino V7 と Lotus Notes V7 に含まれている Axis Java クラスを使っています。必要な Java クラスをできるだけ容易に作成できるように、ここではオープン・ソースで
Lotus Domino ベースの、Stubby と呼ばれるツールを使います。Stubby は Julian Robichaux が作成したもので、OpenNTF の Web サイトからダウンロードすることができます。
多くの古い Web サービスのコンシューマー・クライアントでは、Free Time Web サービスを呼び出した結果返される複合データ型を解析できないという問題がある可能性があります。この
Web サービスのソース・コードは公開されているため、この Web サービスの LotusScript のコードを、単純なデータ型 (例えばテキスト・ストリングなど)
を受け付けて返すように変更することができます。そうすれば、この Web サービスは、基本的にすべてのコンシューマー・クライアントから (特に、WSDL
を使った、動的に作成される呼び出しを行うクライアントから) 容易にアクセスできるようになります。
今度は、Free Time Web サービスにアクセスするようにプログラムされた、Java エージェントと LotusScript エージェントの例をそれぞれとりあげましょう。
Java エージェントから Free Time Web サービスを呼び出す
Stubby データベースを使うと、ある特定の Web サービスを呼び出すために必要な全ての機能を含むスタブ・ファイルを素早く作成することができます。必要な情報は、その
Web サービスの WSDL ファイルの場所のみであり、残りは Stubby が自動的に処理してくれます。Stubby は、Java ファイルとクラス・ファイル、そして
JAR ファイルを生成します。次に、生成された JAR ファイルを切り離してローカルのハードディスクに入れ、それを Java エージェントのデザイン・パネルにある
Edit Project ボタンを使って、その Java エージェントにインポートします。指定された Web サービスを Java エージェントから呼び出すために、他のライブラリーをその
Java エージェントにインポートする必要はありません。その Web サービスのメソッドやパラメーター、データ型などに関する情報が必要な場合には、生成された
Java ソース・ファイルを調べます。
Stubby は、ユーザー名とパスワードを使った認証か、あるいは SSO (single sign-on) トークンを使った認証のいずれかをサポートします。また、SSL
で保護された URL にアクセスするためのソリューションも用意されています。SSL を使うと Web サービスのセキュリティーが大幅に改善されますが、これは受信されるリクエストと送信されるレスポンスが暗号化されるため、もし誰かがクライアントと
Web サーバーとの間のネットワーク・トラフィックを観測できたとしても、その観察者にはリクエストやレスポンスが読み取れないためです。また暗号化によって、リクエストの一部として渡されるログイン資格情報も保護されます。
Java エージェントに BusytimeService.jar を含めると、Web サービスの LOOKUP メソッドを呼び出すコードを作成することができます。Web
サービスに送信するパラメーターは、REQUESTSTRUCTURE と呼ばれる複合データ型であり、いくつかの配列で構成されています。返されるデータ型は
RESPONSESTRUCTURE と呼ばれ、ネストされた配列を含んでいます。
また、同じ Java コードを Java のスクリプト・ライブラリーの設計要素の中に配置し、それを LS2J (LotusScript to
Java) を介して LotusScript エージェントから使うこともできます。リスト 1 は、このエージェントのソース・コードを示しています。
リスト 1. Java のスクリプト・ライブラリーのコード
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"; //name of the first person
attendees[1]="Mary Poppins"; //name of the second person
requestors[0]=""; //Web service does not require this parameter
details[0]=""; //Web service does not require this parameter
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"); //Start time for search
REQUEST.setEND("2007-02-26 22:01"); //End time for search
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 エージェントからの出力
Java エージェントの出力を見ると、予約が入っているカレンダー時刻と、その人が不在となる時刻がわかります。これはその人の、カレンダー・スケジュールのプリファレンスで判断することができます。
このエージェントのコードを見ると、LOOKUP メソッドを呼び出すことによって受信されたデータが、いくつかのレベルの配列にネストされていることがわかります。RESPONSESTRUCTURE
は RESPONSE 型の配列を含みます。この配列にアクセスするためには getATTENDEES() 関数を使います。各 RESPONSE
には、人の名前 (getATTENDEE() 関数を使ってアクセスします) と、ある時間帯を表す配列 (getBUSY() 関数を使ってアクセスします)
が含まれています。各 INTERVAL は開始時刻と終了時刻を含んでいます (このデータには getSTART() 関数と getEND()
関数を使ってアクセスします)。INTERVAL データ型は DETAIL データ型を含んでおり、現在 DETAIL データ型は使われていませんが、場所や会議室名、会議の主題、議事進行係などの情報を含むことになっています。返されるデータ型の構造がわかっている限り、通常はそれらを列挙するのは容易です。
Free Time Web サービスを変更する
今度は、Free Time Web サービスを変更して MSSOAP クライアントと動作できるようにする方法を見てみましょう。LotusScript
コードから MSSOAP コンシューマー・オブジェクトを呼び出すことができます。この呼び出しは素早く実行されるため、Lotus Notes のクライアントから使うには適切な選択肢です。
変更された Free Time Web サービスは、次の 3 つのパラメーターを受け付けます。
この Web サービスを呼び出すと、値同士がセミコロンで区切られた 1 つのストリングが返されます。LotusScript コンシューマー・エージェントでは、このセミコロン区切りのストリングに
Split() 関数を適用することによって、このストリングを容易に配列に変換することができます。
変更された Web サービスとオリジナルの Web サービスとの違いは、この変更された Web サービスが、その人に予約を入れられる時間枠を返すことです。オリジナルの
Web サービスは、その人に予約を入れられない時間枠を返します。もう 1 つの違いは、オリジナルの Web サービスは時刻を GMT データ・フォーマットに変換しますが、変更された
Web サービスは、ユーザーが作成したものと同じタイム・ゾーン・フォーマットで時刻を保持します。
リスト 2 は、単純化された Free Time Web サービスのコードを示しています。
リスト 2. 単純化された Free Time 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 サービスのコードよりもはるかに短いのですが、基本的に同じ機能を持っています。
変更された Free Time Web サービスを、MSSOAP を使って LotusScript から呼び出す
データ型が単純なため、この Web サービスにアクセスしてパラメーターを渡すのは簡単です。変更された Web サービスは 3 つのストリング・パラメーターを受け付け、テキスト・ストリングを返します。そして返されたストリングを、セミコロンを時間枠の区切りに使って配列に分割します
(リスト 3)。
リスト 3. 変更された Free Time Web サービスを呼び出す LotusScript コード
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 the 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 は、このエージェントの出力を示しています。
図 3. LotusScript エージェントの出力
たった 13 行の LotusScript コードで、Web サービスのためのコンシューマー・クライアントを作成することができました。また、Stubby
データベースを使ってスタブ・ファイルを生成し、この変更された Web サービスを Java エージェントから呼ぶこともできます。
まとめ
Web サービスを利用することによって、人やリソースのカレンダーの空き状況を Lotus Domino V7 や他のソフトウェアに統合することができます。また必要な場合には、その
Web サービスを変更して複合データ型を避けることができます。そして、必要な Java ファイルを自動生成する Stubby や他のツール (WSDL2Java
など) の機能を利用することで、皆さんの貴重な数時間を節約することができます。
ダウンロード | ファイル名 | サイズ | ダウンロード形式 |
|---|
| exampledb.zip | 59 KB | HTTP |
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | |  | Andrei Kouvchinnikov は Principal Domino Developer and Administrator の認証を取得しています。彼はこれまで、さまざまなプラットフォームで実行する
Lotus Domino アプリケーションの開発ライフサイクル全般、そして QuickPlace と Sametimeのためのアプリケーション開発を経験してきました。彼は
OS2 用の R4.5 以来、Lotus Domino プラットフォームに取り組んできています。連絡先は andrei@botstation.comです。 |
記事の評価
|