# JabRefのプラグイン機構

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

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

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

## プラグインの書き方

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

- `ImportFormat` - 「...データベースに読み込む」に表示される読込子をJabRefに追加する。
- `EntryFetcher` - ウェブ検索メニューにCiteseerやMedlineのようなデータベースへのアクセスを追加する。
- `ExportFormatTemplate` - 自製書き出しの管理から使用できるのと同じようなひな型ベースの書き出しを追加する。
- `ExportFormat` - JabRefの書き出しダイアログへ書き出しフィルタを追加する。単純なひな型ベースのものよりも複雑です。
- `ExportFormatProvider` - JabRefに書き出し書式を加える、さらに強力な方法です。
- `LayoutFormatter` - レイアウトベースの書き出しに使用される整形子を追加する。
- `SidePanePlugin` - 任意の操作を行うことができる側面要素を追加します。側面パネルは、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の拡張点を満たす拡張を定義してください。特に以下の各点に留意してください。
   - 新しいplugin.xmlには、コアプラグイン(`net.sf.jabref.core`)を読み込む`requires`セクションがあること。
   - 新しいplugin.xmlには、プロジェクト中のどこにクラスファイルやリソースがあるかをJPFに示す`runtime`セクションがあること。
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());
    }