IBM®
本文へジャンプ
    Japan [変更]    ご利用条件
 
 
検索範囲検索:    
    ホーム    製品    サービス & ソリューション    サポート & ダウンロード    マイアカウント    
skip to main content

developerWorks Japan  >  Lotus  >

Lotus Expeditor 6.1入門(3):コンポジット・アプリケーションの開発

Lotus特集

developerWorks
ページオプション

JavaScript を要するドキュメントオプションは表示されません

サンプルコード


レベル: 初級

小野 充志 (onoat@jp.ibm.com), WPLC&PvCソリューション開発 / ソフトウェア開発研究所, IBM

2007年 3月 02日

前回(Lotus Expeditor6.1入門(2)~Toolkitによるアプリケーション開発手順の紹介~)の記事では、Lotus Expeditor 6.1 Toolkitを使ったアプリケーション開発手順についてご紹介しました。本稿では、いよいよこれらを元にしてLotus Expeditorならではのアプリケーションを実際に開発してみます。

今回取り上げるのはLotus Expeditor最大の売りの1つである「コンポジット・アプリケーション(Composite Application)」です。コンポジット・アプリケーションとは、別々に作成された複数のアプリケーションを組み合わせて1つのアプリケーションとしてまとめ上げ、さらにそれらを連携させるように拡張した複合アプリケーションです。組み合わせるアプリケーションは通常のEclipse Plug-inのユーザーインターフェースと同じSWTアプリケーションだけに限らず、Portletアプリケーション、AWTアプリケーションなども組み合わせることが可能です。本稿ではSWTアプリケーションとPortletアプリケーションを組み合わせたコンポジット・アプリケーションの作成手順を、サンプル・コードを元にご紹介します。

サンプル・ギャラリーに提供されているアプリケーションのインポート

コンポジット・アプリケーションの作成に入る前に、Lotus Expeditor Toolkitのサンプル・ギャラリーについてご紹介します。

前回(Lotus Expeditor6.1入門(2)~Toolkitによるアプリケーション開発手順の紹介~)の記事で紹介したリッチ・サンプル・アプリケーションは、通常のEclipse Plug-inとほとんど違いはなく、Lotus Expeditor固有のプラグインや拡張ポイントをあまり使用していないものでした。Lotus Expeditor固有の機能をもっと活用したアプリケーションのサンプルは、サンプル・ギャラリーとして提供されています。サンプル・ギャラリーには、Webサービス、DB2e、Cloudscape、JMS、JNDI、Log、MQe、Portletアプリケーション、Webアプリケーションなど、Lotus Expeditorが持つ各種機能のサンプル・コードが含まれていますので、開発の際には大変参考になります。ここではこれらサンプル・ギャラリーのアプリケーションをインポートする方法を紹介します。

開発環境としてRAD、RSAを使用している場合は、メニューから「ヘルプ」->「サンプル・ギャラリー」を選択するとサンプル・ギャラリーが起動します。いくつかのカテゴリーに分かれてサンプル・アプリケーションのリストが表示されますので、インポートしたいアプリケーションを選択して、紹介ページの「サンプルのインポート」というリンクをクリックするだけで簡単にサンプルをインポートできます(図1)。


(図1) RAD、RSAでのサンプル・ギャラリー
(図1) RAD、RSAでのサンプル・ギャラリー

開発環境としてEclipse + WSTを使用している場合には、残念ながらサンプル・ギャラリーのメニューはありません。しかし、Toolkitをインストールしていればサンプル・ギャラリーのプラグイン自身はインストールされていますので、手動でインポートすることが可能です。以下にその手順を紹介します。

まず、メニューから「ファイル」->「インポート」を選択します。インポート・ソースの選択ダイアログが表示されたら、「既存プロジェクトをワークスペースへ」を」選択して「次へ」ボタンをクリックします。


(図2) サンプル・ギャラリーのインポート(1) – 既存プロジェクトをワークスペースへ を選択
(図2) サンプル・ギャラリーのインポート(1) – 既存プロジェクトをワークスペースへ を選択

インポートするファイルを指定します。サンプル・ギャラリーのアプリケーションはJAR形式で提供されているので、「アーカイブ・ファイルの選択」にチェックをつけて「参照」ボタンをクリックします。ファイル選択ダイアログが表示されるので、以下のフォルダーに進みます。

eclipse_dir\plugins\com.ibm.rcp.tools.samplegallery_6.1.0.20061108\archive  (eclipse_dirはEclipseがインストールされているディレクトリーを指します。)

このフォルダーの中にあるJARファイルはすべてサンプル・ギャラリーのアプリケーションです。JARファイルの名前で何のサンプル・アプリケーションであるかがだいたい分かるようになっています。例えば、ここではLotus Expeditorが持っているCloudscapeデータベースにアクセスするサンプルである「cloudscape.jar」を選択します。


(図3) サンプル・ギャラリーのインポート(2) – JAR形式のサンプル・ギャラリー・アプリケーションを選択
(図3) サンプル・ギャラリーのインポート(2) – JAR形式のサンプル・ギャラリー・アプリケーションを選択


JARファイルを選択すると、その中に含まれているプロジェクトの一覧が表示されます。Cloudscapeのサンプルには「com.ibm.rcp.samples.cloudscape」プロジェクトが含まれているので、これにチェックをつけたまま「終了」ボタンをクリックすると、ワークスペースにサンプル・プロジェクトがインポートされます。このプロジェクトにはCloudscapeを使用するためのプラグイン設定、サンプル・コードがすべて含まれています。


図 4. サンプル・ギャラリーのインポート(3)– Cloudscapeサンプル・プロジェクトをインポート
図 4. サンプル・ギャラリーのインポート(3)– Cloudscapeサンプル・プロジェクトをインポート

使用したい機能のサンプル・アプリケーションをいろいろインポートして、それらのサンプル・コードを開発の参考にしてみてください。




上に戻る


作成するアプリケーションの概要

本稿ではSWTアプリケーションとPortletアプリケーションを組み合わせたコンポジット・アプリケーションを作成していきます。作成するアプリケーションの構成は以下のようになっています(図5)。


図 5. 本稿で作成するコンポジット・アプリケーションの構成
図 5. 本稿で作成するコンポジット・アプリケーションの構成

各アプリケーションの概要について説明します。

まずはSWTアプリケーションです。本稿で作成するSWTアプリケーションは、Lotus Expeditorが持つローカルのCloudscapeデータベースにある商品詳細情報を更新するためのアプリケーションです。商品一覧に表示されている商品を選択して、表示された商品情報を編集して更新ボタンをクリックするとデータベース上の商品情報が更新されます(図6)。


図 6. 商品情報を更新するためのSWTアプリケーション(コンポジット前)
図 6. 商品情報を更新するためのSWTアプリケーション(コンポジット前

次にPortletアプリケーションです。本稿で作成するPortletアプリケーションは、同じくLotus Expeditorが持つローカルのCloudscapeデータベースにある商品詳細情報から、特定の商品を商品名で検索するためのポートレットです(図7)。


(図7) 商品情報を検索するPortletアプリケーション(コンポジット前)
(図7) 商品情報を検索するPortletアプリケーション(コンポジット前)

これらはそれぞれ単独で動作するアプリケーションですが、コンポジット・アプリケーションではこれらをまとめて1つのパースペクティブで表示するようにします。さらに、SWTアプリケーションが持っている更新機能とPortletアプリケーションが持っている検索機能を組み合わせて、ポートレットで検索した商品の情報をSWTアプリケーションに表示して更新する、といった連携を行えるようなコンポジット・アプリケーションを作成します(図8)。このSWTアプリケーションとPortletアプリケーションの連携には、「Property Broker」と呼ばれる機能を使用します。これは元々WebSphere Portal上でポートレット間通信を行うための仕組みであり、今回Lotus Expeditor用にSWTアプリケーションなどのPortlet以外のアプリケーションからも使用できるように拡張されました。


(図8) SWTアプリケーションとPortletアプリケーションによるコンポジット・アプリケーション – 同じパースペクティブに表示するだけでなく連携が可能
(図8) SWTアプリケーションとPortletアプリケーションによるコンポジット・アプリケーション – 同じパースペクティブに表示するだけでなく連携が可能

以上が本稿で作成するアプリケーションの概要です。このアプリケーションを一から作成するとなると本稿だけではすべてを説明しきれませんので、ここではサンプル・コードを用意しました。このページの最後にリンクされている「dwExpeditorSampleApps.zip」をダウンロードし、「サンプル・ギャラリーに提供されているアプリケーションのインポート」の中で紹介したのと同様の手順で、お手持ちの開発環境にサンプル・コードのプロジェクトをインポートしてください。ここからはそのサンプル・コードを元に、開発上のポイントを説明していきます。




上に戻る


ローカルのCloudscapeデータベースにアクセスするアプリケーション

まず、SWTアプリケーションとPortletアプリケーションで共通に使用するデータベース・アクセスのアプリケーションを作成します。サンプル・コードでは「com.ibm.wplc.dw.expeditor.sample.cloudscape」プロジェクトがこれにあたります。

最初に、CloudscapeにアクセスするAPIを使用できるようにするための設定を行います。プロジェクト内の「META-INF/MANIFEST.MF」ファイルを開き、「依存関係」タブを選択します。この中で「インポート済みのパッケージ」として「org.apache.derby.jdbc」を指定します。「追加」ボタンをクリックすれば、パッケージの一覧から選択することが可能です(図9)。



図 9. Cloudscapeアクセスのためにorg.apache.derby.jdbcパッケージをインポート済みパッケージに設定
図 9. Cloudscapeアクセスのためにorg.apache.derby.jdbcパッケージをインポート済みパッケージに設定

このパッケージをインポートすると、Cloudscapeのデータソース・クラスである「org.apache.derby.jdbc.EmbeddedDataSouce」クラスを使用できるようになります。このデータソース・クラスを使用すると、データベースへの接続のためのjava.sql.Connectionオブジェクトを取得することができます。例えば以下がデータソース・クラスからjava.sql.Connectionオブジェクトを取得するサンプル・コードです。

                
import java.io.File;
import java.sql.Connection;
import java.sql.SQLException;

import org.apache.derby.jdbc.EmbeddedDataSource;
import org.eclipse.core.runtime.Platform;
import org.eclipse.osgi.service.datalocation.Location;

public static Connection getConnection()
{
Connection conn = null;

// 新規にEmbeddedDataSourceオブジェクトを作成
EmbeddedDataSource ds = getDataSource();

// Expeditorがデータインスタンスを保存する場所のパスを取得
Location location = Platform.getInstanceLocation();
String instanceAreaPath = location.getURL().getPath();

// 取得したパスを絶対パスに変換し、データベースの作成場所の絶対パスを作成
File file = new File(instanceAreaPath);
String dbPath = file.getAbsolutePath() + File.separatorChar + "dwSampleDB";

// データソースオブジェクトにデータベースのパスを設定
ds.setDatabaseName(dbPath);

// データベースへ接続し、Connectionオブジェクトを取得
// データベースが存在しない場合はSQLExceptionがスローされる
try {
conn = ds.getConnection();
conn.setAutoCommit(true);

} catch (SQLException e) {
try {
// データベースが存在していないので新規作成
ds.setDatabaseName(dbPath + ";create=true");
conn = ds.getConnection();
conn.setAutoCommit(true);

} catch (SQLException e1) {
e1.printStackTrace();
}
}

return conn;
}


java.sql.Connectionオブジェクトを取得したら、あとは通常のデータベース・アクセス・プログラミングと同様、java.sql.PreparedStatement、java.sql.ResultSetクラスなどを用いて、データベースの作成、データ書き込み、データ取得などを一通り行うことができます。「サンプル・ギャラリーに提供されているアプリケーションのインポート」の中で例としてインポートしたCloudscapeサンプル・プロジェクトのコードが非常に参考になりますので、是非ご覧ください。

コーディングが完了したら、作成したデータベース・アクセス・クラスを他のアプリケーションからも使用できるようにエクスポートする設定を行う必要があります。プロジェクトの「META-INF/MANIFEST.MF」ファイルを再度開き、「ランタイム」タブを選択します。この中で「エクスポートされるパッケージ」に、他のアプリケーションから使用できるようにしたいパッケージを「追加」ボタンをクリックしてから指定します。ここでは、データベース・アクセス・クラスが含まれている「com.ibm.wplc.dw.expeditor.sample.cloudscape.itemdb」パッケージをエクスポートするように指定します。


図 10. 他のプラグインから使用できるようにデータベース・アクセス・クラスのパッケージをエクスポート
図 10. 他のプラグインから使用できるようにデータベース・アクセス・クラスのパッケージをエクスポート

以上でデータベース・アクセス・アプリケーションの作成は完了です。このアプリケーション自体はユーザーインターフェースを持たないので、ローカル開発環境上で実行しても操作できません。ユーザーインターフェースを持っている次のSWTアプリケーションを作成してから動作を確認することにします。





上に戻る


商品情報を更新するSWTアプリケーション

次に、商品情報を更新するSWTアプリケーションを作成します。サンプル・コードでは「com.ibm.wplc.dw.expeditor.sample.richapp」プロジェクトがこれにあたります。SWTアプリケーションは、前回(Lotus Expeditor6.1入門(2)~Toolkitによるアプリケーション開発手順の紹介~)の記事で紹介した「ウィザードによるExpeditorサンプル・アプリケーションの作成」の中で作成した基本リッチ・サンプル・アプリケーションを元に開発していくことが可能です。これを元にまず、上で作成したデータベース・アクセス・プラグインを必須プラグインに設定し、SWTアプリケーションから使用できるようにします。「META-INF/MANIFEST.MF」ファイルもしくは「plugin.xml」ファイルを開き、「依存関係」タブを選択します。その中で「必須プラグイン」に先ほど作成した「com.ibm.wplc.dw.expeditor.sample.cloudscape」を指定します(図11)。これでデータベース・アクセス・クラスをSWTアプリケーションの中から使用することが可能となります。


図 11. Cloudscapeデータベース・アクセス・アプリケーションをSWTアプリケーションの必須プラグインとして指定
図 11. Cloudscapeデータベース・アクセス・アプリケーションをSWTアプリケーションの必須プラグインとして指定

あとは通常のEclipse上のSWTアプリケーション開発と手順は同様です。Lotus Expeditor特有の手順はありませんので、ここでは説明は省略します。サンプル・コードを参照してください。コードの確認が完了したら、前回(Lotus Expeditor6.1入門(2)~Toolkitによるアプリケーション開発手順の紹介~)の記事で紹介した「ローカル開発環境でのExpeditorアプリケーションの実行」の手順にならって、このアプリケーションをローカル開発環境上で実行してみましょう。Lotus Expeditorテスト環境が起動したら、「開く」->「Sample Rich Application」を選択すると、図6のようなパースペクティブを持つSWTアプリケーションが起動します。商品一覧に表示されている商品を選択して、表示された商品情報を編集して更新ボタンをクリックするとデータベース上の商品情報が更新されることを確認してみてください。




上に戻る


商品情報を検索するPortletアプリケーション

次に、商品情報を検索するためのPortletアプリケーションを作成します。サンプル・コードでは「com.ibm.wplc.dw.expeditor.sample.portal」プロジェクトがこれにあたります。

Portletアプリケーションを開発する場合は、RADやRSAを使用することをお勧めします。RAD、RSAにはポートレット作成のための専用プロジェクトとして「Client Service ポートレット・プロジェクト」が提供されているため、ウィザードなどのさまざまな支援機能を利用して簡単にポートレットを作成することができるようになっています。Eclipse + WSTの環境を使用した場合、これらの支援機能が提供されていません。そのため、代用プロジェクトとして「Client Service Webプロジェクト」を使用し、このWebプロジェクトをベースにして、portlet.xmlなどのポートレット・プロジェクト固有のファイルを手動で作成する必要があります。もしPortalサーバーにデプロイするポートレット用にすでに作成済みのポートレット・プロジェクトが存在している場合は、それを「プロジェクトをClient Serviceプロジェクトに変換」ウィザードを利用して、Lotus Expeditor上で動作するアプリケーションに変換することも可能です。

さて、PortletアプリケーションをLotus Expeditor上で動作させ、それをブラウザー・ビューで表示できるようにするには、いくつか拡張を設定する必要があります。「META-INF/MANIFEST.MF」ファイルもしくは「plugin.xml」ファイルを開き、「拡張」タブを選択します。設定する拡張は次の2つです。まず1つめは「com.ibm.pvc.webcontainer.application」です。この中でweb.xmlやportlet.xmlに設定されているPortletの宣言を行います。2つめは「com.ibm.eswe.workbench.WctWebApplication」です。これはWebアプリケーションをブラウザ・ビューで表示させるためのURLやブラウザーの設定です(図12)。


図 12. Portletアプリケーションの拡張設定 –Portletの宣言とPortletを表示させるためのURLやブラウザーの設定を行う
図 12. Portletアプリケーションの拡張設定 –Portletの宣言とPortletを表示させるためのURLやブラウザーの設定を行う

あとは、SWTアプリケーションの時と同様に、データベース・アクセス・プラグインを必須プラグインに設定し、SWTアプリケーションから使用できるようにします。先ほどと同じく「META-INF/MANIFEST.MF」ファイルもしくは「plugin.xml」ファイルを開き、「依存関係」タブを選択します。その中で「必須プラグイン」に先ほど作成した「com.ibm.wplc.dw.expeditor.sample.cloudscape」を指定します(図13)。


図 13. Cloudscapeデータベース・アクセス・アプリケーションをPortletアプリケーションの必須プラグインとして指定
図 13. Cloudscapeデータベース・アクセス・アプリケーションをPortletアプリケーションの必須プラグインとして指定

ポートレットのコード自体は通常のポートレット開発のものと特に変わりはありません。Lotus Expeditor特有のコードはありませんので、ここでは説明は省略します。サンプル・コードを参照してください。

コードの確認が完了したら、先ほどと同様に前回(Lotus Expeditor6.1入門(2)~Toolkitによるアプリケーション開発手順の紹介~)の記事で紹介した「ローカル開発環境でのExpeditorアプリケーションの実行」の手順にならって、このアプリケーションをローカル開発環境上で実行してみましょう。Lotus Expeditorテスト環境が起動したら、「開く」->「Sample Portal Application」を選択すると、図7のようなパースペクティブを持つPortletアプリケーションが起動します。商品名を元に商品の検索ができることを確認してみてください。




上に戻る


SWTアプリケーションとPortletアプリケーションを統合したコンポジット・アプリケーション

最後に、これまで作成したSWTアプリケーションとPortletアプリケーションを統合するコンポジット・アプリケーションを作成します。サンプル・コードでは「com.ibm.wplc.dw.expeditor.sample.composite」プロジェクトがこれにあたります。

まずは、上で作成したSWTアプリケーションとPortletアプリケーションを、コンポジット・アプリケーションの必須プラグインとして指定します。「META-INF/MANIFEST.MF」ファイルまたは「plugin.xml」ファイルを開き、「依存関係」タブを選択します。その中で「必須プラグイン」に先ほど作成したSWTアプリケーションのプラグインである「com.ibm.wplc.dw.expeditor.sample.richapp」、Portletアプリケーションのプラグインである「com.ibm.wplc.expditor.sample.portal」の2つを追加します(図14)。


図 14. SWTアプリケーションとPortletアプリケーションをコンポジット・アプリケーションの必須プラグインとして指定
図 14. SWTアプリケーションとPortletアプリケーションをコンポジット・アプリケーションの必須プラグインとして指定

さらに、パースペクティブのビューの中にPortletアプリケーションを埋め込むために、ポートレット・ビューアーを使用します。ポートレット・ビューアーを使用するには「com.ibm.rcp.portletviewer.portlets」拡張ポイントに対する拡張を設定します。先ほどと同じく「META-INF/MANIFEST.MF」ファイルまたは「plugin.xml」ファイルを開き、「拡張」タブの「すべての拡張」として「com.ibm.rcp.portletviewer.portlets」を追加します。追加したportletviewer.portletsを右クリックし、「新規」->「portletData」を選択します。この中でポートレット・ビューアーの中に表示するポートレットの設定を行います(図15)。


図 15. ビューの中でPortletを表示するためにポートレット・ビューアーを拡張
図 15. ビューの中でPortletを表示するためにポートレット・ビューアーを拡張

次に、SWTアプリケーションとPortletアプリケーションのビューを1つにまとめて表示するためのパースペクティブを作成します。com..ibm.wplc.dw.expeditor.sample.compositeパッケージにあるPerspectiveクラスのcreateInitialLayoutメソッド内で、SWTアプリケーションとPortletアプリケーションのそれぞれのビューをレイアウトに追加するように、以下のようなコードを記述します。ポートレットのビューを表示する部分では、ポートレットのビューのIDの前に「com.ibm.rcp.portletviewer.portletview:」という接頭辞をつけて、先ほどplugin.xmlで拡張を設定したポートレット・ビューアーで表示するように指定します。

                
package com.ibm.wplc.dw.expeditor.sample.composite;

import org.eclipse.ui.IPageLayout;
import org.eclipse.ui.IPerspectiveFactory;

public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout)	{		
layout.addStandaloneView(
"com.ibm.wplc.dw.expeditor.sample.richapp.MainView",
false, IPageLayout.TOP, 0.5f,
layout.getEditorArea());
layout.addStandaloneView(
"com.ibm.rcp.portletviewer.portletview:com.ibm.wplc.dw.expeditor.sample.portal
  .TestPortlet",
false, IPageLayout.RIGHT, 0.5f,
"com.ibm.wplc.dw.expeditor.sample.richapp.MainView");
layout.setEditorAreaVisible(false);
}
}

以上で、1つのパースペクティブ内に2つのアプリケーションのビューを表示する部分は作成完了です。

あとは、2つのアプリケーションの連携です。先に述べたように、アプリケーション間で連携を行うためにはProperty Brokerという機能を使用します。いくつか設定やコーディングする部分がありますので、順を追って見ていきます。

(1) Property Broker関連のプラグインを依存関係に指定

SWTアプリケーションおよびPortletアプリケーションの双方でProperty Brokerを使用できるように依存関係に指定します。両アプリケーションのプロジェクトで「META-INF/MANIFEST.MF」ファイルまたは「plugin.xml」ファイルを開き、「必須プラグイン」として「com.ibm.rcp.propertybroker」を指定します。SWTアプリケーションの場合は、追加で「com.ibm.rcp.propertybroker.swt」も指定します。


図 16. PropertyBrokerプラグインを依存関係に設定 – SWTアプリケーション(左)とPortletアプリケーション(右)
図 16. PropertyBrokerプラグインを依存関係に設定 - SWTアプリケーション(左)とPortletアプリケーション(右)

図 16. PropertyBrokerプラグインを依存関係に設定 - SWTアプリケーション(左)とPortletアプリケーション(右)

(2) Property Brokerを使用して送受信するデータのWSDL定義

次に、アプリケーション間でどのようなデータを送受信するかをWSDLファイルによって定義します。まず送信側のPortletアプリケーションから画面上で選択した商品の商品IDを送信するために、「sendItemAction」というアクションを用意して「PortletItemID」という名前の文字列として商品IDデータを送信します、という定義をWSDLに記述します。作成したWSDLは適宜、名前を付けて保存します。ここでは「WebContent/WEB-INF/TestPortalApp.wsdl」というファイル名で保存します。

<definitions name="SendItemDataService"
targetNamespace="http://www.ibm.com/wps/c2a"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:portlet="http://www.ibm.com/wps/c2a"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.ibm.com/wps/c2a"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<message name="sendItemMessage">
<part name="ID" type="xsd:string" />
</message>

<portType name="sendItem">
<operation name="sendItemOperation">
<output message="tns:sendItemMessage" />
</operation>
</portType>

<binding name="sendItemBinding" type="portlet:sendItem">
<portlet:binding />
<operation name="sendItemOperation">
<portlet:action name="sendItemAction" 
	type="standard"
	caption="Send Item Info" 
	description="Send Item information"
	actionNameParameter="ACTION_NAME" />
<output>
	<portlet:param name="PortalItemID" partname="ID" caption="Portal Item ID" />
</output>
</operation>
</binding>

</definitions>

受信側のSWTアプリケーションでは商品IDを受信するため、「receiveItemAction」というアクションを用意して「RichAppItemID」という名前の文字列で商品IDデータを受信します、という定義をWSDLに記述します。ここでは「TestRichApp.wsdl」というファイル名で保存します。

<definitions name="ReceiveItemDataService"
targetNamespace="http://www.ibm.com/wps/c2a"
xmlns="http://schemas.xmlsoap.org/wsdl/"
xmlns:portlet="http://www.ibm.com/wps/c2a"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://www.ibm.com/wps/c2a"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<message name="receiveItemMessage">
<part name="ID" type="xsd:string" />
</message>

<portType name="receiveItem">
<operation name="receiveItemOperation">
<input message="tns:receiveItemMessage" />
</operation>
</portType>

<binding name="receiveItemBinding" type="portlet:receiveItem">
<portlet:binding />
<operation name="receiveItemOperation">
<portlet:action name="receiveItemAction" 
	type="standard"
	caption="Receive Item Info" 
	description="Receive Item information"
	actionNameParameter="ACTION_NAME" />
<input>
	<portlet:param name="RichAppItemID" partname="ID" caption="RichApp Item ID" />
</input>
</operation>
</binding>

</definitions>


(3) データを送受信する部分のコーディング

WSDLで定義したのはどのようなデータを送受信するかという定義だけですので、この定義に従って実際にデータを送受信する部分のコードを記述する必要があります。

まず、送信側のPortletアプリケーションでは、送信する情報はJSP内に記述します。POST時のパラメータとして以下の2つのパラメーターを追加するだけで、データが送信されます。

  • “ACTION_NAME”パラメータ … WSDL内のactionNameParameterに定義した名前をパラメータとして指定。値には”sendItemAction” というWSDL内で定義したアクション名をセット。
  • ”PortletItemID”パラメータ …このパラメータ名は、PortletアプリケーションのWSDL内で、上で指定した”sendItemAction” アクションの<portlet:param>要素のname属性に指定された値を使用します。値には送信したい商品ID文字列をセット。

具体的には以下のようなHTMLをJSP内に記述することになります。(※ 実際のサンプル・コードではもう少し複雑に変数などを使用していますので、異なるコードになっています。)

<%
PortletURL actionUrl = renderResponse.createActionURL();
%>
<FORM method="POST" name="wire" action="<%= actionUrl.toString() %>">
<INPUT name="ACTION_NAME" type="hidden" value="sendItemAction" />
<INPUT name="PortalItemID" type="text" value=”ITEM001” />
</FORM>

受信側のSWTアプリケーションでは、イベント・ハンドラ・クラスを新たに作成する必要があります。イベント・ハンドラ・クラスは「org.eclipse.core.commands.IHandler」インターフェースクラスを実装し、その中の executeメソッドの中でデータを受信するコードを記述します。

                
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IViewPart;

import com.ibm.rcp.propertybroker.event.PropertyChangeEvent;
import com.ibm.rcp.propertybroker.property.PropertyValue;
import com.ibm.rcp.propertybroker.swt.SWTHelper;
import com.ibm.rcp.propertybroker.wire.Wire;

public class ActionHandler implements IHandler {

public Object execute(ExecutionEvent event) throws ExecutionException {

if (event.getTrigger() instanceof PropertyChangeEvent) {

final Display display = Display.getDefault();
final PropertyChangeEvent pcEvent = (PropertyChangeEvent) event.getTrigger();


display.asyncExec(new Runnable() {
        
        public
                void run() {

                // Wire情報の取得
                Wire def = pcEvent.getWireDefinition();

                // Wire情報を元にViewの取得
                IViewPart view = SWTHelper.locateView(def.getTargetEntityId());
                MainView mainView;
                if (view instanceof MainView) {
                        mainView = (MainView) view;
                } else {
                        mainView = (MainView) SWTHelper.locateView(MainView.ID);
                }

                if (mainView != null) {
                        // 受信した文字列値を取得
                        PropertyValue value = pcEvent.getPropertyValue();
                        String str = (String) value.getValue();
                        if (str != null && str.length() > 0) {
                                // Viewに受信した文字列値をセット
                                mainView.setWiredText(str);
                        }
                }
        }
});
}
return null;
}

// その他のメソッドはここでは省略
}

この実装が完了したら、「com.ibm.rcp.propertybroker.PropertyBrokerDefinitions」拡張ポイントに対する拡張を設定して、このイベント・ハンドラーを指定する必要があります。SWTアプリケーションの「META-INF/MANIFEST.MF」ファイルまたは「plugin.xml」ファイルを開き、「拡張」タブで「すべての拡張」として「com.ibm.rcp.propertybroker.PropertyBrokerDefinitions」を追加します。追加したPropertyBrokerDefinitionsを右クリックし、「新規」->「handler」を選択します。この中でイベント・ハンドラーに関する設定を行います(図17)。


図 17. SWTアプリケーションのPropertyBrokerDefinitions拡張の設定 &ndash; WSDLファイルやイベント・ハンドラ・クラスを指定
図 17. SWTアプリケーションのPropertyBrokerDefinitions拡張の設定 &ndash; WSDLファイルやイベント・ハンドラ・クラスを指定

(4) 送信データと受信データのWSDLのワイアリング設定

最後に、送信側のPortletアプリケーションのWSDLと受信側のSWTアプリケーションのWSDLをワイアリングして、データの送受信ができるようにします。ワイアリングには、「com.ibm.rcp.propertybroker」プラグインの拡張ポイントである「com.ibm.rcp.propertybroker.PropertyBrokerWire」を拡張設定します。コンポジット・アプリケーションの「META-INF/MANIFEST.MF」ファイルまたは「plugin.xml」ファイルを開き、「拡張」タブで「すべての拡張」として「com.ibm.rcp.propertybroker.PropertyBrokerWire」を追加します。追加したPropertyBrokerWireを右クリックし、「新規」->「wire」を選択します。この中でPortletアプリケーションの送信側WSDLとSWTアプリケーションの受信側WSDLのワイアリング設定を行います(図18)。


図 18. Compositeアプリケーションのワイアリング設定
図 18. Compositeアプリケーションのワイアリング設定

コンポジット・アプリケーションのProperty Brokerによる連携は、このようにワイアリングの設定によって行います。このProperty Brokerの利点は、各アプリケーションは自分がどのアプリケーションと接続されるのかを前もって知る必要がなく、コンポジット・アプリケーションとしてワイアリングが設定されて初めて、どのアプリケーションとどのアプリケーションを連携するかが決まるという点です。つまり、あらかじめ各アプリケーションにどういうデータを送受信したいかというWSDLをきちんと定義しておきさえすれば、コンポジット・アプリケーションとしてまとめる際にはもともとのアプリケーションは修正が不要なのです。データの定義さえ一致していればどんなアプリケーションでもワイアリングによって接続できます。Property Brokerを使用したコンポジット・アプリケーション開発についてもう少し詳しく知りたい方は、こちらのサイト(英語)が参考になります。

以上ですべての設定が終わりです。あとは、前回(Lotus Expeditor6.1入門(2)~Toolkitによるアプリケーション開発手順の紹介~)の記事で紹介した「ローカル開発環境でのExpeditorアプリケーションの実行」の手順にならって、このアプリケーションをローカル開発環境上で実行してみましょう。Lotus Expeditorテスト環境が起動したら、「開く」->「Sample Composite Application」を選択すると、図8のようなパースペクティブを持つコンポジット・アプリケーションが起動します。ポートレットで商品イメージをクリックすると、SWTアプリケーション上にそのアプリケーションの情報が表示されることを確認してみてください。




上に戻る


まとめ

本稿では、Lotus Expeditor上で動作するコンポジット・アプリケーションの作成手順を紹介しました。各アプリケーションはインターフェースを定義するだけに留め、実際のワイアリングはProperty Brokerという機能を通して行うことで、各アプリケーション間の結びつきが非常に緩くなり、用途に応じてコンポジットするアプリケーションを自由に変更することが可能となります。また、このコンポジット・アプリケーションの機能は、Lotus Expeditorをベースとしている次世代Notesクライアント(Hannover)にも搭載されています。Hannoverの場合には、Notesデータベースとのコンポジット・アプリケーションを作成することも可能となっており、より自由度が広がっています。コンポジット・アプリケーションはSOA (Service Oriented Architecture) の考え方と似ています。いろいろなアプリケーションにインターフェースを定義することで「サービス」として提供し、それらを組み合わせることで新しいアプリケーションを作成していくのです。本稿を通じて、皆さんにコンポジット・アプリケーションの可能性を実感していただければ幸いです。





上に戻る


ダウンロード

内容ファイル名サイズダウンロード形式
dwExpeditorSampleApps.zipdwExpeditorSampleApps.zip112KBHTTP
ダウンロード形式について


参考文献



著者について

筆者は2003年入社後、ソフトウェア開発研究所・PvC開発に配属、主にPvC製品のサービス・プロジェクトに従事し、Expeditorの前身であるWCTMEを使用したプロジェクトなどに携わってきました。昨年9月Workplaceプロジェクト配属となり、Workplace FormsやLotus Expeditorなどを初めとしたWorkplace製品に携わり始めたばかりの新米です。現在、Workplace 製品のアプリケーションの開発に取り組んでいる ISV/BP様に対する技術支援を行っています。趣味はサッカーで、週末によくフットサルなどをやります。ポジションはキーパー以外お断りです。先日2ヵ月ぶりくらいにちょっとレベルが高めのフットサルの大会に参加したところ、キーパーしかやっていないのに翌日から筋肉痛が3日も続き、あまりの体の衰えにショックを受けてジムに通おうかと悩み始めた今日この頃です。




記事の評価


サイト改善のため、ご意見をお寄せください。こちらのフォームからお願いいたします。



はいいいえわからない
 


 


12345
不充分・不完全である大変素晴らしい
 


この記事を共有する

はてなブックマーク はてなブックマーク livedoorクリップ livedoorクリップ del.icio.us del.icio.us Buzzurl(バザール) Buzzurl(バザール) Choix! Choix!
Saafブックマーク Saafブックマーク FC2ブックマーク FC2ブックマーク MM/memo MM/memo ニフティクリップ ニフティクリップ Yahoo!ブックマーク Yahoo!ブックマーク
CZブックマーク CZブックマーク newsing newsing




上に戻る


    日本IBMについて プライバシー お問い合わせ