本文へジャンプ

ソフトウェア Lotus Lotus Developer Domain 製品別技術情報 Lotus Sametime > 
 

IBM Lotus Sametime Connect 7.5.1への辞書機能の追加

   
 
コンテンツ
alphaWorks Dictionary and Thesaurus API for Java(JADT)の使用インスタント・メッセージング・クライアント
Dictionaryプラグインの開始
DictionaryプラグインへのDictionaryコードのインポート
BrowserEventListener拡張ポイントを使用したチャット・ウィンドウ・イベントの捕捉
サンプル・アプリケーションの実行
まとめ
ダウンロード
リソース
筆者について(原文のまま)
ご意見ご要望をお寄せ下さい

Kulvir Singh Bhogal (kbhogal@us.ibm.com), IBM Software Services for WebSphere, IBM Corporation
Mark Talbot (talbotm@us.ibm.com), Developer, Industry Solutions, IBM

レベル:中級
原文の掲載:2007年5月30日
2007年9月28日更新
原文はこちら (US)

IBM Lotus Sametime 7.5.1のEclipseベースの特性を活用する方法を理解しましょう。IBM Lotus Sametime Connectに辞書機能を追加するプラグインを作成します。また、Dictionary and Thesaurus API for Javaを使用して、Lotus Sametimeクライアント・アプリケーションに言語機能を追加する方法を学習します。

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サービスの呼び出しを実行したり、他のメカニズムを用いて辞書の定義などの言語情報を収集できることです。


DictionaryUtilityクラス

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プラグインの開始

それでは、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ユーティリティーの初期化

プラグインがアクティブ化されたときに、辞書データを持つ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);
	}


上に戻る

BrowserEventListener拡張ポイントを使用したチャット・ウィンドウ・イベントの捕捉

この時点で、辞書の意味を調べるためのすべてのものが揃っています。しかし、辞書機能をLotus Sametime Connectユーザーに見やすく公開する方法については、まだ解決していません。辞書をLotus Sametimeユーザーとやり取りさせる方法が必要です。これを行うには、com.ibm.collaboration.realtime.BrowserEventListener拡張ポイントを使用します。BrowserEventListener拡張ポイントを使用すると、単語を強調表示して右クリックするイベントと、単語を検索してその意味を表示する以降のアクションとをプログラマチックに関連付けることができます。

com.ibm.collaboration.realtime.BrowserEventListener拡張ポイントは、イベント(org.w3c.dom.events.Event)をトリガーするeventType (この場合は、ユーザーが右クリックによってコンテキスト・メニューを開いたことを示すコンテキスト・メニューです)を定義します。この拡張ポイントは、そのイベントを捕捉するクラスも定義します。独自のクラスでこのイベントを捕捉するには、com.ibm.collaboration.realtime.browser.BrowserListenerクラスを拡張します。図13のクラス図に、BrowserListenerとcom.devworks.example.dictionary.DictionaryBrowserListenerクラスの関係を示します。

図13. DictionaryBrowserListenerクラスのクラス階層

強調表示した単語をユーザーが右クリックしたときにイベントをトリガーするには、contextmenu型のeventTypeを定義します。また、Lotus Sametimeユーザーに表示するコンテキスト・メニュー・オプションのラベルも定義します。ここでは、メニュー・オプションを「Lookup in Dictionary」にします。この拡張の完全な定義をリスト4に示します。


リスト4. 拡張の定義

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
    <extension
          point="com.ibm.collaboration.realtime.browser.BrowserEventListener">
          	<BrowserEventListener
            class="com.devworks.example.dictionary.DictionaryBrowserListener"
            eventType="contextmenu"
            id="com.devworks.example.dictionary.DictionaryBrowserListener"
            label="Lookup in Dictionary"
            >
         <property
               name="menupath"
               value="open"/>
      </BrowserEventListener>
    </extension>
</plugin>

この拡張は、plugin.xmlというファイルで定義します。「File」->「New」->「File」を選択し、plugin.xmlファイルを作成します。「New File」ウィザードが表示されます(図14参照)。ファイルに「plugin.xml」という名前を付け、com.devworks.example.dictionaryフォルダーに保存します。

図14. DictionaryBrowserListenerクラスのクラス階層

これで、拡張の定義が完了したので、com.devworks.example.dictionary.DictionaryBrowserListenerクラスのコードを扱うことができます。DictionaryBrowserListenerクラス(一部をリスト5に表示)には、com.ibm.collaboration.realtime.browser.Browserクラスのインスタンスが含まれています。Browserインスタンスから、getRealBrowser()メソッドを使用して、com.ibm.swt.xulrunner.browser.SWTXULRunnerBrowserオブジェクトにアクセスできます。


リスト5. DictionaryBrowserListenerクラス

public class DictionaryBrowserListener extends BrowserListener {
	public void handleEvent(Event evt) {
		Browser browser = getBrowser();
		SWTXULRunnerBrowser chatWindowBrowser = 
		(SWTXULRunnerBrowser)browser.getRealBrowser();

SWTXULRunnerBrowserオブジェクトは、チャット・ウィンドウの内部でチャットが表示される領域を表します(図15参照)。

図15. チャット・ウィンドウ内部の領域を表すSWTXULRunnerBrowserオブジェクト

SWTXULRunnerBrowserクラスを使用すると、イベント(DictionaryBrowserListenerによって処理されるイベント)が呼び出された瞬間に強調表示されていたテキストを取得できます。図16では、「cafeteria」が強調表示され、その後で「Dictionary」コンテキスト・メニューが選択されています。

図16.「Lookup in Dictionary」コンテキスト・メニュー・オプションの使用

次に、リスト6のコードを使用して、強調表示されたテキストをhandleEventメソッドで取得します。強調表示されたテキストの取得には、xulrunner APIを使用します。


リスト6. handleEventメソッドでのテキストの取得

JHTMLWindow jhtmlWindow = chatWindowBrowser.getHTMLWindow();
		JSelection jSelection = jhtmlWindow.getSelection();
		JRange jRange = jSelection.getRangeAt(0);
		DocumentFragment fragment = jRange.cloneContents();
		
		HTMLDocument htmlDoc = chatWindowBrowser.getDocument();
		final JHTMLDivElement divElement = (JHTMLDivElement)htmlDoc.createElement("div");
		divElement.appendChild(fragment);
		
		String wordToLookup = divElement.getInnerHTML();

検索する単語の範囲を狭め、それをwordToLookupストリングに格納した後、DictionaryUtilityクラスの静的メソッドgetMeaningsに基づいて、JADTを使用して意味を取得します。

String definition = DictionaryUtility.getMeanings(wordToLookup);

意味を取得した後は、org.eclipse.swt.widgets.MessageBoxで意味を表示します(図17参照)。

図17. 辞書の意味を表示するMessageBoxウィジェット

MessageBox内に意味をレンダリングするには、リスト7に示すコードを使用します。


リスト7. MessageBox内での意味のレンダリング

	MessageBox box = new MessageBox(new Shell());
box.setText(wordToLookup);
box.setMessage(definition);
box.open();


上に戻る

サンプル・アプリケーションの実行

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(US)
ダウンロード方法について (US)

上に戻る

リソース

学習

製品とテクノロジーの入手

ディスカッション

上に戻る

筆者について(原文のまま)

Kulvir Singh Bhogal works as an IBM consultant, devising and implementing Java-centric solutions at customer sites across the nation.


Mark Talbot works for IBM as a developer for Industry Solutions. You can reach Mark at talbotm@us.ibm.com.



上に戻る



上に戻る