next up previous contents
Next: 6.3.4 Das Java Native Up: Implementierung der CORBA-Objekte für Previous: Übersetzung der IDL-Dateien in

Implementierungsansätze für die Agentenobjekte

Zur Realisierung des Agentenobjekts nucleus muß eine Klasse erstellt werden, die die Methoden implementiert, die im Java-Interface nucleus.java deklariert sind. Der Konvention nach sollte diese Klasse nucleusImpl heißen. Die zugehörige Java-Datei hat demnach den Namen nucleusImpl.java. Normalerweise wird zur Implementierung der CORBA-Objekte der sog. BOA-Ansatz (BOA implementation approach) benutzt. Beim BOA-Ansatz ist es erforderlich, daß die selbst entwickelte Klasse (hier:nucleusImpl) die Skeleton-Klasse (hier: _nucleusImplBase) erweitert ( extends). Da Java aber für Methodenimplementierungen nur Einfachvererbung unterstützt, könnte das Objekt keine Methodenimplementierungen an eine Unterklasse im Objektmodell vererben. Diese Problematik wird anhand der Unterklasse UNIXSystem von nucleus in Abbildung 6.7 dargestellt.


 
Abbildung 6.7:  Vererbungskonflikt der Skeleton- und Implementierungsklassen beim BOA-Ansatz
53#53

Soll die Klasse UNIXSystemImpl die Implementierung der Methoden von der Klasse nucleusImpl erben, kann sie nicht gleichzeitig die Skeleton-Klasse _UNIXSystemImplBase erweitern. Die Lösung für dieses Problem ist der sog. Tie-Ansatz, der einen Delegierungsmechanismus realisiert. Dabei wird ein Pseudo-Objekt (Proxy) generiert, das von der Skeleton-Klasse erbt. Anstatt aber die im IDL-Interface definierten Operationen selbst zu implementieren, leitet es entsprechende Aufrufe an ein separates Implementierungsobjekt weiter, das wiederum von einer beliebigen Klasse erben kann. Der Tie-Mechanismus kann auch eingesetzt werden, falls ein Java-Objekt mehrere IDL-Interfaces implementieren soll. Ein Anwendungsfall wäre z.B. ein Server-Objekt eines Dienstes, das neben seiner Dienstschnittstelle auch eine Managementschnittstelle implementiert.

Für das hier betrachtete Beispiel bedeutet der Tie-Mechanismus, daß die Implementierungsklasse von der Proxy-Klasse _tie_UNIXSystem vertreten wird, welche die Skeleton-Klasse erweitert. Die Proxy-Klasse empfängt die Methodenaufrufe für das Server-Objekt und delegiert sie an die Klasse UNIXSystemImpl weiter, welche den Code für die Methoden enthält. Diese implementiert ( implements) also die Methoden, die in dem Java-Interface UNIXSystemOperations.java definiert sind, und kann gleichzeitig die Implementierungen von Methoden aus nucleusImpl erben. Die Auflösung des Konflikts über den Tie-Ansatz ist in Abbildung 6.8 dargestellt.


 
Abbildung 6.8:  Vererbungen des Tie-Ansatzes
54#54

Durch das Proxy-Objekt wird zur Laufzeit zusätzlicher Overhead eingeführt. Der Tie-Mechanismus sollte also nur verwendet werden, wenn ein Objekt die Methodenimplementierungen einer Oberklasse erben muß. Falls das Objekt die Methoden der Oberklasse selbst implementiert, das heißt, falls es sich um abstrakte Methoden handelt oder die Methoden überschrieben werden, sollte der normale BOA-Ansatz eingesetzt werden. Hierbei erweitert (extends) die Implementierungsklasse die Skeleton-Klasse und implementiert (implements die Schnittstelle der Oberklasse. Die beiden Implementierungsansätze werden ausführlich in [Vis97b] beschrieben.

Im folgenden Beispiel für die Implementierung der Klasse UNIXSystem des Objektmodells wird der BOA-Ansatz gewählt. Abbildung 6.9 zeigt Ausschnitte der Datei UNIXSystemImpl.java:


  
Abbildung 6.9: Ausschnitt aus der Implementierungsdatei UNIXSystemImpl.java
55#55

Die Klasse UNIXSystemImpl erweitert die Skeleton-Klasse und implementiert das Interface nucleus. Beim Instantiieren dieser Klasse wird durch Aufruf des Konstruktors der Skeleton-Klasse und Übergabe eines Namens ein persistentes CORBA-Objekt kreiert. Für jedes Attribut der Klassen nucleus und UNIXSystem gibt es eine Methode zum Auslesen des Attributwerts. Für schreibbare Attribute gibt es zusätzlich eine Methode zum Setzen des Attributwerts. Außerdem erbt UNIXSystemImpl u.a. die Methode shutdown(). Als Vorlage zur Implementierung könnte dieses Gerüst aus der Datei _example_UNIXSystem, die der IDL-Compiler erzeugt, übernommen werden. Der Code zur Implementierung der Methoden wurde in der Abbildung weggelassen.

Bei der Realisierung des Prototypen konnte die Managementinformation und -funktionalität der Agentenobjekte über zwei grundsätzlich verschiedene Techniken implementiert werden. Bei Verwendung der Sprache Java stehen Betriebssystemaufrufe zur Ermittlung von Informationen für das Systemmanagement nicht direkt zur Verfügung. Aufgrund der Portabilität von Java werden viele für das Management wichtige Systemdetails durch die Virtual Machine verschattet. Eine Möglichkeit war daher der Aufruf von externen UNIX-Kommandos und Programmen, um Managementinformation zu beschaffen oder Aktionen auszuführen. Sie wird im folgenden an einem Beispiel erläutert. Die andere Technik benutzt das Java Native Interface, um C-Prozeduren eines bestehenden SNMP-Agenten auszuführen. Diese Technik wird im Abschnitt 6.3.4 beschrieben.

Das Betriebssystem AIX stellt sehr viele High-Level-Administrationsbefehle auf der Ebene der UNIX-Kommandozeile bereit. Es ist möglich, aus der Java-VM heraus externe Programme oder Shellskripte aufzurufen. Die Ausgabe des externen Prozesses kann vom Java-Prozeß gelesen und ausgewertet werden. Im folgenden Beispiel wird die Methode Name() zum Auslesen des Hostnamens durch Aufruf des externen AIX-Kommandos hostname realisiert. Abbildung 6.10 zeigt den zugehörigen Java-Code.


  
Abbildung 6.10: Implementierung der Methode Name()
56#56


next up previous contents
Next: 6.3.4 Das Java Native Up: Implementierung der CORBA-Objekte für Previous: Übersetzung der IDL-Dateien in
Copyright Munich Network Management Team