Les propriétés de
configuration de chaque service peuvent être décrites par des
métadonnées conformes à la spécification OSGi Metatype Service. Les métadonnées peuvent inclure des valeurs par défaut, des noms et des descriptions traduisibles, et des informations permettant la validation des valeurs d'entrée.
Le fichier XML généré est conditionné dans le bundle contenant
votre service dans le
répertoire OSGI-INF/metatype, conformément à la
spécification.
Pourquoi et quand exécuter cette tâche
La spécification de métadonnées pour décrire votre configuration est facultative ; elle offre les avantages suivants :
- les valeurs par défaut peuvent être séparées du code d'implémentation dans le fichier XML des métatypes dans lequel elles sont faciles à localiser ;
- les types de données appropriés et d'autres données de validation
peuvent être spécifiées pour chaque attribut, ce qui permet la
validation par l'analyseur syntaxique de la configuration et les
outils de développement et simplifie le code que vous rédigez pour
traiter les attributs ;
- votre configuration est incluse dans le schéma XML qui décrit la
configuration disponible
aux outils de
développement et à d'autres
utilitaires ;
- des noms et des
descriptions pouvant être traduits sont fournis pour chaque attribut
et apparaîtront dans les outils de développement.
Procédure
- Créez un fichier xml dans le répertoire OSGI-INF/metatype de votre bundle et ajoutez une déclaration d'espace de nom pour les espaces de nom des métatypes OSGi :
<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0">
</metatype:MetaData>
- Ajoutez un élément de définition de classe d'objet (OCD) devant contenir l'ensemble d'attributs avec un identificateur et, en option, un nom et une description. Spécifiez également un élément Designate afin de mapper la définition de classe d'objet au PID utilisé dans votre code et le fichier server.xml.
<OCD name="b2c" description="bundle two config" id="b2c-id">
</OCD>
<Designate pid="testBundleTwo">
<Object ocdref="b2c-id" />
</Designate>
- Ajoutez des éléments de définition d'attribut (AD) pour chaque propriété de configuration, dans l'élément de définition de classe d'objet (OCD). Chaque attribut requiert un identificateur qui est aussi utilisé dans le fichier server.xml et dans le code qui reçoit la configuration injectée. Il peut en option être associé à un nom et à une description qui
peuvent être utilisés par les outils de développement et d'autres
outils graphiques.
La spécification d'un type de données permet à l'environnement d'exécution de valider l'entrée pour ce type et simplifie votre code de traitement. La spécification d'une valeur par défaut utile permet à la configuration fournie par l'utilisateur d'être minimale et contient toutes les valeurs par défaut de configuration dans un emplacement connu :
<AD name="boolProperty" description="une propriété de type booléen" id="boolProp"
type="Boolean" default="false" />
- Ensuite, vous avez le fichier metatype.xml suivant :
<?xml version="1.0" encoding="UTF-8"?>
<metatype:MetaData xmlns:metatype="http://www.osgi.org/xmlns/metatype/v1.1.0">
<OCD name="b2c" description="bundle two config" id="testBundleTwo-2-id">
<AD name="textProperty" description="une propriété de type texte"
id="textProp" type="String" default="default string" />
<AD name="boolProperty" description="une propriété de type booléen"
id="boolProp" type="Boolean" default="false" />
<AD name="intProperty" description="une propriété de type entier"
id="intProp" type="Integer" default="14" />
</OCD>
<Designate pid="testBundleTwo-2">
<Object ocdref="testBundleTwo-2-id" />
</Designate>
</metatype:MetaData>
- Codez votre service en vue de la réception des propriétés de configuration.
Sans la description de métatype, toutes vos propriétés sont fournies sous forme de valeurs de type String et sont traitées comme suit :
String textProp = (String) properties.get("textProp");
Boolean boolProp = Boolean.parseBoolean((String) properties.get("boolProp"));
int intProp = Integer.parseInt((String) properties.get("intProp"));
String textProp = (String) properties.get("textProp");
Boolean boolProp = (Boolean) properties.get("boolProp");
int intProp = (Integer) properties.get("intProp");
Et l'environnement d'exécution aura déjà validé les valeurs d'entrée en vérifiant que leurs types sont corrects.