165
10 Management der OSGi Service
Platform
Motivation
In den Tutorials der zurückliegenden Kapitel haben Sie die Equinox-
Konsole bereits als einfachen Management Agent kennengelernt, mit
dem Sie die OSGi Service Platform zur Laufzeit überwachen und mani-
pulieren können. Dabei haben wir die Konsole zur Anzeige des Frame-
work-Status und zur Steuerung des Bundle-Lebenszyklus verwendet.
Die Equinox-Konsole stellt darüber hinaus eine Reihe weiterer Kom-
mandos bereit, die zur Administration der OSGi Service Platform ein-
gesetzt werden können.
Alternativ zur Equinox-Konsole, die ein integraler Bestandteil der
Equinox-Distribution ist, existieren im Open-Source-Bereich eine
Reihe von alternativen Management Agents, die ebenfalls zusammen
mit Eclipse Equinox eingesetzt werden können.
In diesem Kapitel gehen wir sowohl auf die Möglichkeiten der
Equinox-Konsole als auch auf die Verwendung alternativer Manage-
ment Agents ein. Sie lernen die Kommandos der Equinox-Konsole
kennen und erfahren, wie Sie die Equinox-Konsole um eigene Kom-
mandos erweitern können. Darüber hinaus zeigen wir Ihnen am Bei-
spiel des Knopflerfish-Desktops, wie Sie einen anderen Management
Agent in Eclipse Equinox installieren und zur Administration der
OSGi Service Platform verwenden.
Einordnung
Die in diesem Kapitel vorgestellten Konzepte sind in weiten Teilen
Equinox-spezifisch, da in der OSGi-Spezifikation nicht festgelegt ist,
welche Funktionalität Management Agents bereitzustellen haben oder
wie Sie diese bereitstellen.
Stattdessen beschreibt die Spezifikation, wie die programmatische
Schnittstelle (API) der OSGi Service Platform aussieht, über die die
potenziellen Management Agents Zugriff auf das OSGi Framework
bzw. die Standard Services erhalten. Aus diesem Grund sind Manage-
ment Agents, die ausschließlich diese Schnittstelle verwenden, imple-
mentierungsübergreifend nutzbar.
10 Management der OSGi Service Platform166
10.1 Tutorial: Die Equinox-Konsole um ein
greet-Kommando erweitern
Überblick
Im Tutorial zu diesem Kapitel erweitern wir die Equinox-Konsole um
einen neuen, eigenen Befehl
greet. Wir bauen das »Hello World«-
Beispiel so um, dass der Gruß nicht mehr implizit beim Starten und
Stoppen des Bundles
org.osgibook.helloworld ausgegeben, sondern
explizit durch das neues Kommando auf der Equinox-Konsole aufge-
rufen wird.
Um die Equinox-Konsole um den neuen Befehl zu erweitern, müs-
sen wir einen
CommandProvider implementieren, der das greet-Kom-
mando für die Equinox-Konsole bereitstellt. Der
CommandProvider wird
als Service an der Service Registry angemeldet und stellt so das
greet-
Kommando über das Whiteboard-Pattern (vgl. Unterkapitel 7.6) in
der Equinox-Konsole bereit (vgl. Abb. 10–1).
Die Plug-in-Projekte
Wir erweitern im Tutorial zu diesem Kapitel lediglich den Activator
des Plug-in-Projektes org.osgibook.helloworld. Alle weiteren Plug-in-
Projekte bleiben unverändert. Für den Fall, dass Sie das Beispiel mit
der in Kapitel 9 angelegten »Hello World Example (SecurityMana-
ger)«-Launch-Konfiguration starten möchten, müssen Sie jedoch
zusätzlich die lokalen Ausführungsrechte des Plug-in-Projektes
org.osgibook.helloworld anpassen.
Abb. 10–1
Übersicht über die
beteiligten Bundles
CommandProvider
verwendet Service
permissions.perm
OSGI-INF
org.osgibook.helloworld
MANIFEST.MF
META-INF
verwendet
Klassen aus
verwendet
Klassen aus
META-INF
MANIFEST.MF
org.osgibook.translation
ver
wen
det
META-INF
MANIFEST.MF
org.osgibook.translation.impl
TranslationService
META-INF
MANIFEST.MF
translation_de_DE.properties
16710.1 Tutorial: Die Equinox-Konsole um ein greet-Kommando erweitern
Schritt 1: Anpassen der start()- und stop()-Methoden
Da die Grußbotschaft nicht mehr beim Start und beim Stopp des
»Hello World«-Bundles ausgegeben werden soll, benötigen Sie im
Gegensatz zum bisherigen Beispiel keinen Service Tracker mehr, der
das Ausgeben der Grußbotschaft beim An- und Abmelden des Transla-
tion Service übernimmt. Stattdessen verwenden wir einen »einfachen«
Service Tracker, über den wir den Translation Service abfragen, sobald
ein Anwender das
greet-Kommando auf der Konsole ausgeführt hat.
Entfernen Sie deshalb den bislang verwendeten
TranslationService-
Tracker
aus dem Activator. Instanzieren Sie in der start()-Methode
stattdessen einen normalen Service Tracker (vgl. Listing 10–1):
package org.osgibook.helloworld;
[...]
public class Activator implements BundleActivator {
private BundleContext bundleContext;
private ServiceTracker translationServiceTracker;
public void start(BundleContext context) throws Exception {
this.bundleContext = context;
translationServiceTracker = new ServiceTracker(context,
TranslationService.class.getName(), null);
translationServiceTracker.open();
}
public void stop(BundleContext context) throws Exception {
translationServiceTracker.close();
}
[...]
}
Schritt 2: Implementierung des CommandProvider-Interface
Der Equinox-Konsole können eigene Kommando hinzugefügt werden,
indem eine Klasse vom Typ
org.eclipse.osgi.framework.console.Com-
mandProvider implementiert und ein Exemplar dieser Klasse als Service
an der Service Registry angemeldet wird.
Import der
benötigten Packages
In diesem Tutorial implementieren wir der Einfachheit halber das
CommandProvider-Interface direkt am Activator des »Hello World«-
Bundles. Beachten Sie, dass Sie dafür im Bundle Manifest das Package
org.eclipse.osgi.framework.console importieren müssen, damit die ent-
sprechenden Klassen zur Verfügung stehen:
Listing 10–1
Anpassungen im
Activator des »Hello
World«-Bundles I
10 Management der OSGi Service Platform168
Import-Package: org.eclipse.osgi.framework.console
Implementierung des
CommandProvider-
Interface
Die einzige Methode, die vom CommandProvider-Interface definiert wird,
ist die Methode
getHelp(), die in unserem Fall die Beschreibung des
Kommandos
greet zurückliefert. In der start()-Methode des Activa-
tors muss die
CommandProvider-Instanz, in unserem Fall also der Activa-
tor selber, unter dem
CommandProvider-Interface an der Service Registry
angemeldet werden (vgl. Listing 10–2).
package org.osgibook.helloworld;
import org.eclipse.osgi.framework.console.CommandProvider;
[...]
public class Activator implements BundleActivator, CommandProvider
{
[...]
public void start(BundleContext context) throws Exception {
this.bundleContext = context;
context.registerService(CommandProvider.class.getName(),
this, null);
translationServiceTracker = new ServiceTracker(context,
TranslationService.class.getName(), null);
translationServiceTracker.open();
}
[...]
public String getHelp() {
StringBuilder help = new StringBuilder();
help.append("\n--- Hello World Commands ---");
help.append("\n\tgreet [hello|goodbye] - ");
help.append("display the \"Hello World !\" message");
return help.toString();
}
}
Schritt 3: Implementierung des
greet
-Kommandos
Um ein neues Kommando für die Konsole zur Verfügung zu stellen,
muss der Command Provider eine öffentliche Methode implementie-
ren, die nach dem Kommando benannt ist und mit einem führenden
Unterstrich beginnt in unserem Fall also
_greet. Die Signatur der
Methode muss genau einen Parameter vom Typ
org.eclipse.osgi.
framework.console.CommandInterpreter
besitzen.
Listing 10–2
Anpassungen im
Activator des »Hello
World«-Bundles II

Get Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.