Cours programmation par composants

publicité
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
Téléchargement