Bindung des Netscape Application Servers an CORBA 

Home > Deutsch > Ressourcen > NAS und CORBA > kapitel_16
(C) Christian R. Ey
last modified:
Sun Jan 20 20:40:27 GMT+01:00 2002
-- Impressum / Contact --

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