36
Foutse Khomh © Guéhéneuc 2009; Khomh 2010 Département de génie informatique et de génie logiciel École Polytechnique de Montréal LOG4430 : Architecture logicielle et conception avancée Cadres de référence et plugiciels

LOG4430 : Architecture logicielle et conception avancée

  • Upload
    titus

  • View
    47

  • Download
    11

Embed Size (px)

DESCRIPTION

LOG4430 : Architecture logicielle et conception avancée. Cadres de référence et plugiciels. Plan. Introduction Un exemple de plugiciel Eclipse Extensions OSGi Architecture Gestion du cycle de vie Service d’enregistrement Environnement d’exécution Gestion du cycle de vie - PowerPoint PPT Presentation

Citation preview

Page 1: LOG4430 : Architecture logicielle et conception avancée

Foutse Khomh

© Guéhéneuc 2009; Khomh 2010Département de génie informatique et de génie logicielÉcole Polytechnique de Montréal

LOG4430 :Architecture logicielle et

conception avancée

Cadres de référence et plugiciels

Page 2: LOG4430 : Architecture logicielle et conception avancée

2/36

Plan

1. Introduction

2. Un exemple de plugiciel• Eclipse• Extensions

3. OSGi• Architecture• Gestion du cycle de vie• Service d’enregistrement• Environnement d’exécution

4. Gestion du cycle de vie• Gestion de besoin• Architecture• Implantation• Test• Suivi des problèmes• Gestion des versions

Page 3: LOG4430 : Architecture logicielle et conception avancée

3/36

1. Introduction

Aujourd’hui (et demain), les programmes – Sont de plus en plus complexes– Doivent être livrés de plus en plus rapidement– Doivent fonctionner avec un minimum d’arrêt

Page 4: LOG4430 : Architecture logicielle et conception avancée

4/36

1. Introduction

Les programmes nécessitent donc– Une plateforme de programmation favorisant

l’indépendance des composants– Un format de livraison « standardisé »– Une plateforme d’exécution permettant le

remplacement à chaud Les programmes doivent donc être formés

de composants réutilisables et interchangeables en cours d’exécution (cf. « Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 7–11)

Page 5: LOG4430 : Architecture logicielle et conception avancée

5/36

2. Definition: plugiciel

« Un [plugiciel] est un programme qui interagit avec un logiciel principal, appelé programme hôte, pour lui apporter de nouvelles fonctionnalités » [Wikipedia]– ils ne peuvent fonctionner seuls car ils sont uniquement

destinés à apporter une fonctionnalité à un ou plusieurs logiciels ;

– ils sont mis au point par des personnes n'ayant pas nécessairement de relation avec les auteurs du logiciel principal.

Page 6: LOG4430 : Architecture logicielle et conception avancée

6/36

2. Definition: plugiciel

L’ojectif derriere l’implementation des plugiciels est de permettre:– L’ajout des fonctionnalités sans avoir à tout

reprogrammer– Permettre aux utilisateurs d'ajouter leurs propres

fonctionnalités de manière indépendante

Cette indépendance inclut la possibilité pour le logiciel principal d'évoluer tout en restant compatible avec les plugiciels existants ; cette condition est cependant loin d'être toujours remplie.

Page 7: LOG4430 : Architecture logicielle et conception avancée

7/36

2. Chargement de plugiciel

Dans les architectures statiques, la structure des plugiciel est définie avant le lancement du logiciel ( par exemple dans un fichier de configuration)

Dans les architectures dynamique c’est l’application qui va elle même recenser les plugiciels présents, – Très souvent par examen de fichiers présents dans un répertoire dédié

aux plugiciels. Exemple Eclipse.– L’ajout et la suppression d’éléments dans le répertoire permet d’activer ou

de désactiver les plugiciels correspondants. – Certaines applications permettent le démarrage et l’arrêt

d’un plugiciel pendant son fonctionnement. On parle alors de configuration à chaud ou hot-plug

– Toutefois, ce type d’architecture devient vite complexe du fait des dépendances qui peuvent exister entre les plugiciels.

Page 8: LOG4430 : Architecture logicielle et conception avancée

8/36

Un exemple de plugiciel

Eclipse

Page 9: LOG4430 : Architecture logicielle et conception avancée

9/36

Un exemple de plugiciel

Extensions– Points d’extension

• point d'ancrage dans plugins• le “provide” des composants• ressemble à la déclaration d'une interface, le plugiciel informe qu’il est

ouvert à l’ajout de nouvelles fonctionnalités d’une certaine façon• mais description en XML précisant la grammaire que les meta-data des

extensions doivent suivre

– Extension• greffon attaché à un point d'extension (déclaration de la nouvelle

fonctionnalité d’extension) • le “require” des composants• ressemble à une liaison entre une interface et une implémentation

(description XML suivant la grammaire spécifiée par le point d’extension)

Page 10: LOG4430 : Architecture logicielle et conception avancée

10/36

Un exemple de plugiciel

Extensions

– Registre des extensions (Extension Registry)• Match des points d’extensions aux extensions• Les plugiciel interrogent cette base pour connaître les

extensions qui leurs sont proposées.

– Chargement à la demande

http://www-master.ufr-info-p6.jussieu.fr/2006/Ajouts/Master_esj_2006_2007/IMG/pdf/Eclipse-plugins-slides.pdf

Page 11: LOG4430 : Architecture logicielle et conception avancée

11/36

Un exemple de plugiciel

Extensions

[http://www.eclipsezone.com/articles/extensions-vs-services/images/extensions.png]

Page 12: LOG4430 : Architecture logicielle et conception avancée

12/36

Un exemple de plugiciel

Illustration:– fonctionnement du point d'extension qui permet

d'ajouter des pages de préférences dans la fenêtre des préférences d'Eclipse

– Le plugiciel 'org.eclipse.ui', fourni par le framework Eclipse, définit un point d'extension nommé 'org.eclipse.ui.preferencePages'.

– Le fichier 'preferencePages.exsd' contient la grammaire associée à ce point d'extension, en voici un extrait :

Page 13: LOG4430 : Architecture logicielle et conception avancée

13/36

Illustration de points d’extensions

<element name="page">   <complexType>      <attribute name="id" type="string" use="required" />

      <attribute name="name" type="string" use="required" />

      <attribute name="class" type="string" use="required">         <annotation>            <appInfo>               <meta.attribute kind="java"                      basedOn="org.eclipse.jface.preference.PreferencePage:                                             org.eclipse.ui.IWorkbenchPreferencePage"/>               </appInfo>            </annotation>         </attribute>

      <attribute name="category" type="string"/>

   </complexType></element>

Page 14: LOG4430 : Architecture logicielle et conception avancée

14/36

Illustration de points d’extensions

– Cette grammaire définit un élément XML nommé 'page' qui possède quatre attributs : 'id', 'name', et 'class'.

• Pour l'attribut 'class', l'interface à implémenter est indiquée ('org.eclipse.ui.IWorkbenchPreferencePage') et dans ce cas précis une superclasse est aussi proposée ('org.eclipse.jface.preference.PreferencePage').

• Les attributs 'id', 'name' et 'class' sont obligatoires.

Page 15: LOG4430 : Architecture logicielle et conception avancée

15/36

Illustration de points d’extensions

Pour ajouter une page de préférences, un plugin doit donc définir, dans son fichier plugin.xml, une extension sur le point d'extension 'org.eclipse.ui.preferencePages‘, et une classe indiquée par “class”

<?xml version="1.0" encoding="UTF-8"?><?eclipse version="3.2"?><plugin>   <extension      point="org.eclipse.ui.preferencePages">         <page          id="com.eclipsetotale.tutorial.pagepreference.page1"          name="Tutorial développement de plugin"          class="com.eclipsetotale.tutorial.pagepreference.TutorialPreferencePage"         />   </extension></plugin>

Page 16: LOG4430 : Architecture logicielle et conception avancée

16/36

Illustration de points d’extensions

package com.eclipsetotale.tutorial.pagepreference;

import org.eclipse.jface.preference.PreferencePage;...

public class TutorialPreferencePage extends PreferencePage       implements IWorkbenchPreferencePage {

       protected Control createContents(Composite parent) {            Composite composite = new Composite(parent, SWT.NONE);            Color jaune = parent.getDisplay().getSystemColor(SWT.COLOR_YELLOW);            composite.setBackground(jaune);            return composite;      }

      public void init(IWorkbench workbench) {      }

}

Cette sous-classe de 'org.eclipse.jface.preference.PreferencePage' a pour responsabilité la gestion du contenu spécifique à la page de préférences ajoutée.

Page 17: LOG4430 : Architecture logicielle et conception avancée

17/36

3. OSGi

Considérons une classe java faisant partie d’une application et implémentant une fonctionnalité. – Cette classe doit donc faire partie des .jar de l’application. – En cas de bug dans cette classe, l’application complète doit être

arrêtée afin que celui-ci soit corrigé même s’il n’affecte qu’une sous-fonctionnalité très rarement utilisée.

La technologie OSGi permet de développer les fonctionnalités de façon indépendantes et de les intégrées dans l’application sous forme de services.

Ces services peuvent être reliées dynamiquement à l’application

Un service particulier pouvant être arrêté et mis à jour sans que le reste de l’application ne soit affecté.

Page 18: LOG4430 : Architecture logicielle et conception avancée

18/36

3. OSGi

OSGi (Open Service Gateway Initiative) a été fondé par Ericson, IBM, Oracle et Sun

Modèle à composants complet et dynamique– Complémente la machine virtuelle Java– Réduit la complexité : encapsulation, interface de

programmation– Réutilisation : composants depuis l’étagère– Déploiement simplifié : gestion du cycle de vie– Mises à jour dynamiques : voir ci-dessus– Adaptation : les services peuvent aller et venir– Transparence : composants indépendants

[http://aneeshkumarkb.blogspot.com/]

Page 19: LOG4430 : Architecture logicielle et conception avancée

19/36

OSGi

Architecture– Bundles = composants– Services = publication,

recherche et connexion dynamique d’objets Java

– Life Cycle = gestion du cycle de vie des objets (démarrage, arrêt, mises à jours, installation,…)

– Module = fonctions basiques de gestion (classloading, import, export,…)

– Security = gestion des aspects de sécurité

– Execution Environment = plateforme d’exécution

[http://www.osgi.org]

Page 20: LOG4430 : Architecture logicielle et conception avancée

20/36

OSGi

La spécification de OSGi définit comment les bundles (composants) doivent être implémentés afin d’être intégrés à la plateforme OSGi. Elle se structure de la manière suivante:– Un ensemble de services qu’un conteneur OSGi

doit implémenter (Exple de conteneur: Equinox d’Eclipse)

– Un contrat entre le conteneur et les application

Page 21: LOG4430 : Architecture logicielle et conception avancée

21/36

OSGi: Exemple

Etape 1: Télécharger et sauvegarder un conteneur OSGi: Equinoxe par exemple dans C:/lab Etape 2: Créer la classe HelloOSGI.java suivante: package test.osgi.helloworld;

import org.osgi.framework.BundleActivator;import org.osgi.framework.BundleContext;public class Activator implements BundleActivator {

public void start(BundleContext context) throws Exception {System.out.println("Hello World");}

public void stop(BundleContext context) throws Exception {System.out.println("Bye Bye");}

}

Cette classe est comme une classe main usuelle, la méthode start() est le point de démarrage du bundle (composant)

Page 22: LOG4430 : Architecture logicielle et conception avancée

22/36

OSGi: Exemple

Etape 3: Mettre à jour le path et compiler la classe

# Set classpath=%classpath%;org.eclipse.osgi_3.4.0.v20080605-1900.jar

# javac -d . HelloOSGi.java

Etape 4: Créer un fichier manifeste MANIFEST.MF contenant:

Page 23: LOG4430 : Architecture logicielle et conception avancée

23/36

OSGi: Exemple

MANIFEST.MF

Manifest-Version: 1.0Bundle-ManifestVersion: 2Bundle-Name: HelloWorld OSGiBundle-SymbolicName: test.osgi.HelloWorldBundle-Version: 1.0.0Bundle-Activator: test.osgi.helloworld.HelloOSGIImport-Package: org.osgi.framework

Page 24: LOG4430 : Architecture logicielle et conception avancée

24/36

OSGi: Exemple

Bundle-ManifestVersion: indique que le composant suit la spécification OSGi

Bundle-Name: défini le nom du composant

Bundle-SymbolicName: défini un nom de référencement pour le composant (ce nom sera utilisé par les autres composants)

Bundle-Version: spécifie la version du composant

Bundle-Activator: spécifie le nom de la classe listener à notifier des démarrages et arrêts du composant.

Import-Package: définit les packages importés.

Page 25: LOG4430 : Architecture logicielle et conception avancée

25/36

OSGi: Exemple

Etape 5: Créer ensuite le fichier bundle-jar# jar -cvmf MANIFEST.MF HelloOSGi.jar -C test/*

Etape 6: Démarrer le conteneur OSGi:#java -jar org.eclipse.osgi_3.4.0.v20080605-1900.jar

-console Le prompt osgi> s’affichera.

Etape 7: Installer le bundleosgi> install file:/C:/lab/HelloOSGi.jar

Page 26: LOG4430 : Architecture logicielle et conception avancée

26/36

OSGi: Exemple

Etape 8: Puis démarrer le bundle (composant)

osgi> start file:/C:/lab/HelloOSGi.jar

Vous verrez « Hello World » s’imprimer dans la console, votre composant est prêt!

Page 27: LOG4430 : Architecture logicielle et conception avancée

27/36

OSGi

Architecture (cf. « Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 12–21)

Eclipse implemantion d’OSGi– Equinox (cf. «

Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 22–26)

Page 28: LOG4430 : Architecture logicielle et conception avancée

28/36

OSGi

Services d’enregistrement (cf. « Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 48–50)

[http://www.eclipsezone.com/articles/extensions-vs-services/images/extensions.png]

Page 29: LOG4430 : Architecture logicielle et conception avancée

29/36

OSGi

Services d’enregistrement

[http://www.eclipsezone.com/articles/extensions-vs-services/images/extensions.png]

Page 30: LOG4430 : Architecture logicielle et conception avancée

30/36

OSGi

Services d’enregistrement

[http://www.eclipsezone.com/articles/extensions-vs-services/images/extensions.png]

public void start(BundleContext context) { // Create the service object DbCustomerLookup lookup = new DbCustomerLookup( "jdbc:mysql:localhost/customers");

// Create the properties to register with the service Dictionary properties = new Hashtable(); properties.put("dbname", "local");

// Register the service context.registerService( ICustomerLookup.class.getName(), lookup, properties);}

public void start(BundleContext context) { this.context = context;}

public String getCustomerName(long id) { ServiceReference ref = context.getServiceReference( ICustomerLookup.class.getName()); if(ref != null) { ICustomerLookup lookup = (ICustomerLookup) context.getService(ref); if(lookup != null) { Customer cust = lookup.findById(id); context.ungetService(ref); return cust.getName(); } }

// Couldn't get name -- service not available return null;}

Page 31: LOG4430 : Architecture logicielle et conception avancée

31/36

Cycle de vie d’un bundle OSGi

Page 32: LOG4430 : Architecture logicielle et conception avancée

32/36

OSGi

Collaborative model (cf. « Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 41–51)

Component model (cf. «

Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 52–58)

Example (cf. «

Cours 5 - Cadres de reference et plugiciels (JAOO06-OSGi_Tutorial).pdf », pages 27–40)

Page 33: LOG4430 : Architecture logicielle et conception avancée

33/36

4. Gestion du cycle de vie

Gestion de besoin Architecture Implantation Test Suivi des problèmes Gestion des versions

Page 34: LOG4430 : Architecture logicielle et conception avancée

34/36

Répertoires composants un plugiciel

Page 35: LOG4430 : Architecture logicielle et conception avancée

35/36

Répertoires composants un plugiciel

Page 36: LOG4430 : Architecture logicielle et conception avancée

36/36

Gestion du cycle de vie

Problème de la traçabilité– Besoins – conception– Besoins – code– Besoins – tests– Besoins – bogues– Besoins – versions– Code – tests– Code – bogues– Code – versions