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 ...
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´epartiesLe 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´epartiesR´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´epartiesComparer 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´epartiesR´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´epartiesR´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´epartiesAffichage 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´epartiesConstruction 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´epartiesR´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