UPMC Paris Universitas Master d'informatique M1/STL/CPS 1 TME 5 plateforme OSGi Frédéric Peschanski 26 mars 2008 Ce sujet de TME est un tutoriel à la technologie OSGi, une plateforme industrielle pour les composants binaires et les architectures orientées service. Exercice 1 : bundle Hello Dans un premier temps, nous allons implémenter un composant (bundle dans la terminologie OSGi) minimal : le fameux hello world. On commencera par récupérer sur le site de l'ue le squelette CPS-TME5-HelloBundle-skel.jar. Ce squelette contient : build.xml : le chier de construction ant build.properties : les propriétés éditables pour le chier de construction manifest : le répertoire du manifeste Jar/OSGi (vide) src : le répertoire des sources (pour l'instant vide) Pour démarrer, ne pas oublier d'éditer les propriétés du chier build.properties Question 1.1 : Classe d'activation Un bundle contient au minimum une classe d'activation dont la responsabilité concerne le démarrage (état start) et l'arrêt (état stop) dans le cycle de vie du composant. Voici un extrait du code source de l'interface d'activation à implanter : package org.osgi.framework ; import org.osgi.framework.bundlecontext ; public interface BundleActivator { public void start(bundlecontext context) throws Exception ; public void stop(bundlecontext context) throws Exception ; } La méthode start explique ce qu'il se produit lorsque le composant est démarré, et la méthode stop en décrit l'arrêt. Dans le paquetage hellobundle implémenter une class d'activation HelloActivator qui ache simplement un message Hello world au démarrage, et un message Goodbye world à l'arrêt.
UPMC Paris Universitas Master d'informatique M1/STL/CPS 2 Question 1.2 : Manifeste Le deuxième constituant d'un composant OSGi est un chier de manifeste, basé sur le format des manifestes jar. Bundle-ManifestVersion : 2 Bundle-Name : <A compléter> Bundle-SymbolicName : <A compléter> Bundle-Version : <A compléter> Bundle-Activator : <A compléter> Bundle-Vendor : <A compléter> Import-Package : org.osgi.framework ;version="1.3.0" Export-Package : <A compléter> Nous allons placer le manifest dans un chier HelloBundle.manifest situé dans le répértoire manifest/. Les propriétés à compléter sont les suivantes : Bundle-Name le nom explicatif du composant : une chaîne de caractères quelconque Bundle-SymbolicName le nom symbolique du composant : un identicateur Java Bundle-Version le numéro de version du composant : au format M.m.r avec M numéro de version Majeure, m version mineure et r numéro de release (des entiers positifs). Bundle-Vendor l'institution, société ou personne responsable du composant (en termes de distribution) Import-Package un paquetage à importer pour le bon fonctionnement du composant : au moins le paquetage standard de la plateforme OSGi Export-Package paquetage exporté par le bundle (partie publique) Question 1.3 : Empaquetage Nous pouvons maintenant déployer notre composant. La première étape concerne la compilation du code source. La cible ant correspondante est compile. Une fois le code compilé sans erreur, il nous faut créer le chier d'archive jar qui devra contenir : les classes compilées (répertoire build) le chier de manifeste (dans manifest/hellobundle.manifest) La tâche d'empaquetage est décrite par la cible makebundle. Attention : il faut saisir dans build.properties les propriétés liées au bundle (nom symbolique et numéro de version). Si tout se passe bien, un chier HelloBundle_1.0.0.jar est créé dans le répertoire dist/. Vérier le contenu de cette archive. Question 1.4 : Déploiement Pour déployer notre composant HelloBundle nous avons besoin d'une implémentation de la plateforme OSGi. Il en existe plusieurs, notamment Felix 1 de la fondation Apache, Knoppersh 2 et 1 http://felix.apache.org 2 http://www.knopflerfish.org/
UPMC Paris Universitas Master d'informatique M1/STL/CPS 3 nalement Equinoxe 3 de la fondation Eclipse. Dans ce TME, nous allons utiliser Equinoxe qui a l'avantage d'être disponible sur les machines puisque au c ur de l'environnement Eclipse. la cible startosgi du build.xml lance dans un terminal la console OSGi implémentée dans Equinoxe. On peut lancer manuellement cette console par la ligne de commande suivante : > java -jar /usr/share/eclipse/plugins/org.eclipse.osgi_3.3.0.v20070530.jar -console ou encore avec la commande eclipse -console (mais cela démarre également toute place plateforme Eclipse). Une fois la console lancée, l'invite de commande est aché : osgi> On peut taper la commande help pour obtenir de l'aide (en anglais) sur les commandes disponibles. Les commandes principales sont : install <URL> : installer un bundle uninstall <id> pi <nom> : désinstaller un bundle start <id> pi <nom> : démarrer un bundle stop <id> pi <nom> : arrêter un bundle ss : liste des bundles disponibles et leur statut bundle<id> pi <nom> : informations sur un bundle shutdown : arrêter le framework OSGi launch : relancer le framework OSGi close : arrêter le framework OSGi et quitter la console Pour installer notre composant, on utilisera la ligne de commande suivante : osgi> install le :///<Chemin absolu vers le chier bundle> On pourra ensuite démarrer ou arrêter le composant avec les commande start ou stop. On peut donner en référence soit l'identicateur numérique de bundle (vérier avec la commande ss) ou le nom symbolique utilisé. Remarque : on n'oubliera pas de désinstaller le bundle avec la commande uninstall Exercice 2 : Marque-page internet Dans ce second exercice nous allons créer un service au sens de la plateforme OSGi. Il s'agira d'un simple service de gestion de marque page internet. On commence par créer l'arborescence du projet Bookmark en s'inspirant de l'exercice 1 4. 3 http://www.eclipse.org/equinox/ 4 En règle général, chaque bundle OSGi possède son propre répertoire de développement.
UPMC Paris Universitas Master d'informatique M1/STL/CPS 4 Question 2.1 : service Bookmark Un service OSGi est décrit par une interface Java quelconque. Dans un paquetage dédié (préxe bookmark), décrire l'interface BookmarkService qui permet de manipuler le marque page. Chaque entrée du marque page contient le nom du site enregistré ainsi que son URL. L'interface proposée est la suivante : package cpsweb.bookmark ; public interface BookmarkService { public void register(string site, String url) ; public String ndurl(string site) ; public String listall() ; } Question 2.2 : implémentation Proposer une implémentation simple du service de marque-page dans le répertoirecpsweb.bookmark.impl. Question 2.3 : classe d'activation On crée la classe d'activation cpsweb.bookmark.bookmarkactivator régissant le démarrage et l'arrêt du composant marque-page. Pour le démarrage du service (méthode start), on créera tout d'abord une instance de l'implémentation du marque-page (stockée sous la forme d'un attribut de la classe d'activation). Ensuite nous devons enregistrer le service auprès de la plateforme en utilisant la méthode registerservice de BundleContext (dont une instance est passée en paramètre à la méthode start). La signature de cette méthode est la suivante : ServiceRegistration registerservice(string name, Object impl, Properties props) ; L'argument name est le nom du service, on utiliser "cpsweb.bookmark.bookmarkservice". L'instance de l'implémentation sera passée comme impl. Finalement un dictionnaire de propriétés - ou méta-données - associé au service est également passé en argument. Ces méta-données permettent de décrire plus précisément le service enregistré (ou plutôt son implémentation). On ajoutera une méta-donnée de nom "category" et de valeur "personal" pour expliquer qu'il s'agit d'un marque-page à usage personnel. L'instance de org.osgi.serviceregistration qui est retournée par la méthode registerservice sera stockée sous la forme d'un attribut reg initialement à null.x A l'arrêt du composant, on forcera la récupération mémoire du marque-page, et si nécessaire le désenregistrement de reg (méthode unregister et sa récupération. Question 2.4 : déploiement On procédera ensuite au déploiement du composant, en n'oubliant pas de saisir des informations correctes pour le manifeste. Il faut notamment exporter le paquetages cpsweb.bookmark.
UPMC Paris Universitas Master d'informatique M1/STL/CPS 5 Question 2.5 : client du marque page Sur le site de l'ue, récupérer l'archive CPS-TME5-BookmarkClient-20080321.jar qui contient tout ce qu'il faut pour fabriquer un composant client pour le service de marque-page. On regardera chaque chier pour en comprendre le rôle. Modier éventuellement tout ce qu'il vous semble nécessaire. Après compilation et fabrication du Buncle, déployer le client et le démarrer. Que se passe-t-il?