レベル: 初級 林田 憲昌 (hysd@jp.ibm.com), WPLC開発 / ソフトウェア開発研究所 , IBM
2006年 9月 08日 Lotus Sametime はリアルタイム・コラボレーションのためのプラットフォームであり、インスタント・メッセージングやWeb会議の機能を提供することによって、物理的に遠くに離れた場所にいる人同士の間であっても、リアルタイムなコミュニケーションを可能にしてくれます。Lotus Sametime Connect はこのコラボレーション環境において、エンド・ユーザーがインスタント・メッセージングや在席確認を行う際に用いるデスクトップ・アプリケーションです。
Lotus Sametime は 2006年8月にバージョン7.5がリリースされ、Sametime Connect も大幅に機能が強化されましたが、もっとも大きな変化は、アプリケーションのプラットフォームがeclipse ベースに変更された点にあります(従来提供されていたのはWindowsネイティブのアプリケーションであるC++バージョンと、ブラウザー上で動作するJava Appletバージョンでした)。Sametime Connect はLotus Expeditor (旧WebSphere Everyplace Deployment) と呼ばれる Eclipse Rich Client Platform (RCP) や JRE、拡張サービスを含んだクライアントアプリケーションのためのプラットフォームを基盤としており、それらの機能を利用してリッチなユーザー・インターフェイス (UI) やさまざまなサービスを構築しています(図1)。
プラットフォームがEclipse RCP ベースに変更されたことによって得られる一番大きな利点は、Eclipse が提供するプラグイン・フレームワークを利用することが可能となった点にあります。これにより、機能の拡張やその他のプラグイン・アプリケーションとの連携が容易となり、新たなプラグインを追加していくことで、各ユーザーが好みのクライアント環境を構築することができます。新たなSametime Connect 用プラグインの開発は、通常の Eclipse プラグインを開発する場合と大きな違いはなく、また、Lotus Expeditor および Sametime Connect が提供するさまざまなUIやサービスのコンポーネントを利用することもできるため、比較的容易にリッチなプラグイン・アプリケーションを作成することが可能です。本稿では、実際にどのようにして Sametime Connect を拡張するためのプラグインを開発していったらよいのかについて、例を示しながら説明していきます。
(本稿では、Sametime Connect 7.5、
Eclipse 3.2
およびJ9 JDT launching plug-in 6.1, Apache Axis 1.4を使用し、Windows XP および Mac OS X上で開発しています。Mac版の Sametime 7.5 は後日リリースされる予定です。)
図1. Sametime Connect のアーキテクチャー概要
開発環境の構築
Lotus Sametime Connect 7.5のインストール
Sametime Connect 上で動作するプラグイン・アプリケーションをローカルの開発環境上でコンパイルし実行する際には、ターゲット・プラットフォームとしてSametime Connectを使用するため、あらかじめ開発環境と同じマシンにSametime Connectをインストールしておく必要があります。詳細なインストール方法については Installation Guide などを参照してください。
Sametime 7.5 Toolkits のインストール
Sametime 7.5 Toolkits をこちらのサイトからダウンロードし、任意のディレクトリー(例: C:\st75sdk。以下、<ST75Toolkits>と表記します)に展開してください(図2)。Toolkit には開発者向けのガイドや API の JavaDoc 、サンプルコード、Sametime Connect が使用している JVM (後述) の開発者版などが含まれています。
図2. Sametime 7.5 Toolkits
Eclipseの設定
J9 JDT Launching Plug-in のインストール
Windows および Linux 上では、Sametime は JVM として J9 JCL Desktop Custom Runtime Environment(以下J9 JCL Desktop)を使用しています(図1)。そのため、これらの環境で開発を行う場合には、eclipse が使用する JRE を J9 JCL Desktop に変更する必要があります (Mac OS X の場合、OS標準の JVM を使用するので、JRE に関する設定を行う必要はありません)。しかし、eclipse 3.2 では、デフォルトの状態ではこの J9 JCL Desktop を JVM として指定することができないため、J9 JDT Launching Plug-in をこちらのサイトからダウンロードしインストールする必要があります。インストールは、ダウンロードした JAR ファイル (例: org.eclipse.jdt.launching.j9_6.1.0.jar) を <ECLIPSE_HOME>\plugin フォルダーの直下に置くだけで完了します。正常にインストールされると、eclipse の Preferences に 「J9」という項目が追加されます(図3)。
図3. J9の設定画面
デフォルトJREの変更
Eclipse が使用する JRE を J9 JCL Desktop に変更します。Eclipse のメニューから「Window」 -> 「Preferences...」 > 「Java」 > 「Installed JREs」 を選択し、「Add....」で新しいJREを定義します。「JRE type」として「J9 VM」(J9 JDT Launching Plug-in がインストールされていないと表示されません)を選択し、「JRE home directory」として <ST75Toolkits>\client\connect\j9-runtime\<OS>(<OS>の部分は開発環境として使用しているOSのフォルダーを選択してください。例: win32)を指定します。「Default VM Arguments」には「-jcl:max」と入力して「OK」で保存してください(図4)。
図4. 新規 JRE として J9 JCL Desktop を追加
必要となるライブラリーのすべてが自動で読み込まれてはいないので、手動でJAR ファイルを追加します。先ほど定義したJREを選択して「Edit...」をクリックし, 「Add External JARs...」でJ ARファイルを追加していきます。追加する必要があるのは、<ST75Toolkit>\client\connect\j9-runtime\<OS>\lib\endorsed 内と <ST75Toolkits>\client\connect\j9-runtime\<OS>\lib\jclMax\ext 内の JAR ファイルです。最終的に図5のような構成にしてください。
図5. 必要なライブラリーが全て追加された J9 JCL Desktop の定義
新しく定義したJRE がデフォルトとなるようにチェックを入れてください(図6)。
図6. J9 JCL Desktop をデフォルト JRE として設定
コンパイラーの設定
「Java」 -> 「Compiler」を選択し、「Use default compliance settings」のチェックを外して図7のように設定してください。
図7. コンパイラーの設定
ターゲット・プラットフォームの変更
開発するプラグインをコンパイルし、Sametime Connect 上で実行するためにはターゲット・プラットフォームを変更する必要があります。Eclipse のメニューから 「Window」 -> 「Preferences...」 -> 「Plug-in Development」 -> 「Target Platform」 を選択し、「Location」として Sametime Connect がインストールされているディレクトリー(デフォルトでは C:\Program Files\IBM\Sametime Connect 7.5)を指定して「Reload」ボタンをクリックすると、Sametime Connect が使用しているプラグインが読み込まれます (図8)。これにより Sametime Connect が公開している拡張ポイントやAPI などが利用できるようになります。
図8. ターゲット・プラットフォームの変更
Eclipse から Sametime Connect を起動するための設定
開発中のプラグイン・アプリケーションを Sametime Connect 上で実行して動作確認やデバッグを行うために、Eclipse から Sametime Connect を起動できるようします。Eclipse のメニューから「Run」 -> 「Run...」を選択して設定画面を開き、「Eclipse Application」を選択してコンテキスト・メニューから「New」を選択します(図9)。
図9. eclipse アプリケーション起動構成の新規作成
「Program to Run」として「Run an application」を選択し、ドロップダウン・メニューから「com.ibm.collaboration.realtime.application.RTCApplication」を選択してください。また、「Java Runtime Environment」として、先ほど作成したJ9 JCL Desktopが選択されていることも確認してください(図10)。
図10. Sametime Connect アプリケーションの起動構成 (Main)
次に、「Arguments」タブを選択し、「VM arguments」として「-Xint -Xtrace:none -Xgcpolicy:gencon -Dcom.ibm.pvc.webcontainer.port=7777」と入力し、「Apply」をクリックして設定を保存します(図11)。
図11. Sametime Connect アプリケーションの起動構成 (Arguments)
設定が正しく行われていれば、「Run」をクリックすることで Sametime Connect を Eclipse から起動することができます(図12)。「Run」の代わりに「Debug」を用いて Sametime Connect を起動すれば、コード内にブレークポイントを設定してデバッグを行うことも可能です。
図12. Eclipse から Sametime Connect を起動
Sametime Connectの拡張
Sametime Connect の拡張ポイント
前述したように、Sametime Connect 7.5 はEclipse RCP をベースにしており、そのプラグイン・フレームワークを利用することができるため、eclipse と同様に、拡張ポイントを利用することで、メニューやツールバーのアクション・ボタンを追加するといったことを簡単に行うことができます。また、Sametime Connect 自身もいくつかの拡張ポイントを提供しており、それらを利用することで Sametime Connect 固有の機能の拡張も行うことができます。
図13は左側が通常のデフォルト状態の Sametime Connect、右側が Sametime 7.5 Toolkits に同梱されているサンプル・プラグインを追加した Sametime Connect ですが、このように、図に示されている拡張ポイントを使ってユーザー・インターフェィスを拡張させることができます。 Sametime Connect が提供している拡張ポイント一覧については Sametime 7.5 Toolkits に同梱されている Integration Guide を参照してください。
図13. デフォルト状態のSametime Connect (左) と 拡張された Sametime Connect (右)
Sametime Connect のユーザー・インターフェイス拡張
実際にどのようにして Sametime Connectを拡張していったらよいのかについて、具体的な例を示しながら説明していきます。ここでは、Lotus Domino 上のメール・データベースにWeb Services 経由でアクセスし、取得した情報をりストとして表示するようなミニ・アプリケーションをサンプルとして作成します。ミニ・アプリケーションとは、図13の右図において拡張ポイント「com.ibm.collaboration.realtime.imhum.miniApps」を利用することで拡張している部分にあたるもので、コンタクト・リストの下部に表示領域を確保し、さまざまな情報を表示させることができます。
まず、新規プラグイン・プロジェクトを作成します。 Eclipse のメニューから 「File」 -> 「New」 -> 「New Project...」を選択し、プロジェクト・ウィザードを開き、「Plug-in Project」を選択して次に進みます(図14)。
図14. 新規プロジェクト・ウィザード
任意のプロジェクト名を入力し、次に進みます(図15)。
図15. 新規プラグイン・プロジェクトの作成
任意のプラグイン ID や名前などを入力し、「Finish」をクリックします(図16)。
図16. 新規プラグインの生成に必要なデータを入力
プラグイン・プロジェクトが作成されました。プラグインの構成を変更するために META-INF ディレクトリー内にある MANIFEST.MF を開きます(図17)。
図17. 作成されたプラグイン・プロジェクトのMANIFEST.MF を Plug-in Manifest Editor で開いたところ
拡張ポイントを利用するためには、その拡張ポイントを提供しているプラグインが「Required Plug-ins」として追加されている必要があります。ここでは、ミニ・アプリケーションを表示するための拡張ポイント「com.ibm.collaboration.realtime.imhum.miniApps」を利用するために、「Dependencies」タブを開き、「Required Plug-ins」セクションの「Add..」をクリックして「com.ibm.collaboration.realtime.imhub」を追加してください(図18)。
図18. Required Plug-in の追加
次に、拡張ポイントを追加します。「Extensions」タブを開き、「Add...」をクリックしてダイアログを開きます。拡張ポイント一覧の中から「com.ibm.collaboration.realtime.imhub.miniApps」を選択し、「Finish」してください(図19)。
図19. 拡張ポイントの選択ダイアログ
追加された拡張ポイントを選択し、コンテキスト・メニュー上で「New」 -> 「miniApp」 を選択して新規ミニ・アプリケーションを作成します(図20)。
図20. 新規 miniApp の作成
任意のIDや表示名などを指定します。「maxHeight」は必須項目ではありませんが、他のミニ・アプリケーションが存在しない場合、指定されていないと表示されなくなるので、なるべく指定するようにしてください。入力が完了したら、ミニ・アプリケーションの実装クラスを作成するために「class*:」ラベルをクリックします(図21)。
図21. 新規 miniApp のプロパティ
任意のクラス名やパッケージ名を入力します。「Superclass」には「com.ibm.collaborationi.realtime.miniapp.AbstractMiniApp」を指定し、「Finish」してください(図22)。
図22. miniApp の実装クラスの作成
ミニ・アプリケーションの実装クラスが作成されます。AbstractMiniApp から継承された createControl メソッドがミニ・アプリケーションのウィジェットを生成するときに呼ばれます。このメソッドの引数であるorg.eclipse.swt.widgets.Composite がミニ・アプリケーションのユーザー・インターフェイスにおいて親となるコンテナーであり、この上にボタンやラベルといったSWTのウィジェットを配置していくことでユーザー・インターフェイスを構築していきます。例として、中心にラベルを配置してみます(図23)。
図23. miniApp の実装クラスの例
実行すると作成したミニ・アプリケーションが追加された Sametime Connect が起動します(図24)。このように、Sametime Connect のユーザー・インターフェイスは簡単に拡張することができます。後は、通常のeclipse plug-inを作成する場合と同じように、データを取得したり加工したりするためのロジックを記述したり、SWTを使ってユーザー・インターフェイスを作り込んでいったりしていくことになります。
図24. 作成した miniApp プラグインを追加した Sametime Connect
メール情報を取得するための Domino Web Services の実装
先ほど作成したミニ・アプリケーションの領域に Domino サーバーからメール情報を取得して表示させます。ここでは Domino 7 から利用可能となった Domino Web Services を利用してメール一覧を取得します。本稿は Sametime Connect の拡張方法について説明するのを目的としているので、Domino Web Services の実装方法の詳細については述べませんが(Domino Designer のヘルプなどを参照してください)、例えば、単純な方法としては、以下のようなロジックを、情報を取得したいユーザーのメール・データベースに Web Services として実装(図25)することでメール一覧を取得することができます。
package com.lotus.sametime.sample.notesmail.delegate;
import java.util.ArrayList;
import java.util.List;
import lotus.domino.AgentContext;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.NotesException;
import lotus.domino.Session;
import lotus.domino.View;
import lotus.domino.ViewEntry;
import lotus.domino.ViewEntryCollection;
import lotus.domino.WebServiceBase;
public class NotesMailDelegate {
public NotesMailEntry[] getNotesMailEntries() {
List notesMailEntryList = new ArrayList();
try {
Session session = WebServiceBase.getCurrentSession();
AgentContext agentContext = session.getAgentContext();
Database mailDb = agentContext.getCurrentDatabase();
View calView = mailDb.getView("($Inbox)");
ViewEntryCollection vec = calView.getAllEntries();
ViewEntry viewEntry = vec.getFirstEntry();
Document document;
NotesMailEntry notesMailEntry;
while (null != viewEntry) {
document = viewEntry.getDocument();
notesMailEntry = new NotesMailEntry();
notesMailEntry.setDocumentID(document.getUniversalID());
notesMailEntry.setDocumentNotesURL(document.getNotesURL());
notesMailEntry.setFrom(session.createName(document.getItemValueString
("From")).getCommon());
notesMailEntry.setSubject(document.getItemValueString("Subject"));
notesMailEntryList.add(notesMailEntry);
viewEntry = vec.getNextEntry();
}
} catch (NotesException ne) {
ne.printStackTrace();
}
return (NotesMailEntry[]) notesMailEntryList.toArray(new
NotesMailEntry[notesMailEntryList.size()]);
}
}
package com.lotus.sametime.sample.notesmail.delegate;
import java.io.Serializable;
public class NotesMailEntry implements Serializable {
private String _documentID
=
"";
private String _documentNotesURL
=
"";
private String _from
=
"";
private String _subject
=
"";
public void setDocumentID(String documentID) {
this._documentID = documentID;
}
public String getDocumentID() {
return this._documentID;
}
public void setFrom(String from) {
this._from = from;
}
public String getFrom() {
return this._from;
}
public void setSubject(String subject) {
this._subject = subject;
}
public String getSubject() {
return this._subject;
}
public void setDocumentNotesURL(String documentNotesURL) {
this._documentNotesURL = documentNotesURL;
}
public String getDocumentNotesURL() {
return this._documentNotesURL;
}
}
|
図25. メール・データベース上にメール情報を取得するための Web Services を実装
作成した Web Services の WSDL から Java のスタブ・コードを生成します。ここでは Apache Axis の WSDL2Java を利用することにします。WSDL2Javaの使用方法についてはこちらを参照してください。例えば以下のようなコマンドを実行することでスタブを生成することができます(図26)。
java org.apache.axis.wsdl.WSDL2Java -v <WSDLファイル>
|
図26. WSDL2Java でスタブ・コードを生成
生成されたスタブ・コードを開発環境に取り込みます。コンパイルするために Apache Axis のライブラリーも必要となるので、「Required Plug-ins」として「org.apache.axis」を追加してください(図27)。
図27. スタブ・コードのインポートとRequired Plug-insの追加
Sametime Connect 側には、Web Services を呼び出すためのメソッドを実装します。例えば以下のような方法で Web Services を呼び出すことができます。以上でメール情報を取得するための準備は整いました。
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Stub;
;
import com.lotus.sametime.sample.notesmail.delegate.NotesMailDelegate;
import com.lotus.sametime.sample.notesmail.delegate.NotesMailDelegateService;
import com.lotus.sametime.sample.notesmail.delegate.NotesMailDelegateServiceLocator;
import com.lotus.sametime.sample.notesmail.delegate.NotesMailEntry;
…
…
public static NotesMailEntry[] getNotesMailEntries() {
NotesMailEntry[] notesMailEntries = new NotesMailEntry[0];
try {
NotesMailDelegateService service = new NotesMailDelegateServiceLocator();
NotesMailDelegate delegate = service.getDomino();s
((Stub) delegate)._setProperty(Stub.USERNAME_PROPERTY, "Norimasa Hayashida");
((Stub) delegate)._setProperty(Stub.PASSWORD_PROPERTY, "password");
((Stub) delegate)._setProperty(Stub.ENDPOINT_ADDRESS_PROPERTY,
"http://lotus.sametime.com/mail/nhayashi.nsf/
NotesMailDelegate/NotesMailDelegate?OpenWebService");
notesMailEntries = delegate.getNotesMailEntries();
} catch (ServiceException se) {
se.printStackTrace();
} catch (RemoteException re) {
re.printStackTrace();
}
return notesMailEntries;
}
…
…
…
|
MessageHandlerListener の拡張
Sametime サーバーへのログイン完了時に Web Services を呼び出すために、拡張ポイント「com.ibm.collaboration.realtime.messages,MessageHandlerListener」を利用しmessageHandeler を実装します。messageHandler の実装クラスは com.ibm.collaboration.realtime.messages.DefaultMessageHandler のサブクラスであり、さまざまなイベント発生時(ログイン完了時、ステータス変更時、チャットメッセージの受信時、コンタクト・リスト上で人が選択された時など)に呼び出され、イベント情報(ログインしたユーザーの情報、どのステータスに変更されたのか、受信したチャットメッセージ、コンタクト・リスト上で選択された人の情報など)を取得することができます。
miniApp を作成したときと同様にして拡張を行います。MANIFEST.MF を開いて「Extensions」タブで拡張ポイント「com.ibm.collaboration.realtime.messages,MessageHandlerListener」を追加し、コンテキスト・メニューから「messageHandler」を作成してください(図28)
図28. 新規 messageHandler の作成
「class*:」ラベルをクリックして実装クラスを作成します(図29)。
図29. 新規 messageHandler のプロパティ
任意のクラス名やパッケージ名を入力します。「Superclass」には「com.ibm.collaborationi.realtime.messages.MessageHandlerAdapter」を指定し、「Finish」してください(図30)。
図30. messageHandler の実装クラスの作成
messageHandler の実装クラスが作成されました(図31)。DefaultMessageHandler#handleMessage(ImConnectedMessage) がログイン時に呼び出されるメソッドなので、これをオーバーライドして、先ほど実装したような Web Services を呼び出すためのメソッドを利用してメール情報を取得し、ミニ・アプリケーション内に表示させるようなロジックを追加してください。
図31. 作成された messageHandler の実装クラス。handleMessage(ImConnectedMessage message)をオーバーライド
以上のような実装を行うことで、ログイン時にメール・サーバーからメール一覧を取得し表示するミニ・アプリケーションを Sametime Connect に追加することができました(図32)。今後の展開としては、メールのリストをダブル・クリックしてLotus Notes 上で開いたり、Web Services のエンドポイントを設定するプリファレンス画面を作成したりといったことが考えられます。本稿に添付しているサンプル・ソースコードには、本稿で作成した部分に加えて、そういった拡張も含んでいますので参考にしてみてください。
図32. メール情報を取得し表示するミニ・アプリケーションを追加した Sametime Connect
まとめ
本稿では Sametime Connect を拡張する方法について例を示しながら説明してきました。Sametime Connect 7.5 では Eclipse RCP をベースとすることで、その柔軟なプラグイン・フレームワークを利用することができ、簡単に機能の追加を行うことが可能になっています。Sametime Connect は、ユーザーがPC使用時に常に起動しているアプリケーションであるという特殊な性質があり、さまざまなタイプのソリューション、例えばリアルタイムに提供される情報を表示するようなソリューション、を構築する上で非常に魅力的なプラットフォームであると考えられます。興味を持たれた方はぜひ Sametime Connect の拡張にチャレンジしてみてください。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| sample code | NotesMailMiniApp.zip | 47KB | HTTP |
|---|
参考文献
著者について  | |  | 林田 憲昌 は YSLのWPLC 開発部門に所属するソフトウェア・エンジニアで、現在は主にLotus Notes の開発に取り組んでいます。仕事でリッチクライアントばかりやっていると、Web が恋しくなって、ついつい Greasemonkey でネタをプロトしてしまう近頃です。
|
記事の評価
|