IBM Lotus Sametime Connect 7.5.1はEclipseベースであるため、その機能を拡張してカスタム機能を追加できます。この記事では、Lotus Sametime Connect用のDictionaryプラグインを最初から作成する方法について説明します。使用中のDictionaryプラグインのスクリーン・ショットを図1に、表示された単語の意味を図2に示します。
図1.「Lookup in Dictionary」コンテキスト・メニューのプレビュー
図2. Dictionaryプラグインによって表示された単語の意味
Lotus Sametime Connectユーザーに、新しいコンテキスト・メニュー・オプション「Lookup in Dictionary」が提供されます。これは、Lotus Sametime Connectに本来組み込まれている機能ではありません。”単語の意味を検索する”機能は、IBM alphaWorksプロジェクトのDictionary and Thesaurus API for Javaによってもたらされたものです(「リソース」参照)。
役に立つLotus Sametimeプラグインを作成できますが、それは副次作用に過ぎません。この記事の目的は、com.ibm.collaboration.realtime.browser.BrowserEventListenerLotus Sametime拡張ポイントの活用方法およびcom.ibm.swt.xulrunner.browser.SWTXULRunnerBrowserオブジェクトの使用方法を説明することです。
alphaWorks Dictionary and Thesaurus API for Java(JADT)の使用
ユーザーが単語を右クリックし、「Lookup in Dictionary」コンテキスト・メニュー・オプションを選択すると、この記事で説明するDictionaryプラグインはDictionary and Thesaurus API for Java (JADT)を使用し、単語の意味を検索します。
JADTは、Javaアプリケーションで言語機能にアクセスするためのクラス・ライブラリーです。JADTの詳細については、developerWorksの連載記事「Getting started with JADT (US)」に記載されています。JADTは「辞書と非構造的な単語、およびそれらに関する情報にアクセスする透過的でJava中心の方法」を提供します。JADTにより、Lotus SametimeプラグインなどのJavaアプリケーションは、使用する辞書/データ・プロバイダーから自分自身を抽象化することができます。この抽象化のレイヤーを用いることにより、利用側のアプリケーションは、使用する辞書プロバイダーを簡単に交換できます。これを行うために、辞書サービス用のユーザー・インターフェースを使用するクライアント・アプリケーションを変更する必要はありません。この分離は、バックエンドの言語データへのドライバー・ベースのアクセスを提供するJADTのアーキテクチャーによって可能になります。JADTアーキテクチャーとこの分離に関する説明図を図3に示します。
図3. JADTアーキテクチャー
JADTを使用することにより、アプリケーションは単語の意味、発音、同意語、反意語、および他の多数の言語データにアクセスできます。取得できる言語データの詳細については、JADTの連載記事を参照してください。以降の例では、単語の意味、発音、および品詞(たとえば、形容詞、名詞、動詞、副詞など)を取得します。
JADTアーキテクチャーにより、クライアントに関する課題だけでなく、辞書プロバイダーに関する課題も解決されます。APIにより、辞書プロバイダーはドライバー・サイドのインターフェースをインプリメントすることで、JADTプロバイダーとして動作します。この記事では、辞書プロバイダーのインプリメント方法については触れません。代わりに、JADTに含まれるデフォルト・ドライバーの1つであるJADTTextDriverを使用します。このドライバーは、テキスト形式で保存されている言語データを収集します。
alphaWorks (US) からJADTをダウンロードおよびインストールできます。
jar xvfコマンドを使用して、ご使用になっているハード・ディスク上のディレクトリーにJADTInstaller.jarファイルを抽出します。埋め込まれたJARファイルjadt.jarおよびjadttextdriver.jarが必要です。また、jadt_en_en.txtファイルの場所を記録します。これは、抽出したインストーラーJARファイル内にあります。このファイルをテキスト・エディターで開き、内容を確認するとよいでしょう。このテキスト・ファイルは検索する単語の意味を保持していて、データ・ストアとして機能します。
使用するテキスト・ファイルを見るとわかるように、デフォルトのテキスト・ドライバーはすべての機能を装備した辞書プロバイダーではありません。英語の多数の単語とその意味がテキスト・ファイルから抜けています。しかし、JADTの利点は、独自のドライバーを作成することにより、データベースへのアクセスやWebサービスの呼び出しを実行したり、他のメカニズムを用いて辞書の定義などの言語情報を収集できることです。
com.devworks.example.dictionary.DictionaryUtilityクラスについて詳しく調べてみましょう。プラグインはこのクラスを使用してJADTとやり取りします。このクラスは、loadDictionary静的メソッドとgetMeanings静的メソッドの2つメソッドを持ちます。loadDictionary静的メソッドをリスト1に示します。
リスト1. loadDictionary静的メソッド
public static Dictionary loadDictionary(String dictionaryLocation)
{
try {
Class.forName("com.ibm.jadtdrivers.TextDriver.JADTTextDriverFactory");
JADTDriverFactory factory =
JADTDriverFactoryManager.getJADTDriverFactory("JADTTextDriverFactory");
JADTDriver driver = factory.createJADTDriver();
driver.setProperty("JADTTextDriverDir",dictionaryLocation);
dictionaryCache = driver.getDictionary("english","english");
dictionaryLoaded = true;
return dictionaryCache;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (JADTException e) {
e.printStackTrace();
}
return null;
}
|
JADT APIの複雑さを詳しく説明するのは避けますが、このメソッドの役割はJADTDriverオブジェクトを作成することです。このオブジェクトは、ここで必要としている辞書サービスを含めさまざまなサービスへのアクセスを提供します。このメソッドでは、デフォルト・ドライバーJADTTextDriverを使用することを指定します。これを行うには、factoryオブジェクトからドライバーのインスタンスを取得します。JADTTextDriverオブジェクトから、次の呼び出しを使用してcom.ibm.jadt.Dictionaryオブジェクトを取得します。
dictionaryCache = driver.getDictionary("english","english");
上記のメソッド呼び出しでは、両方のパラメーターでenglishが指定されていることに注目してください。JADTは他の言語(たとえば、スペイン語)への変換を行うDictionaryオブジェクトを取得できます。ここでは、単語の意味を英語で返してもらうようにします。
Dictionaryオブジェクトは、dictionaryCacheという静的変数に格納します。これを行うのは、使用するたびにDictionaryオブジェクトをロードするオーバーヘッドを避けるためです。後で使用するときのために、これをメモリー内に保管しておきます。
Dictionaryオブジェクトがロードされると、定義を知りたい単語の意味を検索できます。この機能は、DictionaryUtilityクラスのgetMeanings静的メソッドによって実現されます(リスト2参照)。
リスト2. getMeanings静的メソッド
public static String getMeanings(String wordToLookup)
{
String returnString = "";
if (dictionaryLoaded)
{
DictionaryRecord dr = dictionaryCache.getMeaning(wordToLookup);
while (dr!=null)
{
returnString+= dr.getType() + " " + dr.getPronunciation()
+ " " + dr.getDescription() + "\n";
dr=dr.getNextRecord();
}
if (returnString.equals("")) returnString = DEFINITION_NOT_FOUND_STR;
}
else returnString = DICTIONARY_NOT_LOADED;
return returnString;
}
|
getMeaningsメソッドはJADT DictionaryオブジェクトのgetMeaningメソッドに基づいて、指定された単語の意味を背後にある辞書プロバイダーから検索します。メソッドに返されるのは、DictionaryRecordオブジェクトです。このオブジェクトは、JDBCレルムのResultSetオブジェクトにたいへんよく似ています。開発者はDictionaryRecordオブジェクトに格納されたレコードを反復処理し、単語の意味を含むストリングを連結します。DictionaryRecordオブジェクトの以下のメソッドを活用します。
- getPronunciation()このメソッドは、DictionaryRecordに格納されている単語の正しい発音を取得します。
- getDescription()このメソッドは、DictionaryRecordに格納されている単語の意味を取得します。
- getUsage()このメソッドは、DictionaryRecordに格納されている単語の使用法を取得します。
単語の意味を構築した後、getMeaningsメソッドを通じて、生成したストリングを呼び出し側のLotus Sametimeプラグイン・メソッドに渡します。
Lotus Sametimeプラグイン開発環境のセットアップ
Eclipse 3.2.2を使用してLotus Sametime 7.5.1プラグインを開発およびテストするには、Eclipse設定のいくつかを変更する必要があります。最初のステップでは、ターゲット・プラットフォームをEclipseからLotus Sametimeに変更します。
ターゲット・プラットフォームはEclipse設定として指定されています。ターゲット・プラットフォームを変更するには、「Window」->「Preferences」を選択します。左側のペインで「Plug-in Development」オプションを展開し、「Target Platform」を選択します。
「location」フィールドで、「Browse」ボタンを使用してLotus Sametime Connectがインストールされているディレクトリーに移動することにより、Lotus Sametime Connectのロケーションを指定します(デフォルトではC:\Program Files\IBM\Sametime Clientです)。「Reload」をクリックします。com.ibm.collaboration.realtimeプラグインがロードされるのを確認し、「OK」をクリックします。
トラブルシューティングのヒントとして、Lotus Sametimeプラグイン(com.ibm.collaboration.realtime)が図4のように表示されない場合は、ブラウザー・ウィンドウで指定したターゲット・プラットフォームのロケーションに移動します。ターゲット・プラットフォームのディレクトリーには、プラグイン・ディレクトリーとフィーチャー・ディレクトリーがあります。ターゲット・プラットフォームのディレクトリーにプラグイン・ディレクトリーとフィーチャー・ディレクトリーがない場合は、Lotus Sametime Connectのターゲット・プラットフォームとして、正しいロケーションを使用していないことになります。このような場合は、ロケーションをLotus Sametimeクライアントの正しいロケーションに変更してください。
図4. Eclipseのターゲット・プラットフォームをLotus Sametimeに変更
それでは、Dictionaryプラグインの作成および構成手順を説明します。最初に、com.devworks.example.dictionaryという名前の新規プラグイン・プロジェクトを作成します。「File」->「New」->「Project」を選択して、新規プロジェクトを作成してください。「New Project」ウィザードが表示されます(図5参照)。「New Project」ウィザードで、「Plug-in Project」を選択し、「Next」をクリックします。
図5.「New Project」ウィザードでの「Plug-in Project」の選択
次に、「New Plug-in Project」ウィザードが表示されます(図6参照)。プロジェクト名として「com.devworks.example.dictionary」を入力し、「Next」をクリックします。
図6. 新規プラグイン・プロジェクト名の指定
次のウィンドウで(図7参照)、プラグイン・オプション「This plug-in will make contributions to the UI」の選択を解除します。「Finish」をクリックします。
図7. プラグインをUIに追加しないことの指定
DictionaryプラグインへのDictionaryコードのインポート
Dictionaryプラグインでは、JADT JARファイルおよびDictionaryUtilityクラスへのアクセスを可能にする必要があります。このため、必要なJADT JARファイルをDictionaryプラグインのクラスパスおよびDictionaryUtility.javaファイルに追加しなければなりません。DictionaryUtility.javaクラスは、この記事の『ダウンロード』セクションにあるプロジェクトZIPファイルから入手できます。JADTインストーラーJARファイルを抽出したディレクトリーと同じディレクトリーに、このZIPファイルを抽出してください。
まず、「File」->「Import」を選択します。「Import」ウィザードが表示されます(図8参照)。「File System」を選択し、「Next」をクリックします。
図8. ファイル・システムからのDictionaryコードのインポート
次に、JADT JARが含まれるディレクトリーを指定します。前にダウンロードしたJADTを抽出したディレクトリーから、インポートするJADT JAR (jadt.jarおよびjadttextdriver.jar)を選択し、さらに辞書ソース・ファイル(jadt_en_en.txt)を選択します。「Into folder」の値として「com.devworks.example.dictionary」を指定します。「Finish」をクリックしてインポートを実行します。
DictionaryUtility.javaクラス・ファイルを取り込むために、このプロセスを少し変更して繰り返す必要があります。「Into folder」として「com.devworks.example.dictionary/src/com/devworks/example/dictionary」を指定します(図9参照)。
図9. ソース・フォルダーへのDictionaryUtility.javaのインポート
次に、いまインポートしたJARファイルをプラグインのクラスパスに追加します。META-INF/MANIFEST.MFファイルを開きます。これにより、プラグインのマニフェスト・エディターが開かれます。プラグインのマニフェスト・エディターで「Runtime」タブを選択します(図10参照)。「Runtime」タブの「Classpath」セクションで、「Add」ボタンをクリックします。
図10. プラグインのランタイム・クラスパスの変更
「Add」ボタンをクリックすると、「JAR Selection」ウィンドウが表示されます(図11参照)。jadt.jarおよびjadttextdriver.jarを強調表示します。この2つのJARファイルが存在しない場合は、これらのファイルをDictionaryプラグイン・プロジェクトにインポートしたかどうか確認します。
図11. Dictionaryプラグインを補助するJARファイルの選択
プラグインのマニフェスト・エディターのページを保存して閉じます。
Dictionaryプラグインでは、MANIFEST.MFファイルでそのプラグインの依存関係を定義する必要があります。幸い、プラグインのマニフェスト・エディターを使用すると、このプロセスを簡素化できます。このエディターを使用して、org.eclipse.jface、com.ibm.swt.xulrunner、com.ibm.collaboration.realtime.browserの各プラグインを、作成中のプラグインが依存するプラグインとして定義します。これを行うには、まずMETA-INF/MANIFEST.MFファイルを開きます。次に、「Dependency」タブを開きます。
ここで、org.eclipse.jfaceプラグインをプラグイン依存関係として追加するプロセスを実行します。最初に、「Add」ボタンをクリックします。「Plug-in Selection」ウィンドウが表示されます。プラグインのリストの範囲を狭めるために、「org.eclipse.jface」と入力します。選択可能な3つのプラグインが表示されます(図12参照)。org.eclipse.jfaceプラグインを選択します。
図12.「Plug-in selection」ウィンドウ
この手順を繰り返し、com.ibm.swt.xulrunnerプラグインとcom.ibm.collaboration.realtime.browserプラグインをプラグイン依存関係として追加します。プラグインのマニフェスト・エディターを保存して閉じます。
プラグインがアクティブ化されたときに、辞書データを持つDictionaryオブジェクトの生成を促進するには、プラグインの作成時に自動的に生成されたcom.devworks.example.dictionary.Activatorクラスのstartメソッドに、DictionaryUtilityクラスのloadDictionary静的メソッド呼び出しを含めます。そして、Dictionaryオブジェクトを用いて、DictionaryUtilityクラスの静的なdictionaryCache変数を生成します。
開発者は、startメソッドでEclipse APIを使用して、JADTTextDriverがそのデータ・ストアとして必要とするファイルのロケーションを動的に検索します。データ・ファイルが見つかった後、構成ファイルのロケーションをDictionaryUtilityのloadDictionaryメソッドに渡します。リスト3のコードは、JARファイルにプラグインが格納されていないという前提に基づいています。
リスト3. 辞書のロケーション
/**
* This method is called upon plug-in activation
*/
public void start(BundleContext context) throws Exception {
super.start(context);
String dictionaryLocation = "";
try {
URL urlLocation = Activator.getDefault().getBundle().getEntry("jadt_en_en.txt");
URL fileURL = FileLocator.toFileURL(urlLocation);
String filePath = fileURL.getFile();
File dictionaryFile = new File(filePath);
File dictionaryFolder = dictionaryFile.getParentFile();
dictionaryLocation = dictionaryFolder.getPath();
} catch (IOException e) {
e.printStackTrace();
}
DictionaryUtility.loadDictionary(dictionaryLocation);
}
|
Eclipse 3.2.2でプラグインをテストするには、「Run」->「Run」を選択します。次に、「Eclipse Application」オプションを右クリックし、「New」を選択します(図18参照)。
図18. Eclipse 3.2.2環境でLotus Sametimeを実行するための新規Eclipse構成の作成
「Run Configuration」ダイアログ・ボックスでデフォルト値を受け入れ、「Run」をクリックします。
この記事では、IBM Lotus Sametimeクライアントに辞書機能を追加する、IBM Lotus Sametime Connectの役に立つプラグインの作成方法を学習しました。この機能を実現するために、Lotus Sametime拡張ポイントのcom.ibm.collaboration.realtime.browser.BrowserEventListenerを活用し、com.ibm.swt.xulrunner.browser.SWTXULRunnerBrowserオブジェクトを使用しました。また、この記事では、IBM alphaWorksが提供するDictionary and Thesaurus API for Javaを使用して、言語機能をLotus Sametime Connectアプリケーションに追加する方法についても説明しました。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| サンプルのDictionaryプラグイン | dictionarySource.zip | 5.3 KB | HTTP |
学ぶために
-
developerWorks Japan: Lotus: Lotusの日本の技術情報サイトです
-
developerWorks: Lotus(US) : Lotusの英語の技術情報サイトです
- developerWorks Lotusの記事 「Setting up an IBM Lotus Sametime server sandbox environment for development(US)
- developerWorks Lotusの記事 「Creating an update site for your IBM Lotus Sametime Connect plug-ins(US)
- developerWorks Lotusの記事 「A tour of the IBM Lotus Sametime 7.5 toolkits(US)
- developerWorks Lotusの記事 「Extending IBM Lotus Sametime Connect 7.5(US)
- developerWorksの連載記事 「Getting started with JADT(US)
製品や技術を入手するために
- developerWorksから Lotus Sametime 7.5.1のトライアル・バージョン (US) をダウンロードできます。
- developerWorksから Lotus Sametime 7.5 Software Development Kit (SDK) (US) をダウンロードできます。
- alphaWorksから JADT (US) をダウンロードできます。
議論するために
- ディスカッション・フォーラム(US) にご参加ください。
- developerWorks Lotus チーム・ブログ(US) にご参加ください。
Kulvir Singh Bhogal works as an IBM consultant, devising and implementing Java-centric solutions at customer sites across the nation. You can contact Kulvir at kbhogal@us.ibm.com.