La projection Java

publicité
La projection d'IDL
Règles de projection sur Java
La projection IDL
• Opération consistant à traduire l'IDL vers les
constructions natives d'un langage objet
– Les projections font partie de la norme
– Dans l'ordre de la standardisation
•
•
•
•
•
C, C++, SmallTalk
Ada95, Cobol Objet
Java
...
Eiffel, ECMAScript, Common Lisp, Python, Perl
La projection IDL
• But
– Générer des souches à partir de la description IDL à l'usage
d'un client
– Générer un squelette de code à partir de la même description
pour implémenter l'objet serveur
• Ce qui fait partie de la traduction
•
•
•
•
Les contrats IDL
La notion de référence à un objet
Le mécanisme d'invocation des opérations
L'accès au bus
La projection Java
• Principe séduisant
– Projeter une fois, compiler, exécuter partout...
• Mécanisme
– L'IDL est par essence portable
– Les objets implémentant le contrat IDL sont compilés vers
du bytecode Java
• Donc portables
– Si l'implémentation du bus est en Java...
• L'ensemble est portable
La projection Java
• Problèmes de base
– Conversion des identificateurs
• Pas de conversion
• Sauf si...
– Conflit avec les mot-clés réservés de Java
– Conflit avec les classes "outil" de la projecteion
• En cas de conflit
– L'identificateur est précédé de "_"
– Conversion des espaces de nommage
• Le module IDL est transformé en package Java
• Les #prefix sont concaténés
Projection des interfaces
• Une interface IDL génère une interface Java
– Traduction du contenu des interfaces:
• Les opérations définissent la signature des méthodes
• Les attributs génèrent des méthodes d'accès (et modification si nonreadonly)
• On utilise l'objet CORBA directement via cette interface
– L'héritage multiple d'interface IDL
• correspond à l'héritage multiple des interfaces en Java
• La tête de la hiérarchie est l'interface org.omg.CORBA.Object
• Génération de classes "Holder" et "Helper"
• Définition de l'opération "narrow"
Exemple de projection
module transport
{
interface Vehicule
{
void accelerer (in long arg) raises (Trop_Rapide);
attribute long poids;
readonly attribute short puissance;
};
};
package transport;
public interface Vehicule extends org.omg.CORBA.Object
{
void accelerer(int arg) throws Trop_Rapide;
int poids();
void poids(int value);
short puissance();
}
public class CamionHelper { ... }
public class CamionHolder { ... }
Types de base
Type IDL
Type Java
void
void
boolean
boolean
octet
byte
short
unsigned short
long
unsigned long
long long
unsigned long long
float
short
double
double
long double
???
char
wchar
string
wstring
fixed
char
int
Note:
long
Certains types Java stockent plus
que l'équivalent IDL, des
exceptions peuvent donc être
générées:
float
java.lang.String
java.math.BigDecimal
char, string, wstring
La projection du passage de paramètres
• Java n'autorise que le passage de paramètre par copie !
– Problème pour le passage des arguments en out ou inout
• Solution: des classes "enveloppes" (Holder)
– Stockage d'une valeur
– Constructeurs pour passage d'une valeur initiale
• La valeur pourra être modifiée dans la méthode et la modification
conservée une fois l'appel fini
– Origine des classes Holder
• prédéfinies pour tous les types de bases
• générées automatiquement pour les types utilisateurs
Exemple de classes Holder
// prédéfinie dans le package org.omg.CORBA
final public class CharHolder
{
public char value;
public CharHolder() {}
public CharHolder(char initial)
{
value = initial;
}
}
// générée à la volée pour un type utilisateur MonType
final public class MonTypeHolder
{
public MonType value;
public MonTypeHolder() {}
public MonTypeHolder(MonType initial)
{
value = initial;
}
public TypeCode _type() {...}
}
Exemple d'utilisation de classes Holder
module Example
{
interface Objet
{
long operation(in long a,
out long b,
inout long c);
};
};
package Example;
public interface Objet
{
int operation(int a,
IntHolder b,
IntHolder c);
}
Example.Objet cible = ...;
// préparation des arguments
int argI = 57;
IntHolder argO = new IntHolder();
IntHolder argIO = new IntHolder(131);
// on invoque l'opération
int resultat = cible.operation(argI, argO, argIO);
// pour utiliser la valeur des arguments en out et inout
... argO.value ...
... argIO.value ...
Les classes Helper
• Classes "utilitaires" générées pour les types utilisateurs
– Interaction avec le type "any"
•
•
•
•
•
Récupération depuis un "any" vers le type utilisateur
Stockage du type utilisateur dans un "any"
Lien avec la valeur de TypeCode correspondante
Mécanismes d'écriture/lecture dans des flots
Opérations narrow() et bind()
Projection des structures
• Les structures sont traduites en classes
• Chaque champ devient une variable publique d'instance
• Classe finale, un constructeur par défaut et un constructeur
initialisant tous les champs
• Classes Holder et Helper correspondantes générées
struct Heure
{
short heure, minute, seconde;
};
public final class Heure
{
public short heure, minute, seconde;
public Heure() {}
public Heure(short h, short m, short s) { ... }
}
Projection des constantes
• Comportement différent selon le placement
– Constante définie en module
• définition d'une classe spécifique enveloppant la valeur
module semaine
{
const short nbjours = 7;
interface { ... }
};
package semaine;
public class nbjours
{
public static final short value = 7;
}
Projection des constantes
– Constantes définies en interface
• définition d'une constante dans la projection générée pour l'interface
interface Univers
{
const short reponse = 42;
};
public interface Univers
{
public static final short reponse = 42;
}
Projection des unions
– Une classe générée par énumération
• A chaque label de l'enum correspond
– une constante
– une instance unique
• Un accesseur pour retrouver l'index du label
enum Etat {on, off};
public final class Etat
{
public final static int _on
public final static Etat on
public final static int _off
public final static Etat off
public int value() {...};
}
=
=
=
=
0;
new Etat (_on);
1;
new Etat (_off);
Tableaux et séquences
– Associés à un tableau Java
• Génération de classes Holder correspondantes
• Vérification des bornes au moment de l'emballage
typedef sequence<int> donnees;
typedef long tableau[42];
final public class donneesHolder
{
public int[] value;
public donneesHolder() {}
public donneesHolder(int[] initial) {...}
...
}
final public class tableauHolder
{
public long[] value;
public tableauHolder() {}
public tableauHolder(long[] initial) {...}
....
Projection des exceptions
• Associées directement aux exceptions Java
• Deux catégories
– Exceptions définies par l'utilisateurs
• Projection similaire à celle d'une structure
• Héritant de org.omg.CORBA.UserException
– Exceptions générées par le bus
• Héritant de org.omg.CORBA.SystemException, qui dérive de
java.lang.RuntimeException
Exemple de projection d'exception
exception MauvaisCodage
{
string raison;
};
final public class MauvaisCodage extends org.omg.CORBA.UserException
{
String raison;
public MauvaisCodage(..) {..}
}
try
{
// code CORBA pouvant générer une exception
}
catch (MauvaisCodage e1) { ... }
catch (org.omg.CORBA.UserException e2) { ... }
catch (org.omg.CORBA.COMM_FAILURE e3) { ... }
catch (org.omg.CORBA.SystemException e4) { ... }
....
Le package org.omg.CORBA
• Les appels du bus CORBA sont décrites dans un
module IDL
– Ce module a été projeté en Java dans ce package et définit:
•
•
•
•
Les classes abstraites Any, TypeCode, Object
Les classes Holder et Helper des types de base
Les définitions d'exceptions systèmes
Les classes pour manipuler le DII, le SII, le DSI, ...
Téléchargement