Die neue Schnittstelle wurde unabhängig von der in [JJS96b] beschriebenen Programmierschnittstelle für ConceptBase entwickelt. Im Gegensatz zu der dortigen Schnittstelle, die in der Sprache C programmiert ist, wurde hier auf eine vollständig objekt-orientierte Implementierung geachtet.
Die Kommunikationsschnittstelle für ein Client-Programm ist für eine objekt-orientierte Darstellung gut geeignet. Die Verbindung zum Server bildet das Objekt, die Methoden stellen die vom Server angebotenen Dienste dar. Für ConceptBase werden verschiedene Arten von Clients angeboten, die für unterschiedliche Zwecke eingesetzt werden können. Jede Client-Art ist in einer Klasse implementiert. Der objekt-orientierte Ansatz ermöglicht auch die einfache Portierung der Schnittstelle für verschiedene Betriebssysteme. Die Schnittstelle ist unter den Betriebssystemen SunOS 4.x, Sun Solaris 2.x, Linux und Microsoft Windows 3.1, 95 und NT lauffähig. Die Klassenhierarchie ist in Abbildung 7.2 dargestellt.
Abbildung 7.2: Hierarchie der Kommunikationsklassen
Die Klasse IpcClient bildet die Basisklasse für die weiteren Kommunikationsschnittstellen. In dieser Klasse sind die Zugriffe auf betriebssystemspezifische Funktionen und Datentypen verkapselt, so daßdie weiteren Klassen unabhängig von der Systemumgebung implementiert sind. Ein IpcClient-Objekt kann für jede Art von Interprozeßkommunikation benutzt werden, die auf Sockets basiert. Diese Klasse stellt unter anderem die Basisoperationen read und write bereit.
Die Verbindung zu einem ConceptBase-Server kann man mit der Klasse CBclient aufbauen. Diese Klasse ist privat abgeleitet von IpcClient, d.h. die öffentlichen Methoden der Oberklasse sind nur innerhalb der Klasse CBclient sichtbar und für ein CBclient-Objekt sind die Methoden tell, untell, ask usw. benutzbar. Schon bei der Konstruktion des Objekts wird die Verbindung zum ConceptBase-Server aufgebaut.
Die Klasse CBnotifyClient ist auch wieder privat von der Klasse CBclient abgeleitet. Ein Objekt dieser Klasse kann nur Notifikationsnachrichten empfangen. Die Methoden von CBclient stehen hier nicht zur Verfügung, da es sonst zu einem Konflikt auf dem Kommunikationskanal zwischen Notifikationsnachrichten und normalen Antworten auf Methodenaufrufe kommen kann. Die Registrierung für eine bestimmte Art von Notifikationsnachrichten erfolgt durch die Methode notification- Request. Mit der Methode getNotifyMessage kann eine Notifikationsnachricht gelesen werden, falls für den Client eine Nachricht vorliegt.
Eine Spezialisierung von CBnotifyClient ist die Klasse CBviewAdmin. Dies ist nur eine virtuelle Klasse, da sie keine direkten Instanzen haben kann. Die Objekte werden als Instanz einer sichtenspezifischen Klasse ViewAdmin gebildet. Wie in Kapitel 6 bereits beschrieben wurde, mußdiese Klasse für jede Sicht generiert werden, da in dieser Klasse die Verarbeitung der Änderungsnachrichten implementiert ist und hier die Objekte in den Sichten eingefügt und gelöscht werden. Die Methode processUpdateMessage verarbeitet die eingehenden Notifikationsnachrichten, indem für die entsprechenden Nachrichten die Methoden handleInsert und handleDelete aufgerufen werden.
Des weiteren gibt es für jede Sicht, für jede Teilanfrage und für jedes Attribut eine spezielle handleInsert-Methode und eine spezielle handleDelete-Methode, die von den allgemeineren Methoden aufgerufen wird. In diesem Methoden ist dann konkret das Einfügen und Löschen von Objekten und Attributen implementiert.
Die Objektvariablen ViewSet bzw. SubViewSet enthalten die Extensionen für Sichten oder Teilanfragen. Die bei der Sichtenwartung erforderlichen Änderungen werden direkt auf diesen Mengen ausgeführt.
Für die Anwendung der Sichten mußder Programmierer ein Objekt der generierten ViewAdmin-Klassen erzeugen. Daraufhin baut das Anwendungsprogramm die Verbindung zum ConceptBase-Server auf und der Server initialisiert die Sichten. Die Initialisierung der Sicht wird als eine Folge von Einfügeoperationen betrachtet, so daßfür die Initialisierung und nachher stattfindende Änderungsoperationen die gleichen Methoden verwendet werden.
Wenn der Programmierer auf eine Sicht zugreifen will, referenziert er die entsprechende ViewSet-Variable seines ViewAdmin-Objekts. Die Datenstrukturen der Objekte und der Zugriff darauf sind genauer im nächsten Abschnitt beschrieben.
Christoph Quix