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

73
5 Package-Abhängigkeiten zwischen
Bundles
Motivation
In den letzten beiden Kapiteln haben wir Ihnen an einem einfachen
»Hello World«-Bundle den grundsätzlichen Aufbau und den Leben-
zyklus von Bundles vorgestellt. In diesem Kapitel werden wir unser
Beispiel um ein zweites Bundles erweitern und Ihnen demonstrieren,
wie Sie in einem Bundle auf Klassen und Ressourcen eines anderen
Bundles zugreifen. Da diese Nutzung von Klassen und Ressouren
innerhalb der OSGi Service Platform über das Ex- und Importieren
von (Java-) Packages realisiert ist, sprechen wir hier auch von Package-
Abhängigkeiten zwischen Bundles.
Um das explizite Ex- und Importieren von Klassen und Ressourcen
realisieren zu nnen, macht das OSGi Framework intensiven
Gebrauch vom Java-Class-Loading-Mechanismus. Wir werden Ihnen
deshalb erläutern, wie die OSGi Service Platform diese Mechanismen
nutzt, um Bundles voneinander zu isolieren.
Einordnung
Die in diesem Abschnitt beschriebenen Konzepte sind logisch in
der Module-Schicht des OSGi Frameworks angesiedelt. Sie ergänzen
die in Kapitel 3 vorgestellten Konzepte und legen fest, wie das OSGi
Framework (Package-)Abhängigkeiten zwischen Bundles realisiert.
Die Spezifikation der in diesem Kapitel vorgestellten Konzepte können
Sie in Kapitel 3 der OSGi Core Specification [OSCS07] nachlesen.
Abb. 5–1
Einordnung in die
logischen Framework-
Schichten
OSGi Framework
Specification
Module-Schicht
Lifecycle-Management-Schicht
Service-Schicht
Secu-
rity
Framework
Services
5 Package-Abhängigkeiten zwischen Bundles74
5.1 Tutorial: Ein »Translation«-Bundle
Überblick
Wir erweitern unser Beispiel in diesem Kapitel um das Bundle
org.osgibook.translation, das einen Translation Service implemen-
tiert, mit dessen Hilfe der Gruß des »Hello World«-Bundles in unter-
schiedlichen Sprachen ausgegeben werden kann (vgl. Abb. 5–2).
Das Package
org.osgibook.translation enthält das Interface Trans-
lationService
und die Klasse TranslationServiceFactory, mit der
Instanzen des Translation Service erzeugt werden. Dieses Package wird
vom »Translation«-Bundle exportiert und ist somit nach außen sicht-
bar.
Das Package
org.osgibook.translation.impl enthält die Klasse
TranslationServiceImpl, die das Interface TranslationService imple-
mentiert. Dieses Package ist nach außen nicht sichtbar.
Die Plug-in-Projekte
In Abb. 5–3 ist der Aufbau der fertigen Beispielprojekte aus diesem
Kapitel dargestellt.
Abb. 5–2
Das »Translation«-Bundle
MANIFEST.MF
META-INF
org.osgibook.helloworld
verwendet
Klassen aus
META-INF
MANIFEST.MF
org.osgibook.translation.impl
org.osgibook.translation
META
-
INF
M
ANIFE
S
T.M
F
Bundle-SymbolicName: org.osgibook.translation
Abb. 5–3
Die Plug-in-Projekte
755.1 Tutorial: Ein »Translation«-Bundle
Neben den Implementierungen der bereits beschriebenen Klassen
befinden sich in dem Projekt eine Reihe von Property-Dateien. Diese
Property-Dateien enthalten die Übersetzungen der Gruß-Botschaften,
die beim Start und beim Stopp des »Hello World«-Bundles ausgegeben
werden.
Schritt 1: Implementation des »Translation«-Bundles
Legen Sie mithilfe des Plug-in-Project-Wizards ein neues Plug-in-Pro-
jekt mit dem Namen
org.osgibook.translation an. Da das »Trans-
lation«-Bundle keine Activator-Klasse benötigt, können Sie beim
Anlegen des Projektes die Option Generate an Activator auf der Seite
Plug-in content des Wizards deselektieren. Der Wizard legt dann keine
Activator-Klasse an und generiert auch keinen entsprechenden Eintrag
im Bundle Manifest.
Nach dem Anlegen des Projektes implementieren Sie das Interface
TranslationService im Package org.osgibook.translation wie folgt:
package org.osgibook.translation;
public interface TranslationService {
public String getTranslation(String key);
}
Anschließend legen Sie im Package org.osgibook.translation.impl die
Klasse
TranslationServiceImpl an:
package org.osgibook.translation.impl;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.osgibook.translation.TranslationService;
public class TranslationServiceImpl implements TranslationService {
private ResourceBundle translations;
public TranslationServiceImpl(Locale locale) {
// ACHTUNG: das ResourceBundle heißt zwar 'Bundle',
// hat aber nichts mit den OSGi Bundles zu tun!
try {
translations =
ResourceBundle.getBundle("translation", locale);
} catch (MissingResourceException e) {
translations = ResourceBundle.getBundle("translation",
new Locale("de", "DE"));
}
}
Listing 5–1
TranslationService.java
Listing 5–2
TranslationService-
Impl.java
5 Package-Abhängigkeiten zwischen Bundles76
public String getTranslation(String key) {
try {
return translations.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
}
Legen Sie nun im Package org.osgibook.translation die Klasse
TranslationServiceFactory an, über die Sie eine Instanz des Translation
Service erzeugen können:
package org.osgibook.translation;
import java.util.Locale;
import org.osgibook.translation.impl.TranslationServiceImpl;
public class TranslationServiceFactory {
private static TranslationService translationService;
public static TranslationService getTranslationService() {
if (translationService == null) {
translationService =
new TranslationServiceImpl(Locale.getDefault());
}
return translationService;
}
}
Die java.util.ResourceBundles, die in der Klasse TranslationService-
Impl verwendet werden, arbeiten mit Property-Dateien, die jeweils die
Übersetzungen für eine Sprache enthalten. Legen Sie exemplarisch eine
Property-Datei für Englisch und Deutsch an sowie eine Default-Datei,
auf die der Translation Service zurückgreift, wenn er für die gewählte
Sprache keine Property-Datei findet. Die drei Dateien müssen sich im
src-Verzeichnis Ihres Bundle-Projektes befinden und der Namenskon-
vention
translation_<locale>.properties entsprechen:
translation_de_DE.prop erties:
hello = Hallo OSGi-Welt sagt Bundle %s!
goodbye = Tschüß OSGi-Welt sagt Bundle %s!
translation_en_US.prop erties:
hello = Hello OSGi World from bundle %s!
goodbye = Goodbye OSGi World from bundle %s!
Listing 5–3
TranslationService-
Factory.java
Listing 5–4
Die Lokalisations-
dateien
775.1 Tutorial: Ein »Translation«-Bundle
translation.properties:
hello = Hallo OSGi-Welt sagt Bundle %s!
goodbye = Tschüß OSGi-Welt sagt Bundle %s!
Damit Sie den Translation Service außerhalb des Bundles nutzen kön-
nen, müssen Sie das Package
org.osgibook.translation, das das Trans-
lationService
-Interface enthält, r andere Bundles sichtbar machen,
indem Sie es explizit exportieren. Dazu fügen Sie in der Manifest-Datei
folgenden Eintrag hinzu
1
:
Export-Package: org.osgibook.translation
Schritt 2: Anpassen des »Hello World«-Bundles
Nachdem Sie den Translation Service implementiert haben, können Sie
diesen innerhalb des »Hello World«-Bundles einsetzen. Dazu passen
Sie die greet()-Methode des Activators an, so dass diese den Trans-
lation Service zum Übersetzen der Nachrichten verwendet. In der
start()- und stop()-Methode der Activator-Klasse übergeben Sie
dann nur noch den Key der Nachricht:
package org.osgibook.helloworld;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgibook.translation.TranslationService;
import org.osgibook.translation.TranslationServiceFactory;
public class Activator implements BundleActivator {
public void start(BundleContext context) throws Exception {
greet("hello", context.getBundle().getSymbolicName());
}
public void stop(BundleContext context) throws Exception {
greet("goodbye", context.getBundle().getSymbolicName());
}
protected void greet(String key, Object... args) {
TranslationService translatorService =
TranslationServiceFactory.getTranslationService();
String translatedMsg = translatorService.getTranslation(key);
1. Sie können die zu exportierenden Packages alternativ auch im Plug-in-Manifest-
Editor auf der Seite »Runtime« unter »Exported Packages« mit der »Add...«-
Schaltfläche hinzufügen.
Listing 5–5
Der Activator des
»Hello World«-Bundles

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