:: Versuch 2 - Implementierung von Web Services (Praktikum) - FSS '07
Ziel
Im zweiten Versuch soll XQuery als Implementierungssprache für Web Services verwendet werden. Dazu erweitern wir den Server aus Versuch 1 um einen XQuery-Auswerter. Für jede Operation wird auf dem Server ein XQuery-Ausdruck hinterlegt, deren Auswertung auf der Eingangsnachricht und evtl. weiteren Daten die jeweilige Antwortnachricht ergibt.
Inhalt
Teilversuch I
Erweitern Sie Ihren Server aus Versuch 1 so, dass auf jeder eingehenden SOAP-Nachricht eine XQuery-Anfrage ausgeführt wird, und geben Sie das Ergebnis der Anfrage als Antwortnachricht zurück. Verwenden Sie Saxon als XQuery-Auswerter. Die Anfrage, die für eine Operation ausgeführt wird, soll jeweils im Dateisystem abgelegt sein. Als Dateinamen verwenden Sie dabei den Local Part des Tagnamens, der die Operation bezeichnet, mit der Endung .xq. Die Anfrage soll als Eingabekontext den Wurzelknoten der SOAP-Nachricht erhalten.
Dadurch kann der Server nun sehr einfach, und sogar ohne Recompilation, um neue Operationen erweitert werden. Um z.B. die echo-Operation aus Versuch 1 zu implementieren, genügt, eine Datei echo.xq abzulegen, die als Inhalt den folgenden XQuery-Ausdruck trägt
declare namespace wsprak="http://db.informatik.uni-mannheim.de/xmlprak";
<env:Envelope xmlns:env='http://www.w3.org/2003/05/soap-envelope'>
<env:Header/>
<env:Body>
{/env:Envelope/env:Body/wsprak:echo}
</env:Body>
</env:Envelope>
Beachten Sie, korrekte Fehlermeldungen zu erzeugen, z.B. wenn eine nicht als Anfrage vorliegende Operation aufgerufen wird.
Implementieren als Test die Operation> histogram (Analog zu Versuch 1).
Teilversuch II
Der Server soll nun Web Services für ein Studienbüro anbieten. Dazu verfügt der Server über Stammdaten in Form des unten angegebenen Dokuments uni.xml. Die eingehenden SOAP-Nachrichten werden von Nutzern des Studienbüros (Studenten, Professoren, Verfassungsschutz, etc.) abgesetzt, um Informationen über die Studenten zu bekommen.
Implementieren Sie die folgenden Operationen mit XQuery-Ausdrücken, die die eingehende SOAP-Nachricht und die Stammdaten zu einer Antwort verknüpfen:
- statistics gib die Anzahl der Studenten, Vorlesungen, Angestellten, und Professoren in Form eines geeigneten XML-Dokuments zurück.
- checkLoad gib die IDs von allen Studenten zurück, bei denen die Gesamtzahl der Credits der besuchten Vorlesungen über 25 liegt.
- getAttendees liefere die IDs aller Studenten zurück, die eine als Parameter angegebene Vorlesung besuchen.
- getName gib den Namen des Angestellten mit der als Parameter übergebenen ID zurück. Vorsicht: Aus Datenschutzgründen dürfen die Namen und IDs von Studenten nicht über diese Operation miteinander verknüpfbar sein. Es muß also bei der Anfrage einer Studenten-ID ein Fehler zurückgegeben werden.
- getBest gibt jeweils zu jedem Semester den Studenten mit der besten Durchschnittsnote über alle Prüfungen zurück.
- getGrades als Parameter bekommt dieser Aufruf eine Studenten-ID, und eine Liste von Vorlesungen in der folgenden Form
... <lecturelist> <lecture><name>Programming</name></lecture> <lecture><id>L32</id></lecture> ... </lecturelist> ...und liefert jeweils die Noten des Studenten für diese Vorlesungen in Form eines entsprechend strukturierten XML-Dokuments zurück. Zu jeder Vorlesung ist entweder ein Teil des Namens oder die ID angegeben. Wenn ein Namensteil angegeben ist, sollen alle Vorlesungen ermittelt werden, in denen der Namensteil vorkommt. - findQualified überprüft, welche Studenten bestimmte Qualifikationen haben, die z.B. für einen bestimmten Kurs
(oder für das Diplom) erforderlich sind. Als Eingabe
erhält die Operation eine Beschreibung der geforderten Qualifikationen in der Form
... <requirements> <minSemester>4</minSemester> <maxSemester>8</maxSemester> <minGrade><lectureid>L32</lectureid><reqGrade>2</reqGrade></minGrade> ... </requirements> ...und liefert jeweils alle passenden Studenten zurück. minGrade kann dabei beliebig oft auftauchen, minSemester und maxSemester höchstens einmal, aber können auch weggelassen werden. Das Ergebnis ist wieder ein XML-Dokument mit geeignetem Schema.
Teilversuch III
Geben Sie ausserdem eine WSDL-Spezifikation Ihres Web Service an, und sorgen Sie dafür, dass der Server die Spezifikation unter der URL "http://servername:port/wsdl" liefert. Verwenden sie den document-Stil und geben Sie Schemadefinitionen für die Nachrichten an.Materialien und Hinweise
Saxon ist auf Sourceforge verfügbar. Die Dokumentation liegt dort in einem getrennten Paket, von dem Teile auch direkt beim Hersteller Saxonica abrufbar sind. Saxon kann die meisten Java-APIs für XML direkt als mögliche Eingabequellen verarbeiten (Streams, DOM, ...) und auch als Anfrageergebnis erzeugen.
Zur Vermeidung des Copy-Paste-Programmings für sich in den Anfragen wiederholende Teilausdrücke wie das Erzeugen des Result-Envelopes bietet sich die Verwendung XQuery library modules an (import module ...), die von Saxon auch unterstützt werden.
Das Dokument für die Stammdaten findet sich hier. Aus einer Query heraus kann man darauf z.B. mit der fn:doc-Funktion zugreifen, wenn das Dokument an geeigneter Stelle im Dateisystem abgelegt wird.
Hier noch ein Link zum WSDL-Standard beim W3C.
Abgabe
Die Abgabe der Aufgabe in Form des Java-Sourcecodes erfolgt per Email an mich. Der Abgabezeitpunkt ist Montag der 16.4. 2007 um 12.00 Uhr. Mit den einzelnen Gruppen gibt es dann jeweils individuell vereinbarte Besprechungstermine, in denen sie ihre Lösung gemeinsam präsentieren müssen.