はじめに、Eclipse 上で動作する Domino Designer の動きを理解するために、基本的なEclipse のプログラミング・モデルの概念について2点ほど簡単に説明します。
ひとつめは Eclipse 上での開発対象の扱われ方についてです。Eclipse では開発対象の単位をプロジェクトと呼び、プロジェクトに含まれるソースコードやバイナリファイルなどの個々の構成要素をリソースと呼びます。Domino Designer もこのフレームワーク内で動作するよう、Domino アプリケーションを仮想的にこれらにマッピングしています。具体的には、個々の Domino アプリケーション (NSF ファイル) をプロジェクトに、Domino アプリケーション内のビューやフォームなどの各設計要素をリソースに、それぞれマッピングしています。プログラミングの観点からは、プロジェクトは org.eclipse.core.resources.IProject インターフェースを実装するオブジェクトとして、リソースは org.eclipse.core.resources.IResource インターフェースを実装するオブジェクトとして扱われます。
ふたつめはセレクション・サービスについてです。セレクション・サービスとは、あらかじめセレクション・リスナー・オブジェクトを登録しておくと、Eclipse のグラフィカル・ユーザー・インターフェース (GUI) 上でユーザーが何かを選択した際に、どこで何が選択されたのかを通知してくれる機能です。この機能を利用することにより、アプリケーション・ビュー上で何かの設計要素が選択された際に、その選択内容に応じて連携する機能を起動するといったイベント・ドリブンの動作を実装することが可能になります。Eclipse の GUI は、さまざまな機能を提供するビューやエディターの組み合わせとして構成され、その組み合わせはパースペクティブと呼ばれています。Eclipse の提供するセレクション・サービスの機能を用いることで、ビューやエディター間の独立性を保ちながら効果的な機能連携を行うことができます。プログラミングの観点からは、選択対象は org.eclipse.jface.viewers.ISelection インターフェースを実装するオブジェクトとして扱われます。
図 1. Eclipse 上で動作する Domino Designer
その他 Eclipse のプログラミングに関する詳しい解説は、参考文献を参照してください。
Domino Designer Extensibility API が提供する機能
Domino Designer Extensibility API の機能はすべて、Java のクラスおよびインターフェースとして提供されており、2つのパッケージにまとめられています。
com.ibm.designer.domino.ide.resources.extensions パッケージ
Domino アプリケーションを Eclipse のリソースとして扱うためのインターフェースが含まれます。含まれるクラスとインターフェースは以下の通りです。
- DesignerProject インターフェース
Domino アプリケーションをアクセスするためのインターフェースです。Domino アプリケーションは DesignerProject インターフェースあるいは IProject インターフェースを通してアクセスされ、これらは相互に変換可能です。このインターフェースを使うことにより、データベースの名前やパス、レプリカ ID、テンプレートなどの属性を取得したり変更したりすることができます。
- DesignerDesignElement インターフェース
Domino アプリケーションに含まれる設計要素をアクセスするためのインターフェースです。設計要素は DesignerDesignElement インターフェースあるいは IResource インターフェースを通してアクセスされ、これらは相互に変換可能です。このインターフェースを使うことにより、設計要素のタイプや名前、コメント、Note IDなどの属性を取得したり変更したりすることができます。
- DesignerException クラス
Domino アプリケーションや設計要素を操作中に発生したエラーを報告するための例外クラスです。
com.ibm.designer.domino.ui.commons.extensions パッケージ
Eclipse のセレクション・サービスを通して、Domino アプリケーション・プロジェクトにアクセスするために必要となるクラスやインターフェースが含まれます。含まれるクラスとインターフェースは以下の通りです。
- DesignerDesignElementSelection インターフェース
セレクション・サービスを通して、選択対象は ISelection インターフェースを実装するオブジェクトとして通知されます。このオブジェクトを DesignerDesignElementSelection インターフェースを実装するオブジェクトに変換することにより、どのような設計要素がいくつ選択されたのかを取得できるようになります。また実際に選択された DesignerProject や DesignerDesignElement のリストも取得できます。
- DesignerResource クラス
Domino アプリケーションを操作するためのユーティリティー・クラスです。ISelection、IProject、IResource をそれぞれ DesignerDesignElementSelection、DesignerProject、DesignerDesignElement に変換する、指定した Domino アプリケーションをアプリケーション・ビューに登録するといった機能を提供します。また、設計要素のタイプを表す文字列定数も定義しています。これらの機能はすべて static メソッドとして提供されており、クラスをインスタンス化する必要はありません。
Domino Designer Extensibility API を利用した拡張機能を開発するには、IBM Lotus Notes用 にEclipse プラグインを開発する場合と同じで、以下の開発環境が利用できます。
- JaveSE JDK 5.0 以上
- 以下のいずれかの開発環境
- Eclipse 3.4.2 for RCP/Plug-in
- Eclipse 3.4.2 for Java EE
- Rational Application Developer 7.5.2
- Lotus Expeditor 6.2.1 Toolkit
Eclipse IDE を実行するための環境として JavaSE JDK 5.0 以上を準備し、その上で Eclipse 3.4.2 を Eclipse のサイトからダウンロードして展開します。展開した Eclipse を起動して ソフトウェア更新を実行し、Lotus Expeditor 6.2.1 Toolkit を追加インストールします。
開発環境に関する詳しい説明およびダウンロード先に関しては、参考文献のリストを参照してください。
前節の開発環境を用いて Domino Designer 向け拡張機能プラグインを開発する際には、次のような点に注意が必要です。
最初に、Lotus Expeditor Toolkit を追加インストールした後に Eclipse を再起動しワークスペースを開く際、Lotus Expeditor Toolkit の構成を行うかどうかを求められます(図 2)。ここでは、「テスト環境」として「Lotus Notes 8」を選択し、構成を行います。
図 2. ワークスペースの構成
次に、開発したプラグインを実行するターゲット環境の準備を行います。メニューより「実行」 > 「実行構成」を選択し、「実行構成」ダイアログを表示します(図 3)。
図 3. 実行構成ダイアログ
ダイアログ左のツリー・ビューより「Client Services」をダブル・クリックして新規構成を作成し、「名前」と「ロケーション」を任意に設定します。Lotus Notes 用プラグインを開発する際には以上の設定で終了ですが、Domino Designer 向け機能拡張プラグインを開発する際には、Domino Designer を直接ターゲットとして起動するために、更に「パーソナリティー」と「製品の実行」を Lotus Notes 用のものから Domino Designer 用のものへと切り替えます。
| パーソナリティー: | com.ibm.designer.domino.personality |
| 製品の実行: | com.ibm.designer.domino.product.dde |
最後に「適用」ボタンを押し、変更を保存して終了です。
ここからは、Domino Designer Extensibility API を実際に利用したサンプル・プログラムを用いて、API の利用方法を説明します。
利用するサンプル・プログラムは、Domino Designer のプロパティ・ビュー・エリアに「設計要素一覧」ビューを追加してスタック表示するプラグインです。アプリケーション・ビュー内で Domino アプリケーションの設定要素を選択すると、選択された要素が表示されます(図 4)。
図 4. 設計要素一覧ビュー
設計要素は同時に複数を選択できます。異なるタイプの設計要素が含まれていてもかまいません。ビュー内に表示される情報は、各設計要素の Note ID 、タイプ、名前、別名、コメントに加えて、選択されている Domino アプリケーションの名前です。各設計要素の属性は表示されるだけではなく、インラインで編集することも可能です。
「設計要素一覧」ビューを表示するプラグインは全部で4つの Java クラスから成り立っています。その中でメインとなるのが DesignElementView クラスです。このクラスは以下のように宣言された Eclipse 標準の ViewPart クラスです(リスト 1)。
リスト 1. DesignElementView クラスの宣言
public class DesignElementView extends ViewPart {
|
ViewPart クラスは、ビュー内に表示される内容を定義するための createPartControl() メソッドを実装します(リスト 2)。
リスト 2. createPartControl() メソッドの定義
/*
* 画面レイアウトを生成します
*/
public void createPartControl(Composite parent) {
parent.setLayout(new GridLayout(1, false));
// アプリケーション名表示エリアの作成
dbName = new Label(parent, SWT.BORDER);
dbName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
dbName.setText("アプリケーション名:");
// 設計要素表示用テーブルの作成
tableViewer = new TableViewer(parent, SWT.FULL_SELECTION);
tableViewer.setLabelProvider(new ElementLabelProvider());
tableViewer.setContentProvider(new ArrayContentProvider());
Table table = tableViewer.getTable();
table.setLayoutData(new GridData(GridData.FILL_BOTH));
table.setLinesVisible(true);
table.setHeaderVisible(true);
// テーブルコラムの作成
TableColumn column = new TableColumn(table, SWT.NONE);
column.setText("Note ID");
column.setWidth(60);
column = new TableColumn(table, SWT.NONE);
column.setText("タイプ");
column.setWidth(120);
column = new TableColumn(table, SWT.NONE);
column.setText("名前");
column.setWidth(150);
column = new TableColumn(table, SWT.NONE);
column.setText("別名");
column.setWidth(150);
column = new TableColumn(table, SWT.NONE);
column.setText("コメント");
column.setWidth(200);
// 編集可能にするための準備
String[] properties = new String[]{
"NoteId",
"Type",
"Name",
"Alias",
"Comment"
};
tableViewer.setColumnProperties(properties);
CellEditor[] editors = new CellEditor[]{
null,
new TextCellEditor(table),
new TextCellEditor(table),
new TextCellEditor(table),
new TextCellEditor(table)
};
tableViewer.setCellEditors(editors);
tableViewer.setCellModifier(new CellModifier());
// Selection Listener の登録
getSite().getWorkbenchWindow().getSelectionService()
.addSelectionListener(selectionListener);
}
|
選択されたDomino アプリケーション名を表示するために Label クラスを、選択された設計要素を一覧表示するために JFace の TableViewer クラスを利用しています。設計要素の属性を表示するために、TableColumn クラスのオブジェクトを属性の数だけ追加しています。最後に、selectionListener 変数にあらかじめ用意された ISelectionListener インターフェースを実装するオブジェクトを、セレクション・リスナーとして登録しています。
セレクション・リスナーとして登録されるクラスの定義は以下の通りです(リスト 3)。
リスト 3. セレクション・リスナー・クラスの定義
/*
* Selection Listener の定義
*/
private ISelectionListener selectionListener = new ISelectionListener() {
public void selectionChanged(IWorkbenchPart source, ISelection selection) {
// 自分以外の選択を処理
if (source != DesignElementView.this) {
updateTable(source, selection);
}
}
};
|
Eclipse GUI 上でオブジェクトが選択されると、登録したセレクション・リスナー・クラスの selectionChanged() メソッドが、選択されたオブジェクトをパラメータとして呼び出されます。受け取ったオブジェクトに基づいて実際に画面表示の更新を行っているのが updateTable() メソッドであり、その定義は以下のようになります(リスト 4)。
リスト 4. 画面更新用メソッド updateTable()
/*
* 選択結果をテーブルに表示します
*/
public void updateTable(IWorkbenchPart sourcePart, ISelection selection) {
dbName.setText("アプリケーション名: ");
if (selection instanceof IStructuredSelection) {
// 選択結果から Domino Designer の設計要素を処理
DesignerDesignElementSelection designerSelection
= DesignerResource.getDesignerSelection(selection);
dbName.setText("アプリケーション名: "
+ designerSelection.getSelectedDesignerProject().getDatabaseTitle());
tableViewer.setInput(designerSelection.getSelectedDesignElements());
}
}
|
アプリケーション・ビュー上で Domino アプリケーションの設計要素が選択された際には、選択オブジェクトは IStructuredSelection インターフェースを実装するオブジェクトとして渡されてきます。それを DesignerResource クラスの getDesignerSelection() メソッドを利用してDesignerDesignElementSelection インターフェースに変換します。これにより選択結果を Domino Designer のオブジェクトとしてアクセスできるようになります。Domino アプリケーション名は getSelectedDesignerProject() メソッドを、設計要素の一覧は getSelectedDesignElements() メソッドをそれぞれ利用して取得します。取得した結果を、先ほどビューの構成要素として配置した Label 及び TableViewer オブジェクトにセットして画面の表示内容を更新します。
このようにして用意したビューを Domino Designer に組み込むには、Eclipse の拡張ポイントを利用します。拡張ポイント利用の定義は plugin.xml で行います。以下がその内容です(リスト 5)。
リスト 5. 拡張ポイント利用の定義
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension point="org.eclipse.ui.views">
<view name="設計要素一覧"
class="com.ibm.wplc.samples.designer.sample.DesignElementView"
id="com.ibm.wplc.samples.designer.sample.DesignElementView">
</view>
</extension>
<extension point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension targetID="com.ibm.designer.domino.perspective">
<view id="com.ibm.wplc.samples.designer.sample.DesignElementView"
relationship="stack"
relative="org.eclipse.ui.views.PropertySheet" />
</perspectiveExtension>
</extension>
</plugin>
|
ひとつめの定義が org.eclipse.ui.views 拡張ポイントを利用したビューの登録です。上述の DesignElementView クラスに com.ibm.wplc.samples.designer.sample.DesignElementView という id を割り当て、「設計要素一覧」という名前で登録しています。
ふたつめの定義が org.eclipse.ui.perspectiveExtensions 拡張ポイントを利用したビューの表示位置の登録です。Domino Designer は com.ibm.designer.domino.perspective という id のパースペクティブで動作しています。そのパースペクティブに対して、先ほど登録した DesignerElementView クラスが実装するビューを、パースペクティブ内の既存の org.eclipse.ui.views.PropertySheet の id を持つビューへのスタック表示として追加しています。org.eclipse.ui.views.PropertySheet とは、Domino Designer の画面下部に表示されているプロパティ・ビューの id です。
以上の2つを定義することにより、標準の Domino Designer のパースペクティブに対して、独自に作成したビューを後から簡単に追加することができます。
このような高い拡張性が Eclipse の大きな特徴です。Eclipse ではビューだけではなく、メニューやツールバーなどを含むさまざまな機能に対して拡張ポイントを提供しています。Domino Designer 上でも、これらすべての拡張ポイントを利用した機能拡張を行うことが可能です。
注: Eclipse はユーザーが変更を加えた現在のパースペクティブの構成内容を保存する機能があります。そのため、本稿で紹介しているサンプル・プログラムをインストールするだけでは、追加した「設計要素一覧」ビューが表示されない場合があります。その場合には、Domino Designer のメニューより、「ウィンドウ」 > 「パースペクティブのリセット」を実行してください。
次に、設計要素一覧の内容をTableViewer オブジェクトの中に表示させるロジックを確認します。表示される内容を生成しているのが ElementLabelProvider クラスです。このクラスは ITableLabelProvider インターフェースを実装しています。これに対して TableViewer オブジェクトは、各セルの表示内容を getColumnText() メソッドを呼び出して問い合わせてきますので、その戻り値として指定された行、列の文字列を返します。このサンプル・プログラムでは、列番号に応じて、Note ID、 タイプ、名前、別名、コメントのそれぞれを、相当する DesignerDesignElement のメソッドを呼び出して取得しています(リスト 6)。
リスト 6. セルの値生成用メソッドの定義
/*
* 指定された行、列の値を生成します
*/
public String getColumnText(Object element, int columnIndex) {
DesignerDesignElement designElement = (DesignerDesignElement)element;
switch (columnIndex) {
case 0:
return Integer.toString(designElement.getNoteId());
case 1:
return designElement.getDesignElementType();
case 2:
return designElement.getName();
case 3:
return designElement.getAlias();
case 4:
return designElement.getComment();
default:
return null;
}
}
|
最後に、一覧表示されている値をインラインで編集する機能を確認します。TableViwer クラスはインライン編集の機能を標準でサポートしていますが、その機能を利用するためには、ICellModifier インターフェースを実装するクラスを用意する必要があります。それが CellModifiter クラスです。このクラスでは主に、編集開始時の初期値を取得するための getValue() メソッドと、編集結果を処理するための modify() メソッドを用意します(リスト 7)。
リスト 7. インライン編集用メソッドの定義
/*
* 編集の初期値を生成します
*/
public Object getValue(Object element, String property) {
DesignerDesignElement designElement = (DesignerDesignElement)element;
String value = null;
if (property.equals("Name")) {
value = designElement.getName();
} else if (property.equals("Alias")) {
: (省略)
}
return (value != null) ? value : "";
}
/*
* 編集結果を処理します
*/
public void modify(Object element, String property, Object value) {
TableItem tableItem = (TableItem)element;
DesignerDesignElement designElement = (DesignerDesignElement)tableItem.getData();
String val = (String)value;
Boolean fModified = false;
String current;
// 編集されたコラムに応じて編集結果を反映
try {
if (property.equals("Name")) {
current = designElement.getName();
if (current == null)
current = "";
if (!val.equals(current)) {
designElement.setName(val);
tableItem.setText(2, val);
fModified = true;
}
} else if (property.equals("Alias")) {
: (省略)
}
} catch (DesignerException e) {
e.printStackTrace();
}
// 編集結果で画面更新
if (fModified) {
designElement.refresh();
}
}
|
getValue() メソッドは、編集しようとしているセルに応じて、その初期値をDesignerDesignElement クラスの get メソッドを用いて取得して返します。反対に modify() メソッドは、受け取った編集結果を、DesignerDesignElement クラスの set メソッドを用いて保存します。set/get メソッドは対象とする値に応じたものがそれぞれ提供されています。例えば、設計要素の名前に対応するものはsetName()/getName()です。保存した内容は Domino アプリケーションのデータベースには反映されますが、GUI の画面上に動的には反映されないため、DesignerDesignElement クラスの refresh() メソッドを最後に呼び出して、画面の表示内容を更新します。
このサンプル・プログラムでは、Domino アプリケーションの内容をアクセスするために Domino Designer Extensibility API のみを利用していますが、従来 Lotus Notes/Domino でサポートされている Note Java API も同時に利用可能です。より複雑な操作を行うプログラムを実装する際には、そちらも合わせて利用します。
Eclipse 上で開発したプログラムは、先ほど用意した Domino Designer をターゲットにした実行構成を利用して、Domino Designer に組み込んだ形で Eclipse から起動、デバッグすることができます。
デバッグが完了した後は、Eclipse のフィーチャー・プロジェクトと更新サイト・プロジェクトを利用してインストール可能な形にパッケージングします。完成したパッケージは Domino Designer の更新マネージャーの機能を利用してインストールします。標準の状態では Domino Designer の更新マネージャーは無効になっていますので、<Notesプログラム・ディレクトリ>/framework/rcp/plugin_customization.ini ファイル内に以下の1行を追加して有効にします。追加後は Domino Designer の再起動が必要です。
com.ibm.notes.branding/enable.update.ui=true
更新マネージャーはメニューの「ファイル」 > 「アプリケーション」 > 「インストール」から起動します。先ほど用意したインストール・パッケージをポイントしてインストールを行います。インストール後は再起動を求められますのでそれに従います。
図 5. インライン編集中の設計要素一覧ビュー
Domino Designer はバージョン8.5より Eclipse ベースに変更され、バージョン8.5.1では更に、機能拡張のための Domino Designer Extensibility API が公開されました。この API を利用することにより、開発者は Domino Designer に対して独自のプラグインを開発、追加することが可能になります。独自プラグインはセレクション・サービスを通して標準の Domino Designer の機能と連携し、選択された Domino アプリケーションの設計要素を入手、操作することができます。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| サンプルコード | designer-extension.zip | 13KB | HTTP |
- Eclipse に関する各種ドキュメント (英語)
- Using IBM Lotus Expeditor Toolkit 6.2.1 with IBM Lotus Notes 8.5.1 (英語)
- Java SE ダウンロード
- Eclipse Packages ダウンロード
- Lotus Expeditor 6.2.1 Toolkit ダウンロード
- IBM Lotus Expeditor Toolkit 6.1.1を使ってのIBM Lotus Notes 8アプリケーション開発
- 製品のヘルプ・ファイル
Lotus Domino Designer (ベーシック版) ユーザーガイド及びリファレンス
Lotus Domino に関する API の Javadoc
Client APIs for Lotus Notes and Domino Designer - Javadoc
Domino Designer Extensibility APIs