2008年7月19日土曜日

既存のライブラリJARをプラグイン化する

オープンソースやフリーウェアとして公開されているものや、自作のものなど、既存のライブラリJARファイルをプラグインあるいはRCP開発で使用したい場合、そのJARファイルの保管先をビルドパスに追加するのではなく、ライブラリ自体をラップするプラグインを作成し、そのプラグインを参照するようにする。
必ずしも、外部ライブラリをプラグイン化しなければならない訳ではないが、そのライブラリを使用するプラグイン毎に内部に持つようにすると、重複して持つことになるため、無駄になる上、ライブラリ自体の更新が発生すると、煩雑な作業が必要となる。
この方法はEclipse自体も行っている方法で、JUnitやApache Luceneなどがプラグイン化して使用されている。

方法は、
1.メニューから[New]-[Project]を選択する。

2.[Plug-in Development]のカテゴリにある[Plug-in from existing JAR archives]を選択し[Next]


3.次のページでプラグインに含めるライブラリを指定し、[Next]


4.プラグインプロジェクトの設定を行い、[Finish]


5.これでライブラリプラグインのプロジェクトが作成できたので、適宜、プラグインマニフェストエディターのruntimeタブで公開(エクスポート)するパッケージを指定する。


6.最後にプラグインとしてexportをする。

こうして作成したライブラリプラグインを使用するには、通常のプラグインと同様に、pluginsディレクトリに配置し、使用する側のプラグインでは、プラグインマニフェストエディターのdependenciesタブでRequired Plug-insに追加すればよい。

ちなみに、Eclipse3.1以前は、plugin.xmlに<runtime>要素とその子として<library>要素を追加し、その中に公開するパッケージを記述していたが、3.2以降はMANIFEST.MFにExport-Package:として記述するようになっている。

参考:
Eclipse Platform Plug-in manifest ver3.0 ver3.2

2008年4月3日木曜日

StatusとMultiStatusとその他Statusと...

ILogインターフェースでのログ出力の際に、引数として渡すIStatusの実装クラスは大きく分けて2つある。

Status
単一のメッセージとExceptionのみで構成されるログ情報。

ILog log = activator.getDefault().getLog();
log.log(new Status(Status.CANCEL, PLUGIN_ID, "これはCANCELメッセージ", null)); // 独自エラーコードなし
log.log(new Status(Status.ERROR, PLUGIN_ID, 9, "これはERRORメッセージ", null)); // Exceptionなし
log.log(new Status(Status.WARNING, PLUGIN_ID, 40, "これはWARNINGメッセージ", new Exception()));
log.log(new Status(Status.INFO, PLUGIN_ID, 2, "これはINFOメッセージ", new Exception()));
log.log(new Status(Status.OK, PLUGIN_ID, 1, "これはOKメッセージ", new Exception()));

上記は次のようになる。


MultiStatus
複数のStatusから構成される階層化ステータス。
上位ステータスは下位ステータスのSeverityが高いものが反映される。

MultiStatus multiStatus = new MultiStatus(PLUGIN_ID, 0, "これはMultiStatusのRootメッセージ", null);
multiStatus.add(new Status(Status.WARNING, PLUGIN_ID, "危険!!", null));
multiStatus.add(new Status(Status.INFO, PLUGIN_ID, "参考情報", null));
MultiStatus multiStatus2 = new MultiStatus(PLUGIN_ID, 0, "これはMultiStatus2のRootメッセージ", null);
multiStatus2.add(multiStatus);
log.log(multiStatus2);

上記は次のようになる。


その他Statusのサブクラス
MergeStatusやOperationStatusなど、個々の機能に特化したステータスクラスがある。それらもやはりStatusクラスから派生している。

2008年4月1日火曜日

EventManager

org.eclipse.core.commands.common.EventManagerクラスはスレッドセーフなListener管理実装を持つ抽象クラスであり、Listenerを管理する必要のあるクラスはこのクラスから派生させると便利。
AbstractActionやPreferenceStoreなどがこのクラスから派生している。

2008年3月31日月曜日

RCPにError Logビューを表示する

RCPに標準のError Logビューを表示するには、IPerspectiveFactoryの実装クラスのcreateInitialLayout()メソッドで次のようにする。
Error Logビューはorg.eclipse.pde.runtimeプラグインで定義されているため、プラグインの依存関係にorg.eclipse.pde.runtimeを追加すること。

public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
// Error Logビューをパースペクティブに追加する
layout.addView("org.eclipse.pde.runtime.LogView", IPageLayout.BOTTOM, IPageLayout.DEFAULT_VIEW_RATIO, IPageLayout.ID_EDITOR_AREA);
}
}

2008年3月29日土曜日

Logging

EclipseにはLogging機能が予め用意されている。

Logを出力するには、org.eclipse.core.runtime.ILogインターフェースが提供する機能を使用する。このインターフェースの実装クラスはPluginクラスのgetLog()メソッドを呼び出すことで、取得することができる。
ActivatorがAbstractUIPluginのサブクラスだとすると、

// ActivatorはPluginのサブクラスであるAbstractUIPluginのサブクラス
ILog log = Activator.getDefault().getLog();


で取得できる。
ILogインターフェースを取得すれば、後は、IStatusインターフェースの実装クラスを引数として、log()メソッドを呼び出せば、ログファイルにログが出力される。
メッセージや種類(エラーか警告かなど)はそのIStatus実装クラスに設定する。

ログの出力先
ランタイムワークスペース/.metadata/.log

ログローテーション
ローテーションの設定は、システムプロパティで設定できる。


System Property説明
eclipse.log.backup.maxログファイルのバックアップ数。このプロパティに設定されている数だけ、.logがsize.maxを超えた場合に、バックアップとして退避される。
eclipse.log.size.maxログファイルのサイズ(KB)。Javadocには記載されていないが、最少値は10であり、それ以下の値は10とみなされる。

ただし、ローテーションの実装方法は若干特殊なので注意が必要。
Eclipse起動 -> .log書き込み -> .logのサイズがsize.maxを超えれば.bak_0.logへ退避 -> Eclipse終了 の繰り返しなので、何回起動したかにかかわらずsize.max * backup.max分のログを保持しているわけではなく、size.max > .logである間は、複数回の起動に関するログが.log内に保持されるが、size.max < .logとなった時点ですでに.bak_0.logがある場合は削除され、その上で.logが退避される。当然ながら、.bak_1.logがすでにあった場合、新しく作成された.bak_0.logとはつながらないことになる。