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

311
18 Der Preferences Service
Motivation
In vielen Anwendungen ist es erforderlich, System- oder Benutzerein-
stellungen über den Start und Stopp des OSGi Frameworks hinweg
persistent abzulegen. Benutzereinstellungen sind dabei spezifische Ein-
stellungen eines einzelnen Benutzers, während Systemeinstellungen
unabhängig vom Benutzer zur Verfügung stehen.
In diesem Kapitel stellen wir Ihnen den Preferences Service vor, der
das Speichern und Auslesen von System- oder Benutzereinstellungen
ermöglicht. Die API des Service ist sehr stark der
java.util.Prefe-
rences
-API nachempfunden, die allerdings noch nicht finalisiert war,
als der Preferences Service entwickelt wurde.
Einordnung
Der Preferences Service ist spezifiziert in Kapitel 106 »Preferences
Service Specification« sowohl im OSGi Service Compendium als auch
in der OSGi Mobile Specification.
18.1 Tutorial: Persistieren der letzten Login-Zeit
Überblick
In Kapitel 17 haben wir ein login-Kommando implementiert, mit dem
sich ein Benutzer an der Anwendung anmelden kann. In diesem Tuto-
rial werden wir das Kommando erweitern, so dass der Benutzer nach
dem Login angezeigt bekommt, wann er sich zuvor das letzte Mal
angemeldet hatte. Diese Login-Informationen werden wir mit dem
Preferences Service verwalten.
Die Plug-in-Projekte
In diesem Beispiel erweitern wir das Plug-in-Projekt, das wir im
Tutorial zu Kapitel 17 angelegt haben. Die Struktur des Projektes (vgl.
Abb. 17-2) wird dabei nicht verändert.
18 Der Preferences Service312
Schritt 1: Importieren der benötigten Packages
Fügen Sie zunächst im Manifest des Bundles org.osgibook.console.
user den Import des Packages org.osgi.service.prefs für die Klassen
des Preferences Service hinzu:
Import-Package:
org.eclipse.osgi.framework.console;version="1.0.0",
org.osgi.framework;version="1.4.0",
org.osgi.service.component;version="1.0.0",
org.osgi.service.useradmin;version="1.1.0",
org.osgi.service.prefs;version="1.1.0"
Schritt 2: Anpassen der UserComponent
Erweitern Sie dann die Aktivator-Klasse. Wir benötigen zunächst einen
weiteren Service Tracker für den Preferences Service. In der
_login()-
Methode müssen wir nach dem Einloggen des Benutzers ermitteln,
wann sich dieser das letzte Mal angemeldet hatte, und das Datum aus-
geben. Diese Aufgabe wird in der Methode
showLastLogin() implemen-
tiert. Zudem legen Sie die Methode
recordLogin() an, in der Sie die
aktuelle Systemzeit in den Preferences des angemeldeten Benutzers
ablegen:
package org.osgibook.console.user;
import org.osgi.service.prefs.BackingStoreException;
import org.osgi.service.prefs.Preferences;
import org.osgi.service.prefs.PreferencesService;
[...]
PreferencesService
OSGi Service Platform /
Preferences Service
CommandProvider
verwendet
Klassen aus
verwendet
Service
OSGi Service Platform /
Declarative Services
Co a d o
der
MANIFEST.MF
META-INF
org.osgibook.console.user
UserAdmin
OSGi Service Platform /
User Admin Service
OSGI-INF
Abb. 18–1
Übersicht über die
beteiligten Bundles
Listing 18–1
Der Import-
Package-Header
Listing 18–2
Die Komponentenklasse
UserComponent
31318.1 Tutorial: Persistieren der letzten Login-Zeit
public class UserComponent implements CommandProvider {
private PreferencesService preferencesService;
[...]
protected void setPreferencesService(
PreferencesService preferencesService) {
this.preferencesService = preferencesService;
}
protected void unsetPreferencesService(
PreferencesService preferencesService) {
this.preferencesService = null;
}
public void _login(CommandInterpreter commandInterpreter) {
[...]
showLastLoginDateTime(user);
recordLoginDateTime(user);
}
private void recordLoginDateTime(User user) {
Preferences userPreferences = preferencesService.
getUserPreferences(user.getName());
String currentDateTime = DateFormat.getDateTimeInstance()
.format(new Date());
userPreferences.put("lastLogin", currentDateTime);
try {
userPreferences.flush();
} catch (BackingStoreException e) {
System.out.println(
"Login-Zeit konnte nicht gespeichert werden!");
}
}
private void showLastLoginDateTime(User user) {
Preferences userPreferences = preferencesService.
getUserPreferences(user.getName());
String lastLogin = userPreferences.get("lastLogin", null);
if (lastLogin == null) {
System.out.println("Sie waren noch nie angemeldet");
return;
}
System.out.println(
"Sie waren am " + lastLogin + " zuletzt angemeldet");
}
[...]
}
18 Der Preferences Service314
Schritt 3: Anpassen der Komponentenbeschreibung
Damit der Preferences Service in der User Component zur Verfügung
steht, muss er zusätzlich in der Komponentenbeschreibung spezifiziert
werden (vgl. Listing 18–3).
<?xml version="1.0"?>
<component name="userComponent">
<implementation
class="org.osgibook.console.user.UserComponent"/>
<service>
<provide interface=
"org.eclipse.osgi.framework.console.CommandProvider"/>
</service>
<reference name="userAdmin"
interface="org.osgi.service.useradmin.UserAdmin"
bind="setUserAdmin"
unbind="unsetUserAdmin"
/>
<reference name="preferencesService"
interface="org.osgi.service.prefs.PreferencesService"
bind="setPreferencesService"
unbind="unsetPreferencesService"
/>
</component>
Schritt 4: Ausführen des Beispiels
Starten Sie nun die Anwendung. Da in der Launch-Konfiguration aus
dem vorherigen Beispiel bereits der Preferences Service (Bundle
org.eclipse.equinox.preferences) enthalten ist, können Sie die Konfi-
guration unverändert übernehmen. Wenn Sie sich nun zunächst als
»andi« anmelden, sehen Sie die veränderte Nachricht nach dem Ein-
loggen:
osgi> login andi secret
User andi eingeloggt
Sie waren noch nie angemeldet
Loggen Sie sich nun erneut mit »andi« ein. Sie erhalten jetzt die Infor-
mation, wann Sie sich zuletzt angemeldet hatten:
osgi> login andi secret
User andi eingeloggt
Sie waren am 20.12.2007 14:46:16 zuletzt angemeldet
Da der Preferences Service seinen Datenbestand persistiert, bleiben die
Login-Informationen auch nach einem Neustart der OSGi Service Plat-
form erhalten.
Listing 18–3
Die Komponenten-
beschreibung
31518.2 Überblick über den Preferences Service
Damit haben Sie gesehen, wie Sie mit dem Preferences Service
Daten für einzelne Benutzer speichern und wieder auslesen können. Im
Folgenden werden wir Ihnen die Konzepte des Service im Detail vor-
stellen.
18.2 Überblick über den Preferences Service
Der Preferences Service stellt eine plattformunabhängige Schnittstelle
zum Speichern und Lesen von System- und Benutzereinstellungen zur
Verfügung, wobei die API des Preferences Service stark an die Prefe-
rences API der Java SE angelehnt ist. Die Preferences werden in einem
Backend Store abgelegt, dessen Realisierung abhängig von der OSGi-
Implementierung ist (vgl. Abb. 18–2).
Die Spezifikation des Preferences Service macht keine Aussage darü-
ber, wie die verwalteten Preferences persistiert werden die Art und
Weise der Speicherung und des Zugriffs auf die Daten wird ausdrück-
lich dem Anbieter der Preferences Services überlassen. Innerhalb der
Preferences-Service-Implementierung in Eclipse Equinox werden
bspw. Preferences in Form von Textdateien im Dateisystem (genauer
im Konfigurationsverzeichnis) abgelegt.
Preferences-Bäume
Preferences sind hierarchisch in Form eines Baumes organisiert.
Die Knoten eines Preferences-Baumes sind Objekte vom Typ
org.osgi.service.prefs.Preferences, wobei jeder Knoten genau einen
Elternknoten besitzen muss und beliebig viele Kindknoten besitzen
kann. Über entsprechende Methoden am
Preferences-Interface kann
durch den Preferences-Baum navigiert werden.
Jeder Preferences-Knoten kann eine Menge von Properties enthal-
ten, die in Form von Key-Value-Paaren abgelegt werden. Dabei wer-
den die Java-Basistypen
int, float, long, double und boolean sowie
String und byte[] unterstützt. Das Preferences-Interface definiert eine
Abb. 18–2
Der Preferences Service
OSGi Framework
Preferences
Service
Service
Preferences
DB

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