目次


IBM Lotus Notes 8 のサイドバーおよびツールバーに Lotus Notes データを統合する

Comments

[編集者のメモ: この記事で取り上げたLotus Notes 8の機能および環境は、ベータ・ソフトウェアに基づいています。記事の内容およびスクリーン・ショットは、製品版と異なる場合があります。]

私たちは、以前公開した記事「IBM Lotus Notes 8のサイドバーとツールバーの拡張」で、クライアントのサイドバーとツールバーにコンポーネントを追加することにより、IBM Lotus Notes 8でのユーザー・エクスペリエンスを拡張する方法について解説しました。具体的には、テキストの保存と管理の問題に対応するSideNoteアプリケーションおよびQuickNoteアプリケーションを追加しました。作成したプラグインは、これらのロケーションに独自のコンポーネントを配置する方法を示す良い例となります。

SideNoteおよびQuickNoteを使用すると、重要な情報がすでにいくつかのサイロに保存されている状況で、さらに2つのサイロが増えたように感じるかもしれません。また、Lotus Notesジャーナルを使用するとき、すべての情報がジャーナル内に保存されていることの価値を見いだせないかもしれません。

独自のコンポーネントを構築する場合、同様の障害に遭遇する可能性があります。すでに保持しているデータおよびシステムと何らかの方法で対話しないと、実行できることは限られてしまいます。幸い、Lotus Notesで利用可能なプログラミング・モデルにより、使用するシステムと対話する幅広い方法が提供されます。たとえば、Webサービスを提供する任意のシステムは、ユーザーが必要とする、ほとんどすべての形で容易に統合できます。JavaインターフェースまたはJavaライブラリーを提供するアプリケーションは、さらに扱いやすいでしょう。

IBM Lotus Notesには、Lotus Notesデータベースおよび文書と対話するNotes.jarライブラリーがあります。この記事では、このライブラリーの使用方法と、新規コンポーネントの機能を拡張する他の手法について説明します。

セットアップ

まず、Lotus Notes 8 ソフトウェアをインストールします。

次に、Eclipseをセットアップします。Eclipseは無料でダウンロードできます。Eclipseは、Lotus Notes環境とともに機能するようセットアップする必要があります。Lotus Notesのプログラム・ディレクトリーは、「C:\Program Files\IBM\Lotus\Notes」に、データ・ディレクトリーは「C:\Program Files\IBM\Lotus\Notes\Data」に導入されている仮定し、手順を説明します。もし、導入先が異なる場合は、導入しているディレクトリーに読み替えてください。
Eclipse(US)

Eclipse IDEを開始し、以下の手順に従いターゲット・プラットフォームを設定します。

  1. 「Window」->「Preferences」を選択します。
  2. 「Plug-in Development」を展開します。
  3. 「Target Platform」を選択します。
  4. 「Location」編集コントロールに「C:\Program Files\IBM\Lotus\notes\framework\eclipse」と入力します。
  5. 「Reload」ボタンをクリックし、「OK」をクリックします。

次に、追加のインストール済みJREを作成します。

  1. 「Window」->「Preferences」を選択します。
  2. 「Java」を展開します。
  3. 「Installed JRE」を選択します。
  4. 「Add」をクリックします。
  5. JRE名として、Notes JREの名前を入力します。
  6. JREホーム・ディレクトリーとして、「C:\Program Files\IBM\Lotus\notes\framework\rcp\eclipse\plugins\com.ibm.rcp.j2se.win32.<version number> 」を入力します。 Lotus Notes Beta 3の場合、このversion numberは com.ibm.rcp.j2se.win32.x86_1.5.0.SR4-200705170110 と、なります。 (NOTE: This populates JAR files to the lower part of the pop-up box.) (メモ: これにより、ポップアップ・ボックスの下部にJARファイルが表示されます。)

次に、新しいランタイム構成を、以下の手順に従って作成します。

  1. 「Run」->「Run」を選択し、「Eclipse Application」を選択します。
  2. 右クリックして「New」を選択します。
  3. 名前を入力します(例: Notes)。
  4. 「Program to Run」で「Run a product」を選択し、「com.ibm.notes.branding.notes」を選択します。
  5. 「Runtime JRE」で「Notes JRE」を選択します。
  6. 「Arguments」タブで、「Program arguments」テキスト・ボックスに以下を入力します。
    -personality com.ibm.rcp.platform.personality
    -product com.ibm.notes.branding.notes
    -debug
    -console

以下の引数を「VM arguments」テキスト・ボックスに入力します。
-Drcp.home=${notes.install}\framework
-Drcp.data=${notes.data}\workspace
-Drcp.install.config=user
-Dosgi.install.area=${notes.install}\framework\eclipse
-Dcom.ibm.pvc.osgiagent.core.logfileloc=${notes.install}\framework\rcp
-Dcom.ibm.pvc.webcontainer.port=0
-Declipse.pluginCustomization=${notes.install}\framework\rcp\plugin_customization.ini
-Declipse.registry.nulltoken=true
-Djava.protocol.handler.pkgs=com.ibm.net.ssl.www.protocol
-Djava.util.logging.config.class=com.ibm.rcp.core.internal.logger.boot.LoggerConfig
-Dosgi.hook.configurators.exclude=org.eclipse.core.runtime.internal.adaptor.EclipseLogHook
-Dosgi.framework.extensions=com.ibm.rcp.core.logger.frameworkhook
-Xbootclasspath/a:${notes.install}\framework\rcp\eclipse\plugins\${rcp.base}\rcpbootcp.jar;

次に、ランタイム構成を以下の手順に従って完了させます。

  1. 「Variables」をクリックします。
  2. 「Edit Variables」をクリックします。
  3. 「New」をクリックします。
  4. 名前として「notes.install」を入力します。
  5. Lotus Notesをインストールしたパスを値として入力し「OK」をクリックします。パスにはスペースを含めないでください。たとえば、「C:\Program Files\Lotus\Notes」にインストールした場合、rcp.homeの値は「C:\PROGRA~1\Lotus\Notes」と入力します。
  6. 手順1から3を繰り返します。
  7. 名前として「notes.data」を入力します。
  8. Lotus Notes データ・ディレクトリーを値として入力し、「OK」をクリックします。デフォルトのディレクトリーに導入した場合、「C:\PROGRA~1\IBM\Lotus\Notes\Data.」です。
  9. 手順1から3を繰り返します。
  10. 名前として「rcp.base」を入力します。
  11. インストールされているcom.ibm.rcp.baseプラグインのバージョンを値として入力し、「OK」をクリックします。このバージョンを知るには、<notes install location>\framework\rcp\eclipse\pluginsに移動します。「com.ibm.rcp.base_6.1.1.<date>」というようなフォルダーがあります。「6.1.0.0-<date>」という値をrcp.base_version変数に入力します。 Lotus Notes Beta 3の場合、「6.1.1.200705170110」の値になります。
  12. 「OK」をクリックし、「Select Variable」ダイアログ・ボックスで「Cancel」をクリックします(「OK」をクリックして変数を選択すると、挿入ポイントの位置に変数が追加されます)。

IDEからLotus Notesセキュリティーを有効にするには、2つの行をアンコメントする必要があります。<notes install location>\framework\shared\eclipse\plugins\com.ibm.notes.branding_3.0.0.<version number>\notes_plugin_customization.iniで、行の先頭の#文字を削除することにより、以下の2つの行をアンコメントします。

com.ibm.rcp.security.auth/loginEnabled=true
com.ibm.rcp.security.auth/loginConfigName=NOTES

これで、「Run/Debug」を選択し、Lotus Notesを起動します。

最後に、この記事で使用するコードをダウンロードし、新しいフォルダーにunzipします。これをEclipseにインポートするには、既存のプロジェクトをインポートする必要があります。

  1. 「File」->「Import」を選択します。
  2. 「General」->「Existing Projects into Workplace」を選択し、「Next」をクリックします。
  3. コードをunzipしたフォルダーを選択し、「OK」をクリックします。
  4. 「Finish」をクリックし、インポート・プロセスを完了します。

SideNote

SideNoteアプリケーションはLotus Notesのサイドバー内に位置し、テキストを迅速に入力し保存する場所を提供します。以前公開した記事「IBM Lotus Notes 8のサイドバーとツールバーの拡張」では、Eclipse拡張ポイントを通じてメニュー・アクションをサイドバー・コンポーネントに追加する方法が解説されています。具体的には、「Save as file」アクションと「Load from file」アクションをSideNoteに追加しました(図1参照)。

図1. SideNoteとメニュー・オプション
図1. SideNoteとメニュー・オプション

電子メール・アクション

SideNoteにテキストを入力した後、その内容を電子メールで送信したいケースもあります。このタスクを実現するメニュー項目(図2参照)を追加します。

図2. 「Email It!」アクション
図2. 「Email It!」アクション

このアクションは、Lotus Notes APIではなく、オペレーティング・システムのAPIを通じて実現します。つまり、この電子メール・アクションはmailto URLプロトコルを使用して、新規メッセージを作成します。

これらのリンクの仕様によると、他のデータも渡すことができます。特に、このアクションでは、メッセージの本文を指定する機能を使用します。また、受信者を省略することもできるので、リンクは「mailto:?body=It+would+be+nice+to+email+from+here」のようになります。
リンクの仕様(US)

Lotus Notesはこのプロトコルを実装しているため、このようなリンクによって、指定された本文を持つ新規の電子メールが正しく作成されます。開発者に必要なのは、リンクを起動することだけです。

前の記事と同様に、org.eclipse.ui.viewActions拡張ポイントをインプリメントし、このメニューに新規アクションを追加します。図3に示すように、viewActions拡張ポイント用に以下のフィールドおよび値を含めます。

  • class: com.ibm.lotuslabs.sidenote.email.EmailSideNote
  • enablesFor: *
  • id: com.ibm.lotuslabs.sidenote.email.EmailSideNote
  • label: Email it!
  • menubarPath: additions
  • tooltip: Email this SideNote
図3. Plugin.xmlおよび拡張ポイント
図3. Plugin.xmlおよび拡張ポイント
図3. Plugin.xmlおよび拡張ポイント

このように、com.ibm.lotuslabs.sidenote.emailプラグインはEmailSideNoteクラスを指します。このクラスは、規約に基づき、IViewActionDelegateインターフェースをインプリメントする必要があります。このクラスのrunメソッドはテキストを取得し、リンクを起動してメッセージを作成します。

「Save to Journal」アクション

もう1つのプラグインcom.ibm.lotuslabs.sidenote.journalは、SideNoteの内容を保存するアクションをユーザーのジャーナルに追加します。この新しいアクションを図4に示します。

図4. 「Save to Journal」アクション
図4. 「Save to Journal」アクション

もう1度同じパターンが使用されることがわかります。plugin.xmlは拡張ポイントに寄与し、JournalSideNoteクラスを指します。runメソッドをリスト1に示します。

リスト1. JournalSideNote runメソッド
      private SideNoteViewPart part;
	
      // save it
      public void run(IAction arg0) {
            if(part!=null) {
                  String text = part.getText();
                  if(text==null)
                        text="";
                  JournalEntry.createJournalEntry(null, text);
            }
      }

リストからわかるように、JournalEntryと呼ばれるクラスがすべての作業を実行します。これは、com.ibm.lotuslabs.notes.pimプラグイン内のヘルパー・クラスで、Lotus Notesとのすべての対話をNotes.jarライブラリーを通じて処理します。

Lotus Notesデータとの対話

この新しいJava環境を導入することにより、Notes.jarライブラリーは、クライアント・データの統合で重要な役割を果たします。このライブラリーはいくつかのリリースで利用可能であり、現在は、IBM Lotus Notes 8のcom.ibm.notes.java.apiプラグインにバンドルされています。

プラグインは、このライブラリーを使用する際の多数の複雑さ、つまりセキュリティーやシステム変数の設定などを処理します。開発者に必要なのは、プラグインのMANIFEST.MFファイルの依存関係に、com.ibm.notes.java.apiを追加することだけです。

また、com.ibm.notes.java.apiはNotesJobクラスを提供するため、Notes.jarライブラリーの活用がより簡単になります。NotesJobクラスはLotus Notesスレッド・アクセスを同期し、Eclipseで表示アクセスを同期するUIJobクラスと同様の方法で使用されます。NotesJobクラスをリスト2に示します。

リスト2. NotesJobの例
NotesJob job = new NotesJob("Job description") {
protected IStatus runInNotesThread(IProgressMonitor mon) {
		Session session = NotesPlatform.getInstance().getSession();
		// your notes.jar code here
		return Status.OK_STATUS;
	}
};
job.schedule();

コードがNotesJob.runinNotesThreadメソッドで実行されると、Lotus Notesのドキュメンテーションおよびガイドラインに従って、Notes.jarのクラスとオブジェクトを使用できます。一般に、Notes.jarクラスは、LotusScriptによって提供される同等のクラスによく似ています。たとえば、データベース、ビュー、文書を表すクラスがあります。これらのコンポーネント内には、コンポーネントを構成する各要素を表すクラスがあります。たとえば、文書内では、フィールドの値やリッチ・テキスト内の各段落にアクセスできます。詳細については、「IBM Lotus Domino Designerヘルプ」(US) を参照してください。

追加手順として、Notes.iniファイルで「BSAFE_ALLOW_REPARENT=1」変数を設定すると役に立つことがあります。この設定により、パスワードの入力を何度も求められずにバックエンド・クラスにアクセスできます。この設定を有効にすると、デフォルトのログイン・ダイアログ・ボックスがランダムに表示されなくなります。通常、Lotus Notes IDファイルへのアクセスには遅延があり、1つの機能でアクセスの必要性が生じるまでログイン・プロンプトは表示されません。この設定を有効にすると、Lotus Notes 8 Eclipse/JavaプロセスおよびLotus NotesワークステーションのプロセスによるIDファイルへのアクセスが、より良好に調整されます。これにより、セキュリティーを損なうことなく、デフォルトのパスワード・プロンプトが不必要に表示されなくなります。

アプリケーション

com.ibm.lotuslabs.notes.pimプラグインは、com.ibm.notes.java.apiに依存してNotes.jarの機能を利用し、メール、カレンダー、連絡先、およびジャーナル・アプリケーションとそれらに含まれる文書を使用します。

Applicationsクラスは、これらのアプリケーション内でNotes.jarコードを起動および実行する機能を提供します。各アプリケーションは、クラス内で静的に定義されたIDを割り当てられます(リスト3参照)。

リスト3. アプリケーションのタイプ
public final static int APP_MAIL = 1;
	public final static int APP_CALENDAR = 2;
	public final static int APP_TODO = 3;
	public final static int APP_CONTACTS = 4;
	public final static int APP_JOURNAL = 5;

これらのアプリケーションの1つを起動するときは、対応するIDをlaunchメソッドに渡します。

Applications.launch(Applications.APP_JOURNAL);

また、このクラスは、executeメソッドを使用してこれらの任意のデータベース内でコードを実行する機能も提供します。開発者は、呼び出したいコードを定義する新しいIDatabaseRunnableを作成します。このインターフェースには1つのメソッドがあります。

public void run(Session session, Database database);

指定されたセッションとデータベース、およびNotes.jar APIを使用することにより、このコードは完全にカプセル化された方法で実行されます。呼び出し側はコードについて注意するだけでよく、初期化、依存関係、または前述のNotesJobsについて考慮する必要はありません。例をリスト4に示します。

リスト4. データベース内でのコードの実行
IDatabaseRunnable run = new IDatabaseRunnable() {
public void run(Session session, Database db) throws NotesException {
	Document doc = db.createDocument();
// set the fields to make a task
	doc.save();
	doc.recycle();
}
};
// schedule the creation
Applications.execute(Applications.APP_TODO, "Create task", run);

ジャーナルとの対話

ジャーナルは既知のURLを持たないため、このスキームに関して他のアプリケーションよりも少し複雑です。内部のDatabaseUtilクラスを見るとわかるように、ユーザーのメールおよび連絡先は、どちらもURLが定義されています。これらのURLはデータベースを起動する、つまり開くために使用されます。しかし、ジャーナルはこの点が異なっており、まず、ユーザーがどのデータベースをジャーナルとして使用しているかを決めなければなりません。

ご存じのように、ジャーナルはLotus Notesのホーム・ページから起動できます(図5参照)。

図5. Lotus Notesのホーム・ページ
図5. Lotus Notesのホーム・ページ
図5. Lotus Notesのホーム・ページ

「個人ジャーナル」ボタンを初めてクリックしたときに、図6に示すダイアログ・ボックスが表示され、ジャーナルを持っているかどうかを確認されます。持っていない場合は、新しいジャーナルを作成できます。既存のジャーナルがある場合は、「ジャーナル・データベースの選択」ボタンをクリックし、ジャーナルの場所をLotus Notesに指示できます。

図6. 個人ジャーナルの選択
図6. 個人ジャーナルの選択
図6. 個人ジャーナルの選択

com.ibm.lotuslabs.pimプラグインは、このメカニズムに基づいてユーザーのジャーナルを特定します。つまり、プラグインは、このデータがbookmark.nsfデータベース内のHPSettingsプロファイル文書に保管されていることを認識しています。プラグインはこの文書を調べ、JServerフィールドに格納されているジャーナル・サーバーと、JDatabaseフィールドに格納されているジャーナル・データベースを認識します。この検索は、ジャーナルに最初にアクセスしたときに、JournalUtilクラスのgetJournalDatabaseメソッドによって行われます。

このセットアップにより、このメソッドがジャーナル・データベースの場所を特定できないことがあります。これは、ジャーナルでコードの実行を試みる際の副次作用となる可能性があります。この記事のケースでは、JournalUtilクラスがファイル・ブラウザー・ウィンドウを開くため、ユーザーはローカル・ジャーナルを選択できます(図7参照)。

図7. 「Select journal database」ダイアログ・ボックス
図7. 「Select journal database」ダイアログ・ボックス
図7. 「Select journal database」ダイアログ・ボックス

データベースの検索は、スケジュール設定されたNotesJobスレッドで実行する必要があります。これはバックグラウンド・スレッドであるため、開発者はファイル・ブラウザーを起動できません。ファイルを参照するには、executeJournalUIメソッドを呼び出して、新規UIJobを起動します。ユーザーが1つのジャーナル・ファイルを選択すると、コードは新規NotesJobにジャンプして戻り、ブックマークのプロファイル文書を更新し、呼び出し側が実行したいコードを実行します。呼び出し側は、Databaseオブジェクトを要求する代わりに、IDatabaseRunnableオブジェクトを渡すことにより、このマルチスレッドの動作を有効にします。

データベース・パスを認識した後は、アプリケーションを開き、渡されたコードを簡単に実行できます。launchJournalメソッドでジャーナルを起動しなければならない場合は、IDatabaseRunnableオブジェクトを使用します。これを行うには、指定されたデータベースに対してデータベース自体のURLを要求し、そのURLを起動します(リスト5参照)。

リスト5. ジャーナルの起動
public static void launchJournal(final String description, final String append) {
	executeJournalThread(description, new IDatabaseRunnable() {
		public void run(Session session, Database database) 
		throws NotesException {
			String server = database.getServer();
			String repId = database.getReplicaID();
			if(repId!=null) {
				if(server==null)
					server = "";
				String url = "notes://"+server+"/"+repId;
				if(append!=null) {
					url += append;
				}
				DatabaseUtil.launchUrl(url, description);
			}
		}
			
	});
}

SideNoteアクションによって呼び出されたJournalEntryクラスは、これらのメカニズムを使用して新規文書を保存します。createJournalEntryメソッドは、必要なIDatabaseRunnableを用いてexecuteメソッドを呼び出します。コードの実行内容として唯一必要となるのは、完全なジャーナル文書にするために、必要なすべてのフィールドを持つ1つの新規文書を作成することです。このコードは、createJournalDocumentクラスに示されています。

Lotus Notesの対話戦略

いくつかのパターンにお気付きになった読者もいることでしょう。Notes.jarライブラリーは、データベース内部のデータを扱うことにたいへん優れています。これまでわかったように、com.ibm.lotuslabs.notes.pimプラグインはこのライブラリーを使用して文書からデータを読み取り、新規文書を作成します。

しかし、このモデルに存在する制限として、メモリー内での処理が挙げられます。新規メール・メッセージを作成するとき、ユーザーはNotes.jarを呼び出さず、URLを起動します。これで目的が達成されます。つまり、保存せずに、新規文書が作成されます。同様に、JournalEntryクラスによっても、同じURL起動メカニズムを用いて新規エントリーを起動し、ジャーナル自体を表示できます。制限は、このURLが新規ジャーナル文書のフィールドを生成できないことです。

この問題を回避するには、いくつかの方法があります。最初の方法としては、Notes.jarを使用して文書を作成し、それを保存します(文書の作成が、アプリケーション内で意味を持つ場合です)。次に、そのURLを要求し、それを起動します。このアプローチの欠点として、自動的に作成するデータが何らかの形で不完全な場合、データベース内に未完了の文書が残ってしまうリスクがあります。

2番目はアプリケーションに強く依存する方法で、データベースとフォームに独自のハンドシェークを構築する必要があります。たとえば、あらかじめ名前を決めた一時ファイルを通じて、これを実現できます。Javaコードがこのファイルに書き込み、新規フォームを起動します。フォームはその一時ファイルを検索することを認識しているため、それを読み取り、必要に応じてそれを生成し、一時ファイルを削除します。このハンドシェークとして、いくつかのバージョンを考案することができます。

他の方法としては、SWT (Standard Widget Toolkit)を使用して独自のユーザー・インターフェースを作成し、Notes.jarを使用して値をロードしたり、データベースに保存したりする方法です。com.ibm.lotuslabs.notes.pim.uiパッケージに含まれているJournalNoteの例は、図8に示すものに似ています。

図8. SWT JournalNote
図8. SWT JournalNote

これを作成するコードをリスト6に示します。

リスト6. JournalNoteの作成
public static void showJournalNote(final Composite parent, 
final String url) {
IDatabaseRunnable run = new IDatabaseRunnable() {
      public void run(Session session, Database database) throws NotesException {
	Document doc = (Document) session.resolve(url);
	final Map map = JournalNote.createValueMap(doc);
	parent.getShell().getDisplay().asyncExec(new Runnable() {
		public void run() {
			JournalNote note = new JournalNote(parent,map);
});	
	};

	// do it
	Applications.execute(Applications.APP_JOURNAL, "Opening journal document", run);
}
}

ジャーナル・ツールバー

この統合コードではすべてのメソッドを使用していないことにお気付きになるかもしれません。そのほとんどは、ジャーナルをよく使うユーザー用のツールバーをサポートするために作成されました(図9参照)。com.ibm.lotuslabs.journal.uiプラグインによって提供されたこのツールバーを使用すると、ユーザーはジャーナルを起動して新しい空のエントリーを編集モードで作成し、新規エントリーを書き留めることができます。

図9. ジャーナル・ツールバー
図9. ジャーナル・ツールバー
図9. ジャーナル・ツールバー

ユーザーのジャーナルを起動する際の背後にあるコードは、すでに説明したApplications.launchメソッドです。ジャーナルのIDを渡すことにより、URLが起動されて、データベースが表示されます。同様の方法で、「New」ボタンはJournalEntry.launchNewEntryメソッドを呼び出し、適切なフォームを表示します。

QuickNoteの概念は、以前公開した記事「IBM Lotus Notes 8のサイドバーとツールバーの拡張」に書かれています。ジャーナル・ツールバーは同じコードを使用しますが、内容をテキスト・ファイルに保存する代わりに、JournalEntryクラスを使用して新規ジャーナル文書を作成します。この機能の利点は、ユーザーが情報を非常に素早く記録できることです。QuickNoteを上回る利点としては、データを追加しても、情報のサイロが新たに作成されないことです。

まとめ

Lotus Notesのデータを統合すると、作業がより興味深いものになります。今までは、これらのテクニックを簡単なアクションに適用しましたが、これらのテクニックを用いると、希望する任意のコンポーネントを作成できます。たとえば、独立して機能する完全なIViewPartインスタンスも作成できます。また、サイドバーへの配置や、コンポジット・アプリケーションの一部としての作成も可能です。

Notes.jarライブラリーおよびIBM Lotus Notes 8の他のテクニックを使用したこれらの簡単な例は、独自コンポーネントの開発を始めるために十分に役立つでしょう。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=338001
ArticleTitle=IBM Lotus Notes 8 のサイドバーおよびツールバーに Lotus Notes データを統合する
publish-date=04242007