Creation d'un bundle simple
Cet exemple montre un composant qui écoute et affiche
les
évènements du framework.
Du fait que le composant implémente l'interface BundleActivator,
il doit implémenter les méthodes start() et stop()
à travers lesquelles il recevra un BundleContext,
qui lui permet de s'abonner aux évènements du framework.
L'interface ServiceListener
est implémentée car le composant est
intéressé à ce type d'évènements
/* * OSGi and Gravity Service Binder tutorial. * Copyright (c) 2003 Richard S. Hall * http://oscar-osgi.sourceforge.net **/
package tutorial.example1;
import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.framework.ServiceListener; import org.osgi.framework.ServiceEvent;
/** * This class implements a simple bundle that utilizes the OSGi * framework's event mechanism to listen for service events. Upon * receiving a service event, it prints out the event's details. **/ public class Activator implements BundleActivator, ServiceListener { /** * Implements BundleActivator.start(). Prints * a message and adds itself to the bundle context as a service * listener. * @param context the framework context for the bundle. **/ public void start(BundleContext context) { System.out.println("Starting to listen for service events."); context.addServiceListener(this); }
/** * Implements BundleActivator.stop(). Prints * a message and removes itself from the bundle context as a * service listener. * @param context the framework context for the bundle. **/ public void stop(BundleContext context) { context.removeServiceListener(this); System.out.println("Stopped listening for service events.");
// Note: It is not required that we remove the listener here, // since the framework will do it automatically anyway. }
/** * Implements ServiceListener.serviceChanged(). * Prints the details of any service event from the framework. * @param event the fired service event. **/ public void serviceChanged(ServiceEvent event) { String[] objectClass = (String[]) event.getServiceReference().getProperty("objectClass");
if (event.getType() == ServiceEvent.REGISTERED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " registered."); } else if (event.getType() == ServiceEvent.UNREGISTERING) { System.out.println( "Ex1: Service of type " + objectClass[0] + " unregistered."); } else if (event.getType() == ServiceEvent.MODIFIED) { System.out.println( "Ex1: Service of type " + objectClass[0] + " modified."); } } }
Cette
classe
doit être enregistrée sous le nom Activator.java. Il faut
maintenant écrire un manifeste et packager le tout pour
procéder à l'installation dans le framework. Le fichier
manifeste est le suivant:
Bundle-Activator: tutorial.example1.Activator Bundle-Name: Service listener example Bundle-Description: A bundle that displays messages at startup and when service events occur Bundle-Vendor: Richard Hall Bundle-Version: 1.0.0
Ce fichier
doit être enregistré avec le nom manifest.mf
Pour
faciliter le développement, il est recommandé de
mettre le fichier manifeste à coté du fichier activator.
A
ce point là, la structure de notre projet doit être
similaire a ce qui suit:
Si on ne dispose pas de Ant
Ignorer
le fichier build.xml pour le moment.
La
compilation se réalise de la manière suivante (en se
placant dans le répertoire au dessus de src)
Creer le
répertoire classes/tutorial/example1
Ensuite
compiler (depuis le répertoire au dessus de src):
javac
-classpath lib/osgi.jar -d classes src/tutorial/example1/*.java
Création du JAR (depuis le répertoire au dessus
de src):
jar
cfm
bundle/example1.jar src/tutorial/example1/manifest.mf -C classes
tutorial/example1
Nous devons maintenant avoir un fichier example1.jar dans le
répertoire bundle, ce fichier est un bundle prêt à
être installé dans le framework
Si on dispose de Ant
Voici le
fichier build_example1.xml
permettant de construire le projet. Attention, il faut respecter la
structure montrée auparavant.
Le fichier
contient plusieurs cibles:
- clean: pour tout effacer
- compile: réaliser seulement la compilation
- init: creation des répertoires
- javadoc: creation de la documentation
- example1.bundle: creation du bundle
Si tout se
passe bien, à la fin de l'exécution de la cible
example1.bundle, nous trouverons un répertoire bundle avec un
fichier nommé example1.jar. Ce fichier est le bundle prêt
à être installé dans le framework
Installation du Bundle
Pour
installer le bundle, nous executons la commande install dans OSCAR:
->
install file:/chemin_du_projet/bundle/example1.jar
-> ps
[
0] [Active ] System Bundle
[
1] [Active ] Oscar Shell Service
[
2] [Active ] Shell TUI
[
3] [Active ] Oscar Bundle Repository
[
4] [Installed ] Service listener example
->
start 4
Starting
to listen for service events.
->
|
A ce point
le premier bundle est installé. Il n'est pas encore
très utile vu qu'il n'y à pas de services qui soient
enregistrés ou desenregistrés en ce moment...
|