Projektstudium SS98 - distributed computing


Konstruierte CORBA Typen

Die in diesem Abschnitt behandelten konstruierten Typen beinhalten sowohl benutzerdefinierte Typen wie interface, union, struct und enum als auch parametrisierte Typen wie array und sequence. Außerdem wird der CORBA Typ Any vorgestellt, der sowohl konstruierte als auch Basistypen beinhalten kann.

 

CORBA Interface

Ein CORBA IDL Interface wird zu einem Java Interface mit dem gleichen Namen transformiert. Das Java Interface beinhaltet die Operationssignaturen des IDL Interfaces.

 
 

OMG IDL

Java

interface MyInterface { 

attribute short anAttribute; 

}

Public interface MyInterface extends org.omg.CORBA.Object { 

Public void anAttribute(short anAttribute); 

Public short anAttribute(); 

}

 

CORBA Sequence

Eine Sequence ist ein von der Größe her variabler eindimensionaler Array dessen Elemente von einem beliebigen IDL-definiertem Typ sein können. Es muß ergänzt werden, daß die Größe optional begrenzt werden kann. Bevor eine Sequenz verwendet werden kann, muß deren Name unter Verwendung eines IDL typedefs festgelegt werden.

Eine Sequence wird zu einem Java Array mit dem gleichen Namen transformiert.

 
 

OMG IDL

Java

interface seqExample { 

//unbegrenzte Sequenz von 

typedef sequence<Count> MyUnboundedSeq; 

  

void seqtest(in MyUnBoundedSeq val1, 

out MyUnBoundedSeq val2); 

};

public interface seqExample extends org.omg.CORBA.Object { 

public void seqtest( 

seq.Count[] val1, 

seq.seqExamplePackage.MyUnboundedSeqHolder val2 

); 

}

Die Quellen:

SEQ\CountImpl.java

SEQ\SeqClient.java

SEQ\SeqExampleImpl.java

SEQ\SeqServer.java

SEQ\SEQUENCE.IDL

SEQ\SEQ\_CountImplBase.java

SEQ\SEQ\_example_Count.java

SEQ\SEQ\_example_seqExample.java

SEQ\SEQ\_seqExampleImplBase.java

SEQ\SEQ\_sk_Count.java

SEQ\SEQ\_st_seqExample.java

SEQ\SEQ\_tie_Count.java

SEQ\SEQ\_tie_seqExample.java

SEQ\SEQ\Count.java

SEQ\SEQ\CountHelper.java

SEQ\SEQ\CountHolder.java

SEQ\SEQ\CountOperations.java

SEQ\SEQ\seqExample.java

SEQ\SEQ\seqExampleHelper.java

SEQ\SEQ\seqExampleHolder.java

SEQ\SEQ\seqExampleOperations.java

SEQ\SEQ\seqExamplePackage\MyBoundedSeqHelper.java

SEQ\SEQ\seqExamplePackage\MyBoundedSeqHolder.java

SEQ\SEQ\seqExamplePackage\MyUnboundedSeqHelper.java

SEQ\SEQ\seqExamplePackage\MyUnboundedSeqHolder.java

 

CORBA Array

CORBA Arrays sind einer Sequence sehr ähnlich. Sie können wie diese Elemente jeden gültigen IDL Typs aufnehmen. Im Gegensatz zu einer Sequence können Arrays multidimensional sein und besitzen immer eine feste Begrenzung. Daher ist ein Array im Vergleich zu einer Sequence weit weniger flexibel.

CORBA Arrays werden auf die gleiche Weise wie eine begrenzte Sequence transformiert. In beiden Fällen findet eine Transformation in einen gleichnamigen Java Array statt.

 
 

OMG IDL

Java

Interface arrayExample { 

Const long ArrayBound = 76; 

Typedef Count MyArray[ArrayBound]; 

Void arrayTest(in MyArray value); 

};

Public interface arrayExample extends org.omg.CORBA.Object { 

Final public static int ArrayBound = (int) 76; 

Public void arrayTest(Count[] value); 

}

 

Es muß noch angemerkt werden, daß der IDL-to-Java Compiler für jeden definierten Array Holder und Helper Klassen generiert.

 

CORBA Structs

Eine Struktur entsteht aus einer festen Anzahl an Feldern. Sie wird in eine Klasse mit dem gleichen Namen transformiert. Diese Java Klasse enthält für jedes Feld innerhalb der Struktur ein Datenfeld des entsprechenden Typs. Jede Struktur besitzt zwei Konstruktoren. Der erste ist der default Konstruktor, der sämtliche Felder der Struktur auf null setzt. Der zweite Konstruktor hat für jedes Element einen Parameter und initialisiert die Objekte entsprechend.

 
 

OMG IDL

Java

struct MyStruct { 

short age; 

string name; 

};

package Struct; 

final public class MyStruct { 

public short age; 

public java.lang.String name; 

public MyStruct() { 

} 

public MyStruct( 

short age, 

java.lang.String name 

) { 

this.age = age; 

this.name = name; 

} 

public java.lang.String toString() { 

org.omg.CORBA.Any any = org.omg.CORBA.ORB.init().create_any(); 

Struct.MyStructHelper.insert(any, this); 

return any.toString(); 

} 

}

 

Ein ausführlicheres Beispiel:

 

CORBA Enums

Bei einem Enum werden die Werte, die eine Variable des Typs annehmen kann durch Namen aufgezählt. Die Werte bilden eine geordnete Menge und sind Konstanten des Typs. Ein Enum wird in eine Java Klasse mit dem Namen des Enums transformiert. Diese Java Klasse definiert ein Feld des Typs final int für jedes Enum Element. Die Namen der Felder entsprechen den Namen der Enum Elemente. Das erste Element hat den Wert null, das zweite eins und so weiter.

 
 

OMG IDL

Java

enum MyEnum { 

eins, 

zwei, 

drei 

};

Final public class MyEnum { 

final public static int _eins = 0; 

final public static int _zwei = 1; 

final public static int _drei = 2; 

final public static MyEnum eins = new MyEnum(_eins); 

final public static MyEnum zwei = new MyEnum(_zwei); 

final public static MyEnum drei = new MyEnum(_drei); 

private int __value; 

private MyEnum(int value) { 

this.__value = value; 

} 

public int value() { 

return __value; 

} 

public static MyEnum from_int(int $value) { 

switch($value) { 

case _eins: 

return eins; 

case _zwei: 

return zwei; 

case _drei: 

return drei; 

default: 

throw new org.omg.CORBA.BAD_PARAM("Enum out of range: [0.." + (3 - 1) + "]: " + $value); 

} 

} 

public java.lang.String toString() { 

org.omg.CORBA.Any any = org.omg.CORBA.ORB.init().create_any(); 

MyEnumHelper.insert(any, this); 

return any.toString(); 

} 

}

 

CORBA Union

Unions bieten eine weitere Möglichkeit Daten zu strukturieren. Im Gegensatz zu einer Struct kann eine Union nur eines ihrer Elemente halten. Es wird also die Möglichkeit geboten, unterschiedlich typisierte Daten unter einem gemeinsamen Namen zu speichern.

Eine Union wird in eine Java Klasse, die den Namen des Unions besitzt transformiert. Für jedes Element existiert jeweilse eine Methode zum Setzen und Herauslesen des Wertes. Diese Methoden sind nach den entsprechenden Elementen benannt und unterscheiden sich jeweils lediglich durch ihre Signatur voneinander. Über die discriminator Methode kann abgefragt werden, welches Element gerade gehalten wird. Zusätzlich existiert noch eine toString Methode.

 
 

OMG IDL

Java

union MyUnion switch (short) { 
case 1: short s; 
case 2: long l; 
default: long long ll; 
};
final public class MyUnion { 
private java.lang.Object _object; 
private short _disc; 
public MyUnion() { 
} 
public short discriminator() { 
return _disc; 
} 
public short s() { 
if( 
_disc != (short) 1 && 
true 
) { 
throw new org.omg.CORBA.BAD_OPERATION("s"); 
} 
return (short) ((java.lang.Integer) _object).intValue(); 
} 
public int l() { 
if( 
_disc != (short) 2 && 
true 
) { 
throw new org.omg.CORBA.BAD_OPERATION("l"); 
} 
return ((java.lang.Integer) _object).intValue(); 
} 
public long ll() { 
if( 
_disc == (short) 1 || 
_disc == (short) 2 || 
false 
) { 
throw new org.omg.CORBA.BAD_OPERATION("ll"); 
} 
return ((java.lang.Long) _object).longValue(); 
} 
public void s(short value) { 
_disc = (short) 1; 
_object = new java.lang.Integer(value); 
} 
public void l(int value) { 
_disc = (short) 2; 
_object = new java.lang.Integer(value); 
} 
public void ll(short disc, long value) { 
_disc = disc; 
_object = new java.lang.Long(value); 
} 
public java.lang.String toString() { 
org.omg.CORBA.Any any = org.omg.CORBA.ORB.init().create_any(); 
MyUnionHelper.insert(any, this); 
return any.toString(); 
} 
}
 

CORBA Typedef

Typedefs erlauben die Definition von eigenen Datentypennamen für einen IDL Typ. Da Java typedefs beziehungsweise ähnliche Konstrukte nicht unterstützt, werden typedefs überall im Java Code durch den ursprünglichen Namen des Datentyps ersetzt.

 
 

OMG IDL

Java

struct Adress { 

string first_name; 

string last_name; 

string street; 

short number; 

string city; 

short postcode; 

}; 

  

typedef Adress MyAdress;

Final public class Adress { 

public java.lang.String first_name; 

public java.lang.String last_name; 

public java.lang.String street; 

public short number; 

public java.lang.String city; 

public short postcode; 

public Adress() { 

} 

public Adress( 

java.lang.String first_name, 

java.lang.String last_name, 

java.lang.String street, 

short number, 

java.lang.String city, 

short postcode 

) { 

this.first_name = first_name; 

this.last_name = last_name; 

this.street = street; 

this.number = number; 

this.city = city; 

this.postcode = postcode; 

} 

public java.lang.String toString() { 

org.omg.CORBA.Any any = org.omg.CORBA.ORB.init().create_any(); 

AdressHelper.insert(any, this); 

return any.toString(); 

} 

}

 

CORBA Any

Der CORBA Any Typ wird zur Java Klasse org.omg.CORBA.Any transformiert. Die Any Klasse ist eine selbstbeschreibende Datenstruktur, die ihren Typ behält. Any läßt den Entwickler Werte von vordefinierten IDL Typen zur Laufzeit Mithilfe von typsicheren Konversionsfunktionen zur Laufzeit extrahieren und einfügen. Es wird eine insert_XXX Methode zum Initilisieren oder Update des Any aufgerufen. extract_XXX Funktionen liefern den vom Any gehaltenen Wert zurück. Wenn der Wert den es enthält nicht mit dem Rückgabetyp der extract_XXX Funktion übereinstimmt, wird eine org.omg.CORBA.BAD_OPERATION Exception ausgelöst.

 

ORBs sind die Fabriken für Any Objekte. Sie werden von ihnen wie folgt erzeugt:

 


Org.omg.CORBA.Any a = orb.create_any();


 

Eine Variable vom Typ short läßt sich auf folgende Art in ein Any einfügen:

 


Short s = 4;

a.insert_short(s);


 

An den Wert, den das Any beinhaltet, gelangt der Entwickler wie folgt:

 


Short y = a.extract_short();


 

 

 

Ein Überblick über sämtliche extract_XXX Methoden:


abstract public short extract_short()

abstract public int extract_long()

abstract public long extract_longlong()

abstract public short extract_ushort()

abstract public int extract_ulong()

abstract public long extract_ulonglong()

abstract public float extract_float()

abstract public double extract_double()

abstract public boolean extract_boolean()

abstract public char extract_char()

abstract public char extract_wchar()

abstract public byte extract_octet()

abstract public org.omg.CORBA.Any extract_any()

abstract public org.omg.CORBA.Object extract_Object()

abstract public String extract_string()

abstract public String extract_wstring()

abstract public org.omg.CORBA.TypeCode extract_TypeCode()

abstract public org.omg.CORBA.Principal extract_Principal()


 

 

Ein Überblick über sämtliche insert_XXX Methoden:


abstract public void insert_short(short s);

abstract public void insert_long(int i);

abstract public void insert_longlong(long l);

abstract public void insert_ushort(short s);

abstract public void insert_ulong(int i);

abstract public void insert_ulonglong(long l);

abstract public void insert_float(float f);

abstract public void insert_double(double d);

abstract public void insert_boolean(boolean b);

abstract public void insert_char(char c)

abstract public void insert_wchar(char c);

abstract public void insert_octet(byte b);

abstract public void insert_any(org.omg.CORBA.Any a);

abstract public voidinsert_Object(org.omg.CORBA.Object o);

abstract public voidinsert_Object(org.omg.CORBA.Object o,

org.omg.CORBA.TypeCode t)

abstract public voidinsert_string(String s)

abstract public void insert_wstring(String s)

abstract public voidinsert_TypeCode(org.omg.CORBA.TypeCode t);

abstract public void insert_Principal(

org.omg.CORBA.Principal p);

abstract public void insert_Streamable(

org.omg.CORBA.portable.Streamable s);


 

Außer den extract_XXX und insert_XXX Methoden existieren zusätzlich die folgenden Methoden:

 

 
 

Methode

Erläuterung

Public abstract InputStream create_input_stream() Diese Methode erzeugt einen Inputstream, der den Wert des Any enthält.
Public abstract OutputStream create_output_stream() Diese Methode erzeugt einen leeren Outputstream.
Abstract public boolean equal(Any rhs) Diese Methode liefert true zurück, wenn der Wert der im Any enthalten ist der gleiche ist wie ihn das Argument Any.rhs enthält. Ist dies nicht der Fall, so wird false zurückgegeben.
Abstract public TypeCode type() Diese Methode gibt den TypeCode, der den Typ der im Any gehalten wird, beschreibt zurück. 
Abstract public void type(org.omg.CORBA.TypeCode type) Diese Methode setzt den Typ des im Any gehaltenen Wertes.
Public abstract void write_value(OutputStream output) Diese Methode schreibt den Wert des Anys in einen OutputStream.
 

nächste Seite


© Copyright 1998 André Möller, Oliver Mentz & Magnus Wiencke