Etude de cas d’une application construite avec CCM

102
ICAR’03 École d’été sur les Intergiciels et sur la Construction d’Applications Réparties Etude de cas d’une application construite avec CCM Philippe Merle Projet Jacquard (INRIA et LIFL) http://www.lifl.fr/~merle

description

JACQUARD. JACQUARD. Etude de cas d’une application construite avec CCM. Philippe Merle Projet Jacquard (INRIA et LIFL) http://www.lifl.fr/~merle. Fork. Fork. Fork. L’application du dîner des philosophes. Thinking Hungry Starving Eating Dead. Thinking Hungry Starving Eating Dead. - PowerPoint PPT Presentation

Transcript of Etude de cas d’une application construite avec CCM

Page 1: Etude de cas d’une application  construite avec CCM

ICAR’03

École d’été sur les Intergiciels etsur la Construction d’Applications Réparties

Etude de cas d’une application construite avec CCM

Philippe MerleProjet Jacquard (INRIA et LIFL)

http://www.lifl.fr/~merle

Page 2: Etude de cas d’une application  construite avec CCM

2© 2003, P. Merle ICAR’03

L’application du dîner des philosophes

Thinking

HungryStarvin

gEatingDead

Kant

ThinkingHungryStarvingEatingDeadDescartes

ThinkingHungryStarvingEatingDead

Aristotle

Fork

Fork

Fork

Page 3: Etude de cas d’une application  construite avec CCM

3© 2003, P. Merle ICAR’03

Node 2

L’application à l’exécution

Node 5

Node 1

Node 3 Node 4

Page 4: Etude de cas d’une application  construite avec CCM

4© 2003, P. Merle ICAR’03

Plan

La conception des composants CORBA Notations : graphique, profile UML 1.x pour CCM et OMG IDL 3.0

L’utilisation des composants CORBA Projection OMG IDL 3.0 vers OMG IDL ; code client

Le développement des composants CORBA Notation OMG CIDL ; classes Java d’implantation

Le conditionnement et l’assemblage des composants CORBA Notation XML CCM ; exemples d’outils

Le déploiement, l’exécution et l’administration de l’application Démonstration sur la plate-forme OpenCCM

Conclusion

Page 5: Etude de cas d’une application  construite avec CCM

5© 2003, P. Merle ICAR’03

La conception descomposants CORBA

Page 6: Etude de cas d’une application  construite avec CCM

6© 2003, P. Merle ICAR’03

La conception des composants CORBA

Concevoir des composants CORBA = identifier les Types de composants et leurs ports

Interfaces et événements d’interaction (~ typage des ports)

Types de maisons de composants et leurs opérations

Types de données et exceptions utilitaires

Via une notation Graphique informelle

Profil UML 2.0 pour CCM (non existant)

Profil UML 1.x pour CCM (en cours de standardisation OMG)

OMG IDL 3.0 défini dans CORBA 3.0

Cependant une plate-forme CCM « classique » ne comprend que la notation OMG IDL 3.0

Toutefois OpenCCM compile aussi des fichiers XMI UML CCM

Page 7: Etude de cas d’une application  construite avec CCM

7© 2003, P. Merle ICAR’03

Le dîner des philosophesnotation graphique informelle

Philosopher

name = Kant

Philosopher

name = Aristotle

Philosopher

name = Descartes

Fork

Fork

Fork

Composant

Interf. base

Facette

Réceptacle

Source évén.

Puit évén.

Observer

Page 8: Etude de cas d’une application  construite avec CCM

8© 2003, P. Merle ICAR’03

Des outils pour la conceptiondes composants CORBA

ConcepteurComposant

Plate-forme CCM

OMG IDL 3.0

Atelier UMLRose, Poseidon, Objecteering

IDEEclipse, NetBeans

N’importe quel

éditeur de texte

XMI UML CCM

Page 9: Etude de cas d’une application  construite avec CCM

9© 2003, P. Merle ICAR’03

L’atelier CadenaPlug-in Eclipse + OpenCCM

Page 10: Etude de cas d’une application  construite avec CCM

10© 2003, P. Merle ICAR’03

L’atelier Objecteeringavec profil UML pour CCM

Développement LIFL dans projet RNTL ACCORD

Page 11: Etude de cas d’une application  construite avec CCM

11© 2003, P. Merle ICAR’03

Le composant ForkManagernotation graphique informelle

InterfaceFork

Interfacede base

ComposantForkManager

facettethe_fork

Page 12: Etude de cas d’une application  construite avec CCM

12© 2003, P. Merle ICAR’03

Le composant ForkManagernotation profil UML 1.x pour CCM

Page 13: Etude de cas d’une application  construite avec CCM

13© 2003, P. Merle ICAR’03

Le composant ForkManagernotation OMG IDL 3.0

exception InUse {};

interface Fork{

void get() raises (InUse);void release();

};

// Le composant fourchette.component ForkManager{

// La facette fourchette utilisée par les philosophes.provides Fork the_fork;

};

ForkManager

Page 14: Etude de cas d’une application  construite avec CCM

14© 2003, P. Merle ICAR’03

Le composant ForkManagernotation OMG IDL 3.0

exception InUse {};

interface Fork{

void get() raises (InUse);void release();

};

// Le composant fourchette.component ForkManager{

// La facette fourchette utilisée par les philosophes.provides Fork the_fork;

};

ForkManager

Page 15: Etude de cas d’une application  construite avec CCM

15© 2003, P. Merle ICAR’03

Le composant ForkManagernotation OMG IDL 3.0

exception InUse {};

interface Fork{

void get() raises (InUse);void release();

};

// Le composant fourchette.component ForkManager{

// La facette fourchette utilisée par les philosophes.provides Fork the_fork;

};

ForkManager

Page 16: Etude de cas d’une application  construite avec CCM

16© 2003, P. Merle ICAR’03

La maison de ForkManagerselon les 3 notations

// OMG IDL 3.0

home ForkHome manages ForkManager {};

ForkHome

ForkManager

Page 17: Etude de cas d’une application  construite avec CCM

17© 2003, P. Merle ICAR’03

L’événement StatusInfonotations UML / CCM et OMG IDL 3.0

enum PhilosopherState { EATING, THINKING, HUNGRY, STARVING, DEAD};

eventtype StatusInfo { public string name; public PhilosopherState state; public unsigned long

ticks_since_last_meal; public boolean has_left_fork; public boolean has_right_fork;};

profil UML pour CCM OMG IDL 3.0

Page 18: Etude de cas d’une application  construite avec CCM

18© 2003, P. Merle ICAR’03

Le composant Philosophernotation graphique informelle

ComposantPhilosopher

RéceptacleFork left

RéceptacleFork right

Attribut name

SourceStatusInfo info

Page 19: Etude de cas d’une application  construite avec CCM

19© 2003, P. Merle ICAR’03

Le composant Philosophernotation profil UML 1.x pour CCM

Page 20: Etude de cas d’une application  construite avec CCM

20© 2003, P. Merle ICAR’03

Le composant Philosophernotation OMG IDL 3.0

component Philosopher

{

attribute string name;

// La fourchette à gauche.

uses Fork left;

// La fouchette à droite.

uses Fork right;

// La source d’événements StatusInfo.

publishes StatusInfo info;

};

Philosopher

name = XXX

Page 21: Etude de cas d’une application  construite avec CCM

21© 2003, P. Merle ICAR’03

Le composant Philosophernotation OMG IDL 3.0

component Philosopher

{

attribute string name;

// La fourchette à gauche.

uses Fork left;

// La fouchette à droite.

uses Fork right;

// La source d’événements StatusInfo.

publishes StatusInfo info;

};

Philosopher

name = XXX

Page 22: Etude de cas d’une application  construite avec CCM

22© 2003, P. Merle ICAR’03

Le composant Philosophernotation OMG IDL 3.0

component Philosopher

{

attribute string name;

// La fourchette à gauche.

uses Fork left;

// La fouchette à droite.

uses Fork right;

// La source d’événements StatusInfo.

publishes StatusInfo info;

};

Philosopher

name = XXX

Page 23: Etude de cas d’une application  construite avec CCM

23© 2003, P. Merle ICAR’03

Le composant Philosophernotation OMG IDL 3.0

component Philosopher

{

attribute string name;

// La fourchette à gauche.

uses Fork left;

// La fouchette à droite.

uses Fork right;

// La source d’événements StatusInfo.

publishes StatusInfo info;

};

Philosopher

name = XXX

Page 24: Etude de cas d’une application  construite avec CCM

24© 2003, P. Merle ICAR’03

La maison de Philosopher selon les 3 notations

// OMG IDLhome PhilosopherHome manages Philosopher { factory new(in string name);};

PhilosopherHome

Philosopher

name = XXX

Page 25: Etude de cas d’une application  construite avec CCM

25© 2003, P. Merle ICAR’03

Le composant Observernotation graphique informelle

ComposantObserver

Interfacede base

eventtypeStatusInfo

Puitinfo

Page 26: Etude de cas d’une application  construite avec CCM

26© 2003, P. Merle ICAR’03

Le composant Observernotation profil UML 1.x pour CCM

Page 27: Etude de cas d’une application  construite avec CCM

27© 2003, P. Merle ICAR’03

Le composant Observernotation OMG IDL 3.0

component Observer

{

// Le puit de réception de StatusInfo.

consumes StatusInfo info;

};

Observer

Page 28: Etude de cas d’une application  construite avec CCM

28© 2003, P. Merle ICAR’03

Le composant Observernotation OMG IDL 3.0

component Observer

{

// Le puit de réception de StatusInfo.

consumes StatusInfo info;

};

Observer

Page 29: Etude de cas d’une application  construite avec CCM

29© 2003, P. Merle ICAR’03

La maison de Observer selon les 3 notations

// OMG IDLhome ObserverHome manages Observer {};

Observer Home

Observer

Page 30: Etude de cas d’une application  construite avec CCM

30© 2003, P. Merle ICAR’03

L’utilisation des composants CORBA

Page 31: Etude de cas d’une application  construite avec CCM

31© 2003, P. Merle ICAR’03

L’utilisation des composants CORBA

« OMG IDL orienté composant » uniquement sucre syntaxique pour décrire les composants CORBA, projeté en OMG IDL 2.x

Chaque construction OMG IDL 3.0 a une équivalence en OMG IDL 2.x

Une seule projection spécifiée au lieu d’une par langages de programmation

Préservation des standards de projection OMG IDL 2.x langages

Les composants et maisons sont utilisés par les développeurs comme des objets CORBA étendus

Composants et maisons invoqués comme des objets CORBA

Applications clientes uniquement CORBA 2.x possible

Préservation des compétences des développeurs CORBA 2.x

Réutilisation des outils CORBA 2.x, e.g. générateurs de souches/squelettes

Page 32: Etude de cas d’une application  construite avec CCM

32© 2003, P. Merle ICAR’03

Le projection OMG IDL 3.0vers OMG IDL 2.x

ConcepteurComposant

Code utilisateur

Compilateur

Code généré

OMG IDL 3.0Orienté

Composant

SoucheCliente

CompilateurOMG IDL 3.0

OMG IDL 2.xOrientéObjet

UtilisateurComposant

ApplicationCliente

Utilise

Implanté par

ORBComposant

Page 33: Etude de cas d’une application  construite avec CCM

33© 2003, P. Merle ICAR’03

Les principales règles de projectionOMG IDL 3.0 vers OMG IDL

1 type de composants 1 interface héritant de Components::CCMObject

1 propriété 1 attribut

1 facette ou puits 1 opération fournissant la référence du port

1 réceptacle opérations de connexion, déconnexion et d’acquisition de la

(ou des) référence(s) associée(s)

1 source opérations de (dé)souscription aux événements produits

1 type de maisons 3 interfaces 1 pour opérations explicites du concepteur

+ héritage de Components::CCMHome 1 pour opérations implicites générées 1 héritant des 2 interfaces précédentes

1 type d’événements 1 type de valeurs + 1 interface Consumer héritant de Components::EventBase héritant de Components::EventConsumerBase

Page 34: Etude de cas d’une application  construite avec CCM

34© 2003, P. Merle ICAR’03

La projection OMG IDLdu composant ForkManager

component ForkManager

{

provides Fork the_fork;

};

interface ForkManager :

::Components::CCMObject

{

Fork provide_the_fork();

};

Traduit en

ForkManager

Page 35: Etude de cas d’une application  construite avec CCM

35© 2003, P. Merle ICAR’03

ForkHome

La projection OMG IDLde la maison ForkHome

home ForkHome

manages ForkManager {};

interface ForkHomeExplicit :

::Components::CCMHome {};

interface ForkHomeImplicit :

::Components::KeylessCCMHome {

ForkManager create();

};

interface ForkHome :

ForkHomeExplicit,

ForkHomeImplicit {};

ForkManager

Traduit en

Page 36: Etude de cas d’une application  construite avec CCM

36© 2003, P. Merle ICAR’03

La projection OMG IDLde l’événement StatusInfo

eventtype StatusInfo { . . . };

valuetype StatusInfo : ::Components::EventBase { . . . };

interface StatusInfoConsumer : ::Components::EventConsumerBase { void push_StatusInfo(in StatusInfo the_StatusInfo);};

Traduit en

Page 37: Etude de cas d’une application  construite avec CCM

37© 2003, P. Merle ICAR’03

La projection OMG IDLdu composant Observer

component Observer {

consumes StatusInfo info;

};

interface Observer :

::Components::CCMObject {

StatusInfoConsumer get_consumer_info();

};

Observer

Traduit en

Page 38: Etude de cas d’une application  construite avec CCM

38© 2003, P. Merle ICAR’03

Observer Home

La projection OMG IDLde la maison ObserverHome

home ObserverHome manages Observer {};

interface ObserverHomeExplicit : ::Components::CCMHome {};interface ObserverHomeImplicit : ::Components::KeylessCCMHome {

Observer create();};

interface ObserverHome : ObserverHomeExplicit, ObserverHomeImplicit {};

ObserverTraduit en

Page 39: Etude de cas d’une application  construite avec CCM

39© 2003, P. Merle ICAR’03

La projection OMG IDLdu composant Philosopher

component Philosopher {attribute string name;uses Fork left;uses Fork right;publishes StatusInfo info;

};

interface Philosopher : ::Components::CCMObject { attribute string name;

.../...

Philosopher

name = XXX

Traduit en

Page 40: Etude de cas d’une application  construite avec CCM

40© 2003, P. Merle ICAR’03

La projection OMG IDLdu composant Philosopher

void connect_left(in Fork cnx) raises(…); Fork disconnect_left() raises(…); Fork get_connection_left();

void connect_right(in Fork cnx) raises (…); Fork disconnect_right() raises (…); Fork get_connection_right();

Components::Cookie subscribe_info( in StatusInfoConsumer consumer) raises(…);

StatusInfoConsumer unsubscribe_info( in Components::Cookie ck) raises(…);};

Traduit en

Philosopher

name = XXX

Page 41: Etude de cas d’une application  construite avec CCM

41© 2003, P. Merle ICAR’03

La projection OMG IDLde la maison PhilosopherHome

home PhilosopherHomemanages Philosopher {

factory new(in string name);};

interface PhilosopherHomeExplicit : ::Components::CCMHome {

Philosopher new(in string name);};interface PhilosopherHomeImplicit : ::Components::KeylessCCMHome {

Philosopher create();};

interface PhilosopherHome : PhilosopherHomeExplicit, PhilosopherHomeImplicit {};

PhilosopherHome

Philosopher

name = XXX

Traduit en

Page 42: Etude de cas d’une application  construite avec CCM

42© 2003, P. Merle ICAR’03

Le modèle de programmationdes clients

Deux canevas de conception Factory – Recherche une maison et l’utilise pour créer de nouvelles

instances de composant

Finder – Recherche instances de composant existantes via le service de Nommage, de Courtage ou via les opérations de recherche des maisons

Optionnellement démarcation des transactions begin, commit et rollback

Peut établir les crédits de sécurité

Invoque les opérations des instances de composant Celles définies par la projection vers OMG IDL

Client ne sait pas nécessairement qui interagit avec des composants

Page 43: Etude de cas d’une application  construite avec CCM

43© 2003, P. Merle ICAR’03

L’utilisation de composants CORBA via OMG IDLscript

# Obtenir le service de recherche de maisons de composants.chf = CORBA.ORB.resolve_initial_references (“ComponentHomeFinder”)

# Rechercher une maison selon son type.forkHome = chf.find_home_by_type(ForkHome.id())

# Créer un composant fourchette.forkManager = forkHome.create()

# Obtenir la facette fourchette.fork = forkManager.provide_the_fork()

# Utiliser la facette fourchette.fork.get(). . . . . . .

fork.release()

Page 44: Etude de cas d’une application  construite avec CCM

44© 2003, P. Merle ICAR’03

L’interconnexion de composants CORBA avec OMG IDLscript

# Obtenir les composants CORBA à interconnecter.

kant = Philosopher(“corbaname:…”)observer = Observer(“corbaname:…”)

# Connecter les composants kant et observer.ck = kant.subscribe_info(observer.get_consumer_info()). . . . . .

# Déconnecter les composants kant et observer.

kant.unsubscribe_info(ck)

Observer

Philosopher

name = Kant

Page 45: Etude de cas d’une application  construite avec CCM

45© 2003, P. Merle ICAR’03

La navigation et l’introspectiondes composants CORBA

Navigation d’une facette vers le composant via opération CORBA::Object::get_component() Retourne la référence de base du composant ou nil si pas une facette

Navigation du composant vers les facettes et puits via les opérations introduites lors de la projection vers OMG IDL

Opérations génériques de navigation, de contrôle et d’introspection fournies par l’interface CCMObject provide_facet, get_[all|named]_facets, same_component connect, disconnect, get_connections, get_[all|

named]_receptacles get_consumer, get_[all|named]_consumers subscribe, unsubscribe, [dis]connect_consumer, get_[all|

named]_[emitters|publishers] get_all_ports, get_ccm_home, get_component_def, get_ccm_home,

get_primary_key

Au cœur de l’interconnexion des composants au déploiement et de l’administration des composants à l’exécution

Page 46: Etude de cas d’une application  construite avec CCM

46© 2003, P. Merle ICAR’03

Le développement des

composants CORBA

Page 47: Etude de cas d’une application  construite avec CCM

47© 2003, P. Merle ICAR’03

Le développement des composants CORBA

Décrire la structure d’implantation des composants Via OMG Component Implementation Definition Language (CIDL)

Compositions, segments et états persistants

Compiler les descriptions OMG CIDL Génération du code conteneur + squelette exécuteur

Implanter les composants et les maisons Héritage du code généré

Règles de programmation à respecter

Compiler le code utilisateur + le code généré

Page 48: Etude de cas d’une application  construite avec CCM

48© 2003, P. Merle ICAR’03

La compilation OMG CIDL

ConcepteurComposant

OMG IDL3.0

LocalServer-sideOMG IDL

CodeComposant

ConteneurComposant

DéveloppeurComposant

hérité

Code utilisateur

Compilateur

Code généré

OMG CIDL

ConcepteurComposition

SqueletteComposant

Implantépartiellement

délègue

CompilateurOMG CIDL

includeimport

Page 49: Etude de cas d’une application  construite avec CCM

49© 2003, P. Merle ICAR’03

L’implantation Javades composants

Héritage des squelettes OMG CIDL générés 1 classe par maison implantant

Opérations métiers explicites du concepteur 1 méthode de fabrique des implantations des segments 1 méthode statique point d’entrée pour le déploiement

1 classe par composant implantant Opérations métiers des facettes supportées 1 opération de réception des événements pour chaque puit supporté Surcharge des opérations de l’interface SessionComponent ou

EntityComponent

1 classe par segment implantant Opérations métiers des facettes supportées 1 opération de réception des événements pour chaque puit supporté

2 classes par événement Implantation concrète et fabrique

Page 50: Etude de cas d’une application  construite avec CCM

50© 2003, P. Merle ICAR’03

L’interface SessionComponent

module Components { local interface EnterpriseComponent { void configuration_complete() raises(InvalidConfiguration); }; local interface SessionComponent : EnterpriseComponent { void set_session_context(in SessionContext ctx) raises(CCMException); void ccm_activate() raises(CCMException); void ccm_passivate() raises(CCMException); void ccm_remove() raises(CCMException);};};

Page 51: Etude de cas d’une application  construite avec CCM

51© 2003, P. Merle ICAR’03

La composition OMG CIDLpour composant Observer

composition session ObserverComposition

{

home executor ObserverHomeBase

{

implements DiningPhilosophers::ObserverHome;

manages ObserverBase;

};

};

Page 52: Etude de cas d’une application  construite avec CCM

52© 2003, P. Merle ICAR’03

La structure d’implantationdu composant Observer

ObserverHomeBase ObserverBase

ObserverImplObserverHomeImplinstancie

ObserverComposition

Page 53: Etude de cas d’une application  construite avec CCM

53© 2003, P. Merle ICAR’03

L’implantation Javade la maison ObserverHome

public class ObserverHomeImpl extends ObserverComposition.ObserverHomeBase{ // Le constructeur. public ObserverHomeImpl() {}

// La fabrique des implantations de segments. public org.omg.Components.ExecutorSegmentBase create_executor_segment(int segid) { return new ObserverImpl(); }

// Le point d’entrée pour le déploiement. public static org.omg.Components.HomeExecutorBase create_home() { return new ObserverHomeImpl(); }}

Page 54: Etude de cas d’une application  construite avec CCM

54© 2003, P. Merle ICAR’03

SessionContext

Le composant Observer

ObserverBaseObserverImpl

CCM_Observer_Executor

CCM_StatusInfoConsumerCCM_Observer_Context

Observer

StatusInfoConsumer

SessionComponent

Observer

Page 55: Etude de cas d’une application  construite avec CCM

55© 2003, P. Merle ICAR’03

L’implantation Javadu composant Observer (1/2)

public class ObserverImpl extends ObserverComposition.ObserverBase{ // Attributs internes pour IHM.

// Le constructeur. public ObserverImpl() { ... }

// Pour interface CCM_StatusInfo_Consumer. public void push(StatusInfo event) { ... Mise à jour IHM ... }../..

Observer

Page 56: Etude de cas d’une application  construite avec CCM

56© 2003, P. Merle ICAR’03

L’implantation Javadu composant Observer (2/2)

// Surcharge des opérations SessionComponent.

public void ccm_activate() throws org.omg.Components.CCMException { ... Afficher IHM ... }

public void ccm_passivate() throws org.omg.Components.CCMException { ... Cacher IHM ... }

public void ccm_remove () throws org.omg.Components.CCMException { ... Libérer les ressources IHM ... }}

Observer

Page 57: Etude de cas d’une application  construite avec CCM

57© 2003, P. Merle ICAR’03

La composition OMG CIDLpour composant Philosopher

composition session PhilosopherComposition

{

home executor PhilosopherHomeBase

{

implements DiningPhilosophers::PhilosopherHome;

manages PhilosopherBase;

};

};

Page 58: Etude de cas d’une application  construite avec CCM

58© 2003, P. Merle ICAR’03

La structure d’implantationdu composant Philosopher

PhilosopherHomeBase PhilosopherBase

PhilosopherImplPhilosopherHomeImplinstancie

PhilosopherComposition

Page 59: Etude de cas d’une application  construite avec CCM

59© 2003, P. Merle ICAR’03

L’implantation Javade la maison PhilosopherHome

public class PhilosopherHomeImpl extends PhilosopherComposition.PhilosopherHomeBase{ // Le constructeur. public PhilosopherHomeImpl() {}

// Pour CCM_PhilosopherHome public org.omg.Components.EnterpriseComponent _new(String name) { return new PhilosopherImpl(name); }

// Fabrique des implantations de segments. public org.omg.Components.ExecutorSegmentBase create_executor_segment(int segid) { return new PhilosopherImpl(null); }

// Le point d'entrée pour le déploiement. public static org.omg.Components.HomeExecutorBase create_home() { return new PhilosopherHomeImpl(); }}

Page 60: Etude de cas d’une application  construite avec CCM

60© 2003, P. Merle ICAR’03

Le composant Philosopher

PhilosopherBasePhilosopherImpl

CCM_Philosopher_Executor

CCM_Philosopher_Context

Philosopher

SessionComponent

SessionContext

Philosopher

name = XXX

Page 61: Etude de cas d’une application  construite avec CCM

61© 2003, P. Merle ICAR’03

Les interfaces de l’exécuteurPhilosopher

local interface CCM_Philosopher_Executor : ::Components::EnterpriseComponent{ attribute string name;};local interface CCM_Philosopher_Context : ::Components::CCMContext{ // Obtenir la fourchette gauche actuellement connectée. Fork get_connection_left();

// Obtenir la fourchette droite actuellement connectée. Fork get_connection_right();

// Envoyer un événement à tous les puits connectés. void push_info(in StatusInfo ev);};

Philosopher

name = XXX

Page 62: Etude de cas d’une application  construite avec CCM

62© 2003, P. Merle ICAR’03

L’implantation Javadu composant Philosopher (1/4)

public class PhilosopherImpl extends PhilosopherComposition.PhilosopherBase implements java.lang.Runnable{ // Attribut pour stocker le nom du philosophe. private String name_;

// Le constructeur. public PhilosopherImpl(String name) {name_=name;}

// Pour interface CCM_Philosopher_Executor. public String name() { return name_; } public void name(String n) { name_ = n; }

../..

Philosopher

name = XXX

Page 63: Etude de cas d’une application  construite avec CCM

63© 2003, P. Merle ICAR’03

L’implantation Javadu composant Philosopher (2/4)

// Surcharge des opérations EnterpriseComponent.

public void configuration_complete() throws org.omg.Components.InvalidConfiguration { // Vérifier si la configuration est correcte. if( (name_ == null) || (get_context().get_connection_left()==null) || (get_context().get_connection_right()==null)) { throw new

org.omg.Components.InvalidConfiguration(); } }

Philosopher

name = XXX

Page 64: Etude de cas d’une application  construite avec CCM

64© 2003, P. Merle ICAR’03

L’implantation Javadu composant Philosopher (3/4)

// Surcharge des opérations SessionComponent.

// L'activité associée au philosophe. private java.lang.Thread comportement_;

public void ccm_activate() throws org.omg.Components.CCMException { comportement_ = new Thread(this); comportement_.start(); }

public void ccm_remove() throws org.omg.Components.CCMException { comportement_.stop(); }

Philosopher

name = XXX

Page 65: Etude de cas d’une application  construite avec CCM

65© 2003, P. Merle ICAR’03

L’implantation Javadu composant Philosopher (4/4)

// Le comportement du philosophe. public void run() { ... // Envoyer son état aux observateurs. get_context().push_info(new StatusInfoImpl(...)); ... // Prendre les fourchettes. get_context().get_connection_left().get(); get_context().get_connection_right().get(); ... // Rendre les fourchettes. get_context().get_connection_left().release(); get_context().get_connection_right().release(); ...} }

Philosopher

name = XXX

Page 66: Etude de cas d’une application  construite avec CCM

66© 2003, P. Merle ICAR’03

La composition OMG CIDLpour composant ForkManager

composition session ForkComposition{ home executor ForkManagerHomeBase { implements DiningPhilosophers::ForkHome; manages ForkManagerBase { segment ForkSeg { provides facet the_fork; } }; };};

Page 67: Etude de cas d’une application  construite avec CCM

67© 2003, P. Merle ICAR’03

La structure d’implantationdu composant Philosopher

ForkManagerHomeBase ForkManagerBase

ForkManagerImplForkHomeImpl

ForkComposition

ForkSeg

ForkSegImpl

<<CORBAInterface>>Fork

Page 68: Etude de cas d’une application  construite avec CCM

68© 2003, P. Merle ICAR’03

L’implantation Javade la maison ForkHome

public class ForkHomeImpl extends ForkComposition.ForkManagerHomeBase{ // La fabrique d'implantation des segments. public org.omg.Components.ExecutorSegmentBase create_executor_segment(int segid) { switch (segid) { case 0: return new ForkManagerImpl(); case ForkSegImpl._segment_id_value: return new ForkSegImpl(); } }

// Le point d'entrée pour le déploiement. public static org.omg.Components.HomeExecutorBase create_home() { return new ForkHomeImpl(); }}

Page 69: Etude de cas d’une application  construite avec CCM

69© 2003, P. Merle ICAR’03

Le composant ForkManager

ForkManagerImpl

CCM_ForkManager_Executor

CCM_ForkManager_Context

ForkManager

Fork

SessionComponent

ForkSegImplCCM_Fork

ForkManager

SessionContext

Page 70: Etude de cas d’une application  construite avec CCM

70© 2003, P. Merle ICAR’03

L’implantation Javadu composant ForkManager (1/2)

public class ForkManagerImpl extends ForkComposition.ForkManagerBase{ // Le constructeur. public ForkManagerImpl() {}

// Surcharge des opérations SessionComponent. // e.g. ccm_activate, ccm_passivate, ccm_remove.}

ForkManager

Page 71: Etude de cas d’une application  construite avec CCM

71© 2003, P. Merle ICAR’03

L’implantation Javadu composant ForkManager (2/2)

public class ForkSegImpl extends ForkComposition.ForkSeg{ private boolean disponible_ = true;

// Prendre la fourchette. public void get() throws InUse { if(!disponible_) throw new InUse(); disponible_ = false; }

// Rendre la fourchette. public void release() { disponible_ = true; }}

ForkManager

Page 72: Etude de cas d’une application  construite avec CCM

72© 2003, P. Merle ICAR’03

L’implantation Javade l’événement StatusInfo (1/2)

public class StatusInfoImpl extends StatusInfo{ public StatusInfoImpl(PhilosopherState s, String n, int ticks, boolean left_fork, boolean right_fork) { state = s; name = n; ticks_since_last_meal = ticks; has_left_fork = left_fork; has_right_fork = right_fork; } public StatusInfoImpl() { this(PhilosopherState.DEAD, "", 0, false, false); }}

Page 73: Etude de cas d’une application  construite avec CCM

73© 2003, P. Merle ICAR’03

L’implantation Javade l’événement StatusInfo (2/2)

public class StatusInfoFactory

implements org.omg.CORBA.portable.ValueFactory

{

// Lecture depuis un flux CORBA.

public java.io.Serializable

read_value(org.omg.CORBA_2_3.portable.InputStream in)

{

java.io.Serializable v = new StatusInfoImpl();

return in.read_value(v);

}

}

Page 74: Etude de cas d’une application  construite avec CCM

74© 2003, P. Merle ICAR’03

Le conditionnement et l’assemblage des composants CORBA

Page 75: Etude de cas d’une application  construite avec CCM

75© 2003, P. Merle ICAR’03

Le conditionnement et l’assemblage des composants CORBA

Construire des archives ZIP De composants contenant

XML Component Software Descriptor (.csd) XML CORBA Component Descriptors (.ccd) XML Component Property Files (.cpf) Fichiers OMG IDL + code binaires

D’assemblage contenant XML Component Assembly Descriptor (.cad) Archives de composants XML Component Property Files (.cpf)

Besoin d’outils de conditionnement et d’assemblage pour CCM Diverses approches et outils existent

Combinaison de différents outils possible

Page 76: Etude de cas d’une application  construite avec CCM

76© 2003, P. Merle ICAR’03

Des outils de conditionnement et d’assemblage des composants CORBA

Conditionneur / AssembleurComposant

Plate-forme CCM

CCM XML + ZIP

Atelier UMLRose, Poseidon, Objecteering

Outil IHMMicoCCM, K2, OpenCCM

N’importe quel

éditeur de texte

Page 77: Etude de cas d’une application  construite avec CCM

77© 2003, P. Merle ICAR’03

Software Package Descriptorpour Composant Observer

<?xml version="1.0"?>

<!DOCTYPE softpkg SYSTEM "softpkg.dtd">

<softpkg name="Observer" version="1,0,0,0">

<pkgtype>CORBA Component</pkgtype>

<title>Observer</title>

<author>

<name>Philippe Merle</name>

<company>INRIA</company>

<webpage href="http://www.inria.fr"/>

</author>

<description>The CCM dining philosophers example</description>

Page 78: Etude de cas d’une application  construite avec CCM

78© 2003, P. Merle ICAR’03

Software Package Descriptorpour Composant Observer

<license href= "http://www.objectweb.org/license.html"/>

<idl id="IDL:DiningPhilosophers/Observer:1.0">

<link href="http://www.objectweb.org/philo.idl"/>

</idl>

<descriptor type="CORBA Component">

<fileinarchive name="observer.ccd"/>

</descriptor>

<propertyfile>

<fileinarchive name="observer.cpf"/>

</propertyfile>

<implementation> . . . </implementation>

</softpkg>

Page 79: Etude de cas d’une application  construite avec CCM

79© 2003, P. Merle ICAR’03

Software Package Descriptorpour Composant Observer

<implementation id="Observer_impl">

<os name="WinNT" version="4,0,0,0"/>

<os name="Linux" version="2,2,17,0"/>

<processor name="x86"/>

<compiler name="JDK"/>

<programminglanguage name="Java"/>

<code type="Java class">

<fileinarchive name="ObserverHomeImpl.class"/>

<entrypoint>ObserverHomeImpl.create_home</entrypoint>

</code>

<runtime name="Java VM" version="1,2,2,0"/>

<runtime name="Java VM" version="1,3,0,0"/>

<dependency>...</dependency>

</implementation>

Page 80: Etude de cas d’une application  construite avec CCM

80© 2003, P. Merle ICAR’03

Software Package Descriptorpour Composant Observer

<dependency type="ORB" action="assert"> <name>OpenORB</name> </dependency>

<dependency type="Java Class" action="install"> <valuetypefactory repid="IDL:DiningPhilosophers/StatusInfo:1.0"

valueentrypoint="DiningPhilosophers.StatusInfoDefaultFactory.create"

factoryentrypoint="DiningPhilosophers.StatusInfoDefaultFactory">

<fileinarchive name="DiningPhilosophers/StatusInfoDefaultFactory.class"/>

</valuetypefactory> </dependency>

Page 81: Etude de cas d’une application  construite avec CCM

81© 2003, P. Merle ICAR’03

CORBA Component Descriptorpour Composant Philosopher

<?xml version="1.0"?><!DOCTYPE corbacomponent SYSTEM "corbacomponent.dtd">

<corbacomponent> <corbaversion>3.0</corbaversion> <componentrepid repid= "IDL:DiningPhilosophers/Philosopher:1.0"/> <homerepid repid= "IDL:DiningPhilosophers/PhilosopherHome:1.0"/> <componentkind> <process><servant lifetime="container" /></process> </componentkind> <security rightsfamily="CORBA“ rightscombinator="secanyrights" /> <threading policy="multithread" /> <configurationcomplete set="true" />

Page 82: Etude de cas d’une application  construite avec CCM

82© 2003, P. Merle ICAR’03

CORBA Component Descriptorpour Composant Philosopher

<homefeatures name="PhilosopherHome" repid="IDL:DiningPhilosophers/PhilosopherHome:1.0"/> <componentfeatures name="Philosopher" repid="IDL:DiningPhilosophers/Philosopher:1.0"> <ports> <uses usesname="right" repid="IDL:DiningPhilosophers/Fork:1.0" /> <uses usesname="left" repid="IDL:DiningPhilosophers/Fork:1.0" /> <publishes emitsname="info" eventtype="StatusInfo"> <eventpolicy policy="normal" /> </publishes> </ports> </componentfeatures>

<interface name="Fork" repid="IDL:DiningPhilosophers/Fork:1.0"/>

Page 83: Etude de cas d’une application  construite avec CCM

83© 2003, P. Merle ICAR’03

Property File pour Philosopher Kant

<?xml version="1.0"?>

<!DOCTYPE properties SYSTEM "properties.dtd">

<properties>

<simple name="name" type="string">

<description>Philosopher name</description>

<value>Kant</value>

<defaultvalue>Unknown</defaultvalue>

</simple>

</properties>

Page 84: Etude de cas d’une application  construite avec CCM

84© 2003, P. Merle ICAR’03

L’assemblage des composantsdu dîner des philosophes

Philosopher

name = Kant

Philosopher

name = Aristotle

Philosopher

name = Descartes

Fork

Fork

Fork

Composant

Interf. base

Facette

Réceptacle

Source évén.

Puit évén.

Observer

Page 85: Etude de cas d’une application  construite avec CCM

85© 2003, P. Merle ICAR’03

Component Assembly Descriptorpour dîner des philosophes

<?xml version="1.0"?><!DOCTYPE componentassembly SYSTEM

"componentassembly.dtd"><componentassembly id="demophilo"> <description>Dinner assembly descriptor</description> <componentfiles> <componentfile id="PhilosopherComponent"> <fileinarchive name="philosopher.csd"/> </componentfile> <componentfile id="ObserverComponent"> <fileinarchive name="observer.csd"/> </componentfile> <componentfile id="ForkManagerComponent"> <fileinarchive name="forkmanager.csd"/> </componentfile> </componentfiles>

Page 86: Etude de cas d’une application  construite avec CCM

86© 2003, P. Merle ICAR’03

Component Assembly Descriptorpour dîner des philosophes

<partitioning>

<homeplacement id="ObserverHome">

<componentfileref idref="ObserverComponent"/>

<componentinstantiation id="Freud"/>

<registerwithnaming name="Dinner/ObserverComponent"/>

</homeplacement>

<homeplacement id="ForkHome">

<componentfileref idref="ForkManagerComponent"/>

<componentinstantiation id="ForkManager1"/>

<componentinstantiation id="ForkManager2"/>

<componentinstantiation id="ForkManager3"/>

<registerwithhomefinder name="ForkHome"/>

</homeplacement>

Page 87: Etude de cas d’une application  construite avec CCM

87© 2003, P. Merle ICAR’03

Component Assembly Descriptorpour dîner des philosophes

<homeplacement id="PhilosopherHome"> <componentfileref idref="PhilosopherComponent"/>

<componentinstantiation id="Kant"> <componentproperties><fileinarchive name="Kant.cpf"/> </componentproperties></componentinstantiation>

<componentinstantiation id="Descartes"> <componentproperties><fileinarchive name="Descartes.cpf"/> </componentproperties></componentinstantiation>

<componentinstantiation id="Aristotle"> <componentproperties><fileinarchive name="Aristotle.cpf"/> </componentproperties></componentinstantiation>

</homeplacement></partitioning>

Page 88: Etude de cas d’une application  construite avec CCM

88© 2003, P. Merle ICAR’03

Component Assembly Descriptorpour dîner des philosophes

<connections>

<connectinterface>

<usesport>

<usesidentifier>left</usesidentifier>

<componentinstantiationref idref="Kant"/>

</usesport>

<providesport>

<providesidentifier>the_fork</providesidentifier>

<componentinstantiationref idref="ForkManager1"/>

</providesport>

</connectinterface>

Philosopher

name = Kant

Fork

Page 89: Etude de cas d’une application  construite avec CCM

89© 2003, P. Merle ICAR’03

Component Assembly Descriptorpour dîner des philosophes

<connectevent>

<publishesport>

<publishesidentifier>info</publishesidentifier>

<componentinstantiationref idref="Kant"/>

</publishesport>

<consumesport>

<consumesidentifier>info</consumesidentifier>

<componentinstantiationref idref="Freud"/>

</consumesport>

</connectevent>

Philosopher

name = Kant Observer

Page 90: Etude de cas d’une application  construite avec CCM

90© 2003, P. Merle ICAR’03

L’outil de conditionnement et d’assemblage d’OpenCCM

Page 91: Etude de cas d’une application  construite avec CCM

91© 2003, P. Merle ICAR’03

L’outil d’assemblage de MicoCCM

Page 92: Etude de cas d’une application  construite avec CCM

92© 2003, P. Merle ICAR’03

L’outil d’assemblage de K2

Page 93: Etude de cas d’une application  construite avec CCM

93© 2003, P. Merle ICAR’03

Le plug-in Rational Rosedu projet IST COACH

CORBA Component

CCM

Page 94: Etude de cas d’une application  construite avec CCM

94© 2003, P. Merle ICAR’03

Le plug-in Rational Rosedu projet IST COACH

Philosophers_3

<<CORBAAssembly>>

o1 : Observer

philosopher_home : PhilosopherHome

p1 : Philosopher

i1 : Fork i6 : Fork

observerHome_plcmnt : ObserverHome

f3 : Cutlery

f1 : Cut lery

i2 : Fork

p2 : Philosopher

i5 : Fork

philosopher3 : Philosopher

i4 : Forki3 : Fork f2 : Cutlery

cutlery_home : CutleryHome

philosopher_state1 : PhilosopherState

philosopher_state2 : PhilosopherState

philosopher_s tat e3 : PhilosopherStat e

r1: right l1 : left

philosopher_st ate : philosopher_sta tef1 : fork f6 : fork

philosopher_state : philosopher_st...

philosopher_state : philosopher_st... philosopher_state : philosopher_st...

f2 : fork

l2 : left

philosopher_state : philosopher_st...

f5 : fork

r3 : right

philosopher_state : philosopher_st...l3 : leftr2 : right

f3 : fork f4 : fork

Page 95: Etude de cas d’une application  construite avec CCM

95© 2003, P. Merle ICAR’03

Le plug-in Rational Rosedu projet IST COACH

Page 96: Etude de cas d’une application  construite avec CCM

96© 2003, P. Merle ICAR’03

Le plug-in Rational Rosedu projet IST COACH

Fraunhofer Fokus

PLATIN

CORBA Component

Philosopher_S Philosopher_W

Philosopher_W

The Dining Philosopher Example

http://www.fokus.fraunhofer.de http://www.fokus.fraunhofer.de

Page 97: Etude de cas d’une application  construite avec CCM

97© 2003, P. Merle ICAR’03

Le déploiement, l’exécution et l’administration de l’application

Page 98: Etude de cas d’une application  construite avec CCM

98© 2003, P. Merle ICAR’03

Le déploiement, l’exécution et l’administration de l’application

Déploiement automatisé Lancement via un outil de déploiement

Exécution automatisée Lancement de démons à faire manuellement

1 domaine 1 CORBA Naming Service 1 CCM Assembly Factory

1 machine 1 CCM Server Activator 1 CCM Component Installation

Administration de l’application Des programmes clients ad hoc à l’application

Utilisation d’une console générique

Déployerle dîner desphilosophes

avecOpenCCM

Page 99: Etude de cas d’une application  construite avec CCM

99© 2003, P. Merle ICAR’03

La console d’administration OpenCCM

Page 100: Etude de cas d’une application  construite avec CCM

100

© 2003, P. Merle ICAR’03

Conclusion

Page 101: Etude de cas d’une application  construite avec CCM

101

© 2003, P. Merle ICAR’03

Conclusion

Pas si compliqué si correctement expliqué (?)

Pas parfait mais puissant

Bonne source d’inspiration pour faire mieux ;-)

Page 102: Etude de cas d’une application  construite avec CCM

102

© 2003, P. Merle ICAR’03

Merci