OUGF - Nouveautés OSGi Core 4.3

941 views
860 views

Published on

Published in: Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
941
On SlideShare
0
From Embeds
0
Number of Embeds
7
Actions
Shares
0
Downloads
24
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

OUGF - Nouveautés OSGi Core 4.3

  1. 1. Nouveautés OSGi Core 4.3 OSGi Users’ Group France Jeudi 24 novembre 2011 François Fornaciari - francois.fornaciari@zenika.comZenika © 2011 1
  2. 2. Historique  OSGi Specifications  Core (v4.3): plateforme minimale  Compendium (v4.2) : services additionnels  Enterprise (v4.2) : services orientés « entreprise »  OSGi Core 4.3 : mars 2011  Implémentations open-source  Eclipse Equinox 3.7 (Indigo)  Première livraison stable mars 2011  C’est la RI !  Apache Felix 4  Première livraison stable fin septembre 2011Zenika © 2011 2
  3. 3. <Generics> Introduction  Meilleure lisibilité du code  Meilleur typage des objets  Compatibilité avec le JRE 1.4  Utilisation de l’option de compilation -target jsr14  N’est pas une solution au code contenant des annotations dont la RetentionPolicy est à RUNTIME  Configuration Maven <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.5</source> <target>jsr14</target> </configuration> </plugin>Zenika © 2011 3
  4. 4. <Generics> Enregistrement de service  Avant OSGi 4.3 PrintService service = new PrintServiceImpl(); Properties props = new Properties(); props.put("color", "true"); bundleContext.registerService(PrintService.class.getName(), service, props);  OSGi 4.3 bundleContext.registerService(PrintService.class, service, props);  ComptabilitéZenika © 2011 4
  5. 5. <Generics> Recherche de service  Avant OSGi 4.3 ServiceReference reference = bundleContext.getServiceReference(PrintService.class.getName()); PrintService service = (PrintService) bundleContext.getService(reference);  OSGi 4.3 ServiceReference<PrintService> reference = bundleContext.getServiceReference(PrintService.class); PrintService service = bundleContext.getService(reference);  ComptabilitéZenika © 2011 5
  6. 6. <Generics> ServiceTracker (1/2)  Avant OSGi 4.3 ServiceTracker serviceTracker = new ServiceTracker(bundleContext, PrintService.class.getName(), null) { public Object addingService(ServiceReference ref) { // Méthode appelée lors de lajout au tracker dun service satisfaisant le filtre // Avantage : appelée à louverture du tracker pour chaque service déjà enregistré // Retourne un objet associé au service tracké (généralement le service détecté) return super.addingService(reference); } public void modifiedService(ServiceReference ref, Object service) { // Méthode appelée lors de la modification des propriétés dun service tracké } public void removedService(ServiceReference ref, Object service) { // Méthode appelée lors du retrait dun service tracké // Avantage : appelée à la fermeture du tracker pour chaque service tracké } }; serviceTracker.open(); PrintService service = (PrintService) serviceTracker.getService();Zenika © 2011 6
  7. 7. <Generics> ServiceTracker (2/2)  OSGi 4.3 ServiceTracker<PrintService, PrintService> serviceTracker = new ServiceTracker<PrintService, PrintService>(bundleContext, PrintService.class, null) { public PrintService addingService(ServiceReference<PrintService> ref) { return super.addingService(reference); } public void modifiedService(ServiceReference<PrintService> ref, PrintService s) { } public void removedService(ServiceReference<PrintService> reference, PrintService s) { } }; serviceTracker.open(); PrintService service = serviceTracker.getService();Zenika © 2011 7
  8. 8. <Generics> ServiceFactory  Création dun nouveau service à chaque lookup  Le service créé est associé au bundle consommateur  Un bundle récupérant deux fois le service reçoit la même instance public class PrintServiceFactory implements ServiceFactory<PrintService> { public PrintService getService(Bundle b, ServiceRegistration<PrintService> sr) { return new PrintServiceImpl(); } public void ungetService(Bundle b, ServiceRegistration sr, PrintService ps) { } } [...] // Enregistrement du service bundleContext.registerService(PrintService.class, new PrintServiceFactory() , null); [...] // Client PrintService service = bundleContext.getService((bundleContext.getServiceReference(PrintService.class)));Zenika © 2011 8
  9. 9. <Generics> BundleTracker (1/2)  Avant OSGi 4.3 BundleTracker bundleTracker = new BundleTracker(bundleContext, Bundle.ACTIVE, null) { public Object addingBundle(Bundle bundle, BundleEvent event) { // Méthode appelée lors de lajout au tracker dun bundle satisfaisant létat spécifié // Avantage : appelée à louverture du tracker pour chaque bundle déjà installé // Retourne un objet associé au bundle tracké [...] return object; } public void removedBundle(Bundle bundle, BundleEvent event, Object o) { // Méthode appelée lors du retrait dun des bundles trackés // Possibilité deffectuer des traitements sur lobjet associé au bundle // Avantage : appelée à la fermeture du tracker pour chaque bundle tracké } }; bundleTracker.open();Zenika © 2011 9
  10. 10. <Generics> BundleTracker (2/2)  OSGi 4.3 BundleTracker<String> bundleTracker = new BundleTracker<String> (bundleContext, Bundle.ACTIVE, null) { public String addingBundle(Bundle bundle, BundleEvent event) { // Méthode appelée lors de lajout au tracker dun bundle satisfaisant létat spécifié // Avantage : appelée à louverture du tracker pour chaque bundle déjà installé // Retourne un objet associé au bundle tracké [...] return "Objet tracké de type String"; } public void removedBundle(Bundle bundle, BundleEvent event, String o) { // Méthode appelée lors du retrait dun des bundles trackés // Possibilité deffectuer des traitements sur lobjet associé au bundle // Avantage : appelée à la fermeture du tracker pour chaque bundle tracké } }; bundleTracker.open();Zenika © 2011 10
  11. 11. Capabilities & Requirements Introduction  Jusqu’à présent le framework s’occupait de la résolution des bundles en faisant correspondre des packages importés avec des packages exportés  Depuis OSGi 4.3, généralisation des concepts de dépendances  Un bundle peut offrir un Capability personnalisable  Un bundle peut exprimer une dépendance vers au travers d’un Requirement  Prise en compte lors de la résolution d’un bundle  Permet de définir des dépendances qui ne sont pas des dépendances de code  Ex : nombre minimal de cœurs CPUZenika © 2011 11
  12. 12. Capabilities & Requirements Définition (1/2)  Capability  Un set d’attributs (couple clé/valeur) associé à un namespace  Requirement  Un filtre sur des attributs appartenant à un namespace  Namespace réservés  osgi.wiring.package  Import-Package, DynamicImport-Package et Export-Package  osgi.wiring.bundle  Require-Bundle, Bundle-SymbolicName et Bundle-Version  osgi.wiring.host  Fragment-Host, Bundle-SymbolicName et Bundle-VersionZenika © 2011 12
  13. 13. Capabilities & Requirements Définition (2/2)  Déclaration de le fichier MANIFEST  Capability Provide-Capability: com.zenika.formation; year:Long=2011; effective:=resolve  Requirement (filtre LDAP) Require-Capability: com.zenika.formation; filter:="(year=2011)"  Déclaration de l’environnement d’exécution requis  Avant OSGi 4.3 (déprécié) Bundle-RequiredExecutionEnvironment: JavaSE-1.6  OSGi 4.3 Require-Capability: osgi.ee;filter:="(&(osgi.ee="JavaSE")(version>=1.6))"Zenika © 2011 13
  14. 14. Core Services  Package Admin Service  Start Level Service  Conditionnal Permission Service  Bundle Wiring API  Start Level API  Service Hook Service  Resolver Hook Service  Weaving Hook Service  URL Handler Services  Remote ServicesZenika © 2011 14
  15. 15. Package Admin Service Rappel  Service permettant danalyser et dagir sur les dépendancesZenika © 2011 15
  16. 16. Start Level Service Rappel  Service permettant de gérer la séquence dactivation des bundlesZenika © 2011 16
  17. 17. Deprecated services  « Package Admin Service » et « Start Level Service » sont dépréciés  Utilisés par les outils d’administration de plateformes OSGi  Shells OSGi  Console de management web de Felix  Servers d’applications  Etc.Zenika © 2011 17
  18. 18. Nouveaux services OSGi 4.3  Remplacement de « Package Admin Service » par « Bundle Wiring API » et de « Start Level Service » par « Start Level API »  A lorigine, choix dune approche orientée service (dynamique) mais ce design nétait pas suffisamment orienté objet (passage de lobjet bundle à chaque méthode)  Nouvelle représentation des « Wiring » entre bundles en se basant sur l’introduction des concepts de « Capability » et « Requirement »Zenika © 2011 18
  19. 19. Bundle Wiring API (1/4)  A chaque résolution de bundle, un objet de type BundleWiring est créé pour une révision donnée  A noter : chaque mise à jour dun bundle déclenche la création dune nouvelle révision. Seule une opération de « refresh » permet de forcer la rafraichissement des liaisons entre les bundles  Permet de récupérer les informations de dépendance  Nom symbolique, version, etc.  Packages requis / fournis, fragments, etc.  Représentation des liaisons au « runtime »Zenika © 2011 19
  20. 20. Bundle Wiring API (2/4)Zenika © 2011 20
  21. 21. Bundle Wiring API (3/4)  Exemple de récupération des packages importés BundleWiring bundleWiring = bundleContext.getBundle().adapt(BundleWiring.class); for (BundleWire wire : bundleWiring.getRequiredWires("osgi.wiring.package")) { String packageName = (String) wire.getCapability().getAttributes().get("osgi.wiring.package"); Bundle bundle = wire.getProviderWiring().getBundle(); [...] }  Namespaces osgi.wiring.bundle et osgi.wiring.hostList<BundleCapability> capabilities = bundleWiring.getCapabilities(null);for (BundleCapability bundleCapability : capabilities) { System.out.println(bundleCapability.toString());}// En sortie de la consoleosgi.wiring.bundle; osgi.wiring.bundle="zenika-bundle"; bundle-version:Version="1.0.0"osgi.wiring.host; osgi.wiring.host="zenika-bundle"; bundle-version:Version="1.0.0"Zenika © 2011 21
  22. 22. Bundle Wiring API (4/4) Collection<String> resources = bundleWiring.listResources("/", "*.properties", BundleWiring.LISTRESOURCES_RECURSE); Collection<URL> resources = bundleWiring.findEntries("/", "*.class", BundleWiring.FINDENTRIES_RECURSE);Zenika © 2011 22
  23. 23. Start Level API  Manipulation des informations de « StartLevel » BundleStartLevel bundleStartLevel = bundleContext.getBundle().adapt(BundleStartLevel.class); int startLevel = bundleStartLevel.getStartLevel();  Opérations à partir du « System Bundle » FrameworkStartLevel frameworkStartLevel = bundleContext.getBundle(0).adapt(FrameworkStartLevel.class); int initialBundleStartLevel = frameworkStartLevel.getInitialBundleStartLevel();Zenika © 2011 23
  24. 24. Service Hook Rappel (1/2)  Spécification permettant dinteragir avec le « service engine » : depuis OSGi 4.2  Connaître les services requis par les bundles  Limiter la visibilité de certains services  Mettre facilement en œuvre des proxies de services  Trois types dinteractions  Event Hook : intercepte les évènements liés au cycle de vie des services (enregistrement / désenregistrement / modification)  Filtrer tout ou partie des évènements reçus par les bundles  Find Hook : intercepte la recherche de références de services  Manipuler les références de services demandées  Listener Hook : intercepte la création et la suppression de ServiceListener  Avoir la connaissance des services potentiellement utilisés par les bundlesZenika © 2011 24
  25. 25. Service Hook Rappel (2/2) public interface EventHook { // contexts : contextes vers lesquels les évènements sont propagés // (peuvent être modifiés) void event(ServiceEvent event, java.util.Collection contexts); } public interface FindHook { // allServices : filtre sur getServiceReferences() // ou getAllServiceReferences() void find(BundleContext context, java.lang.String name, java.lang.String filter, boolean allServices, java.util.Collection references); } public interface ListenerHook { void added(java.util.Collection listeners); void removed(java.util.Collection listeners); }Zenika © 2011 25
  26. 26. Nouvelles interceptions (1/2)  Ajout de trois nouveaux mécanismes dinterception depuis la version 4.3  Weaving Hook  Permet dintercepter le chargement de classe des bundles et de manipuler le bytecode avant chargement  Les nouvelles classes générées peuvent dépendre de nouvelles classes, doù la possibilité de modifier au runtime lattribut DynamicImport-Package du fichier MANIFEST  Resolver Hook  Permet dintercepter le mécanisme de résolution de packages et dinfluencer le resolver  Exemple : limiter la visibilité de certains packagesZenika © 2011 26
  27. 27. Nouvelles interceptions (2/2)  Bundle Hook  Permet dintercepter les évènements du framework à propos du cycle de vie des bundles (Event Hook)  Permet de limiter la visibilité de certains bundles (Find Hook)  Le trio «Service Hook », « Resolver Hook » et « Bundle Hook » offre un mécanisme efficace pour introspecter le framework et agir sur son comportement  Cas dutilisation : isoler plusieurs applications sexécutant sur le même framework  Alternative aux mécanismes de sécurité offerts par la plateformeZenika © 2011 27
  28. 28. Resolver Hook Service Mise en œuvre  Enregistrement dun service de type ResolverHookFactory  A chaque tentative de résolution dun bundle par le framework, création dune instance de ResolverHook  Possibilité de filtrer la résolution dun bundle ou la résolution de packages spécifiquesZenika © 2011 28
  29. 29. Bundle Hook Service Mise en œuvre  Event Hook : intercepte les évènements liés au cycle de vie des bundles (install / start / update / …) avant de les émettre aux différents listeners  Filtrer les évènements reçus par les bundles  Find Hook : intercepte les appels aux méthodes de récupération des bundles présents sur la plateforme  Manipuler la liste de bundles retournéesZenika © 2011 29
  30. 30. Virgo regions  Eclipse Virgo 3.0 s’appuie sur les mécanismes d’interception pour créer des régions isolées  Précédemment implémentées par les « nested framework » qui ont été abandonnés  Plan de contribution des régions dans EquinoxZenika © 2011 30
  31. 31. Ressources  Spécifications OSGi http://www.osgi.org  OSGi Wiki http://en.wikipedia.org/wiki/OSGi  Billets de blog http://jaxenter.com/what-s-new-in-core-4-3-36450.html http://www.infoq.com/news/2011/03/osgi-43Zenika © 2011 31
  32. 32. Zenika © 2011 32

×