GIS 4 Architectures Logicielles Programmation par composants Olivier Caron Polytech Lille Avenue Paul Langevin Cité Scientifique Lille 1 59655 Villeneuve d’Ascq cedex http://ocaron.plil.fr [email protected] Olivier Caron January 10, 2017 1/70 GIS 4 Architectures Logicielles c Robert Cringely If the automobile had followed the same development cycle as the computer, a Rolls-Royce would today cost $100, get a million miles per gallon, and explode once a year, killing everyone inside. Olivier Caron January 10, 2017 2/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • La programmation par objets (Java) Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • La programmation par objets (Java) • Les bases de données (SQL) Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • La programmation par objets (Java) • Les bases de données (SQL) • Le framework JPA Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • • • • La programmation par objets (Java) Les bases de données (SQL) Le framework JPA Notion de réseau (les concepts) Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • • • • La programmation par objets (Java) Les bases de données (SQL) Le framework JPA Notion de réseau (les concepts) • Structuration et évaluation : Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • • • • La programmation par objets (Java) Les bases de données (SQL) Le framework JPA Notion de réseau (les concepts) • Structuration et évaluation : • 11h de cours, 13h de TP, 14h de projet Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • • • • La programmation par objets (Java) Les bases de données (SQL) Le framework JPA Notion de réseau (les concepts) • Structuration et évaluation : • 11h de cours, 13h de TP, 14h de projet • 2h DS, 2h contrôle TP individuel, projet en binôme, interrogation(s) de cours Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • • • • La programmation par objets (Java) Les bases de données (SQL) Le framework JPA Notion de réseau (les concepts) • Structuration et évaluation : • 11h de cours, 13h de TP, 14h de projet • 2h DS, 2h contrôle TP individuel, projet en binôme, interrogation(s) de cours • Supports de cours et exemples Java sur ocaron.plil.fr Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Le module Architectures Logicielles • Pré-requis : • • • • La programmation par objets (Java) Les bases de données (SQL) Le framework JPA Notion de réseau (les concepts) • Structuration et évaluation : • 11h de cours, 13h de TP, 14h de projet • 2h DS, 2h contrôle TP individuel, projet en binôme, interrogation(s) de cours • Supports de cours et exemples Java sur ocaron.plil.fr • Anciens sujets de DS sur ocaron.plil.fr, Twiki Polytech et portail Lille 1 Olivier Caron January 10, 2017 3/70 GIS 4 Architectures Logicielles Problématique ? • Les applications logicielles deviennent de plus en plus complexes : Olivier Caron January 10, 2017 4/70 GIS 4 Architectures Logicielles Problématique ? • Les applications logicielles deviennent de plus en plus complexes : • L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . Olivier Caron January 10, 2017 4/70 GIS 4 Architectures Logicielles Problématique ? • Les applications logicielles deviennent de plus en plus complexes : • L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . • Intéropérabilité des langages et plates-formes. Olivier Caron January 10, 2017 4/70 GIS 4 Architectures Logicielles Problématique ? • Les applications logicielles deviennent de plus en plus complexes : • L’application ne fonctionne pas sur une machine mais sur plusieurs. → programmation réseau, efficacité, performances, sécurité, tolérance aux pannes,. . . • Intéropérabilité des langages et plates-formes. • L’application utilise/ou réutilise des applications existantes. → applications patrimoines, bases de données Olivier Caron January 10, 2017 4/70 GIS 4 Architectures Logicielles Des objectifs ambitieux • Face à cette complexité, on veut, en outre : Olivier Caron January 10, 2017 5/70 GIS 4 Architectures Logicielles Des objectifs ambitieux • Face à cette complexité, on veut, en outre : • Améliorer la qualité et la production de code Olivier Caron January 10, 2017 5/70 GIS 4 Architectures Logicielles Des objectifs ambitieux • Face à cette complexité, on veut, en outre : • Améliorer la qualité et la production de code • Simplifier le travail du programmeur Olivier Caron January 10, 2017 5/70 GIS 4 Architectures Logicielles Des objectifs ambitieux • Face à cette complexité, on veut, en outre : • Améliorer la qualité et la production de code • Simplifier le travail du programmeur • Réutiliser au mieux le logiciel Olivier Caron January 10, 2017 5/70 GIS 4 Architectures Logicielles L’industrie du logiciel • Pour 10 projets de développement logiciel, Olivier Caron sont des succès January 10, 2017 6/70 GIS 4 Architectures Logicielles L’industrie du logiciel • Pour 10 projets de développement logiciel, sont des succès • Fiabilité des projets, spécification des règles de gestion, tests Olivier Caron January 10, 2017 6/70 GIS 4 Architectures Logicielles L’industrie du logiciel • Pour 10 projets de développement logiciel, sont des succès • Fiabilité des projets, spécification des règles de gestion, tests • Vol 501 d’ariane 5, bug informatique : débordement de capacité Olivier Caron January 10, 2017 6/70 GIS 4 Architectures Logicielles L’industrie du logiciel • Pour 10 projets de développement logiciel, sont des succès • Fiabilité des projets, spécification des règles de gestion, tests • Vol 501 d’ariane 5, bug informatique : débordement de capacité • Réalisées après la catastrophe, les simulations en laboratoire ont permis de vérifier que l’explosion était inéluctable. Olivier Caron January 10, 2017 6/70 GIS 4 Architectures Logicielles Les solutions • Définir en premier lieu l’architecture logicielle la mieux adaptée : A software architecture is an abstract system specification consisting primarily of functional components described in terms of their behaviors and interfaces and component-component interconnections”. (Hayes-Roth, 1994) Olivier Caron January 10, 2017 7/70 GIS 4 Architectures Logicielles Les solutions • Définir en premier lieu l’architecture logicielle la mieux adaptée : A software architecture is an abstract system specification consisting primarily of functional components described in terms of their behaviors and interfaces and component-component interconnections”. (Hayes-Roth, 1994) • Disposer de briques logicielles réutilisables : les composants. Olivier Caron January 10, 2017 7/70 GIS 4 Architectures Logicielles Les solutions • Définir en premier lieu l’architecture logicielle la mieux adaptée : A software architecture is an abstract system specification consisting primarily of functional components described in terms of their behaviors and interfaces and component-component interconnections”. (Hayes-Roth, 1994) • Disposer de briques logicielles réutilisables : les composants. • Disposer d’infrastructures d’accueil de ces composants : les serveurs d’applications. Olivier Caron January 10, 2017 7/70 GIS 4 Architectures Logicielles Plan du cours (1/2) • Des objets aux composants Olivier Caron January 10, 2017 8/70 GIS 4 Architectures Logicielles Plan du cours (1/2) • Des objets aux composants • Le modèle de composants Java Beans Olivier Caron January 10, 2017 8/70 GIS 4 Architectures Logicielles Plan du cours (1/2) • Des objets aux composants • Le modèle de composants Java Beans • Des objets aux objets répartis Olivier Caron January 10, 2017 8/70 GIS 4 Architectures Logicielles Plan du cours (1/2) • Des objets aux composants • Le modèle de composants Java Beans • Des objets aux objets répartis • Le modèle Java RMI Olivier Caron January 10, 2017 8/70 GIS 4 Architectures Logicielles Plan du cours (1/2) • Des objets aux composants • Le modèle de composants Java Beans • Des objets aux objets répartis • Le modèle Java RMI • Le modèle CORBA (cf pages webs) Olivier Caron January 10, 2017 8/70 GIS 4 Architectures Logicielles Plan du cours (2/2) • Des objets aux composants répartis Olivier Caron January 10, 2017 9/70 GIS 4 Architectures Logicielles Plan du cours (2/2) • Des objets aux composants répartis • Les architectures clients/serveurs 3-tiers Olivier Caron January 10, 2017 9/70 GIS 4 Architectures Logicielles Plan du cours (2/2) • Des objets aux composants répartis • Les architectures clients/serveurs 3-tiers • L’architecture JEE (composants Web, composants EJB) Olivier Caron January 10, 2017 9/70 GIS 4 Architectures Logicielles Plan du cours (2/2) • Des objets aux composants répartis • Les architectures clients/serveurs 3-tiers • L’architecture JEE (composants Web, composants EJB) • Introduction aux web services, web 2.0 Olivier Caron January 10, 2017 9/70 GIS 4 Architectures Logicielles Plan du cours (2/2) • Des objets aux composants répartis • Les architectures clients/serveurs 3-tiers • L’architecture JEE (composants Web, composants EJB) • Introduction aux web services, web 2.0 • Le modèle de composants CORBA Olivier Caron January 10, 2017 9/70 GIS 4 Architectures Logicielles Plan du cours (2/2) • Des objets aux composants répartis • Les architectures clients/serveurs 3-tiers • L’architecture JEE (composants Web, composants EJB) • Introduction aux web services, web 2.0 • Le modèle de composants CORBA • Conception d’applications 3-tiers Olivier Caron January 10, 2017 9/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( • Existence de bugs ! Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( • Existence de bugs ! • Succession des versions (à payer ?) Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( • Existence de bugs ! • Succession des versions (à payer ?) • Adéquation de la nouvelle version par rapport à la configuration matérielle Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( • Existence de bugs ! • Succession des versions (à payer ?) • Adéquation de la nouvelle version par rapport à la configuration matérielle • Logiciel non adapté aux besoins : Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( • Existence de bugs ! • Succession des versions (à payer ?) • Adéquation de la nouvelle version par rapport à la configuration matérielle • Logiciel non adapté aux besoins : • Trop de fonctionnalités (ex: fonctions EXCEL) Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel, aujourd’hui • Des produits chers ! • Une bonne solution : le logiciel libre :-) • Une mauvaise solution : le piratage :-( • Existence de bugs ! • Succession des versions (à payer ?) • Adéquation de la nouvelle version par rapport à la configuration matérielle • Logiciel non adapté aux besoins : • Trop de fonctionnalités (ex: fonctions EXCEL) • Manque LA fonctionnalité ! Olivier Caron January 10, 2017 10/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises • On dispose toujours de la dernière version Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises • On dispose toujours de la dernière version • La dernière version est moins buggée que la précédente. . . Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises • On dispose toujours de la dernière version • La dernière version est moins buggée que la précédente. . . • On peut faire évoluer (reconfigurer) son logiciel Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises • On dispose toujours de la dernière version • La dernière version est moins buggée que la précédente. . . • On peut faire évoluer (reconfigurer) son logiciel • On ne paye que : Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises • On dispose toujours de la dernière version • La dernière version est moins buggée que la précédente. . . • On peut faire évoluer (reconfigurer) son logiciel • On ne paye que : • Les fonctionnalités requises Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (1/2) • Des logiciels adaptés aux besoins : • Ne se trouve que les fonctionnalités requises • On dispose toujours de la dernière version • La dernière version est moins buggée que la précédente. . . • On peut faire évoluer (reconfigurer) son logiciel • On ne paye que : • Les fonctionnalités requises • La durée effective d’utilisation Olivier Caron January 10, 2017 11/70 GIS 4 Architectures Logicielles L’industrie du logiciel de demain (2/2) INTERNET Via le réseau Internet, recherche des composants nécessaires, association de ceux-ci, puis exécution à distance. Première réalisation : les Clouds Olivier Caron January 10, 2017 12/70 GIS 4 Architectures Logicielles Objectif des composants • A partir de plusieurs composants, construire une nouvelle application : Comp1 Comp3 Comp2 NewComp Olivier Caron January 10, 2017 13/70 GIS 4 Architectures Logicielles Objectif des composants • A partir de plusieurs composants, construire une nouvelle application : • Associer/connecter des composants Comp1 Comp3 Comp2 NewComp Olivier Caron January 10, 2017 13/70 GIS 4 Architectures Logicielles Objectif des composants • A partir de plusieurs composants, construire une nouvelle application : • Associer/connecter des composants • Proposer des outils d’aide à la composition de composants Comp1 Comp3 Comp2 NewComp Olivier Caron January 10, 2017 13/70 GIS 4 Architectures Logicielles Les apports de la programmation par composants • Ne pas partir de zéro, existence de composants efficaces et robustes : Olivier Caron January 10, 2017 14/70 GIS 4 Architectures Logicielles Les apports de la programmation par composants • Ne pas partir de zéro, existence de composants efficaces et robustes : • Navigateur HTML (aide en ligne), correcteur orthographique, chargement, restauration de fichier,. . . Olivier Caron January 10, 2017 14/70 GIS 4 Architectures Logicielles Les apports de la programmation par composants • Ne pas partir de zéro, existence de composants efficaces et robustes : • Navigateur HTML (aide en ligne), correcteur orthographique, chargement, restauration de fichier,. . . • Plus facile à décrire une application complexe : Olivier Caron January 10, 2017 14/70 GIS 4 Architectures Logicielles Les apports de la programmation par composants • Ne pas partir de zéro, existence de composants efficaces et robustes : • Navigateur HTML (aide en ligne), correcteur orthographique, chargement, restauration de fichier,. . . • Plus facile à décrire une application complexe : • Ensemble de composants Olivier Caron January 10, 2017 14/70 GIS 4 Architectures Logicielles Les apports de la programmation par composants • Ne pas partir de zéro, existence de composants efficaces et robustes : • Navigateur HTML (aide en ligne), correcteur orthographique, chargement, restauration de fichier,. . . • Plus facile à décrire une application complexe : • Ensemble de composants • Connection entre ces composants Olivier Caron January 10, 2017 14/70 GIS 4 Architectures Logicielles Les Besoins technologiques • Vers des ”composants sur l’étagère” Olivier Caron January 10, 2017 15/70 GIS 4 Architectures Logicielles Les Besoins technologiques • Vers des ”composants sur l’étagère” • Accéder à un composant (protocole réseau) Olivier Caron January 10, 2017 15/70 GIS 4 Architectures Logicielles Les Besoins technologiques • Vers des ”composants sur l’étagère” • Accéder à un composant (protocole réseau) • Localiser un composant (eq. DNS) Olivier Caron January 10, 2017 15/70 GIS 4 Architectures Logicielles Les Besoins technologiques • Vers des ”composants sur l’étagère” • Accéder à un composant (protocole réseau) • Localiser un composant (eq. DNS) • Description d’un composant (service trader) Olivier Caron January 10, 2017 15/70 GIS 4 Architectures Logicielles Les Besoins technologiques • Vers des ”composants sur l’étagère” • • • • Accéder à un composant (protocole réseau) Localiser un composant (eq. DNS) Description d’un composant (service trader) Faire payer l’utilisation d’un composant Olivier Caron January 10, 2017 15/70 GIS 4 Architectures Logicielles Les Besoins technologiques • Vers des ”composants sur l’étagère” • • • • • Accéder à un composant (protocole réseau) Localiser un composant (eq. DNS) Description d’un composant (service trader) Faire payer l’utilisation d’un composant Programmation : associer des composants Olivier Caron January 10, 2017 15/70 GIS 4 Architectures Logicielles Qu’est-ce qu’un composant ? • Module logiciel autonome pouvant être installé sur différentes plateformes Olivier Caron January 10, 2017 16/70 GIS 4 Architectures Logicielles Qu’est-ce qu’un composant ? • Module logiciel autonome pouvant être installé sur différentes plateformes • Mécanisme d’introspection (auto-descriptif) Olivier Caron January 10, 2017 16/70 GIS 4 Architectures Logicielles Qu’est-ce qu’un composant ? • Module logiciel autonome pouvant être installé sur différentes plateformes • Mécanisme d’introspection (auto-descriptif) • Conservation de son état Olivier Caron January 10, 2017 16/70 GIS 4 Architectures Logicielles Qu’est-ce qu’un composant ? • Module logiciel autonome pouvant être installé sur différentes plateformes • Mécanisme d’introspection (auto-descriptif) • Conservation de son état • Paramétrable ou configurable Olivier Caron January 10, 2017 16/70 GIS 4 Architectures Logicielles Les composants en Java : les Java Beans http://docs.oracle.com/javase/tutorial/javabeans/ • Module logiciel autonome pouvant être installé sur différentes plateformes (fichier jar) Olivier Caron January 10, 2017 17/70 GIS 4 Architectures Logicielles Les composants en Java : les Java Beans http://docs.oracle.com/javase/tutorial/javabeans/ • Module logiciel autonome pouvant être installé sur différentes plateformes (fichier jar) • Mécanisme d’introspection (auto-descriptif) (reflection Java) Olivier Caron January 10, 2017 17/70 GIS 4 Architectures Logicielles Les composants en Java : les Java Beans http://docs.oracle.com/javase/tutorial/javabeans/ • Module logiciel autonome pouvant être installé sur différentes plateformes (fichier jar) • Mécanisme d’introspection (auto-descriptif) (reflection Java) • Conservation de son état (sérialisation) Olivier Caron January 10, 2017 17/70 GIS 4 Architectures Logicielles Les composants en Java : les Java Beans http://docs.oracle.com/javase/tutorial/javabeans/ • Module logiciel autonome pouvant être installé sur différentes plateformes (fichier jar) • Mécanisme d’introspection (auto-descriptif) (reflection Java) • Conservation de son état (sérialisation) • Paramétrable ou configurable (sérialisation + réflection + évènements) Olivier Caron January 10, 2017 17/70 GIS 4 Architectures Logicielles Structure d’un Java Bean BeanInfo Configuration Méthodes JAVA BEAN Evènements Propriétés JAR Olivier Caron January 10, 2017 18/70 GIS 4 Architectures Logicielles Premier Bean : SmileyBean import j a v a . awt . ∗ ; public class SmileyBean extends Canvas { private Color ourColor = Color . yellow ; p r i v a t e boolean s m i l e = t r u e ; public SmileyBean ( ) { this . setSize (250 ,250); } public synchronized void t o g g l e S m i l e ( ) { smile = ! smile ; this . repaint ( ) ; } public void p a i n t ( Graphics g ) { . . . } } Olivier Caron January 10, 2017 19/70 GIS 4 Architectures Logicielles Premières remarques : • Ici, pas de constructions supplémentaires Olivier Caron January 10, 2017 20/70 GIS 4 Architectures Logicielles Premières remarques : • Ici, pas de constructions supplémentaires • Deux règles Bean respectées : Olivier Caron January 10, 2017 20/70 GIS 4 Architectures Logicielles Premières remarques : • Ici, pas de constructions supplémentaires • Deux règles Bean respectées : • Fonction constructeur sans paramètres Olivier Caron January 10, 2017 20/70 GIS 4 Architectures Logicielles Premières remarques : • Ici, pas de constructions supplémentaires • Deux règles Bean respectées : • Fonction constructeur sans paramètres • Classe sérialisable Olivier Caron January 10, 2017 20/70 GIS 4 Architectures Logicielles Premières remarques : • Ici, pas de constructions supplémentaires • Deux règles Bean respectées : • Fonction constructeur sans paramètres • Classe sérialisable • Une classe simple peut correspondre à un Java Bean. Olivier Caron January 10, 2017 20/70 GIS 4 Architectures Logicielles Première application import j a v a . awt . ∗ ; import j a v a . awt . event . ∗ ; public class SmileyPlace extends Frame implements WindowListener { public SmileyPlace ( S t r i n g t i t r e ) { SmileyBean s m i l e y = n u l l ; try { s m i l e y = ( SmileyBean ) j a v a . beans . Beans . i n s t a n t i a t e ( n u l l , ” SmileyBean ” ) ; } catch ( E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” E x c e p t i o n : ” +e ) ; } t h i s . add ( s m i l e y ) ; t h i s . addWindowListener ( t h i s ) } s t a t i c public void main ( S t r i n g args [ ] ) Olivier Caron {... January 10, 2017 21/70 GIS 4 Architectures Logicielles La classe java.beans.Beans • Fournit différents services Olivier Caron January 10, 2017 22/70 GIS 4 Architectures Logicielles La classe java.beans.Beans • Fournit différents services • La création d’un Beans peut ne pas se faire par new package java.beans ; public class Beans extends Object { ... public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException ; ... Olivier Caron January 10, 2017 22/70 GIS 4 Architectures Logicielles La classe java.beans.Beans • Fournit différents services • La création d’un Beans peut ne pas se faire par new package java.beans ; public class Beans extends Object { ... public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException ; ... • Chargement du class loader (null équivaut au system class loader) Olivier Caron January 10, 2017 22/70 GIS 4 Architectures Logicielles La classe java.beans.Beans • Fournit différents services • La création d’un Beans peut ne pas se faire par new package java.beans ; public class Beans extends Object { ... public static Object instantiate(ClassLoader cls, String beanName) throws IOException, ClassNotFoundException ; ... • Chargement du class loader (null équivaut au system class loader) • Tentative de charger beanName.ser puis création du bean Olivier Caron January 10, 2017 22/70 GIS 4 Architectures Logicielles Propriétés des composants - Conventions de nommage • public int getProp() public void setProp(int valeur) Olivier Caron January 10, 2017 23/70 GIS 4 Architectures Logicielles Propriétés des composants - Conventions de nommage • public int getProp() public void setProp(int valeur) • Définit une propriété entière de nom prop Olivier Caron January 10, 2017 23/70 GIS 4 Architectures Logicielles Propriétés des composants - Conventions de nommage • public int getProp() public void setProp(int valeur) • Définit une propriété entière de nom prop • public boolean isVisible() public void setVisible(boolean valeur) Olivier Caron January 10, 2017 23/70 GIS 4 Architectures Logicielles Propriétés des composants - Conventions de nommage • public int getProp() public void setProp(int valeur) • Définit une propriété entière de nom prop • public boolean isVisible() public void setVisible(boolean valeur) • Définit une propriété booléenne de nom visible Olivier Caron January 10, 2017 23/70 GIS 4 Architectures Logicielles Propriétés des composants - Conventions de nommage • public int getProp() public void setProp(int valeur) • Définit une propriété entière de nom prop • public boolean isVisible() public void setVisible(boolean valeur) • Définit une propriété booléenne de nom visible • Possibilité de ne pas utiliser les conventions de nommage (BeanDescriptor) Olivier Caron January 10, 2017 23/70 GIS 4 Architectures Logicielles Propriétés des composants - Conventions de nommage • public int getProp() public void setProp(int valeur) • Définit une propriété entière de nom prop • public boolean isVisible() public void setVisible(boolean valeur) • Définit une propriété booléenne de nom visible • Possibilité de ne pas utiliser les conventions de nommage (BeanDescriptor) • La réflexion Java permet d’analyser dynamiquement un composant et de le configurer dynamiquement ! Olivier Caron January 10, 2017 23/70 GIS 4 Architectures Logicielles Phases associées aux composants • Récupération d’un composant, soit fichier .class, soit fichier .jar Olivier Caron January 10, 2017 24/70 GIS 4 Architectures Logicielles Phases associées aux composants • Récupération d’un composant, soit fichier .class, soit fichier .jar • Découverte du composant : que peut-on faire avec ce composant ? Quelles sont les méthodes de ce composant ? −→ Introspection Olivier Caron January 10, 2017 24/70 GIS 4 Architectures Logicielles Phases associées aux composants • Récupération d’un composant, soit fichier .class, soit fichier .jar • Découverte du composant : que peut-on faire avec ce composant ? Quelles sont les méthodes de ce composant ? −→ Introspection • Utiliser ce composant : exécuter les méthodes découvertes −→ Invocation dynamique Olivier Caron January 10, 2017 24/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (1/8) • Soit le programme Reflection.java Olivier Caron January 10, 2017 25/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (1/8) • Soit le programme Reflection.java • Ce programme accepte en argument n’importe quel nom de classe (accessible dans le CLASSPATH) Olivier Caron January 10, 2017 25/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (1/8) • Soit le programme Reflection.java • Ce programme accepte en argument n’importe quel nom de classe (accessible dans le CLASSPATH) • Objectif du programme : Olivier Caron January 10, 2017 25/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (1/8) • Soit le programme Reflection.java • Ce programme accepte en argument n’importe quel nom de classe (accessible dans le CLASSPATH) • Objectif du programme : 1 Découvrir si la classe en question dispose de propriétés booléennes, entières, réelles ou chaı̂nes de caractères. Olivier Caron January 10, 2017 25/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (1/8) • Soit le programme Reflection.java • Ce programme accepte en argument n’importe quel nom de classe (accessible dans le CLASSPATH) • Objectif du programme : 1 2 Découvrir si la classe en question dispose de propriétés booléennes, entières, réelles ou chaı̂nes de caractères. Modifier les valeurs des propriétés découvertes. Olivier Caron January 10, 2017 25/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (2/8) java Reflection java.awt.Label --- Partie Introspection de java.awt.Label --int property found : alignment java.lang.String property found : text boolean property found : focusable boolean property found : visible boolean property found : enabled java.lang.String property found : name --- Partie Invocation dynamique --invoke method setFocusable with boolean parameter invoke method setAlignment with int parameter invoke method setText with java.lang.String parameter invoke method setEnabled with boolean parameter invoke method setVisible with boolean parameter invoke method setName with java.lang.String parameter Olivier Caron January 10, 2017 26/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (3/8) import j a v a . l a n g . r e f l e c t . ∗ ; import j a v a . beans . Beans ; import j a v a . u t i l . HashMap ; public class R e f l e c t i o n { p r i v a t e HashMap<S t r i n g , Class> recognizedTypes ; p r i v a t e HashMap<Method , S t r i n g > detectedSetMethods ; public R e f l e c t i o n ( ) { t h i s . recognizedTypes=new HashMap<S t r i n g , Class > () ; t h i s . recognizedTypes . p u t ( ” boolean ” , Boolean . TYPE) ; t h i s . recognizedTypes . p u t ( ” i n t ” , I n t e g e r . TYPE) ; t h i s . recognizedTypes . p u t ( ” double ” , Double . TYPE) ; t h i s . recognizedTypes . p u t ( ” j a v a . l a n g . S t r i n g ” , S t r i n g . class ) ; } Olivier Caron January 10, 2017 27/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (4/8) public boolean isRecognizedType ( S t r i n g typeName ) { r e t u r n t h i s . recognizedTypes . g e t ( typeName ) ! = n u l l ; } public Class [ ] getParamForSetter ( S t r i n g typeName ) { r e t u r n new Class [ ] { t h i s . recognizedTypes . g e t ( typeName ) } ; } public s t a t i c void main ( S t r i n g args [ ] ) { R e f l e c t i o n analyseComponent = new R e f l e c t i o n ( ) ; analyseComponent . run ( args [ 0 ] ) ; } Olivier Caron January 10, 2017 28/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (5/8) public void run ( S t r i n g className ) { S t r i n g setName , propertyName ; i n t i n d ; t h i s . detectedSetMethods = new HashMap<Method , S t r i n g > ( ) ; System . o u t . p r i n t l n ( ”−−− P a r t i e I n t r o s p e c t i o n de ” +className+ ” −−−” ) ; try { O b j e c t o b j = Beans . i n s t a n t i a t e ( n u l l , className ) ; Class l a C l a s s e = o b j . g e t C l a s s ( ) ; f o r ( Method m : l a C l a s s e . getMethods ( ) ) { S t r i n g typeName=m. getReturnType ( ) . getName ( ) ; i f ( (m. getName ( ) . s t a r t s W i t h ( ” g e t ” ) | | (m. getName ( ) . s t a r t s W i t h ( ” i s ” ) && typeName . equals ( ” boolean ” ) ) && m. getParameterTypes ( ) . l e n g t h ==0 && isRecognizedType ( typeName ) ) { / / g e t method found i f ( typeName . equals ( ” boolean ” ) ) i n d =2 ; else i n d =3 ; setName= ” s e t ” +m. getName ( ) . s u b s t r i n g ( i n d ) ; propertyName = m. getName ( ) . s u b s t r i n g ( ind , i n d + 1 ) . toLowerCase ( ) + m. getName ( ) . s u b s t r i n g ( i n d +1) ; Olivier Caron January 10, 2017 29/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (6/8) try { Method methodeSet= l a C l a s s e . getMethod ( setName , getParamForSetter ( typeName ) ) ; detectedSetMethods . p u t ( methodeSet , typeName ) ; System . o u t . p r i n t l n ( typeName+ ” p r o p e r t y found : ” +propertyName ) ; } catch ( NoSuchMethodException e1 ) { / / No c o r r e s p o n d i n g s e t t e r method found ( setName ) } } } Olivier Caron January 10, 2017 30/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (7/8) System . o u t . p r i n t l n ( ”−−− P a r t i e I n v o c a t i o n dynamique −−−” ) ; f o r ( Method m : detectedSetMethods . keySet ( ) ) { S t r i n g typeName=detectedSetMethods . g e t (m) ; System . o u t . p r i n t l n ( ” i n v o k e method ” +m. getName ( ) + ” w i t h ” +typeName+ ” parameter ” ) ; i f ( typeName . equals ( ” boolean ” ) ) m. i n v o k e ( obj , t r u e ) ; else i f ( typeName . equals ( ” i n t ” ) ) m. i n v o k e ( obj , 0 ) ; else i f ( typeName . equals ( ” double ” ) ) m. i n v o k e ( obj , 0 . 0 ) ; else i f ( typeName . equals ( ” S t r i n g ” ) ) m. i n v o k e ( obj , ” H e l l o World ! ” ) ; } Olivier Caron January 10, 2017 31/70 GIS 4 Architectures Logicielles Introspection et invocation dynamique (8/8) } catch ( ArrayIndexOutOfBoundsException e ) { System . e r r . p r i n t l n ( ” E r r e u r : j a v a R e f l e c t i o n className ” ) ; } catch ( S e c u r i t y E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” e x c e p t i o n r a i s e d . . . ” ) ; } catch ( I l l e g a l A c c e s s E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” Access . . . ” ) ; } catch ( I n v o c a t i o n T a r g e t E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” Argument . . . ” ) ; } catch ( I l l e g a l A r g u m e n t E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” Argument . . . ” ) ; } catch ( j a v a . i o . IOException e ) { System . e r r . p r i n t l n ( ” IO . . . ” ) ; } catch ( ClassNotFoundException e ) { System . e r r . p r i n t l n ( ” c l a s s . . . ” ) ; } } } Olivier Caron January 10, 2017 32/70 GIS 4 Architectures Logicielles Les environnements à base de composants • Possibilité de construire des outils paramètrables, des descripteurs de composants : Olivier Caron January 10, 2017 33/70 GIS 4 Architectures Logicielles Les environnements à base de composants • Possibilité de construire des outils paramètrables, des descripteurs de composants : • BeanBox, BeanBuilder, NetBeans (SUN) Olivier Caron January 10, 2017 33/70 GIS 4 Architectures Logicielles Les environnements à base de composants • Possibilité de construire des outils paramètrables, des descripteurs de composants : • BeanBox, BeanBuilder, NetBeans (SUN) • JBuilder (Inprise) Olivier Caron January 10, 2017 33/70 GIS 4 Architectures Logicielles Les environnements à base de composants • Possibilité de construire des outils paramètrables, des descripteurs de composants : • BeanBox, BeanBuilder, NetBeans (SUN) • JBuilder (Inprise) • Visual Cafe (Symantec),. . . Olivier Caron January 10, 2017 33/70 GIS 4 Architectures Logicielles Les environnements à base de composants • Possibilité de construire des outils paramètrables, des descripteurs de composants : • BeanBox, BeanBuilder, NetBeans (SUN) • JBuilder (Inprise) • Visual Cafe (Symantec),. . . • d’autres outils: ex: BeanShell Olivier Caron January 10, 2017 33/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Observé Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Auditeur 1 Auditeur 2 ... Auditeur n Observé Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Auditeur 1 Auditeur 2 ... Auditeur n Phase 1 : Inscription Observé Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Auditeur 1 Auditeur 2 ... Auditeur n Phase 1 : Inscription Phase 2 : Evénement Observé évén. Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Auditeur 1 Auditeur 2 ... Auditeur n Phase 1 : Inscription Phase 2 : Evénement Phase 3 : notification Observé évén. Olivier Caron January 10, 2017 34/70 GIS 4 Architectures Logicielles Les évènements (1/3) • Basé sur ”Observer Design Pattern” : Auditeur 1 Auditeur 2 ... Auditeur n Phase 1 : Inscription Phase 2 : Evénement Phase 3 : notification Observé évén. Olivier Caron January 10, 2017 35/70 GIS 4 Architectures Logicielles Les évènements (2/3) • Illustration : le modèle de l’AWT java.util.EventObject java.util.EventListener <<interface>> XEvent observers XListener <<interface>> YBean +void addXListener(XListener x) +void removeXListener(Listener x) -void notifyListeners() <<implements>> notifyListeners() { xe=new XEvent() for each observers ... ZBean } Olivier Caron January 10, 2017 36/70 GIS 4 Architectures Logicielles Les évènements (2/3) • Illustration : le modèle de l’AWT java.util.EventObject java.util.EventListener <<interface>> XEvent observers XListener <<interface>> YBean +void addXListener(XListener x) +void removeXListener(Listener x) -void notifyListeners() <<implements>> notifyListeners() { xe=new XEvent() for each observers ... ZBean } • X → Action, Y → Button Olivier Caron January 10, 2017 36/70 GIS 4 Architectures Logicielles Les évènements (3/3) package j a v a . u t i l ; public class EventObject implements j a v a . i o . S e r i a l i z a b l e { protected t r a n s i e n t O b j e c t source ; public EventObject ( O b j e c t source ) { . . . } public O b j e c t getSource ( ) { r e t u r n source ; } public S t r i n g t o S t r i n g ( ) { . . . } } package j a v a . u t i l ; public i n t e r f a c e E v e n t L i s t e n e r { } Olivier Caron January 10, 2017 37/70 GIS 4 Architectures Logicielles Un nouvel évènement SourireEvent • Objectif : on veut créer un nouvel évènement qui intervient quand le ’smiley’ sourit. import j a v a . u t i l . EventObject ; public class S o u r i r e E v e n t extends EventObject { public S o u r i r e E v e n t ( SmileyBean s r c ) { super ( s r c ) ; } } • Plusieurs auditeurs peuvent être à l’écoute de cet évènement. Olivier Caron January 10, 2017 38/70 GIS 4 Architectures Logicielles Interface pour les auditeurs • Les auditeurs désirant capturer l’évènement doivent implémenter l’interface SourireListener : import j a v a . u t i l . E v e n t L i s t e n e r ; public i n t e r f a c e S o u r i r e L i s t e n e r extends E v e n t L i s t e n e r { public void d e v i e n t D r o l e ( S o u r i r e E v e n t e ) ; } Olivier Caron January 10, 2017 39/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (1/4) • doit gérer les auditeurs (listeners) : ajout et retrait Olivier Caron January 10, 2017 40/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (1/4) • doit gérer les auditeurs (listeners) : ajout et retrait • doit créer un évènement SourireEvent lorsque le ’smiley’ sourit Olivier Caron January 10, 2017 40/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (1/4) • doit gérer les auditeurs (listeners) : ajout et retrait • doit créer un évènement SourireEvent lorsque le ’smiley’ sourit • doit notifier à tous les auditeurs inscrits l’évènement Olivier Caron January 10, 2017 40/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (1/4) • doit gérer les auditeurs (listeners) : ajout et retrait • doit créer un évènement SourireEvent lorsque le ’smiley’ sourit • doit notifier à tous les auditeurs inscrits l’évènement • doit gérer les accès concurrents. Olivier Caron January 10, 2017 40/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (2/4) import j a v a . awt . ∗ ; import j a v a . beans . ∗ ; import java . u t i l . ArrayList ; public class SmileyBean extends Canvas { / / P r i v a t e data f i e l d s : private Color ourColor = Color . yellow ; p r i v a t e boolean s m i l e = t r u e ; p r i v a t e A r r a y L i s t <S o u r i r e L i s t e n e r > l i s t e n e r s ; public SmileyBean ( ) { this . setSize (250 ,250); t h i s . l i s t e n e r s = new A r r a y L i s t <S o u r i r e L i s t e n e r > () ; } Olivier Caron January 10, 2017 41/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (3/4) s yn c hr o n i z e d public void addSourireListener ( SourireListener l ) { l i s t e n e r s . add ( l ) ; } s yn c hr o n i z e d public void removeSourireListener ( SourireListener l ) { l i s t e n e r s . remove ( l ) ; } public synchronized void t o g g l e S m i l e ( ) { smile = ! smile ; i f ( smile ) n o t i f y L i s t e n e r s ( ) ; this . repaint ( ) ; } Olivier Caron January 10, 2017 42/70 GIS 4 Architectures Logicielles La nouvelle classe SmileyBean (4/4) p r i v a t e void n o t i f y L i s t e n e r s ( ) { S o u r i r e E v e n t se=new S o u r i r e E v e n t ( t h i s ) ; ArrayList lv =null ; / / r e a l i s a t i o n c o p i e ( acces c o n c u r r e n t ) / / ex : cas ou un a d d L i s t e n e r en a c t i o n s yn c h r o n i z e d ( t h i s ) { l v =( A r r a y L i s t ) l i s t e n e r s . c l o n e ( ) ; } f o r ( i n t i =0; i <l v . s i z e ( ) ; i ++) ( ( S o u r i r e L i s t e n e r ) l v . g e t ( i ) ) . d e v i e n t D r o l e ( se ) ; } public void p a i n t ( Graphics g ) { . . . } } Olivier Caron January 10, 2017 43/70 GIS 4 Architectures Logicielles Conventions de nommage • Evènement : class NomEvent Olivier Caron January 10, 2017 44/70 GIS 4 Architectures Logicielles Conventions de nommage • Evènement : class NomEvent • Auditeur : interface NomListener Olivier Caron January 10, 2017 44/70 GIS 4 Architectures Logicielles Conventions de nommage • Evènement : class NomEvent • Auditeur : interface NomListener • Classe source d’évènements : public void addNomListener(NomListener l) public void removeNomListener(NomListener l) Olivier Caron January 10, 2017 44/70 GIS 4 Architectures Logicielles Connection de composants • Le composant C1Bean génère l’événement Ev1, le composant C2Bean veut réagir pour cet événement. Olivier Caron January 10, 2017 45/70 GIS 4 Architectures Logicielles Connection de composants • Le composant C1Bean génère l’événement Ev1, le composant C2Bean veut réagir pour cet événement. • Deux cas de figure sont possibles : Olivier Caron January 10, 2017 45/70 GIS 4 Architectures Logicielles Connection de composants • Le composant C1Bean génère l’événement Ev1, le composant C2Bean veut réagir pour cet événement. • Deux cas de figure sont possibles : • Le composant C2Bean implémente l’auditeur Ev1Listener ⇒ unC1.addEv1Listener(unC2) ; Olivier Caron January 10, 2017 45/70 GIS 4 Architectures Logicielles Connection de composants • Le composant C1Bean génère l’événement Ev1, le composant C2Bean veut réagir pour cet événement. • Deux cas de figure sont possibles : • Le composant C2Bean implémente l’auditeur Ev1Listener ⇒ unC1.addEv1Listener(unC2) ; • Le composant C2Bean n’implémente pas l’auditeur Ev1Listener Olivier Caron January 10, 2017 45/70 GIS 4 Architectures Logicielles Connection de composants • Le composant C1Bean génère l’événement Ev1, le composant C2Bean veut réagir pour cet événement. • Deux cas de figure sont possibles : • Le composant C2Bean implémente l’auditeur Ev1Listener ⇒ unC1.addEv1Listener(unC2) ; • Le composant C2Bean n’implémente pas l’auditeur Ev1Listener • Utilisation du design pattern Adaptateur ⇒ Adaptateur a=new Adapt(unC2) ; unC1.addEv1Listener(a) ; Olivier Caron January 10, 2017 45/70 GIS 4 Architectures Logicielles Application du patron de conception Adaptateur public class A d a p t a t e u r implements Ev1 L i s t e n e r { p r i v a t e C2Bean c i b l e ; public A d a p t a t e u r ( C2Bean c i b l e ) { t h i s . c i b l e = c i b l e ; } / / l e s methodes de ˜ Ev1 ˜ L i s t e n e r public void m1( Ev1Event e ) { c i b l e . methode ( ) ; } ... } Olivier Caron January 10, 2017 46/70 GIS 4 Architectures Logicielles Le composant IncrementeurBean import j a v a . awt . Label ; public class IncrementeurBean extends Label { p r i v a t e i n t compteur=0 ; public IncrementeurBean ( ) { super ( ” compteur : 0 ” ) ; } public void i n c r { compteur++ ; t h i s . s e t T e x t ( ” compteur : ” +compteur ) ; } } Olivier Caron January 10, 2017 47/70 GIS 4 Architectures Logicielles Exemple Adaptateur public class A d a p t a t e u r implements S o u r i r e L i s t e n e r { p r i v a t e IncrementeurBean c i b l e ; public A d a p t a t e u r ( IncrementeurBean c i b l e ) { this . cible = cible ; } public void d e v i e n t D r o l e ( S o u r i r e E v e n t e ) { this . cible . incr ( ) ; } } Olivier Caron January 10, 2017 48/70 GIS 4 Architectures Logicielles Exemple application (1/3) Olivier Caron January 10, 2017 49/70 GIS 4 Architectures Logicielles Exemple application (2/3) import j a v a . awt . ∗ ; import j a v a . awt . event . ∗ ; import j a v a . beans . ∗ ; public class SmileyPlace extends Frame implements WindowListener , A c t i o n L i s t e n e r { p r i v a t e SmileyBean s m i l e y = n u l l ; public SmileyPlace ( ) { B u t t o n ok=new B u t t o n ( ” ok ” ) ; IncrementeurBean i n c r = n u l l ; try { s m i l e y =( SmileyBean ) Beans . i n s t a n t i a t e ( n u l l , ” SmileyBean ” ) ; i n c r = new IncrementeurBean ( ) ; } catch ( E x c e p t i o n e ) { System . e r r . p r i n t l n ( ” E x c e p t i o n : ” +e ) ; } Olivier Caron January 10, 2017 50/70 GIS 4 Architectures Logicielles Exemple application (3/3) t h i s . add ( ” Center ” , s m i l e y ) ; t h i s . add ( ” South ” , l a b e l ) ; t h i s . add ( ” North ” , ok ) ; / / c o n n e c t i o n des composants : ok . a d d A c t i o n L i s t e n e r ( t h i s ) ; s m i l e y . a d d S o u r i r e L i s t e n e r (new A da p t at e u r ( i n c r ) ) ; t h i s . addWindowListener ( t h i s ) ; } public void a c t i o n P e r f o r m e d ( A c t i o n E v e n t e ) { smiley . toggleSmile ( ) ; } ... Olivier Caron January 10, 2017 51/70 GIS 4 Architectures Logicielles Que fait au juste l’application ? • Elle n’utilise que des composants (norme Java Beans) : Button, SmileyBean, IncrementeurBean Olivier Caron January 10, 2017 52/70 GIS 4 Architectures Logicielles Que fait au juste l’application ? • Elle n’utilise que des composants (norme Java Beans) : Button, SmileyBean, IncrementeurBean • Elle connecte les composants entre eux addActionListener, addSourireListener Olivier Caron January 10, 2017 52/70 GIS 4 Architectures Logicielles Que fait au juste l’application ? • Elle n’utilise que des composants (norme Java Beans) : Button, SmileyBean, IncrementeurBean • Elle connecte les composants entre eux addActionListener, addSourireListener • Elle n’appelle que des méthodes existantes toggleSmile Olivier Caron January 10, 2017 52/70 GIS 4 Architectures Logicielles Que fait au juste l’application ? • Elle n’utilise que des composants (norme Java Beans) : Button, SmileyBean, IncrementeurBean • Elle connecte les composants entre eux addActionListener, addSourireListener • Elle n’appelle que des méthodes existantes toggleSmile Alors . . . Pourquoi programmer l’application ? Olivier Caron January 10, 2017 52/70 GIS 4 Architectures Logicielles Les outils dédiés • Beanbox, BeanBuilder, NetBeans, . . . Olivier Caron January 10, 2017 53/70 GIS 4 Architectures Logicielles Les outils dédiés • Beanbox, BeanBuilder, NetBeans, . . . • Charge dynamiquement des composants Beans fichiers jar normalisés Olivier Caron January 10, 2017 53/70 GIS 4 Architectures Logicielles Les outils dédiés • Beanbox, BeanBuilder, NetBeans, . . . • Charge dynamiquement des composants Beans fichiers jar normalisés • Outil visuel de programmation Olivier Caron January 10, 2017 53/70 GIS 4 Architectures Logicielles Structure physique du composant (1/2) • fichier archive (jar) contenant : Olivier Caron January 10, 2017 54/70 GIS 4 Architectures Logicielles Structure physique du composant (1/2) • fichier archive (jar) contenant : • classes Java (*.class) Olivier Caron January 10, 2017 54/70 GIS 4 Architectures Logicielles Structure physique du composant (1/2) • fichier archive (jar) contenant : • classes Java (*.class) • objet sérialisé (*.ser) Olivier Caron January 10, 2017 54/70 GIS 4 Architectures Logicielles Structure physique du composant (1/2) • fichier archive (jar) contenant : • classes Java (*.class) • objet sérialisé (*.ser) • fichier descriptif (Manifest.MF), sa structure : Name : <name> <attribute> : <value> <attribute> : <value> ... Name : <name> ... Olivier Caron January 10, 2017 54/70 GIS 4 Architectures Logicielles Structure physique du composant (2/2) • Fichier ”manifest” smiley.mf : Manifest-Version: 1.0 Name: SmileyBean.class Java-Bean: True Name: IncrementeurBean.class Java-Bean: True Name: SourireEvent.class Java-Bean: False ... Olivier Caron January 10, 2017 55/70 GIS 4 Architectures Logicielles Structure physique du composant (2/2) • Fichier ”manifest” smiley.mf : Manifest-Version: 1.0 Name: SmileyBean.class Java-Bean: True Name: IncrementeurBean.class Java-Bean: True Name: SourireEvent.class Java-Bean: False ... • jar cvfm smiley.jar smiley.mf *.class Olivier Caron January 10, 2017 55/70 GIS 4 Architectures Logicielles Structure physique du composant (2/2) • Fichier ”manifest” smiley.mf : Manifest-Version: 1.0 Name: SmileyBean.class Java-Bean: True Name: IncrementeurBean.class Java-Bean: True Name: SourireEvent.class Java-Bean: False ... • jar cvfm smiley.jar smiley.mf *.class • Le fichier ”manifest” est souvent optionnel Olivier Caron January 10, 2017 55/70 GIS 4 Architectures Logicielles La BeanBox en action Olivier Caron January 10, 2017 56/70 GIS 4 Architectures Logicielles La sérialisation Java (1/2) • Mécanisme permettant de rendre persistant des objets Java : Olivier Caron January 10, 2017 57/70 GIS 4 Architectures Logicielles La sérialisation Java (1/2) • Mécanisme permettant de rendre persistant des objets Java : • implémenter l’interface java.io.Serializable Olivier Caron January 10, 2017 57/70 GIS 4 Architectures Logicielles La sérialisation Java (1/2) • Mécanisme permettant de rendre persistant des objets Java : • implémenter l’interface java.io.Serializable • hériter d’une classe sérialisable Olivier Caron January 10, 2017 57/70 GIS 4 Architectures Logicielles La sérialisation Java (1/2) • Mécanisme permettant de rendre persistant des objets Java : • implémenter l’interface java.io.Serializable • hériter d’une classe sérialisable • Sauvegarder un Java Bean : FileOutputStream fic=new FileOutputStream("Smiley1.ser") ; ObjectOutputStream os=new ObjectOutputStream(fic) os.writeObject(unSmileyBean) ; Olivier Caron January 10, 2017 57/70 GIS 4 Architectures Logicielles La sérialisation Java (2/2) • Restaurer un Java Bean : SmileyBean smiley ; try { // essai de récuperer le fichier .ser smiley=(SmileyBean) Beans.instantiate(null,"Smiley1") ; } catch(Exception e) { try { smiley=(SmileyBean) Beans.instantiate(null,"SmileyBean"); } catch(... Olivier Caron January 10, 2017 58/70 GIS 4 Architectures Logicielles La sérialisation Java (2/2) • Restaurer un Java Bean : SmileyBean smiley ; try { // essai de récuperer le fichier .ser smiley=(SmileyBean) Beans.instantiate(null,"Smiley1") ; } catch(Exception e) { try { smiley=(SmileyBean) Beans.instantiate(null,"SmileyBean"); } catch(... • Clause java transient Olivier Caron January 10, 2017 58/70 GIS 4 Architectures Logicielles Les propriétés multiples • Les propriétés tableaux, conventions : public Type[] getNomPropriété() public void setNomPropriété(Type[] valeur) Olivier Caron January 10, 2017 59/70 GIS 4 Architectures Logicielles Les propriétés multiples • Les propriétés tableaux, conventions : public Type[] getNomPropriété() public void setNomPropriété(Type[] valeur) • Les propriétés indicées, élément unique d’un tableau, conventions : public Type getNomPropriété(int index) public void setNomPropriété(int index,Type valeur) Olivier Caron January 10, 2017 59/70 GIS 4 Architectures Logicielles Les propriétés liées (1/3) • Exploite le pattern Observateur Olivier Caron January 10, 2017 60/70 GIS 4 Architectures Logicielles Les propriétés liées (1/3) • Exploite le pattern Observateur • C’est une propriété qui avertit tous les auditeurs des changements de valeur de la propriété. Olivier Caron January 10, 2017 60/70 GIS 4 Architectures Logicielles Les propriétés liées (1/3) • Exploite le pattern Observateur • C’est une propriété qui avertit tous les auditeurs des changements de valeur de la propriété. • L’évènement est envoyé après la modification Olivier Caron January 10, 2017 60/70 GIS 4 Architectures Logicielles Les propriétés liées (1/3) • Exploite le pattern Observateur • C’est une propriété qui avertit tous les auditeurs des changements de valeur de la propriété. • L’évènement est envoyé après la modification • Un auditeur doit implémenter l’interface PropertyChangeListener : package java.beans; import java.util.EventListener ; public interface PropertyChangeListener extends EventListener { void propertyChange(PropertyChangeEvent evt); } Olivier Caron January 10, 2017 60/70 GIS 4 Architectures Logicielles Les propriétés liées (2/3) • Le composant détenant des propriétés liées doit inclure des méthodes de recensement d’auditeurs : Olivier Caron January 10, 2017 61/70 GIS 4 Architectures Logicielles Les propriétés liées (2/3) • Le composant détenant des propriétés liées doit inclure des méthodes de recensement d’auditeurs : • une seule propriété liée dans le composant : public void addPropertyChangeListener(PropertyChangeListener l) public void removePropertyChangeListener(PropertyChangeListener l) Olivier Caron January 10, 2017 61/70 GIS 4 Architectures Logicielles Les propriétés liées (2/3) • Le composant détenant des propriétés liées doit inclure des méthodes de recensement d’auditeurs : • une seule propriété liée dans le composant : public void addPropertyChangeListener(PropertyChangeListener l) public void removePropertyChangeListener(PropertyChangeListener l) • plusieurs propriétés liées dans le composant : public void addPropertyChangeListener( String propertyName, PropertyChangeListener l) public void removePropertyChangeListener( String propertyName, PropertyChangeListener l) Olivier Caron January 10, 2017 61/70 GIS 4 Architectures Logicielles Les propriétés liées (3/3) • L’évènement est du type : package j a v a . beans ; public class PropertyChangeEvent extends j a v a . u t i l . EventObject { public PropertyChangeEvent ( O b j e c t source , S t r i n g propertyName , O b j e c t oldValue , O b j e c t newValue ) { ... } public S t r i n g getPropertyName ( ) { r e t u r n propertyName ; } public O b j e c t getNewValue ( ) { r e t u r n newValue ; } public O b j e c t getOldValue ( ) { r e t u r n o l d V a l u e ; } Olivier Caron January 10, 2017 62/70 GIS 4 Architectures Logicielles Premier exemple de propriété liée (1/3) import j a v a . u t i l . A r r a y L i s t ; import j a v a . beans . ∗ ; public class TemperatureBean extends j a v a . awt . Label { p r i v a t e double t e m p e r at u r e =20.0 ; p r i v a t e A r r a y L i s t <PropertyChangeListener> listeners ; public TemperatureBean ( ) { t h i s . s e t T e x t ( ” ” + t em p e ra t u re ) ; t h i s . l i s t e n e r s = new A r r a y L i s t <PropertyChangeListener > () ; } Olivier Caron January 10, 2017 63/70 GIS 4 Architectures Logicielles Premier exemple de propriété liée (2/3) synchronized public void addPropertyChangeListener ( PropertyChangeListener l ) { l i s t e n e r s . add ( l ) ; } synchronized public void removePropertyChangeListener ( PropertyChangeListener l ) { l i s t e n e r s . remove ( l ) ; } p r i v a t e void n o t i f y L i s t e n e r s ( PropertyChangeEvent event ) { ArrayList lv =null ; synchronized ( t h i s ) { l v =( A r r a y L i s t ) l i s t e n e r s . c l o n e ( ) ; } f o r ( i n t i =0; i <l v . s i z e ( ) ; i ++) ( ( P r o p e r t y C h a n g e L i s t e n e r ) l v . g e t ( i ) ) . propertyChange ( event ) ; } Olivier Caron January 10, 2017 64/70 GIS 4 Architectures Logicielles Premier exemple de propriété liée (3/3) public synchronized void setTemperature ( double v ) { double o l d = t h i s . t e m p e ra t u re ; t h i s . t e m p e r a t u r e =v ; PropertyChangeEvent event ; event =new PropertyChangeEvent ( t h i s , ” te m p er a t u r e ” , new Double ( o l d ) , new Double ( t e m p e r a t u r e ) ) ; t h i s . n o t i f y L i s t e n e r s ( event ) ; t h i s . s e t T e x t ( ” ” + t e m p e ra t u re ) ; } public synchronized double getTemperature ( ) { r e t u r n t h i s . t e m p e ra t u re ; } } Olivier Caron January 10, 2017 65/70 GIS 4 Architectures Logicielles Les propriétés contraintes (1/2) • Le changement de valeur peut être bloqué par un auditeur. • L’auditeur implémente l’interface VetoableChangeListener : package j a v a . beans ; import j a v a . u t i l . E v e n t L i s t e n e r ; public i n t e r f a c e VetoableChangeListener extends E v e n t L i s t e n e r { void vetoableChange ( PropertyChangeEvent e v t ) throws P r o p e r t y V e t o E x c e p t i o n ; } Olivier Caron January 10, 2017 66/70 GIS 4 Architectures Logicielles Les propriétés contraintes (2/2) • L’auditeur peut déclencher l’exception PropertyVetoException pour refuser la modification de la propriété. Olivier Caron January 10, 2017 67/70 GIS 4 Architectures Logicielles Les propriétés contraintes (2/2) • L’auditeur peut déclencher l’exception PropertyVetoException pour refuser la modification de la propriété. • Le composant possédant des propriétés contraintes doit gérer des auditeurs Olivier Caron January 10, 2017 67/70 GIS 4 Architectures Logicielles Les propriétés contraintes (2/2) • L’auditeur peut déclencher l’exception PropertyVetoException pour refuser la modification de la propriété. • Le composant possédant des propriétés contraintes doit gérer des auditeurs • convention pour la définition de propriété contraintes : public void setNomPropriété(Type valeur) throws java.beans.PropertyVetoException Olivier Caron January 10, 2017 67/70 GIS 4 Architectures Logicielles Les composants Java Beans, c’est aussi... • Des API pour des descripteurs de composants Olivier Caron January 10, 2017 68/70 GIS 4 Architectures Logicielles Les composants Java Beans, c’est aussi... • Des API pour des descripteurs de composants • Des API pour des éditeurs de composants Olivier Caron January 10, 2017 68/70 GIS 4 Architectures Logicielles Les composants Java Beans, c’est aussi... • Des API pour des descripteurs de composants • Des API pour des éditeurs de composants • Des outils de versioning (utilitaire serialver) Olivier Caron January 10, 2017 68/70 GIS 4 Architectures Logicielles Les composants Java Beans, c’est aussi... • Des API pour des descripteurs de composants • Des API pour des éditeurs de composants • Des outils de versioning (utilitaire serialver) • Des outils d’authentification (utilitaire javakey) Olivier Caron January 10, 2017 68/70 GIS 4 Architectures Logicielles Les composants Java Beans, c’est aussi... • Des API pour des descripteurs de composants • Des API pour des éditeurs de composants • Des outils de versioning (utilitaire serialver) • Des outils d’authentification (utilitaire javakey) • Des mécanismes de sécurité (JDK 2 : les permissions java) Olivier Caron January 10, 2017 68/70 GIS 4 Architectures Logicielles Conclusion • Facile ? Olivier Caron January 10, 2017 69/70 GIS 4 Architectures Logicielles Conclusion • Facile ? • Puissant Olivier Caron January 10, 2017 69/70 GIS 4 Architectures Logicielles Conclusion • Facile ? • Puissant • Ce n’est pas un nouveau langage Olivier Caron January 10, 2017 69/70 GIS 4 Architectures Logicielles Conclusion • Facile ? • Puissant • Ce n’est pas un nouveau langage • Permet une programmation très modulaire : chaque composant est parfaitement autonome. Olivier Caron January 10, 2017 69/70 GIS 4 Architectures Logicielles Conclusion • Facile ? • Puissant • Ce n’est pas un nouveau langage • Permet une programmation très modulaire : chaque composant est parfaitement autonome. • Portable Olivier Caron January 10, 2017 69/70 GIS 4 Architectures Logicielles Conclusion • Facile ? • Puissant • Ce n’est pas un nouveau langage • Permet une programmation très modulaire : chaque composant est parfaitement autonome. • Portable • Interopérable avec composants ActiveX Olivier Caron January 10, 2017 69/70 GIS 4 Architectures Logicielles Et pour finir... c Ralph Johnson Avant de vouloir qu’un logiciel soit réutilisable, il faudrait d’abord qu’il ait été utilisable. Olivier Caron January 10, 2017 70/70