# Das Plugin-System von JabRef

Ab Version 2.4 beta1 kann man JabRef mit Hilfe eines Plugin-Systems erweitern, dass mit dem Java Plugin Framework (JPF) erstellt wurde.

Um Plugins zu nutzen, müssen Sie nur die jar-Datei des Plugins in einen Ordner mit dem Namen `plugins` speichern, wobei der `plugins`-Ordner in demselben Verzeichnis liegen muss, in dem sich auch die Datei JabRef.jar befindet. Beim Start von JabRef wird eine Liste mit allen geladenen Plugins angezeigt.

## Schreiben eines Plugins

JabRef bietet die folgenden Erweiterungs-Möglichkeiten für Entwickler:

- `ImportFormat` - Importformate hinzufügen, die über den Menüpunkt Datei -> Importieren in ... Datenbank aufgerufen werden können.
- `EntryFetcher` - Zugang zu Datenbanken wie Citeseer oder Medline zum Internet-Menü hinzufügen.
- `ExportFormatTemplate` - Einen vorlagenbasierten Export wie diejenigen, die unter Optionen -> Verwalte externe Exportfilter verfügbar sind, hinzufügen.
- `ExportFormat` - Einen Exportfilter zum Exportdialog von JabRef hinzufügen – das ist komplizierter als einen vorlagenbasierten Export zu erstellen.
- `ExportFormatProvider` - Ein leistungsfähigerer Weg, um Exportformate hinzuzufügen.
- `LayoutFormatter` - Formatierer hinzufügen, die im Layout-basierten Export benutzt werden können.

Diese Erweiterungs-Möglichkeiten sind in `plugin.xml` des JabRef-core-plugin definiert, das in `JabRef/src/plugins/net.sf.jabref.core/` zu finden ist.

Gehen Sie folgendermaßen vor, um ein Plugin zu erstellen:

1. Machen Sie einen checkout des JabRef 'trunk' mit subversion (`https://jabref.svn.sourceforge.net/svnroot/jabref/trunk`) – den Ordner 'htdocs' brauchen Sie nicht. Im 'trunk' sind sowohl JabRef selbst als auch die Plugins enthalten, die bislang zu JabRef beigesteuert wurden und die einen guten Startpunkt für Ihre eigenen Plugins bieten.
2. Kompilieren Sie JabRef mit `ant jars`.
3. Erstellen Sie Ihr eigenes Projekt und definieren Sie Ihr Plugin in Ihrer eigenen plugin.xml, wobei Sie die oben beschriebenen Erweiterungs-Möglichkeiten beachten müssen. Achten Sie besonders darauf, dass
   - ...Ihre plugin.xml einen `requires`-Bereich enthält, der das core plugin (`net.sf.jabref.core`) importiert.
   - ...Ihre plugin.xml einen `runtime`-Bereich enthält, in dem Sie JPF mitteilen, wo in Ihrem Projekt die class-Dateien und Ressourcen gespeichert werden.
4. Erstellen Sie eine jar-Datei Ihres Projektes und speichern es in den `plugins`-Ordner von JabRef.
5. Ihr Plugin sollte nun beim Start von JabRef.jar geladen werden.

Falls Sie noch Fragen zum Plugin-System haben, zögern Sie nicht, sie auf der Mailing-Liste zu stellen.

## Erstellen einer Erweiterungs-Möglichkeit

Dieser Abschnitt ist für JabRef-Entwickler gedacht, die zusätzliche Erweiterungs-Möglichkeiten bereitstellen wollen.

Um eine neue Erweiterungs-Möglichkeit hinzuzufügen, müssen Sie diese in der plugin.xml des core-plugins deklarieren. Hier ist ein Beispiel:

    <extension-point id="PushToApplication">
    	<parameter-def type="string" id="pushToApp"
    		custom-data="<classname of the interface that plugin providers need to implement>" />
    	<!-- optionally other parameters (we currently do not use any of these for anything)
    		<parameter-def type="string" id="name" />
    		<parameter-def type="string" id="description"
    			multiplicity="none-or-one" />
    			-->
    </extension-point>

Anschließend müssen Sie den Plugin-Code-Generator "`ant generate`" aufrufen, der die Klasse "`net.sf.jabref.plugin.core.generated`" neu erstellt, so dass sie die Methode `getPushToApplicationExtensions()` enthält; sie gibt eine Liste aller PushToTalk-Erweiterungen aus, die im System registriert sind.

Diese Liste kann dann folgendermaßen genutzt werden (als Beispiel dient die EntryFetcher-Erweiterung):

    /*
     * Load fetchers that are plug-in extensions
     */
    JabRefPlugin jabrefPlugin = JabRefPlugin.getInstance(PluginCore.getManager());
    if (jabrefPlugin != null){
    	for (EntryFetcherExtension ext : jabrefPlugin.getEntryFetcherExtensions()){
    		EntryFetcher fetcher = ext.getEntryFetcher();
    		if (fetcher != null){
    			fetchers.add(fetcher);
    		}
    	}
    }

    // and later...

    for (EntryFetcher fetcher : fetchers){
      GeneralFetcher generalFetcher = new GeneralFetcher(sidePaneManager, this, fetcher);
      web.add(generalFetcher.getAction());
      fetcherActions.add(generalFetcher.getAction());
    }