1
6
6-
-Compléments illustrés en JAVA
Compléments illustrés en JAVA
Thierry DESPRATS
Université Paul SABATIER – Toulouse III
IRIT- SIERA
http://www.irit.fr/~Thierry.Desprats
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 2
2
Agenda
Développement par délégation
Rappel et limites de l’approche par héritage
Approche par délégation
Exemple
Type générique, Meta-Type
Le type Any
Le type TypeCode
Exemple
Gestion dynamique de valeurs d’any
Mode d’invocation dynamique
Référentiel d’Interfaces (IR)
Composition dynamique de requêtes
Invocation dynamique et modalités
Exemples
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 3
3
Approche statique par délégation (1/7)
Rappel approche par héritage
Principe :
La classe d’implémentation Java hérite du squelette
de l’interface à implémenter
public class EuroImpl extends _EuroPOA {
Limites de l’approche par héritage en java:
Pas d’héritage multiple en JAVA : impossible de
réutiliser les classes d’implémentation
(pas de répercussion des héritages IDL sur les
implémentations JAVA)
Impossibilité d’associer une seule classe
d’implémentation JAVA à plusieurs interfaces CORBA
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 4
4
Approche statique par délégation (2/7)
Illustration du mode par héritage :
Interface
Euro.java
Stub
_EuroStub.java
Skeleton
_EuroPOA.java
EuroImpl.java
Operations
EuroOperations.java
org.omg.Portable.Servant
extends
org.omg.Portable.ObjectImpl
implements
extends
implements extends
Servant
2
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 5
5
Approche statique par délégation (3/7)
Approche par délégation
Principe :
La classe d’implantation va concerner non plus l’interface IDL
de l’objet, mais l’interface d’opérations de l’objet
public class EuroImpl implements EuroOperations {
Utilisation de la classe de délégation « tie » générée lors de la
compilation IDL de l’interface Toto vers Java :
TotoTie.java
Il s’agit d’une implantation par défaut de l’interface à laquelle
elle est associée qui va déléguer le travail des opérations et
attributs vers une classe d’implantation quelconque
Impacts sur le développement :
Côté client : aucune modification
Côté serveur : associer une instance de la classe de délégation
à une instance d’une classe implémentant l’interface
d’opérations requise
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 6
6
Approche statique par délégation (4/7)
Illustration du mode par délégation :
Interface
Euro.java
Stub
_EuroStub.java EuroPOATie.java
EuroImpl.java
Operations
EuroOperations.java
org.omg.Portable.Servant
extends
org.omg.Portable.ObjectImpl
implements
extends
implements délégation
EuroPOA.java
extends
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 7
7
Approche statique par délégation (5/7)
Extrait de EuroPOATie.java
package Convertisseur;
public class EuroPOATie extends EuroPOA
{ private EuroOperations _tie;
private org.omg.PortableServer.POA _poa;
public EuroPOATie(EuroOperations tieObject)
{ _tie = tieObject; }
public EuroPOATie(EuroOperations tieObject, org.omg.PortableServer.POA poa)
{ _tie = tieObject; _poa = poa; }
public EuroOperations _delegate() { return _tie; }
public void _delegate(EuroOperations delegate_) { _tie = delegate_; }
public org.omg.PortableServer.POA _default_POA()
{ if (_poa != null) return _poa; else return super._default_POA(); }
public double taux() { return _tie.taux(); }
public void taux(double value) { _tie.taux(value); }
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 8
8
Approche statique par délégation (6/7)
Ecriture du serveur ServeurConvertisseur.java :
3/ Incarnation de l’objet
// Création d’une instance de la classe d’implémentation
EuroImpl monEuro = new EuroImpl();
// Association
EuroPOATie monEurotie = new EuroPOATie(moneuro);
// Fabrication d’un Identifiant(OID) pour attribution par le POA
byte[] monEuroId = args[0].getBytes();
// Activer le servant dans le POA et lui attribuer l'ID
poa.activate_object_with_id(monEuroId, monEurotie);
// le POA dispose désormais de la référence
3
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 9
9
Approche statique par délégation (7/7)
Illustration d’implantation unique
Contrat idl :
Classe d’implantation unique :
Serveur :
module Exemple {
interface A { void f(); };
interface B(:A) { void g(); };
};
Public class AetBImpl implements [AOperations], BOperations {
public void f() { System.out.println(“il pleut“); };
public void g() { System.out.println(“il neige“); };
};
AetBImpl toto new AetBImpl;
ATie a_tie = new ATie(toto);
BTie b_tie = new BTie(toto);
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 10
10
Type générique, Meta-type (1/17)
Définition
Type IDL any
Type générique capable de contenir une valeur de
n’importe quelle autre type CORBA (standard ou
utilisateur).
Utilisation
Comme type de paramètre, de retour d’opération,
ou comme type de base d’un type construit
(exemple : type d’un membre d’une structure)
Projection en JAVA
Classes :
org.omg.CORBA.Any
org.omg.CORBA.AnyHolder
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 11
11
Type générique, Meta-type (2/17)
Création d’une variable any en Java :
Méthode de org.omg.CORBA.orb :
create_any()
Exemple :
Insertion/Extraction de valeur :
Valeur d’un type primitif toto :
Insertion : insert_toto(valeur)
Extraction : extract_toto()
Valeur d’un type construit toto :
Insertion : totoHelper.insert(any, valeur)
Extraction : totoHelper.extract(any)
// Création d’un Any : a ne contient aucune valeur
org.omg.CORBA.Any a= orb.create_any();
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 12
12
Type générique, Meta-type (3/17)
Illustration en Java :
org.omg.CORBA.Any a= orb.create_any();
org.omg.CORBA.Any b= orb.create_any();
org.omg.CORBA.Any c= orb.create_any();
// Affectation d’un chaîne
a.insert_string(“Il fait beau“);
// Affectation d’un entier
b.insert_long(64);
// Affectation d’une structure
individu i = new individu();
i.nom = “Desprats”;
i.prenom = “Thierry”;
i.adresse = “Rue Corba”;
individuHelper.insert(c,i);
// Récupération des valeurs
String s = extract_string(a);
long t = extract_long(b);
individu j = individuHelper.extract(c);
4
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 13
13
Type générique, Meta-type (4/17)
Le Meta-type TypeCode :
Type IDL TypeCode
En Java : org.omg.CORBA.TypeCode
Objectif : donner les moyens de description
de tout type CORBA :
= = > tout type IDL (standards et utilisateurs) est
associé à un TypeCode
La nature des informations d’un TypeCode
dépend du type qu’il décrit :
= = > Les types sont classés par «genres »appelés
TCKind
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 14
14
Type générique, Meta-type (5/17)
Le type énuméré TCKind :
Type IDL TCKind
En Java : org.omg.CORBA.TCKind
Objectif : énumérer les genres de types
CORBA :
// Définition du type TCKind
Enum TCKind {
tk_null, tk_void, tk_short, tk_long, tk_ushort, tk_ulong,
tk_float, tk_double, tk_boolean, tk_char, tk_octet, tk_any,
tk_TypeCode, tk_Principal, tk_objref, tk_struct, tk_union,
tk_enum, tk_string, tk_sequence, tk_array, tk_alias,
tk_except, tk_longlong, tk_fixed, tk_value, tk_value_box
tk_native, tk_abstract_interface
};
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 15
15
Type générique, Meta-type (6/17)
Obtention d’un TypeCode :
Pour un type primitif toto :
Méthode de org.omg.CORBA.orb :
get_primitive_tc(tcKind du type toto)
Exemple :
Pour un type construit toto :
Méthode de totoHelper :
type()
Exemple :
// Récupération du type code associé à long
org.omg.CORBA.TypeCode tc = orb.get_primitive_tc(org.omg.CORBA.TCKind.tk_long);
// Récupération du type code associé à la structure Individu
org.omg.CORBA.TypeCode tc = individuHelper.type();
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 16
16
Type générique, Meta-type (7/17)
Utilisation d’un TypeCode (1/3):
Méthodes de org.omg.CORBA.TypeCode :
Connaître le genre d’un type :
kind() retourne un TCKind
Connaître le nom d’un type non primitif :
name() retourne un string
Connaître le « Repository ID » d’un type non primitif :
id() retourne un identifiant de la forme :
[ IDL:] [préfixe] [chemin] [version]
exemple :
On obtient les repository IDs suivants :
pour le module Exemple : IDL:Exemple:1.0
pour l’interface A : IDL:Exemple/A:1.0
pour le type individu : IDL:Exemple/individu/:1.0
module Exemple {
struct individu {string nom; string prenom; string adresse;};
interface A { void f();}; };
5
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 17
17
Type générique, Meta-type (8/17)
Utilisation d’un TypeCode (2/3):
Connaître les membres d’un type composé :
(structures, unions, énumérations, exceptions, value types)
member_count() retourne le nombre de membres présents dans le type
member_name() retourne le nom du type dont l’index est préci
member_type() retourne le type code du membre dont l’index est précisé
Exemple : à partir de cette description :
qu’afficherait à l’écran le code suivant ?
struct individu {string nom; string prenom; string adresse;};
org.omg.CORBA.TypeCode tc = individuHelper.type();
if (tc.kind().value() = = org.omg.CORBA.TCKind._tk_struct)
{ System.out.println(“Nom de la structure: “+tc.name());
System.out.println(“ID de la structure: “+tc.id());
System.out.println(“Nombre de membres : “+tc.member_count());
for( int i=0; i<tc.member_count(); i++)
{ System.out.println(“Nom du membre : “+tc.member_name(i));
System.out.println(“Type du membre : “+tc.member_type(i));
}}
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 18
18
Type générique, Meta-type (9/17)
Utilisation d’un TypeCode (3/3):
Connaître le type de référence d’un alias :
Content_type() retourne un TypeCode
Connaître le type de référence d’un tableau :
Content_type() retourne un TypeCode
Connaître la taille d’un tableau :
length() retourne la taille
Comparer des TypeCodes :
equal() retourne un booléen (égalité stricte)
equivalent() retourne un booléen (égalité indirecte)
Connaître le type d’une valeur Any :
type() retourne le TypeCode de la valeur contenue dans un any
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 19
19
Type générique, Meta-type (10/17)
Exemple:
Interface polymorphe :
Servant Java :
typedef sequence <long> longSeq
struct individu {string nom; string prenom; string adresse;};
exception TypeInconnu { };
interface Polymorphe { void pass(in any valeur) raises TypeInconnu); };
public class PolymorpheImpl extends PolymorphePOA
{ public void pass(org.omg.CORBA.Any val) throws TypeInconnu
{ org.omg.CORBA.TypeCode tc = valeur.type();
switch (getEquivalentKind(tc))
{ case org.omg.CORBA.TCKind_tk_long :
int l = valeur.extract_long();
System.out.println(“recu un entier de valeur: “+l);
break;
case org.omg.CORBA.TCKind_tk_string :
String s = valeur.extract_string();
System.out.println(“recu une string de valeur: “+s);
break;
Compléments CORBA
Compléments CORBA © 2005-06 Th. Desprats 20
20
Type générique, Meta-type (11/17)
Exemple : Servant Java
case org.omg.CORBA.TCKind_tk_string :
String s = valeur.extract_string();
System.out.println(“recu une string de valeur: “+s);
break;
case org.omg.CORBA.TCKind_tk_struct :
if (tc.equal(individuHelper.type()))
{ individu i = individuHelper.extract(valeur);
System.out.println(“recu un individu : “+i.nom+” “
+i.prenom”+” “+i.adresse); }
else throw new TypeInconnu();
break;
case org.omg.CORBA.TCKind_tk_sequence :
if (tc.equal(longSeqHelper.type()))
{ int [] seq = longSeqHelper.extract(valeur);
System.out.println(“recu une sequence d’entiers :”);
for (int = i; i<seq.length; i++)
System.out.println(“Elt n° “+i+“:”+seq[i]); }
else throw new TypeInconnu();
break;
default
throw new TypeInconnu(); } }
1 / 9 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !