In diesem Abschnitt soll an einer kleinen Beispielapplikation die Verwendung der Programmierschnittstelle gezeigt werden. Als Sicht wird dafür das schon vorher benutzte Beispiel EmpDept verwendet. Das Programm gibt alle Angestellten mit ihren Abteilungen und den Abteilungsleitern auf den Bildschirm aus. Die Schnittstellenklasse heißt EmpDeptAdmin, die Hauptklasse wird mit EmpDept bezeichnet, und die Klasse für die Teilanfrage der Departments heißt SV_dept. Die vollständigen Deklarationen der Klassen sind in Anhang E enthalten.
#include <iostream.h>
#include "EmpDept.h"
int main() {
CBref<EmpDept> e;
CBref<SV_dept> d;
EmpDeptAdmin empAdmin("localhost",4723);
// Verbindung ok?
if(!empAdmin)
exit(1);
Zunächst wird die Verbindung aufgebaut, dabei mußnur der Rechnername und die Portnummer
des ConceptBase-Servers angegeben werden.
Der Konstruktor des Objekts empAdmin stellt nicht nur die Verbindung her,
sondern stellt auch die Anfrage zur Initialisierung der Sichten und
füllt die Mengen im Anwendungsprogramm mit den Antwortobjekten.
Nachdem überprüft wurde, ob die Verbindung
korrekt aufgebaut worden ist, beginnt eine Endlosschleife. In dieser Schleife
wird zunächst die Sicht ausgegeben.
while(1) {
for(int i=0; i <empAdmin.EmpDeptSet.size(); i++) {
e=empAdmin.EmpDeptSet[i];
cout << (char*) *e << endl;
Die Menge der Objekte der Sicht ist in
der Objektvariablen EmpDeptSet des emp- Admin-Objekts enthalten.
Für die Ausgabe werden die Objekte der Variablen e zugewiesen und
mit dem Cast-Operator (char*) in einen C++-String konvertiert.
for(int j=0; j < e->dept.size(); j++) {
d=e->dept[j].getValue();
cout << e->dept[j].getLabel() ",";
cout << (char*) *d << endl;
Die Objektvariable dept der Klasse EmpDept ist vom Typ
CBset<CBattribute< CBref<SV_dept>>>. Beim Zugriff mußdaher zunächst
mit dem Array-Operator [] ein Objekt der Menge selektiert werden. Dann
kann man über die Methoden getLabel und getValue die Attributbezeichnung
und den Attributwert erhalten. Hier ist der Attributwert eine Referenz
auf die Klasse SV_dept.
for(int k=0; k < d.getValue()->head.size(); k++) {
cout << d->head[k].getLabel() << ",";
cout << (char*) d->head[k].getValue() << endl;
}
}
}
In dieser Schleife werden die Leiter einer Abteilung mit ihren Attributbezeichner ausgeben.
Die Objektvariable head ist ebenfalls eine Menge von Attributen, jedoch
ist der Template-Parameter keine Referenz wie bei dept,
sondern CBobjectName.
if(empAdmin.processUpdateMessage(0))
cout << "Neue Nachricht eingetroffen und verarbeitet!\n";
else
cout << "Keine neue Nachricht!\n";
}
}
Am Ende der Endlosschleife kontrolliert der Client, ob für ihn neue
Nachrichten eingetroffen sind und verarbeitet die Nachrichten direkt.
Die Methode processUpdate- Message über nimmt auch das Einfügen
und Löschen von Objekten.