 |
Zurück
Weiter
Speicher für die Extensions
Um die Verwaltung der zu speichernden Daten auch in der Extension
zu vereinfachen, haben wir die ExtensionStorage Klasse
entworfen. Sie übernimmt die Funktion der CorbaSession,
die bei der Applikation ohne Extensions verwendet wurde. Sie stellt
Methoden zum Hinzufügen (add), setzen (set),
Bekommen (get) und Löschen (remove) von Werten zur
Verfügung. Außerdem ist auch hier die Methode
createMyOwnVariable() vorhanden, die wir in der Klasse
CorbaExtensionStorage mit einem Aufruf der Methode
CorbaVariableAndParameter.createVariable() überschreiben
(vergleichbar mit Listing 4).
Die Managerklasse der Extension (CBankManager) verweist auf
ein CorbaExtensionStorage Objekt. Da die AppLogics das
Speicherobjekt durch die Managerklasse manipulieren, besitzt diese
zusätzlich die vier Methoden addObject, setObject,
getObject und removeObject. Diese Methoden
unterscheiden sich von den Methoden der Speicherklasse
addValue, setValue, getValue und
removeValue, da sie einen zusätzlichen Parameter
boolean useSession nehmen, der bestimmt, ob der
CBankManager die benötigten UID/Objektreferenz Paare im
Speicherobjekt der Extension oder in der Session speichert. Dies
sollte davon abhängen, ob mehrere Application Server Prozesse
verwendet werden (Session) oder nicht (Speicherobjekt der Extension).
Diese Unterscheidung ist in
"Design einer CORBA
Extension" erklärt.
Im Fall der Verwendung des Session Objektes zur Speicherung
der Objektreferenz, muß diese in eine Zeichenkette umgewandelt
werden, wie schon in
"Speicherung in der
Session" erläutert. Dies wird in der Methode
externalize() der Extensionklassen vorgenommen. Das
Gegenstück hierzu ist die Methode internalize(.), die den
Zustand eines Objektes anhand eines Strings wiederherstellt. Da jede
Extensionklasse außer der Managerklasse diese
Funktionalität zur Verfügung stellen muß, werden
diese beiden Methoden in der Klasse CExtCorbaDelegateObject
definiert, welche externalize() schon implementieren kann.
internalize(.) muß von der Unterklasse implementiert
werden. Listing 6 zeigt die Definition der
externalize() und internalize(.) Methoden der
CExtCorbaDelegateObject Klasse.
|
Listing
|
Erklärung
|
public java.lang.String externalize(){
String result;
try {
result =
_CORBA.Orbix.object_to_string(proxy_object);
} catch (SystemException e) {
result = null;
}
return result;
}
|
das CORBA Proxy Objekt, dessen Verweis ein Attribut der
CExtCorbaDelegateObject Klasse ist, wird zur
Zeichenkette umgewandelt und so zurückgegeben.
|
public abstract int internalize(
java.lang.String state,
bankCorbaExtDelegate.IBankManager mModule);
|
diese Methode ist abstrakt und muß von der
Unterklasse implementiert werden.
|
Listing 6: Die CExtCorbaDelegateObject Klasse
(Code von Christian Ey, ©’98 Netscape)
Um ein Extension Objekt wiederherstellen ("internalize") zu
können, ist neben der Objektreferenz noch der Name der
betreffenden Extensionklasse notwendig. Beim Wiederherstellen
muß zuerst das korrekte Extension Objekt hergestellt
werden und anschließend mit internalize(.) dessen
Zustand (in unserem Fall betrifft dies nur die CORBA Objektreferenz).
All dies bewerkstelligt die Klasse CorbaExtensionSession,
die die Klasse CorbaSession beerbt. Hierzu werden die Methoden
convert(.) und reconvert(.) überschrieben.
Listing 7 zeigt, wie wir das implementieren.
|
Listing
|
Erklärung
|
public GXVAL convert( Object anObject)
throws SystemException {
// this turns a string into a GXVAL object
IValList temp = GX.CreateValList();
temp.setValString( "temp",
anObject.getClass().getName()
+ "!" + ((CExtCorbaDelegateObject)anObject).externalize());
return temp.getVal( "temp");
}
|
Das zurückgegebene GXVAL Objekt enthält
einen String, der den Namen der Extensionklasse, ein
trennendes "!" und die zur Zeichenkette umgewandelte CORBA
Objektreferenz enthält. Das Format
ist:extensionKlasseName!Objektreferenz.
|
public Object reconvert( GXVAL aValue)
throws SystemException {
// this turns a GXVAL object into a string
IValList temp = GX.CreateValList();
CExtCorbaDelegateObject anObject;
temp.setVal( "temp", aValue);
String theString = temp.getValString( "temp");
int theInt = theString.indexOf('!');
try {
anObject =
(CExtCorbaDelegateObject)Class.forName(
theString.substring(0,
theInt)).newInstance();
} catch (ClassNotFoundException e) {
return null;
} catch (InstantiationException e) {
return null;
} catch (IllegalAccessException e) {
return null;
}
anObject.internalize(theString.substring(
theInt+1), m_Module);
return anObject;
}
|
Zuerst wird der String aus dem GXVAL Objekt
extrahiert. Dann wird mit Class.forName(.) ein
Extension Objekt erzeugt von der Klasse, die im
String bis zum Zeichen "!" niedergeschrieben ist. Wenn dies
keine Exception verursachte, wird an dem neuen
Extension Objekt die Methode internalize(.)
mit der CORBA Objektreferenz aufgerufen.
|
Listing 7: Die CorbaExtensionSession Klasse
(Code von Christian Ey, ©’98 Netscape)
Zurück
Weiter, Autor:
Christian Ey,
http://www.inweb.de/chetan
|
 |