:: Versuch 3 - Implementierung von Web Services (Praktikum) - FSS '07
Ziel
Im dritten Versuch wird XQuery so erweitert, dass Aufrufe an externe Web Services in XQuery-Ausdrücken verwendet werden können. Dazu wird die Funktionsbibliothek unseres XQuery-Auswerters um eine Funktion zum Absetzen von SOAP-Calls erweitertn.
Inhalt
Teilversuch I
Durch Erweiterungsmechanismen können die meisten Anfragebearbeitungskomponenten um neue Funktionen erweitert werden, die in anderen Sprachen als der Anfragesprache implementiert sind. In Saxon kann man in Java implementierte Erweiterungsfunktionen für XQuery recht einfach einbinden:
Durch Assoziation eines Namespace-Prefixes mit einer Java-Klasse können die statischen Methoden der Klasse direkt in XQuery-Ausdrücken verwendet werden. Steht z.B. die Deklaration declare namespace xprak = "java:org.test.Klasse"; im Prolog einer Anfrage, kann die statische Methode TestFunktion der Klasse org.test.Klasse als XQuery-Funktion verwendet werden:
declare namespace xprak = "java:org.test.Klasse";
element ergebnis {
Das Ergebnis der TestFunktion ist {xprak:TestFunktion()}.
}
Vorausetzung ist dabei, dass
- die Klasse auf dem Classpath liegt.
- die Klasse public ist.
- die Methode public und static ist.
Machen Sie sich mit dem Erweiterungsmechanismus vertraut; entwickeln Sie eine einfache Java-Testfunktion add, die zwei Integer-Zahlen addiert und die Summe zurückgibt. Schreiben Sie eine XQuery-Anfrage, die diese Funktion aufruft.
Teilversuch II
Erlauben Sie in Ihrem Web-Service-Server aus den vorherigen Teilversuchen den Aufruf von externen Web Services aus XQuery. Implementieren Sie dazu eine Java-Erweiterungsfunktion, die folgende Signatur hat
declare namespace xprak = "...";
declare function xprak:callWS($uri as xs:anyURI,$soap as node()) as node() external;
Dabei soll die Funktion die übergebene SOAP-Request-Nachricht (d.h. $soap enthält den kompletten Envelope) an den angegebenen Endpoint schicken, und die Antwort
als Rückgabewert liefern.
Materialien und Hinweise
Weitere Hinweise zur Entwicklung externer Funktionen in Saxon finden sich hier. Dort gibt es auch eine genaue Auflistung, welche Datentypen in Java auf welche Typen in XQuery abgebildet werden, und umgekehrt.
Beachten Sie in Teilversuch II, dass
- die Kommunikation mittels HTTP POST abgewickelt wird. Dies kann mit der Java-Klasse java.net.URLConnection bewerkstelligt werden.
- Das Interface der URLConnection basiert auf Streams. Das beduetet, dass Ihre Erweiterungsfunktion eine Umwandlung der XML-Daten in einen Stream und umgekehrt vornehmen muss.
Testen Sie Ihre Funktion, indem Sie zwei Server parallel starten (unterschiedliche Ports), bei denen die Implementierung einer Operation in einem Server den anderen aufruft.
Abgabe
Die Abgabe der Aufgabe in Form des Java-Sourcecodes erfolgt per Email an mich. Der Abgabezeitpunkt ist Montag der 7.5. 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.