O'Reilly logo

Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox by Matthias Lübken, Bernd Kolb, Nils Hartmann, Gerd Wütherich

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

379
22 Extension Points und Extensions
Motivation
In der OSGi Platform haben Sie mit Services die Möglichkeit, Dienste
zu veröffentlichen, die von anderen Bundles genutzt werden können.
Mit dem Konzept der Extension Registry stellt Eclipse Equinox einen
vergleichbaren Mechanismus zur Verfügung, der seit der Version 1.0
integraler Bestandteil der Eclipse IDE ist und somit aus einer Zeit
stammt, in der die Eclipse IDE noch nicht auf dem OSGi Framework
basierte.
Durch die Verwendung von Extension Points nnen Sie ein
Bundle gezielt für Erweiterungen öffnen, die zur Entwicklungszeit des
Bundles nicht bekannt sein müssen. Andere Bundles können zu einem
Extension Point Erweiterungen zur Verfügung stellen. Über diesen
Mechanismus können bspw. in der Eclipse IDE neue Einträge in eine
Menüleiste eingebettet werden. Im Gegensatz zu Services können
Extensions auch von Bundles bereitgestellt werden, die nicht gestartet
sind. Des Weiteren kann die Bereitstellung von Extensions rein dekla-
rativ erfolgen, die Implementierung und Bereitstellung von Java-Klas-
sen ist nicht notwendig.
Einordnung
Die Extension Registry ist Bestandteil von Eclipse Equinox und
nicht in der OSGi-Spezifikation spezifiziert. Sie kann jedoch in ande-
ren OSGi Frameworks eingesetzt werden. Des Weiteren kann sie auch
außerhalb des OSGi Frameworks verwendet werden.
22 Extension Points und Extensions380
22.1 Tutorial: Ein erweiterbarer Dialog
Das Konzept der Extension Points und Extensions werden wir Ihnen
anhand eines Swing-Dialogs vorstellen, den Sie über Extensions mit
beliebigen Actions erweitern können. Dazu legen wir zwei Bundles an:
Das Bundle
org.osgibook.helloworld.swing stellt den Dialog bereit.
Außerdem definiert es einen Extension Point r Actions, die auf
dem Dialog in Form von Schaltflächen angezeigt und ausgeführt
werden.
Das Bundle
org.osgibook.helloaction stellt eine Extension mit
einer Action r den Dialog zur Verfügung. Die Action gibt in
einem eigenen Dialog eine »Hello World«-Nachricht aus.
Der im Bundle
org.osgibook.helloworld.swing implementierte Dialog
soll dynamisch auf im System installierte Extensions des
action-Exten-
sion Points reagieren. Wenn im Framework ein neues Bundle mit einer
entsprechenden Extension installiert wird, dann wird eine neue Schalt-
fläche zum Dialog hinzugefügt. Wird ein Bundle mit einer Extension
deinstalliert, dann soll die entsprechende Schaltfläche wieder aus dem
Dialog entfernt werden.
Die fertigen Plug-in-Projekte zu diesem Tutorial sind in Abb. 22–2
dargestellt.
verwendet
Klassen aus
verwendet
Service
Equinox Extension Registry
IExtensionRegistry
MANIFEST.MF
META-INF
org.osgibook.helloworld.swing
schema
plugin.xml
MANIFEST.MF
META-INF
org.osgibook.helloaction
plugin.xml
MANIFE
ST.
MF
META-INF
org osgibook helloaction
Bundle-SymbolicName:
org.osgibook
.helloaction
M
ANIFEST.
MF
META
-
INF
schema
k
.helloac
t
io
n
Bundle-SymbolicName:
org.osgibook
.helloworld.swing
Abb. 22–1
Überblick über die
beteiligten Bundles
38122.1 Tutorial: Ein erweiterbarer Dialog
Schritt 1a: Anlegen des Bundles org.osgibook.helloworld.swing
Legen Sie bitte zunächst ein neues Bundle mit dem Namen org.osgi-
book.helloworld.swing und dem folgenden Import-Package-Header an:
Import-Package: org.eclipse.core.runtime;registry=split,
org.eclipse.core.runtime.dynamichelpers,
org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.3.0"
Bei dem Package org.eclipse.core.runtime handelt es sich um ein Split-
Package, das von mehreren Bundles exportiert wird. Um den richtigen
Exporter auszuwählen (das Bundle
org.eclipse.equinox.registry),
müssen Sie das Attribut
registry=split hinzufügen.
Beachten Sie außerdem, dass Bundles, die Extensions Points oder
Extensions bereitstellen, im Header
Bundle-SymbolicName das Attribut
singleton:=true definieren ssen. Dadurch wird sichergestellt, dass
nur genau eine Version des (Singleton-)Bundles im Framework instal-
liert werden kann:
Bundle-SymbolicName: org.osgibook.helloworld.swing;singleton:=true
Abb. 22–2
Die Plug-in-Projekte
22 Extension Points und Extensions382
Schritt 1b: Definieren des Extension Points
Das Bundle org.osgibook.helloworld.swing soll einen Extension Point
org.osgibook.helloworld.swing.action bereitstellen, den andere Bund-
les erweitern können, um eigene Actions innerhalb des Action-Dialogs
zu platzieren. Eine Action besteht dabei aus einem sprechenden
Namen sowie einer implementierenden Klasse, die vom Typ
javax.
swing.Action
sein muss.
Der Extension-
Point-Editor
Ein Extension Point wird in der Datei plugin.xml definiert, die sich
im Wurzelverzeichnis des Bundles befinden muss. Die Bearbeitung die-
ser Datei kann mit dem Manifest-Editor erfolgen, den Sie bereits zur
Bearbeitung von Manifest-Dateien verwendet haben. Um diesen Edi-
tor zu öffnen, klicken Sie auf der Registerkarte Overview auf den Link
Extension Points. Die Funktionsweise des Extension-Point-Editors
(vgl. Abb. 22–3) ist detailliert unter [ECHEEP] beschrieben.
Legen Sie einen neuen Extension Point mit der ID
action, dem Namen
Action und dem Schema schema/action.exsd an.
Der Schema-Editor
Mit einem Doppelklick auf den Link Open extension point schema
öffnen Sie den Schema-Editor, der die Bearbeitung des Schemas eines
Extension Points ermöglicht. Dieses Schema definiert, welche Konfigu-
rationselemente eine Extension zu einem Extension Point definieren
muss/darf. Die Funktionsweise des Schema-Editors ist im Detail unter
[ECHEME] beschrieben.
Legen Sie ein neues Element mit dem Namen
action an. Zu diesem
Element müssen Sie die Attribute
title und class definieren. Das
title-Attribut ist vom Typ string, während das class-Attribut den
Typ
java besitzt. Spezifizieren Sie außerdem, dass eine unter dem
Abb. 22–3
Der Extension-
Point-Editor
38322.1 Tutorial: Ein erweiterbarer Dialog
class-Attribut angegebene Klasse das Interface javax.swing.Action
implementieren muss. Abschließend müssen Sie das action-Element
dem
extension-Element als einziges Element einer Sequence zuordnen.
Die Datei plugin.xml
Nach dem Speichern enthält die Datei plugins.xml im Root-Verzeich-
nis des Bundles den folgenden Eintrag für den neuen Extension Point:
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>
<extension-point id="action" name="Action"
schema="schema/action.exsd"/>
</plugin>
Das XML-Schema zur Beschreibung der möglichen Konfigurationsele-
mente einer
action-Extension ist in der Datei schema/action.exsd abge-
legt.
Schritt 1b: Implementierung des Action-Dialogs
Erstellen Sie jetzt nun die Klasse org.osgibook.helloworld.swing.
ActionDialog. Der Action-Dialog liest alle vorhandenen Extensions
zum action-Extension Point aus der Extension Registry und erzeugt
pro Extension einen JButton, der mit einer Instanz der angegebenen
Klasse vom Typ
javax.swing.Action assoziiert ist.
Da Bundles, die Extensions bereitstellen, zur Laufzeit installiert
und deinstalliert werden können, implementiert der Action Dialog
Abb. 22–4
Der Schema-Editor
Listing 22–1
Die Datei plugin.xml

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required