Wenn Sie die Funktionalität Ihres Plug-ins durch ein anderes Plug-in erweitern oder anpassen möchten, sollten Sie einen Erweiterungspunkt definieren. Wie bei Erweiterungen besteht der erste Schritt bei der Definition eines Erweiterungspunkts darin, der Datei plugin.xml Ihres Plug-ins bestimmte Befehle hinzuzufügen. Beispiel:
<?xml version="1.0" ?> <plugin name="Simple Extension Point Plugin" id="org.eclipse.sample" version="1.0"> <runtime> <library name="extpt.jar" /> </runtime> <extension-point name="Sample Extension Point" id="sampleExtensionPoint"/> </plugin>
Mehr müssen Sie nicht tun, um einen eigenen Erweiterungspunkt zu definieren. Die Struktur der Erweiterungen, die eine Verbindung zu diesem Erweiterungspunkt herstellen, wird nicht durch die Plattform interpretiert, sonder sollte stattdessen einem Schema folgen, das durch denjenigen definiert wird, der den Erweiterungspunkt bereitstellt. Die einzige Einschränkung besteht darin, dass die Erweiterungsbefehle gültiges XML darstellen müssen. Nachdem Sie einen Erweiterungspunkt definiert haben, können Sie zur Laufzeit die Plug-in-Registrierung der Plattform abfragen, um alle möglicherweise vorhandenen Erweiterungen abzufragen und zu verarbeiten. Zur Laufzeit werden die Erweiterungen als Objekte IExtension manifestiert. Erweiterungen wiederum bestehen aus einer Struktur von Objekten IConfigurationElement (jeweils ein Objekt für jedes Element in den Befehlen der Erweiterung). Der folgende Codeausschnitt fragt die Plug-in-Registrierung nach allen Erweiterungen ab, die dem oben definierten Erweiterungspunkt zugeordnet sind.
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); if (point != null) { IExtension[] extensions = point.getExtensions(); System.out.println("Found " + extensions.length + " extensions"); }
In einfachen Fällen ist die einzige Interaktion, die zwischen einem Erweiterungspunkt und seinen Erweiterungen stattfindet, in den Befehlen der Erweiterung enthalten. Die Erweiterung kann bestimmte Daten oder Benutzervorgabeneinstellungen direkt im XML der Erweiterungsbefehle bereitstellen. Das Plug-in des Erweiterungspunkts liest dann diese Informationen und verarbeitet sie, um ein bestimmtes angepasstes Verhalten zu ermöglichen.
Komplexere Erweiterungspunkte sind unter Umständen dann sinnvoll, wenn Sie zur Laufzeit mit Objekten interagieren wollen, die durch die Erweiterung definiert sind. Der Trick hierbei ist, dass das Plug-in, das den Erweiterungspunkt definiert, die Namen von Klassen und Paketen in der Erweiterung normalerweise nicht kennt und daher die erwartete Klassenstruktur in einer Schnittstelle beschreiben muss. Anschließend kann das Plug-in Exemplare der Klassen im Plug-in der Erweiterung erstellen, indem IExecutableExtension sowie die Schnittstelle mit dem Objekt zur Laufzeit verwendet werden.
Um dies anhand eines Beispiels zu veranschaulichen, definiert der folgende Ausschnitt aus einer Datei plugin.xml eine Erweiterung, die einen Anbindungspunkt zum bereits definierten Beispielerweiterungspunkt bildet:
<extension name="Sample Extension" id="myExtension" point="org.eclipse.sample.sampleExtensionPoint"> <someObject> <run class="org.eclipse.examples.SomeClass"/> </someObject> </extension>
Diese Erweiterung enthält Befehle für eine ausführbare Erweiterung, die den Namen der Klasse Klasse enthält, von der ein Exemplar erstellt werden soll. Diese Klasse sollte einer Schnittstelle entsprechen, die durch das Plug-in definiert wird, das auch den Erweiterungspunkt definiert. Wie bereits erläutert sind die Namen der Tags in diesem Beispiel ("someObject" und "run") willkürlich gewählt. Diese Tags werden durch das Schema des Erweiterungspunkts definiert.
Angenommen, die Schnittstelle für die ausführbare Erweiterung heißt ISomeInterface. Der folgende Codeausschnitt im Plug-in des Erweiterungspunkts fragt die Plug-in-Registrierung ab und erstellt Exemplare für alle ausführbaren Erweiterungen des Erweiterungspunkts "sampleExtensionPoint":
IPluginRegistry registry = Platform.getPluginRegistry(); IExtensionPoint point = registry.getExtensionPoint("org.eclipse.sample.sampleExtensionPoint"); IExtension[] extensions = point.getExtensions(); for (int i = 0; i < extensions.length; i++) { IConfigurationElement[] elements = extensions[i].getConfigurationElements(); for (int j = 0; j < elements.length; j++) { if ("someObject".equals(elements[j].getName())) { ISomeInterface object = (ISomeInterface)elements[j].createExecutableExtension("run"); System.out.println("Found an executable extension: " + object); } } }
Weitere Angaben sind für diese Implementierung nicht erforderlich. Weitere Informationen finden Sie in den Javadoc-Angaben für das Paket org.eclipse.core.runtime oder im Abschnitt über den Erweiterungspunkt, der im Readme-Tool definiert ist (Installationsanweisungen enthält das Beispielhandbuch). Das beste Beispiel finden Sie jedoch in den Erweiterungspunkten, die durch die Eclipse-Plattform selbst definiert werden.