Architektur des CORBA-Komponentenmodells (2003)

Martin v. Löwis

Aufbauend auf einer Einführung der Common Object Request Broker Architecture (CORBA) und des C++-Mappings für IDL wird das CORBA-Komponenten-Modell (CCM) vorgestellt. Dazu werden die relevantent technischen Standards studiert und mit den tatsächlich verfügbaren Implementierungen verglichen.

Als aktuelle Entwicklung auf dem Gebiet von Softwarekomponenten wird ebenfalls Microsofts Shared Source Common Language Infrastructure (SSCLI) und die Integration der Programmiersprache C# in diese Plattform untersucht. Auch hier werden die relevanten ECMA-Standards mit den Implementierungen verglichen.

Schwerpunkte der Vorlesung sind:
  • die Architektur des CORBA-Komponentenmodells
  • die Architektur von .NET SSCLI
  • das C++-Mapping für CCM
  • Implementierungsstrategien für CCM-Container und -Komponenten

Prüfungstermin

Mündliche Prüfungen finden am 28.7., 29.7. und 30.9.2003 statt. Voraussetzung zur Prüfungszulassung ist die erfolgreiche Absolvierung des Praktikums (Lösung der Übungsaufgaben). Prüfungstermine werden von Frau Wagner vergeben.

Literatur

CORBA-Implementierungen für C++

Vorlesungen

  1. Course Overview
  2. CORBA 3.0
  3. OMG IDL
  4. C++ Mapping: Data Types
  5. C++ Mapping: Client Side
  6. Object Services: Name Service
  7. C++ Mapping: Server Side
  8. Object Services: Event Service
  9. POA Interfaces
  10. Tutorial CCM
  11. CORBA Security
  12. Overview of .NET
  13. GIOP
  14. .NET Packagin and Deployment (Beispiele)

Übungsaufgaben

Aufgabe 1: Java-Sprach-Abbildung

Abgabetermin: 21. April

Höchstpunktzahl: 10P

Gegeben sei die IDL-Datei time.idl. Vergleichen Sie die Ausgabe des IDL-zu-Java-Compilers mit der Mapping-Spezifikation ( formal/02-08-05)

  1. Geben Sie für jede Ausgabe-Datei an, ob sie für die Klienten-Seite oder die Server-Seite benötigt wird.
  2. Geben Sie für jede Ausgabe-Datei an, ob die darin definierten Klassen und Schnittstellen durch die Java-Sprachabbildung vorgegeben sind oder zur Implementierungsstrategie des CORBA-Laufzeitsystems gehören.
  3. Geben Sie für die aus der Schnittstelle CosTime::TimeService generierten Klassen und Schnittstellen an, welche Definitionen sich aus dem Sprachabbildung ergeben, welche zur Implementierungsstrategie gehören, und welche der von der Sprachabbildung vorgegebenen Konstrukte vom IDL-Compiler nicht oder falsch generiert werden. (Hinweis: Sie können diese Klassifizierung beispielsweie durch farbliche Markierung der Quellen in HTML-Form vornehmen).

Aufgabe 2: Klientenimplementierung in C++

Abgabetermin: 12. Mai

Höchstpunktzahl: 10P

Gegeben sei die IDL-Datei aufgabe2.idl sowie die Objektreferenz, die durch den IOR

      IOR:000000000000001849444C3A41756667616265322F5365727665723A312E3000000000010000000000000028000100000000000F3134312E38392E3232342E3133310000162E0000000000086175666761626532
    
definiert wird (corbaloc::141.89.224.131:5678/aufgabe2).

Aufgabe 3: Serverimplementierung in C++

Abgabetermin: 21. Mai

Höchstpunktzahl: 10P

Implementieren Sie einen Server für die Schnittstelle aus Augabe 2. Beim Start des Servers soll sich dieser in den Namensdienst unter /<id> eintragen, wobei <id> Ihre Unix-Account-Kennung ist. Passen Sie Ihren Klienten derart an, den Server an dieser Stelle zu finden.

Implementieren Sie einen Klienten in C++, der die Operation reverse am gegebenen Objekt durchführt.

Aufgabe 4: Komponentenimplementierung in C++

Abgabetermin: 4. Juni

Höchstpunktzahl: 10P

Implementieren Sie eine Komponente eines Auktionshauses, wie sie in auktion.idl definiert ist. Wählen Sie dabei eine der folgenden Teilaufgaben:

  1. Auktionshaus: Erzeugt auf Verkäufer-Anfrage neue Auktionen, leitet Gebote (einschließlich Initialgebot) an alle Bieter weiter, erteilt nach einer Weile Zuschlag.
  2. Verkäufer: Bietet in unregelmäßigen Abständen neue Gegenstände zum Verkauf.
  3. Bieter: Empfängt Gebote, entscheidet sich gelegentlich, aktuelles Gebot zu überbieten.
  4. Filter: Meldet sich anstelle der Bieter beim Auktionshaus, und filtert Gebote. Falls mehrere Bieter den gleichen Filter benötigen, sollte sich der nur einmal beim Autionshaus anmelden.
Ein möglicher Ablauf dieser Anwendung ist in einem Ablaufdiagramm dargestellt.

Bitte geben Sie die gewählte Teilaufgabe bis zum 26.5. per Email bekannt.

Alle Komponenten sollten mit Mico im CCM-Pool abgearbeitet werden können. Zur Ablaufverfolgung reicht es, wenn die Komponenten-Homes als separate Serverprozesse laufen und den Ablauf auf der Standardausgabe protokollieren.

Folgende Test-Dienste stehen im CCM-Pool zur Verfügung:

  • Der Namensdienst, unter corbaloc::ccm1/NameService
  • Ein Welt-Objekt, unter corbaname::ccm1/loewis/Welt
  • Ein VerkaeuferHome, unter corbaname::ccm1/loewis/Verkaeufer
  • Ein BieterHome, unter corbaname::ccm1/loewis/Bieter
Zum Termin muss lediglich eine übersetzbare Komponente abgegeben werden; der Test ist Inhalt der nächsten Aufgabe.

Aufgabe 5: Komponententest

Abgabetermin: 11. Juni

Höchstpunktzahl: 5P

Testen Sie Ihre Komponente, und liefern Sie eine eventuell überarbeitete Komponente ab.

Aufgabe 6: Mico-Konformität

Abgabetermin: 25. Juni

Höchstpunktzahl: 10P

Lösen Sie eine der folgenden Teilaufgaben:

  1. Finden Sie 10 Inkompatibilitäten in MICOs Implementierung des CORBA-Komponentenmodells. Führen Sie dabei unter Angabe der Kapitel/Abschnittsnummer des CORBA3/CCM-Standards an, ob es sich um ein nicht realisiertes oder ein falsch realisiertes Feature handelt; in letzterem Fall auch, worin der Fehler besteht.
  2. Implementieren Sie einen HomeFinder für MICO. Bieten Sie dazu Schreibzugriff über die erweiterte Schnittstelle HPI::ComponentHome an.
  3. Implementieren Sie die Registrierung von Komponenten im HomeFinder, sowohl für den Fall des Standalone-Servers als auch für den Fall des dynamischen Nachladens von Komponenten. Liefern Sie Ihre Lösung in Form eines Patches für eine aktuelle MICO-Version.

Aufgabe 7: Remoting in .NET

Abgabetermin: 9. Juli

Höchstpunktzahl: 10P

Implementieren Sie mittels .NET oder Rotor Klienten und Server für folgende Schnittstelle:

    namespace ReverseAPI
    {
      public interface Reverser
      {
        string reverse(string arg);
      }
    }
    

Verwenden Sie dabei einen TCP-Kanal, und richten Sie den Dienst auf Port 8421 ein.