IBM Lotus Notes 8 以降のスタンダード版 (以下、Lotus Notes と表記することでスタンダード版を示します) を用いてコンポジット・アプリケーションを開発する際には、既存のアプリケーションやその断片をいかに簡単かつ迅速に再利用するかが、開発工数削減および利用促進を実現するための要素となります。既存の Notes アプリケーションを再利用する場合、今までの手法では、他のコンポーネントとの連携用ロジックの実装と、WSDL ファイルを用いたインターフェースの宣言が必要でした。既存の Java アプリケーションを再利用するときも、同じようにインターフェース宣言やその実装が必要でした。また、Web アプリケーションを再利用する際、その Web アプリケーションが複数ページから構成されているような場合、ある特定のページだけに連携用のロジックを実装し再利用することが困難な場合もありました。これは Web アプリケーションだけでなく、他のテクノロジーによって作られたアプリケーションを再利用する際も同様です。これらの要因により、既存アプリケーションをコンポーネント化する作業には多くの時間を要するため、コンポジット・アプリケーション開発の敷居が高くなっていました。この問題を解決するために、Lotus Notes 8.5.1 では既存のアプリケーションに追加の実装や宣言を一切加えることなくコンポーネント化を実現する、コンテナ・フレームワークと呼ばれる機能が提供されました。コンテナとは、名前の通りアプリケーションの入れ物で、既存のアプリケーション自身をカスタマイズせずに、簡単な設定のみでコンポーネント化することを可能にします。Lotus Notes 8.5.1 では、以下の 4 つのコンテナが提供されています。
- Lotus Notes 文書コンテナ – Lotus Notes アプリケーション内でデザインされているフォームに格納されたNotes 文書、またはそのフォーム自身をコンポーネントとして再利用する際に利用するコンテナ。
- Lotus Notes ビューコンテナ – Lotus Notes アプリケーション内でデザインされている Notes ビューをコンポーネントとして再利用する際に利用するコンテナ。
- Symphony Spreadsheet コンテナ – Lotus Symphony で利用可能な表計算アプリケーションをコンポーネントとして再利用する際に利用するコンテナ。
- 管理対象ブラウザー – Web アプリケーションをコンポーネントとして再利用する際に利用するコンテナ。
これらのコンテナはコンポジット・アプリケーション専用のアセンブリ・ツールである Composite Application Editor (CAE) から利用できます。CAE はインストール時の選択で導入することができる Lotus Notes に含まれている機能です。CAE のコンポーネント・パレットにはデフォルトで各コンテナが用意されており (図1)、ここから利用したいコンテナを選択し、中央部分にドラッグ & ドロップして配置することで使用可能となります。Lotus Notes 文書コンテナと Lotus Notes ビューコンテナ、そしてSymphony Spreadsheetコンテナはコンポーネント・パレットのコンテナ・カテゴリに、Web アプリケーション用のコンテナである管理対象ブラウザーはコンテナ・カテゴリではなく、ブラウザー・カテゴリに分類されています。
(図 1) Composite Application Editor で利用可能となったコンテナ
それでは、コンテナを利用して既存のアプリケーションをコンポーネント化する際の仕組みを説明します。コンテナは Notes 文書や Web アプリケーションなどを表示・実行する機能だけではく、現在コンテナ上で実行されているアプリケーションの状態 (表示内容) を特定する機能を持っています。これは Landmark Identifier と呼ばれるサービスで、例えばWeb コンテナである管理対象ブラウザーであれば、現在表示している Web アプリケーションのタイトルや URL を返します。同様に、Notes ビューコンテナや Notes 文書コンテナであれば Notes URL を、Symphony Spreadsheet コンテナであればシート名を返します。この Landmark Identifier から返される値は Landmark (ランドマーク) と呼ばれ、その名の通り他のアプリケーションと統合するポイントを示すための目印的な役割を担います。コンテナを利用したコンポーネント化では、ランドマークごとにインターフェースを定義することができます。このインターフェースは、コンポーネント間通信を管理するプロパティ・ブローカーに対して登録され、他のコンポーネントとのデータの送受信に利用されます。つまり、複数ページから構成されたアプリケーションであっても、それぞれのアプリケーションがある特定の状態になったときのみで有効なプロパティ・ブローカーへのアクセスを定義することができます。
それぞれのコンテナではランドマークの定義を直感的に行うことができる設定ツールを用意しています。図 2 は管理対象ブラウザーが提供する設定ツールです。
(図 2) 管理対象ブラウザーが提供するアクション定義用のツール
コンテナを使って既存のアプリケーションをコンポーネント化する際の流れを説明します。この操作にはCAEを使いますが、CAEの起動方法や使い方については後半の「コンテナ・フレームワークを利用したアプリケーション開発」の中で説明します。まず初めに、CAE 上で配置したコンテナにおいて、再利用したいアプリケーションを指定します。管理対象ブラウザーの場合は、再利用したい Web アプリケーションの URL を指定します。次に、他のコンポーネントと連携したいページにランドマークを設定します。例えば、My developerWorks のプロフィールアプリケーションを再利用したい場合、その URL (https://www.ibm.com/developerworks/mydeveloperworks/profiles/) を入力し、ここにランドマークを設定します。表示しているページにランドマークを設定する際には、図 3 の赤枠内のボタンをクリックします。
(図 3) ランドマークの設定ボタン
次に、ランドマークが設定されているページにおける、プロパティ・ブローカーとのインターフェースを定義します。まず、どのようなイベントが発生した時にプロパティ・ブローカーと通信するのかを定義します。イベントの定義にはツール上部にある旗のアイコンをクリックして選択します。コンテナによって用意されているイベントは多少異なりますが、通常以下の 4 種類が用意されています。
- コンテンツの完了 – 対象となるアプリケーションがロードされた直後。
- ビューを閉じる – コンテナ自体が閉じられたとき。
- ビューの初期化 – コンテナ自体がロードされる直前。
- データの変更 – パブリッシュ時は指定した部分のデータが変更されたとき、受信時はプロパティ・ブローカーからデータを受け取ったとき。
イベントが定義された後、そのイベントが発生した際に何を実行するのかを定義します。具体的には、イベントが発生した際に、プロパティ・ブローカーにデータを「パブリッシュ」するのか、プロパティ・ブローカーからデータを「受信」するのかを定義します。コンテナによっては、その特性を生かした別のアクションの定義も可能になっています。例えば、管理対象ブラウザーでは、「URL の設定」をアクションとして選択することができ、プロパティ・ブローカーから渡ってきた URL のページを即座に表示するといった事が可能になっています。イベントとアクションが定義されたら、最後に扱うデータを定義します。データの定義はそれぞれのコンテナによって異なり、使用できるデータは以下の表1のようになっています。
表 1. 各コンテナで使用できるデータ
| パブリッシュできるデータ | 受信できるデータ | |
| Lotus Notes 文書コンテナ | 対象となる Notes 文書のフォームが保持しているフィールドに格納されている値。 | 対象となる Notes 文書のフォームが保持しているフィールドに格納する値。 |
| Lotus Notes ビューコンテナ | 対象となる Notes ビューのカラムの値、および式言語 (@ 関数) の返り値、またはその両方を組み合わせた値。Notes ビュー上で複数文書が選択された際に、「選択された文書の値すべてを送信する」、「選択された文書の値における最大値のみを返す」などのオプションを指定することも可能。 | 受信はできません。 |
| Symphony Spreadsheet コンテナ | 対象となる表計算ファイルのセルに格納されている値。複数のセルを選択し、利用することも可能。 | 対象となる表計算ファイルのセルに格納する値。 |
| 管理対象ブラウザー | 対象となる Web アプリケーションが保持しているフィールドに格納されている値。および、XPath でアクセスできる DOM のエレメントに格納されている値。 | 対象となる Web アプリケーションが保持しているフィールドに格納する値。および、XPath でアクセスできる DOM のエレメントに格納する値。 |
以上により、プロパティ・ブローカーに対するインターフェースの定義がコンテナに保持されます。このように、「指定されたアプリケーションの特定のページや状態 (ランドマーク) において、何 (イベント) が起きたら、何 (データ) を、どうするのか (アクション)」を定義することで、既存アプリケーションをコンポーネント化することができます。図 4 はMy developerWorks のプロフィールアプリケーションに対して、他のコンポーネントからプロパティ・ブローカー経由でデータを受信した際に、その値を検索フィールドにセットするという設定した例です。
(図 4) コンテナ上でコンポーネント化された Web アプリケーションの設定例
以上の設定により、CAE にて他のコンポーネントとの連携を実現するためのワイヤリングを行うことが可能となり、コンポジット・アプリケーションのコンポーネントとして利用することができるようになります。つまり、コンテナを利用することで、インターフェース宣言やその実装といった難しいコーディング作業を行うことなく既存アプリケーションをコンポーネント化することが可能になります。
前章では、コンテナ・フレームワークを利用して既存のアプリケーションをコンポジット・アプリケーション用のコンポーネント化する手順を説明しました。本章では、より実践的なコンテナの使用方法を、実際にコンポジット・アプリケーションを作りながら説明します。ここでは、Notes アプリケーションに格納されているデータを Lotus Symphony spreadsheet のセルに入力するコンポジット・アプリケーションを、Notes ビューコンテナ及び Lotus Symphony Spreadsheet コンテナを利用して実現する例を題材に説明します。事前準備としてディスカッションテンプレート (discussion8.ntf) から Notes アプリケーションを作成し、テストデータとして文書を複数作成してください。その際にカテゴリの値も使用するのでカテゴリにも値を入力してください。次に、コンテナを利用して、作成した Notes アプリケーションをコンポーネント化します。図 5 のように、「ブランクの複合アプリケーション」テンプレートを用いて、コンポジット・アプリケーションを格納するための Notes アプリケーションを作成します。
(図 5) コンポジット・アプリケーション用の Notes アプリケーション作成画面
次に、作成したコンポジット・アプリケーションを開き、Lotus Notes のメニューバーから「アクション」 -> 「アプリケーションの編集」を選択して Composite Application Editor (CAE) を起動します。CAE が起動したら、右側のコンポーネント・パレットから Lotus Notes ビューコンテナを選択し、中央部分にドラッグ & ドロップして配置します。Lotus Notes ビューコンテナが配置されたら、図 6 の赤丸で示した部分をクリックし、メニューから「コンポーネント・プロパティーの編集」を選択します。
(図 6) コンポーネント・プロパティーの編集の起動
コンポーネント・プロパティーの編集画面で、先ほど作成したディスカッション・アプリケーションの「すべての文書」ビューを表示するように設定します。Lotus Notes ビューコンテナでは、内部に表示するNotes ビューを Notes URL 形式で指定します。URLを手入力することも可能ですが、Notes URL を入力するテキストボックス右側にある参照ボタンをクリックすることで、指定したい Notes ビューを選択することも可能です。コンポーネント名やコンポーネントの説明も、必要に応じて入力します (図 7)。
(図 7) コンポーネント・プロパティーの設定
OK ボタンをクリックすると、作成したディスカッション・アプリケーションの「すべての文書」ビューが、配置した Lotus Notes ビューコンテナ内に表示されます。次に、コンテナ上部にあるツールを利用して、Lotus Symphony spreadsheet アプリケーションにデータを渡すために、プロパティ・ブローカーに対するインターフェースを定義します。この例では、Notes ビュー内で選択された文書のタイトルとそのカテゴリ、および文書が作成された日付をパブリッシュするように定義します。まず、コンテナ上部のツールにおいて、パブリッシュするデータの名前を定義します。このデータ名は任意でかまいませんが、ここでは「NotesViewData」とします。次に、データをパブリッシュする際の条件を定義します。ここでは式言語の返り値をパブリッシュしたいので「式」を選択します。最後に、実際にパブリッシュするデータを定義します。ここには式言語で「Subject + Categories + @Text(@Created)」と入力し、最後に右端の緑の歯車アイコンをクリックしてアクションを追加し、最後に最右端の丸矢印アイコンをクリックして追加したアクションを保存して設定を完了します(図 8)。
(図 8) Lotus Notesビューコンテナのプロパティ・ブローカーに対するアクションの定義
次に、データを受信する Lotus Symphony spreadsheet を作成します。CAE のコンポーネント・パレットから Lotus Symphony Spreadsheet コンテナを CAE 中央部、Lotus Notes ビューコンテナの下部にドラッグ & ドロップし配置します。次に Lotus Symphony Spreadsheet コンテナ上部のツールを利用してプロパティ・ブローカーから受け取った値を A1 セルから順番に入力するように定義します。基本操作は先ほどの Lotus Notes ビューコンテナと同様です。ここでは、プロパティ・ブローカーからデータを受け取った際に、spreadsheet アプリケーションのセル A1 から A10 までに値をセットし、そのためのデータを受信するプロパティ名を指定します。このプロパティ名も任意でかまいませんが、ここでは SymphonyNotesData に設定します(図9)。
(図 9) Lotus Symphony Spreadsheetコンテナのプロパティ・ブローカーに対するアクションの定義
以上で、Lotus Notes ビューおよび Lotus Symphony spreadsheet それぞれがコンポジット・アプリケーション用のコンポーネントとして利用可能になります。最後に、CAE のワイヤリング機能を用いて両コンポーネントが連携できるように設定します。Lotus Notes ビューコンテナからパブリッシュされる NotesViewData プロパティをマウスでドラッグし、Lotus Symphony Spreadsheet コンテナで受信する SymphonyNotesData プロパティにドラッグし、二つのプロパティをワイヤリングします(図 10)。
(図 10) ワイヤリング画面
以上でコンポジット・アプリケーションの開発は完了となります。設定を保存し、Composite Application Editor を閉じてください。最後に作成したコンポジット・アプリケーションを開き、動作確認を行います。Notes ビューコンテナ上に表示されているディスカッション・アプリケーションの文書を選択すると、選択された文書のタイトル、カテゴリ、文書の作成日時が Lotus Symphony spreadsheet アプリケーションの A1 セルに入力されることが確認できます。さらに、Notes ビュー上で複数文書を選択すると、選択された文書の情報が Lotus Symphony spreadsheet の A1 セルから順番に入力されます(図 11)。
(図 11) 完成したコンポジット・アプリケーション
以上のような操作で、Notes アプリケーションのデータを Lotus Symphony spreadsheet アプリケーションに書き出すコンポジット・アプリケーションが作成できます。このように、コンテナ・フレームワークを使用することで、既存のアプリケーションに手を入れず、コードも書かずにコンポジット・アプリケーションを開発することができます。
最後に、コンテナ・フレームワークで使用されている Property to Property ワイヤリングについて説明します。従来、コンポジット・アプリケーションの開発を行う際には、それぞれのコンポーネントがプロパティ・ブローカーに対して、パブリッシュできるプロパティの定義、受信することができるプロパティの定義、そして受信した際に実行されるロジックを、あらかじめ WSDL 形式のファイルで定義する必要がありました。コンポーネント内で定義されたそれらの値は、コンポジット・アプリケーションを組み立てる際に動的に変更することができません。また、プロパティを定義する際にはネームスペースやデータの型も厳密に定義する必要があるため、実際にワイヤリング可能となるのは、事実上双方のコンポーネントが連携されることを前提に実装されている必要があり、自由度が低くなっていました。この従来型のワイヤリング方法は Property to Action と呼ばれています。それに対して Property to Property ワイヤリングでは、お互いのコンポーネントが持つインターフェースを WSDL ファイルを用いて厳密に定義する必要がなく、コンポーネント自体が動的にプロパティなどを定義することを可能にしています。これにより、コンポーネントは動的に定義されたプロパティ名を使ってプロパティ・ブローカーと通信することができます。各コンポーネントは PropertyBrokerListener インターフェースの実装を持つことで、 Property to Property ワイヤリングの利用が可能です。これまで解説してきたコンテナもこの仕組みを使って、プロパティ・ブローカーへのインターフェースをコンポーネント側で設定することを可能にしています。また、この仕組みを使うことで、新たなコンテナを作成することも可能です。PropertyBrokerListener インターフェースを実装して Property to Property ワイヤリングを可能にするコンポーネントの開発方法は IBM Composite Application Wiki で解説されています。
Lotus Notes 8.5.1 からコンテナ・フレームワークが提供されたことによって、業務効率の向上を実現する次世代デスクトップ・アプリケーションであるコンポジット・アプリケーションの開発を、迅速かつ容易に行うことが可能となりました。コンテナは既存のアプリケーションにランドマーク、イベント、データ、アクションを定義することでコンポーネント化することができ、それらの定義はコンテナで提供されるツールで容易に行うことができます。このコンテナ・フレームワークを利用して、日常業務の効率を向上するコンポジット・アプリケーションの開発に取り組んでいただけることを期待しています。
- Lotus Notes/Domino
- IBM Composite Application wiki (英語)
- IBM Lotus Notes/Domino 8.5 におけるアプリケーション開発
- IBM Lotus Notes 8 技術概説
- ILotus Notes 8 における Composite Applicationの概要と開発手法
- IBM Lotus Expeditor Toolkit 6.1.1を使ってのIBM Lotus Notes 8アプリケーション開発
- Lotus Expeditor 6.1入門「その1」「その2」「その3」
佐藤 淳はソフトウェア開発研究所のLotus テクノロジー開発に属し、WPLC (Lotus + WebSphere Portal) 製品に対応したソリューションやアプリケーションの開発に取り組んでいる ISV/BP 様の技術支援を行っています。先日 IT Media にインタビュー記事が公開されたのですが、寄せられた質問・感想は服装に関する事のみで肝心の内容については何もなく落ち込んでいます。