Henrike Schuhart: Design and Implementation of a Database Programming Language for XML-based Applications Zusammenfassung Die Extensible-Markup-Language (XML) ist seit einigen Jahren ein weit verbreitetes Standardformat zum Datenaustausch in heterogenen Systemen. XML ist eine universelle Sprache, die unabhängig von Programmiersprachen, Plattformen, Betriebssystemen und Anwendungsdomänen ist. Der verstärkte Einsatz von XML in Web-Applikationen und E-Commerce Anwendungen erfordert die Integration von XML-Technologien in existierende, objektorientierte Programmiersprachen wie Java oder C#. Darüberhinaus arbeiten viele Anwendungen mit persistenten Daten und Objekten, beziehungsweise müssen diese persistent ablegen. Bestehende Ansätze, die XML in Programmiersprachen integrieren, reichen von primitiven bis hin zu sehr komplexen Strategien. Das Document Object Model (DOM) beispielsweise bietet Schnittstellen, um beliebige XML-Dokumente erzeugen und bearbeiten zu können. Die zur Verfügung stehenden Basisoperationen erschweren eine übersichtliche und komfortable Handhabung. Zwar sichert die Benutzung des DOMs die Erzeugung von wohl-geformten XML-Dokumenten zu, deren Gültigkeit hinsichtlich eines deklarierten Schemas bleibt dabei jedoch unberücksichtigt. Komplexere Ansätze zur Integration von XML in Programmiersprachen zeichnen sich beispielsweise durch die Unterstützung von XML-Anfragesprachen wie XPath aus. Auf diese Weise kann eine komplexere Navigation auf XMLDokumenten stattfinden. Außerdem werden XML-Dokumente statisch oder dynamisch bezüglich ihrer Gültigkeit bezogen auf ein deklariertes XML-Schema geprüft. In Hinblick auf Persistenz werden zur Zeit zahlreiche Frameworks entwickelt, die das Mismatch-Problem zwischen dem Objekt-Modell der Programmiersprache und dem Datenmodell der Persistenzschicht lösen sollen. Im Allgemeinen werden aus Performance-Gründen zumeist relationale Datenbanken verwendet. Obwohl bestehende Ansätze den Aufwand des Mappings zwischen den unterschiedlichen Datenmodellen zu minimieren versuchen, fehlt es weiterhin an einer wirklich transparenten Lösung. In dieser Arbeit beinhaltet transparente Persistenz, dass Objekte beliebigen Typs gespeichert werden können. Algorithmen können unverändert bleiben, egal ob sie nun auf persistenten oder transienten Objekten arbeiten. Schließlich darf sich auch der Programmierer nur auf einem sehr hohen Level mit der Frage der Persistenz auseinandersetzen müssen. Objektorientierte Datenbanken beschränken sich auf eine einzige Programmiersprache und haben sich nicht durchgesetzt. Allen Ansätzen, die Persistenz in bestehende Programmiersprachen integrieren, ist gemeinsam, dass sie expliziten Code für die Kommunikation mit dem Persistenzdienst benötigen. In der Vergangenheit wurden einige Datenbankprogrammiersprachen entwickelt, die allerdings alle das relationale Datenmodell zu integrieren versuchten. Folglich scheint es wünschenswert zu sein, eine einheitliche und vor allen Dingen transparente Lösung für die Integration von XML und Persistenz in eine existierende Programmiersprache zu entwickeln. In dieser Arbeit ist beispielhaft Java als die objektorientierte Ausgangs-Programmiersprache gewählt worden. Das XOBEDBPL (XML OBjEcts DataBase Programming Language) Projekt ist das Nachfolgeprojekt von XOBE. In XOBE sind bereits XML-Daten und XPath-Ausdrücke integriert worden. Das Besondere am XOBE-Ansatz ist allerdings deren statische ¨ Uberprüfung auf Gültigkeit in Bezug zu einem deklarierten XML-Schema. Als XML-Schema-Sprachen werden XML Schema sowie DTD unterstützt. Der verwendete Typcheck-Algorithmus arbeitet im speziellen Fall der XOBE-Programme in linearer Zeit und basiert auf Typinferenz und Subtypcheck. In XOBEDBPL sind drei wesentliche Erweiterungen vorgenommen worden. Erstens ist es nun möglich, XML-Objekte per Updates zu manipulieren. Updates in XOBEDBPL basieren hauptsächlich auf XPath, um die entsprechenden Knoten zu addressieren, und einer beliebigen Sequenz bestehend aus Basisoperationen. Die unterstützten Basisoperationen setzen sich aus Inserts, Deletes, Renames und Replaces zusammen. Auch XML-Updates in XOBEDBPL werden statisch auf ihre Gültigkeit hin überprüft. Dazu ist der in XOBE verwendete Typcheck-Algorithmus entsprechend erweitert worden. Der zweite wesentliche neue Bestandteil von XOBEDBPL ist das umgesetzte Konzept der transparenten, typunabhängigen Persistenz. In XOBEDBPL steht dem Programmierer die Deklaration einer persistenten Umgebung zur Verfügung. Objekte, die innerhalb dieser persistenten Umgebung erzeugt werden, werden persistent durch Erreichbarkeit. Dabei bleiben die bereits bestehenden Typdeklarationen dieser Objekte unangetastet. Bereits existierende persistente Objekte beliebigen Typs können per XPath-Anfragen gefunden werden und dann per Methodenaufrufen, bzw. im Falle von XML-Objekten mittels XPath- oder Update-Ausdrücken, bearbeitet werden. Persistente Objekte in XOBEDBPL können zwischen verschiedenen Anwendungen ausgetauscht werden. Um den gemeinsamen und eventuell konkurrierenden Zugriff konsistent halten zu können, ist die Unterstützung von Transaktionen erforderlich. Transaktionen stehen aus Programmierersicht durch sogenannte Transaktions-Statements zur Verfügung. Zur Compilezeit werden XOBEDBPL-Programme in reine Java-Programme transformiert. Die Transformation fügt entsprechenden Kommunikationscode mit dem Persistenzservice hinzu. Der Persistenzservice nutzt intern eine verteilte Persistenzschicht. Die Entwicklung und Implementierung der Persistenzschicht in XOBEDBPL ist die dritte Neuerung. Die Persistenzschicht basiert hauptsächlich aufWebservices. Darüberhinaus ist sie nicht nur von XOBEDBPLProgrammen nutzbar, sondern auch von beliebigen anderen Applikationen. Die Schnittstelle bildet ein Webservice, der generische Operationen zum Laden, Speichern, Löschen und zur Transaktionsverwaltung beinhaltet. Der Webservice akzeptiert beliebige Objekte in XML-Darstellung und deren Typbeschreibungen. Eine solche Persistenzschicht kann aus beliebig vielen dieserWebservice-Instanzen bestehen. Intern können in den Persistenzschicht-Komponenten beliebige Datenspeicher verwendet werden. Beispielsweise können das relationale Datenbanken, XML-Datenbanken, aber auch Dateisysteme sein. Die Resultate der Arbeit wurden auf drei internationalen Konferenzen und zwei Workshops veröffentlicht.