25714.3 Beschreibung von Metatyp-Informationen in XML
14.3.2 Zuordnung zu ManagedService und ManagedServiceFactory
Bislang haben Sie gesehen, wie Sie die Metatyp-Information von Kon-
figurationen in Form von Object-Class-Definitionen angeben. Wenn
Sie den Metatype-Service zusammen mit dem Config Admin Service
nutzen, müssen Sie diese Metatype-Informationen zusätzlich den ent-
sprechenden Managed Services (bzw. den Managed Service Factories)
zuordnen. Um eine entsprechende Zuordnung zu treffen, müssen Sie
das
Designate-Element verwenden, das u.a. über die in Tabelle 14–4
aufgeführten Attribute verfügt.
Die zugehörige Object-Class-Definition referenzieren Sie mit dem
Object-Unterelement. Im folgenden Beispiel wird dem Managed Service
mit der PID
org.osgibook.translation.TranslationService die Object-
Class-Definition mit der ID
org.osgibook.translation. TranslationService
zugeordnet:
<Designate pid="org.osgibook.translation.TranslationService">
<Object
ocdref="org.osgibook.translation.TranslationService"/>
</Designate>
14.3.3 Lokalisierung
Um die Namen und die Beschreibungen von Object-Classes und deren
Attribute in Management Agents in unterschiedlichen Sprachen anzu-
zeigen, können verschiedene Werte innerhalb einer Metatype-Defini-
tion lokalisiert werden. Dies betrifft die Werte der XML-Attribute
name, description und icon einer Object-Class-Definition sowie die
Werte der XML-Attribute
name, description und label der Attribute-
Definition.
Verwendung von
Properties
Wenn Sie einen der Werte lokalisieren möchten, tragen Sie in der
XML-Datei nicht den eigentlichen Wert ein, sondern nur den Namen
einer Property. Diese Property müssen Sie dann in einer oder mehrerer
l10n-Dateien mit den entsprechenden, übersetzten Werten versehen.
Um dem Metatype Service anzuzeigen, dass es sich bei dem Wert eines
Attributs nicht um den tatsächlichen Wert, sondern um ein zu loka-
lisierendes Property handelt, geben Sie vor dem Namen des Propertys
ein
%-Zeichen ein:
Name Optional Beschreibung
pid nein Die PID eines Managed Service
factoryPid ja Die PID einer Managed Service Factory
bundle ja Die Location des Bundles, das die PID implementiert
Tab. 14–4
XML-Attribute
des Designate-Elements
14 Der Metatype Service258
<OCD id="org.osgibook.translation.TranslationService"
description="%translationServiceDescription"
name="%translationServiceName">
. . .
</OCD>
Die Lokalisierungs-
dateien
Die lokalisierten Werte der Properties hinterlegen Sie dann in Pro-
perty-Dateien im
OSGI-INF/l10n-Verzeichnis, wobei die einzelnen
Dateien mit dem Präfix »
bundle_« beginnen und mit dem Ländercode
enden müssen (vgl. Abb. 14–7).
Die Lokalisierungsdateien müssen für alle in der Metatype-Definition
angegebenen Properties entsprechende Übersetzungen enthalten. Das
folgende Beispiel zeigt die Übersetzungen für die deutsche Sprache:
translationServiceName=Translation-Service-Konfiguration
translationServiceDescripion=
Die Konfiguration des Translation Service
Wenn Sie die Lokalisierungsdateien in einem anderen Verzeichnis oder
mit einem anderen Namen verwenden möchten, können Sie am
meta-
type
-Element das localization-Attribut verwenden, um dem Meta-
type-Service einen alternativen Ort für die Property-Dateien anzuge-
ben. Der Wert, den Sie dort angeben, wird als relativer Pfad zum Root-
Verzeichnis Ihres Bundles interpretiert. Wenn Sie Ihre Property-
Dateien bspw. in dem Verzeichnis
i18n ablegen und mit dem Präfix
messages beginnen lassen möchten, verwenden Sie folgenden Eintrag:
<?xml version="1.0" encoding="UTF-8"?>
<metatype:MetaData
xmlns:metatype=http://www.osgi.org/xmlns/metatype/v1.0.0"
localization="i18n/mes sages" >
. . .
</metatype>
Abb. 14–7
Lokalisierungsdateien
im Ordner OSGI-INF/l10n
META-INF
org.osgibook.translation.internal
TranslationService,
ManagedService
OSGI-INF
metatype
metatype.xml
l10n
bundle_de_DE.properties
Listing 14–2
Die Datei
bundle_de_DE.properties
25914.4 Programmatische Abfrage von Metadaten
14.4 Programmatische Abfrage von Metadaten
Das Auslesen und Interpretieren von Metatype-Informationen erfolgt
in der Regel durch den Management Agent, der die bereitgestellten In-
formationen zur Erzeugung von dynamischen Eingabemasken verwen-
det. Es ist aber über den Metatype Service durchaus möglich, die Me-
tatype-Informationen in eigenen Bundles programmatisch auszulesen.
14.4.1 Das Interface MetaTypeService
Der zentrale Service zum Abfragen der Metatype-Informationen eines
Bundles ist über das Interface
MetaTypeService definiert. Dieses Inter-
face enthält eine einzige Methode
getMetaTypeInformation(Bundle), die
zu einem Bundle die definierten Metatype-Informationen zurückliefert
(vgl. Listing 14–3).
package org.osgi.service.metatype;
import org.osgi.framework.Bundle;
public interface MetaTypeService {
public MetaTypeInformation getMetaTypeInformation(
Bundle bundle);
}
Das Interface
MetaTypeInformation
Die getMetaTypeInformation()-Methode liefert Ihnen die Metadaten
eines Bundles in Form eines Objektes vom Typ
MetaTypeInformation
zurück. Über die Methoden getPids() und getFactoryPids() können Sie
alle innerhalb des Bundles definierten PIDs bzw. Factory PIDs abfra-
gen, für die Object-Class-Definitionen vorhanden sind (vgl. Listing
14–4).
package org.osgi.service.metatype;
import org.osgi.framework.Bundle;
public interface MetaTypeInformation extends MetaTypeProvider {
public String[] getPids();
public String[] getFactoryPids();
public Bundle getBundle();
}
Das Interface
MetaTypeProvider
Das Interface MetaTypeInformation erweitert das Interface MetaTypePro-
vider
, über das zusätzlich die in Listing 14–5 aufgeführten Methoden
zur Verfügung stehen.
Listing 14–3
Das Interface
MetaTypeService
Listing 14–4
Das Interface
MetaTypeInformation
14 Der Metatype Service260
package org.osgi.service.metatype;
public interface MetaTypeProvider {
public ObjectClassDefinition getObjectClassDefinition(
String id, String locale);
public String[] getLocales();
}
Über die Methode getLocales() können alle für ein Bundle definierten
Locales abgefragt werden. Um die Object-Class-Definitionen eines
Bundles abzufragen, verwenden Sie die Methode
getObjectClassDefi-
nition(String id, String locale)
. Diese Methode liefert Ihnen zu einer
ID (bspw. einer PID oder Factory PID) und einem Locale die entspre-
chende Object-Class-Definition zurück.
Das nachfolgende Beispiel zeigt, wie Object-Class-Definitionen über
den
MetaTypeService abgefragt werden können:
MetaTypeService metaTypeService = ...
MetaTypeInformation metaTypeInformation = metaTypeService
.getMetaTypeInformation(bundleContext.getBundle());
String[] pids = metaTypeInformation.getPids();
String[] locales = metaTypeInformation.getLocales();
String locale = null;
if (locales != null) {
// Wir verwenden die erste Übersetzung, die existiert
locale = locales[0];
}
ObjectClassDefinition objectClassDefinition =
metaTypeInformation.getObjectClassDefinition(
pids[0], locale);
14.4.2 Das Interface ObjectClassDefinition
In der Metadaten-XML-Datei haben Sie mit dem OCD-Element eine
Object-Class-Definition beschrieben. Diese Definition steht Ihnen über
die API des Metatype Service in Form des
ObjectClassDefinition-Inter-
face zur Verfügung (vgl. Listing 15-6):
Listing 14–5
Das Interface
MetaTypeProvider

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

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.