Construction d
24 pages
Latin

Construction d'applications r[Please insert PrerenderUnicode{é} into preamble]parties - Cours 6

-

Le téléchargement nécessite un accès à la bibliothèque YouScribe
Tout savoir sur nos offres

Description

Constructiond’applicationsr´epartiesGilles RousselConstruction d’applications r´epartiesAnyCours 6InvocationdynamiqueLesintercepteurs Gilles RousselGilles.Roussel@univ-mlv.frhttp://igm.univ-mlv.fr/~roussel/CORBA/IR317 octobre 2006Gilles Roussel Construction d’applications r´epartiesLe type AnyConstructiond’applicationsr´epartiesGilles RousselTransmettre des arguments ou des valeurs de retourAny g´en´eriquesInvocationdynamique Type IDL any correspondant au type Java AnyLesInstance vide construite via orb.create any()intercepteursInstance remplie avec une valeur particuli`ere par :orb.insert type() pour les types primitifsTypeHelper.insert() pour les types utilisateursClasses particuli`eres pour ins´erer des tableaux ou s´equences(i.e. LongSeqHelper)Gilles Roussel Construction d’applications r´epartiesR´ecup´eration du type du contenuConstruction Il faut connaˆıtre le type de l’objet pour l’extraired’applicationsr´eparties Type repr´esent´e par un objet TypeCode retourn´e par laGilles Roussel m´ethode type()Contient des informations caract´erisant le type de l’objet :Anyla sorte (type primitif, structure, s´equence, alias, etc.)Invocationdynamique retourn´ee par la m´ethode kind(), repr´esent´ee parLes l’´enum´eration IDL TCKind (entier retourn´e par value())intercepteurspour les types utilisateurs, l’identificateur de type ouRepository ID (que l’on trouve aussi dans les IOR)retourn´e par la m´ethode id()pour les types conteneurs ...

Sujets

Informations

Publié par
Nombre de lectures 21
Langue Latin

Exrait

Construction d’applications r´eparties Gilles Roussel Construction d’applications r´eparties Any Cours 6 Invocation dynamique Les intercepteurs Gilles Roussel Gilles.Roussel@univ-mlv.fr http://igm.univ-mlv.fr/~roussel/CORBA/ IR3 17 octobre 2006 Gilles Roussel Construction d’applications r´eparties Le type Any Construction d’applications r´eparties Gilles Roussel Transmettre des arguments ou des valeurs de retour Any g´en´eriques Invocation dynamique Type IDL any correspondant au type Java Any Les Instance vide construite via orb.create any()intercepteurs Instance remplie avec une valeur particuli`ere par : orb.insert type() pour les types primitifs TypeHelper.insert() pour les types utilisateurs Classes particuli`eres pour ins´erer des tableaux ou s´equences (i.e. LongSeqHelper) Gilles Roussel Construction d’applications r´eparties R´ecup´eration du type du contenu Construction Il faut connaˆıtre le type de l’objet pour l’extraired’applications r´eparties Type repr´esent´e par un objet TypeCode retourn´e par la Gilles Roussel m´ethode type() Contient des informations caract´erisant le type de l’objet :Any la sorte (type primitif, structure, s´equence, alias, etc.)Invocation dynamique retourn´ee par la m´ethode kind(), repr´esent´ee par Les l’´enum´eration IDL TCKind (entier retourn´e par value()) intercepteurs pour les types utilisateurs, l’identificateur de type ou Repository ID (que l’on trouve aussi dans les IOR) retourn´e par la m´ethode id() pour les types conteneurs simples (alias, s´equence ou tableau), le type du ou des ´el´ements contenus retourn´e par content type() pour les types conteneurs complexes (structures, unions, etc.), le nombre de membres (member count()) et, pour chacun d’eux, leur nom (member count(i)) et leur type (member type(i)) Gilles Roussel Construction d’applications r´eparties Comparer les types Construction d’applications r´eparties Gilles Roussel Any Comparer la sorte (kind().value()) en utilisant les Invocation constantes enti`eres TCKind. tk kind dynamique Comparer directement l’objet TypeCode avec les m´ethodes Les intercepteurs equal() (sans « s ») ou equivalent() (pour les alias) avec les objets : TypeHelper.type() pour les types utilisateurs orb.get primitie tc(TCKind.tk type) pour les types primitifs Gilles Roussel Construction d’applications r´eparties R´ecup´erer le contenu d’un Any Construction d’applications r´eparties Gilles Roussel Any Invocation dynamique any.extract type() pour les types primitifs Les intercepteurs TypeHelper.extract(any) pour les autres types Gilles Roussel Construction d’applications r´eparties R´ecup´eration du type r´eel Construction d’applications r´eparties Gilles Roussel TypeCode getRealType(TypeCode type) { try { Any if (type.kind().value() == TCKind. tk alias) {Invocation dynamique return getRealType(type.content type()); Les }intercepteurs return type; } catch (BadKind e) { assert false; throw new RuntimeException(e); } } Gilles Roussel Construction d’applications r´eparties Affichage des informations sur un type Construction d’applications r´eparties Gilles Roussel TypeCode type = ... Any int n = type.member count(); Invocation System.err.println("Nombre de membres : " + n); dynamique for (int i = 0; i < n; i++) { Les intercepteurs System.err.print("Membre n " + i + " : "); System.err.print(type.member name(i)); System.err.print(" de type code "); System.err.println(type.member type(i) ); } Gilles Roussel Construction d’applications r´eparties Construction de l’objet Any Construction d’applications r´eparties Gilles Roussel Any arg = orb.create any(); Any arg.insert string("Marne-la-Vall´ee"); Invocation System.out.println(h.hello(arg));dynamique LocalityHelper.insert(arg,new Locality("Paris")); Les intercepteurs System.out.println(h.hello(arg)); String [] t = new String[] "Paris", "Londres", "Tokyo" StringSeqHelper.insert(arg,t); System.out.println(h.hello(arg)); arg.insert long(2); System.out.println(h.hello(arg)); Gilles Roussel Construction d’applications r´eparties R´ecup´eration du contenu d’un type Any Construction public String hello(Any arg) { d’applications try { r´eparties String h = "Hello from "; TypeCode type = getRealType(arg.type()); Gilles Roussel switch (type.kind().value()) { case TCKind. tk string: return h + arg.extract string();Any case TCKind. tk struct: Invocation if (type.equal(LocalityHelper.type())) { dynamique return h + LocalityHelper.extract(arg).name; } Les break; intercepteurs case TCKind. tk sequence: TypeCode stringType = ORB.init().get primitive tc(TCKind.tk string); if (type.content type().equivalent(stringType)) { for (String from : StringSeqHelper.extract(arg)) { h += from + " "; } return h; } break; } return h + "nowhere"; } catch (BadKind e) { assert false; throw new RuntimeException(e); } catch (Bounds e) { assert false; throw new RuntimeException(e); } Gilles Roussel Construction d’applications r´eparties} Invocation dynamique Construction d’applications r´eparties Gilles Roussel Any Possibilit´e d’invoquer une m´ethode sur un objet CORBA Invocation sans disposer de son interface ni de sa classe Helper dynamique Les Utilis´e dans les souches (stub) intercepteurs N´ecessite de connaˆıtre : les profils des m´ethodes les classes des types utilisateurs utilis´ees pour les param`etres, la valeur de retour et les exceptions Gilles Roussel Construction d’applications r´eparties