DE:Osmosis/Writing Plugins
Aufbau eines Plugins
Ein Osmosis-Plugin besteht aus:
- einem Zip-Archiv
- einer Datei plugin.xml
- den Klassen des Plugins
Inhalt von plugin.xml
<?xml version="1.0" ?>
<!DOCTYPE plugin PUBLIC "-//JPF//Java Plug-in Manifest 1.0" "http://jpf.sourceforge.net/plugin_1_0.dtd">
<plugin id="LibOSM" version="2.5.2.0"
class="org.openstreetmap.osm.Plugins.LibOSMOsmosisPlugin">
<!--These are library-files we require including our own code. -->
<requires>
<import plugin-id="org.openstreetmap.osmosis.core.plugin.Core" plugin-version="0.32" reverse-lookup="false"/>
</requires>
<!--These are library-files we require including our own code. -->
<runtime>
<library id="mycode" path="/" type="code"/>
</runtime>
<!--This is where our plugin plugs into.
The extension-point 'task' with a subclass of PluginLoader named 'WriteOSMBinPlugin'
that tells Osmosis what tasks are provided.-->
<extension plugin-id="org.openstreetmap.osmosis.core.plugin.Core"
point-id="Task" id="LibOSM/OsmBin-Tasks/writeOsmBin">
<parameter id="name"
value="writeOsmBin"/>
<parameter id="class"
value="org.openstreetmap.osm.data.osmbin.OSMBinPlugin"/>
</extension>
<!--extension plugin-id="org.openstreetmap.osmosis.core.plugin.Core"
point-id="Task" id="LibOSM/OsmBin-Tasks/writeOsmBin-0.6">
<parameter id="name"
value="writeOsmBin-0.6"/>
<parameter id="class"
value="org.openstreetmap.osm.data.osmbin.OSMBinPlugin"/>
</extension-->
</plugin>
Wo hängt man sich ein
Momentan gibt es nur den Erweiterungs-Punkt task
Einhängen von tasks
Der plugin-loader
Um den Erweiterungs-Punkt task zu nutzen muß man eine Factory-Klasse schreiben die com.bretth.osmosis.core.plugin.PluginLoader erweitert (example).
Diese Klasse ist aus historischen Gründen erforderlich.
Die TaskManagerFactory
Diese Klasse enthält eine Methode loadTaskFactories() welche eine Zuordnung (map) vom Befehlszeilennamen zur Instanz von TaskManagerFactory zurückgibt.
Für jeden Task, der hinzugefügt werden soll, muß eine Implementierung von com.bretth.osmosis.core.pipeline.common.TaskManagerFactory geschrieben werden (example). Diese Klasse hat die Aufgabe, die Befehlszeilenargumente zu analysieren, Ihren Task zu instanziieren und in einen TaskManager zu verpacken. Zum Beispiel ein com.bretth.osmosis.core.pipeline.v0_5.SinkManager für eine Aufgabe, die OSM-Daten nutzt.
Der Task
Schließlich müssen Sie die eigentliche Aufgabe implementieren (example).