Startseite :: Kontakt :: Sitemap ::

 

:: Versuch 3 - Implementierung von Web Services (Praktikum) - FSS '07

Quicklinks: Ziel :: Inhalt :: Material :: Abgabe ::
 

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 Funktionsargumente und Rückgabewerte werden dabei automatisch zwischen den entsprechenden Java- und XQuery-Typen ungewandelt. Neben AtomicTypes können auch Knoten und Dokumentfragmente übergeben werden, z.B. indem DOM-Objekte auf der Java-Seite verwendet werden.

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

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.