JabRefのプラグイン機構

第2.4版以降、JabRefは、Java Plugin Framework (JPF)を用いて構築された、プラグイン機構を使って拡張することができます。

プラグインを使用するには、JabRefのプラグイン検索対象ディレクトリのうちの一つにプラグインを置いておかなくてはなりません。JabRef jarファイルがあるディレクトリ下のpluginsは、その一つです。もう一つはユーザーディレクトリであり、LinuxやOS Xでは~/.jabref/plugins、Windowsではお使いのユーザーホームディレクトリ下の.jabref/pluginsにあります。

プラグインを導入する最も簡単な方法は、プラグインメニューにあるプラグインマネージャーを使用することです。プラグインマネージャーは、ユーザープラグインディレクトリに導入されているプラグインをすべて列挙し、導入済のプラグインを削除したり、新しいものを導入したりすることができます。

プラグインの書き方

JabRefは、開発者のために以下の拡張点を備えています。

これらの拡張点は、JabRefコアプラグインのplugin.xmlに定義されており、これはJabRef/src/plugins/net.sf.jabref.core/にあります。

開発を進めるには、大凡以下のような手順を踏んでください。

  1. subversion (https://jabref.svn.sourceforge.net/svnroot/jabref/trunk)から、JabRef trunkをチェックアウトしてください。これにはJabRef本体と、これまでJabRefに寄せられたプラグインが含まれていて(htdocsフォルダは必要ありません)、プラグインを作り始めるのに最適です。
  2. ant jarsを実行してJabRefをコンパイルしてください。
  3. 新しいプロジェクトを作成して、新しいplugin.xmlに、コアplugin.xmlの拡張点を満たす拡張を定義してください。特に以下の各点に留意してください。
  4. あなたのプロジェクトのjarを作成し、JabRefのpluginsフォルダにおいてください。
  5. JabRefをjarから実行すると、あなたのプラグインが読み込まれます。

プラグイン機構に関連した質問がありましたら、メーリングリストで自由に訊いてください!

JabRefに拡張点を追加するには

この文書は、拡張点をさらに追加したいJabRef開発者のために書かれています。

新しい拡張点を加えるには、以下に示すように、この拡張点をコアプラグインのplugin.xmlの中で宣言する必要があります。

<extension-point id="PushToApplication">
	<parameter-def type="string" id="pushToApp"
		custom-data="<プラグインプロバイダが実装する必要のあるインタフェースのクラス名>" />
	<!-- 追加的な他のパラメータ (現在のところこれらはどの目的にも使用されていません)
		<parameter-def type="string" id="name" />
		<parameter-def type="string" id="description"
			multiplicity="none-or-one" />
			-->
</extension-point>

その後、プラグインコード生成子"ant generate"を再度実行する必要があります。これは"net.sf.jabref.plugin.core.generated"中にヘルパークラスを再生成し、システムに登録されたPushToTalk拡張の全リストを返すgetPushToApplicationExtensions()メソッドをインクルードします。

そうすれば、このリストを以下のように使用することができます(これはEntryFetcher拡張の場合の例です)。

 
/*
 * プラグイン拡張である取得子を読み込む
 */
JabRefPlugin jabrefPlugin = JabRefPlugin.getInstance(PluginCore.getManager());
if (jabrefPlugin != null){
	for (EntryFetcherExtension ext : jabrefPlugin.getEntryFetcherExtensions()){
		EntryFetcher fetcher = ext.getEntryFetcher();
		if (fetcher != null){
			fetchers.add(fetcher);
		}
	}
}
 
// そしてその後...
 
for (EntryFetcher fetcher : fetchers){
  GeneralFetcher generalFetcher = new GeneralFetcher(sidePaneManager, this, fetcher);
  web.add(generalFetcher.getAction());
  fetcherActions.add(generalFetcher.getAction());
}