Fakultät Informatik, Institut für Systemarchitektur, Professur für Rechnernetze KOMPLEXPRAKTIKUM J2ME / SOAP - VERSUCH Betreuer: Dipl.-Inf. Anja Strunk -0- 1 Inhaltsverzeichnis INHALTSVERZEICHNIS 2 KAPITEL 1 4 Praktikumsbeschreibung 1.1 Versuchziel 1.2 Aufgabenstellung 1.3. Versuchsdurchführung 4 4 4 5 KAPITEL 2 14 J2ME – Tutorial 14 KAPITEL 3 15 SOAP - Web Service– Tutorial 3.1 Einführung 3.2 Architektur und Clientzugriff 3.3 Implementierungstechnische Umsetzung von Web Services 15 15 15 18 Projektdokumentation 1.1 Serverapplikation 1.2 Clientapplikation 1.3 Abgabe der Lösungen 20 20 21 25 ANHANG A getBooking.xsd getFlight.xsd 26 26 27 Abkürzungsverzeichnis 30 Glossar 31 Abbildungsverzeichnis 32 Tabellenverzeichnis 33 Literaturverzeichnis 34 http://www.bstuder.ch/sppmc/v20_Tutorial_J2ME_ohne_loe.pdf 34 Goyal V.: „J2ME Tutorial“ 34 Java. NET, The Source for Java Technology Collaboration, 2005. 34 2 3 Kapitel 1 Praktikumsbeschreibung 1.1 Versuchziel Die Integration drahtloser Endgeräte in verteilte Anwendungen ist heute eine Standardanforderung bei der Entwicklung von Softwaresystemen. Aufgrund ihres Verwendungszwecks sind drahtlose Endgeräte jedoch mit beschränkten System- und Hardwareressourcen ausgestattet. Engpässe gibt es z.B. in einer geringen Anzahl unterstützter Netzwerkprotokolle und knapper CPU Leistung. Zudem liegen die Ressourcen stark heterogen vor. Dies bedeutet, dass für jedes Endgerät eine speziell auf dessen Fähigkeiten zugeschnittene Clientanwendung entwickelt werden muss. Vorteilhafter ist natürlich die Erstellung einer endgerätunabhängigen Applikation. Java 2 Standard Edition (J2SE) unterstützt dies für drahtgebundene Endgeräte. Für drahtlose Endgeräte hat SUN die so genannte Java 2 Micro Edition (J2ME) entwickelt. Diese Java Virtual Maschine (JVM) ist speziell an die beschränkten Ressourcen drahtloser Endgeräte angepasst. Selbstverständlich kann die J2ME-JVM dem Programmier nur ein Mindestmaß an Funktionalität zur Verfügung stellen. So sind z.B. komplexe Middleware-Konzepte zur Realisierung verteilter Anwendungen (z.B. RMI1) nicht enthalten. Für die Kopplung heterogener Systeme wird daher häufig die plattform- und programmiersprachenunabhängige SOAP– bzw. Web Service Architektur eingesetzt. Ziel des Versuchs ist es, Kenntnisse über die Technologie SOAP bzw. Web Services und deren praktischen Einsatz im Rahmen einer verteilten Java Anwendung zu vermitteln. Zusätzlich dazu soll der Student befähigt werden, J2ME-Anwendungen zu erstellen. 1.2 Aufgabenstellung Als Realisierungsbeispiel oben genannter Techniken dient der bereits in den Versuchen „Sockets“, „RMI“, „Corba“ und „EJB“ vorgestellte Anwendungsfall eines Flugbuchungssystems. Mittels eines drahtlosen Endgerätes soll der Nutzer die Möglichkeit haben: Flüge, die seinen Kriterien entsprechen zu suchen und zu buchen sowie bereits gebuchte Flüge zu stornieren Hierfür wird die Serviceapplikation als Web Service realisiert. Client und Server kommunizieren über SOAP. Die Serverapplikation wird im JWSDP fähigen Tomcat 5.0 zur Verfügung gestellt. Als Implementierungssprache dient Java. 1 Remote Method Invocation 4 Die Verwaltung von Flügen und bereits durchgeführten Buchung erfolgt in der AccessDatenbank „flugbuchung2.mdb“. Abbildung 1 veranschaulicht die Struktur der Beispielanwendung. JWSDP-Tomcat 5.0 SOAP / HTTP Access Datenbank J2ME-Client Nutzer Java Web Service Abbildung 1: physische Struktur der Beispielanwendung 1.3. Versuchsdurchführung Die Client- und Serveranwendung ist bereits vorimplementiert. Sie muss nur noch an ausgewählten Stellen ergänzt werden. Diese Stellen sind im Quellcode mit TODO gekennzeichnet. Die Quellcode-Dateien können auf der Praktikums-Webseite heruntergeladen werden. Im Kapitel 4 „Projektdokumentation“ werden die Quellcodedateien sowie die konkreten Aufgaben erläutert. Die notwendigen Komponenten für die Versuchsdurchführung findet man unter http://www.inf.tu-dresden.de/index.php?node_id=1786&ln=de&data=KR/J2MESOAP.html Installation der Entwicklungsumgebung Java SDK 5 Java SDK 5.x installieren. Der Versuch ist mit höheren Java-Versionen nicht kompatibel. Tomcat 5.0 und JWSDP (Java Web Service Development Pack) Als Web Service Container wird Tomcat 5.0 für JWSDP verwendet. Installation: 1. Tomcat für JWSDP herunterladen und entpacken. 2. JWSDP 2.0 herunterladen und installieren, dabei a. als JDK Java 1.5.x auswählen b. als Web-Container Tomcat auswählen. c. sonstige Standardeinstellungen übernehmen J2ME Wireless Toolkit 2.5.2 Das J2ME Wireless Toolkit enthält geeignete Emulatoren zum Test von J2ME Anwendungen. Für den Test der Clientanwendung ist ausschließlich der WTK 2.5.2 „DefaultColorPhone“ Emulator zu benutzen. 5 Installation: 1. J2ME Wireless Toolkit herunterladen und installieren, dabei a. als JDK Java 1.5.x auswählen Eclipse 3.3.1 Eclipse ist eine Entwicklungsumgebung für Java Programme. Um ein ständiges Kopieren der Quelltextdateien zwischen Eclipse und WTK zu vermeiden, empfiehlt sich die Verwendung des Ant-Werkzeuges Antenna 1.0.0. Zur Integration von Tomcat und Eclipse dient das Tomcat-Plug-In von Sysdeo. Es ermöglicht das Starten und Stoppen von Tomcat aus Eclipse heraus. Installation 1. Eclipse 3.3.1 oder höher, Eclipse Tomcat Plug-In und Antenna (antenna.jar) herunterladen. 2. Eclipse in gewünschtes Verzeichnis entpacken 3. Eclipse starten 4. Menü Windows Preferences… öffnen 5. Java Compiler in der Baumansicht auswählen 6. „Compiler compliance level” 5.0 einstellen. Achtung: 6.0 sorgt für eine BadClassVersion Exception beim kompilieren. (Siehe Abbildung 2) 6 Abbildung 2: Einstellen des Compiler Levels 7. Java Installed JRE in der Baumansicht auswählen 8. JDK 1.5.x hinfügen (siehe Abbildung 3) 7 Abbildung 3: Einstellen von JDK 1.5.x - 1 9. JDK 1.5.x als Standard setzen (siehe Abbildung 4) 8 Abbildung 4: Einstellen von JDK 1.5.x - 2 10. Im Menü Windows Preferences Ant Runtime auswählen 11. antenna-bin-0.9.13.jar unter Eclipse unter "Ant Home Entries (Default)“ hinzufügen (siehe Abbildung 5) 12. Fehlermeldung ignorieren 9 Abbildung 5: Einbinden von Antenna in Eclipse 13. Tomcat Plug-in in den Ordner „plugin“ im Eclipse Home Verzeichnis entpacken 14. Eclipse neu starten. Die Menüleiste enthält nun 3 Icons zum Starten, Stoppen und erneutem Starten von Tomcat (siehe Abbildung 6) Abbildung 6: Tomcat Integration in Eclipse - GUI 15. Menüeintrag Window Preferences… aufrufen 16. In Dialog Eintrag „Tomcat“ auswählen“ 17. Die installierte Tomcat Version auswählen, in unserem Fall 5.x und den Pfad auf das Tomcat Installationsverzeichnis eintragen (siehe Abbildung 7) 10 Abbildung 7: Integration von Tomcat in Eclipse - Tomcat Datenbank integrieren Die Datenbank speichert verfügbare Flüge und getätigte Buchungen. Installation: 1. Systemsteuerung Verwaltung Datenquellen (ODBC) 2. Registerkarte „DSN-Benutzer“ aktiveren 3. Hinzufügen… (siehe Abbildung 8) 11 Abbildung 8: Hinzufügen der Datenbank „flugbuchung2.mdb“ - 1 4. Treibers „Microsoft Access Driver (*.mdb)“ auswählen 5. Datenbankquelle„flugbuchung2.mdb“ (siehe Abbildung 9). 12 Abbildung 9: : Hinzufügen der Datenbank „flugbuchung2.mdb“ – 2 Achtung: Bei der Nutzung von Windows für x64 Systeme, muss folgender Befehl ausgeführt werden: „%WINDIR%\SysWOW64\odbcad32.exe“ 13 Kapitel 2 J2ME – Tutorial Im Rahmen der Praktikumsdokumentation wird nicht näher auf J2ME eingegangen. Ein detailliertes Tutorial findet sich unter: http://today.java.net/pub/a/today/2005/02/09/j2me1.html?page=1 14 Kapitel 3 SOAP - Web Service– Tutorial 3.1 Einführung Ein Web Service ist ein Web Server Dienst, der über das Internet aufgerufen werden kann und als Antwort statt HTML-Code eine für Maschinen lesbare XML-Datei generiert. Dies ermöglicht neben der Nutzung von Internetangeboten durch den Menschen auch deren Anspruchnahme von Maschinen. Ein prominentes Beispiel ist die Suchmaschine „Google“, welche ihren Recherchedienst nicht nur dem Web Browser und damit Anwendern zur Verfügung stellt, sondern auch anderweitigen Softwarekomponenten. Statt eines Eingabefeldes und einer tabellarischen Ausgabe der Suchergebnisse, wird für die Maschine Anfrage und Antwort in einer XMLNachricht kodiert. (Vergleiche Abbildung 10) HTML-Antwort XML-Antwort HTML-Anfrage XML-Anfrage Abbildung 10: Suchdienst von Google für Mensch und Maschine 3.2 Architektur und Clientzugriff Web Services folgen, gemäß Abbildung 11, einer service-orientierten Architektur (SOA – Service Oriented Architecture) bei der der so genannte Service-Provider einen Dienst inklusive seiner Beschreibung bei einem Verzeichnisdienst veröffentlicht. Der ServiceKonsument kann bei diesem nach Diensten, die seinen Anforderungen entsprechen suchen. Während dieser Suche wird auf die Servicebeschreibung des Providers zurückgegriffen. Als Ergebnis erhält der Konsument den oder die zutreffenden Dienste zuzüglich aller für die Inanspruchnahme notwendigen Informationen (z.B. Adresse). Er kann nun die Angebote der Service Provider nutzen. he n uc rg e he Verzeichnisdienst3 .: E :S 2. :V 1. fe öf r e lic nt bn is 5.: XML-Antwort 4.: XML-Anfrage Service Provider Service Konsument Abbildung 11: Architektur von Web Services: Grundprinzip, nach [Sev03] 15 Um die Interoperabilität heterogener Anwendungen zu unterstützen, war die Plattform-, Protokoll- und Programmiersprachenunabhängigkeit oberste Priorität bei der Realisierung von Web Services. Aus diesem Grund greifen alle für Kommunikation und Dienstbeschreibung entwickelten Standards auf XML zurück, die durch eben diese Eigenschaften gekennzeichnet ist. SOAP definiert den Aufbau aller zwischen den drei Akteuren der Web Service Architektur auszutauschenden Nachrichten. Jede Nachricht basiert hierbei auf einem standardisiertem XML-File, welches in ein „Header“- und ein „Body“-Element aufgeteilt ist. Beides befindet sich im so genannten „Envelope“-Element. Der Header dient der Aufnahme von Metainformationen über die Nutzdaten, während sich letztere als dienstspezifisches XML-File kodiert im Body befinden. Zusätzlich ist es möglich einen Anhang (engl. Attachement) an die SOAP Nachricht anzufügen, der Binärdaten des MIME2-Standards enthält. Abbildung 12 visualisiert den Aufbau einer SOAP-Nachricht. SOAP-Nachricht Envelope Attachement Header ….<Metainformationen> Non-text Body ….<Nutzdaten> text Abbildung 12: Aufbau einer SOAP-Nachricht, nach [Zel03] SOAP beschreibt lediglich den Aufbau der Daten und ist daher völlig unabhängig vom zugrunde liegenden Übertragungsprotokoll. D.h. obwohl meist HTTP genutzt wird, ist die Verwendung anderer Internetprotokolle wie SSL, FTP oder SMTP möglich, sofern diese XML-Nutzdaten akzeptieren. (Vergleiche Abbildung 13) SOAP Anwendung HTTP SMTP TCP Transport UDP IP Vermittlung Netzzugang … FTP Ethernet Token Ring FDDI … Abbildung 13: SOAP mit TCP / IP Protokollstapel, [Wik05d] WSDL (Web Services Description Language) bildet den Standard für Servicebeschreibungen. Sie definiert eine eindeutige XML-Grammatik zur Dokumentation von Web Services, die im Allgemeinen: 2 die austauschbaren Dokumente, d.h. SOAP-Nachrichten für Anfrage und Antwort (= Interfacebeschreibung des Dienstes), die verwendeten Übertragungsprotokolle (meist HTTP) und Multipurpose Internet Mail Extensions 16 die Adresse des Service-Providers (meist eine URL) umfasst. Aus der vom Verzeichnisdienst erhaltenen WSDL-Datei erlangt der potentielle Service-Konsument alle für die Nutzung des Web Services notwendigen Informationen. WSDL-Dateien werden ebenfalls mittels SOAP zum Verzeichnisdienst bzw. von diesem zum Dienstnutzer übertragen. Als dezentraler Verzeichnisdienst steht UDDI (Universal Description Discovery and Integration) zur Verfügung. UDDI bildet nicht nur einen öffentlichen Ort zum Registrieren und Aufsuchen von Diensten, sondern standardisiert auch die notwendigen SOAPNachrichten, um Web Services und ihre Beschreibung zu Finden, zu Ändern, Hinzuzufügen oder zu Löschen. Abbildung 14 fasst die 3 Standards SOAP, WSDL und UDDI bezüglich der Web Service Architektur noch einmal übersichtlich zusammen. ha (W SD 5.: SOAP - Antwort L) e (W SD g ra nf O AP uc O AP -S 1. :S AP O L) :S 2. 3. :S UDDI 4.: aus WDSL Aufbau der SOAP Nachrichten, Adresse + Übertragungsprotokoll auslesen 4.: SOAP – Anfrage Service Provider Service Konsument Abbildung 14: Web Service Architektur: konkret, nach [Wik05b] Web Services haben, gegenüber anderen Lösungen zur Realisierung verteilter Anwendungen den Vorteil ihrer Plattform-, Programmiersprachen- und Protokollunabhängigkeit, um zum einen auf effiziente Weise verteilte Anwendungen auf Basis existierende Internetdienste zu erstellen und zum anderen heterogene Softwarekomponenten zu verteilten Anwendungen zu verknüpfen, ohne den Nachteil eines hohen Einarbeitungsaufwand, wie dies z.B. von CORBA her bekannt ist. Während dies auch anfangs die Hauptmotivation von Web Services darstellte, gestattet die reine Nutzung von SOAP und HTTP als Übertragungsprotokoll darüber hinaus nicht nur die Realisierung verteilter Anwendungen hinter Firewalls, sondern auch die Involvierung leistungsschwacher Endgeräte in diese (vergleiche Abbildung 15). SOAP über HTTP SOAP über HTTP Client Server Firewall Thin Client Abbildung 15: verteilte Anwendungen auf Basis von SOAP über HTTP Web Services besitzen jedoch auch gravierende Nachteile. Erstere äußern sich im Sicherheitsproblem der verwendeten Übertragungsprotokolle. Es sind daher für sensitive Daten unbedingt weitere Mechanismen, wie z.B. SSL, nötig um Vertraulichkeit, Integrität und 17 Authentizität zu gewährleisten. Zusätzlich stellen hohe Übertragungs-, Kodierungs- und Decodierungszeiten der SOAP Nachrichten sowie Overhead für XML-Markup Performanceprobleme dar. Ein weiteres großes Problem bildet das fehlende Transaktionsmanagement der zu Grunde liegenden Transportprotokolle. Diese fundamentale Vorraussetzung verteilter Systeme kann derzeit leider nur durch proprietäre Lösungen, wie z.B. Cookies, ermöglicht werden. 3.3 Implementierungstechnische Umsetzung von Web Services Die Web Service Architektur wurde mit dem Ziel der Protokoll-, Plattform- und Programmiersprachenunabhängigkeit geschaffen. Aus diesem Grund definiert sie lediglich wie die Initialisierung und der Nachrichtenaustausch zwischen den Kommunikationspartner erfolgt, die konkrete Realisierung von Web Service- und deren Clientimplementierung wird jedoch nicht festgelegt. Dem Programmier steht es demnach frei die nötige Funktionalität der SOAPNachrichteninteraktionen und Netzwerkaktivität selbst zu programmieren oder von einer der diversen Programmierschnittstellen Gebrauch zu machen. Für die Serverapplikation existieren hierfür zahlreiche Web Service Container und APIs. Im Praktikumsversuch soll der Web Service Container „JWSDP-Tomcat 5.0“, die API „JAXRPC3“ und das JWSDP 2.0 genutzt werden. JAX-RPC automatisiert die Netzwerkinteraktionen und das Mapping zwischen SOAP und Java mit Hilfe so genannter Ties. Der Programmier braucht sich nur auf die Implementierung der Fachlogik der als Web Service angebotenen Methoden zu konzentrieren, indem er die Signatur der remote Methoden im so genannte Service Endpoint Interface definiert und deren Fachlogik in der Implementierungsklasse des SEIs anschließend spezifiziert. Im einfachsten Fall sind lediglich zwei .java–Files (Interface + Impl.-Klasse) notwendig. Das JWSDP erstellt aus dem SEI die dazugehörige WSDL-Datei sowie die JAX-RPC Ties. Notwendige Steuerungsinformationen befinden sich in der „config.xml“. Die Informationen über Adresse, Name, Bezeichnung, SEI und Implementierungsklasse des Web Services werden in den .xml Files web.xml jaxrpc-ri.xml hinterlegt und zusammen mit dem Quellcode und den Ties in einem .war File zusammengefasst. Auch diese Archiverstellung kann mittels der JWSDP-Funktionalität durchgeführt werden. Zur Laufzeit konvertiert Tomcat das .war File in ein Servlet, welches auf eingehende httpRequests der in den .xml Files hinterlegten Adresse reagiert, die entsprechenden Methode in der Serviceimplementierung aufruft und auf diese Weise den Web Service realisiert. Abbildung 16 visualisiert den Buildprozess eines Web Services. 3 Java API for XML-RPC 18 jaxrpc-ri.xml SEI config.xml Service-Impl web.xml JWSDP 2.0 Servlet SEI jaxrpc-ri.xml Tie WSDL-Datei Service-Impl web.xml JAX-RPC Laufzeitumgebung Tie Ties .war File JWDP-Tomcat 5.0 Abbildung 16: Buildprozess der Serverapplikation Auch auf Clientseite existieren zur Vereinfachung des Web Service Zugriffs diverse APIs. Für mobile J2ME-Anwendungen steht die API „JSR 172“ zur Verfügung, welche wie auch JAX-RPC, das Java-SOAP Mapping sowie die nötigen Netzwerkinteraktionen in so genannten Stubs automatisiert. Die Stubs können automatische aus der WSDL Datei des Servers gewonnen werden. Das WTK 2.2 bietet hierfür ein entsprechendes Tool an. (siehe Abbildung 17) WSDL-Datei WTK 2.2 J2ME-Client Stub JSR 172 Laufzeitumgebung Abbildung 17: Buildprozess der Clientapplikation Durch die Stubs unterscheidet sich der Aufruf einer Web Service Methode nicht von der einer lokalen, der originale Rückgabewert der Serverfunktion steht direkt zur Verfügung. Leider sind aufgrund der eingeschränkten Funktonalität der J2ME JVM nur Strings als Rückgabewerte möglich. Die zu übertragenden Informationen müssen daher auf geeignete Weise kodiert werden. Idealerweise bietet sich hierfür XML an. Dies bedeutet, dass die Informationen auf dem Server zunächst in ein entsprechendes .xml File kodiert und auf Clientseite mit Hilfe eines XML-Parsers wieder extrahiert werden müssen. Eine Beispielanwendung oben beschriebener Architektur findet WTK/apps/JSR172Demo oder im WWW http://www.devx.com/wireless/Article/28046/1954?pf=true. 19 man unter unter Kapitel 4 Projektdokumentation Die Quellcodedateien als Eclipse Projekte können auf der Praktikumseite herunter geladen werden. 1.1 Serverapplikation Die äußerst einfach gestaltete Serveranwendung besteht aus dem einzigen Package „flugbuchung“. Es enthält sowohl das SEI als auch dessen Implementierung. Die Implementierung in der Klasse „ServerImpl.java“ ist zu vervollständigen. Abbildung 18: Klassendiagramm des Servers Die Serveranwendung kann mit der im Eclipse-Projet enthaltenen buildServer.bat erstellt werden. Die .bat erzeugt die benötigte .war Datei und kopiert sie in das notwendige Verzeichnis für Web Applikationen in Tomcat. Es sind keine weiteren Aktionen notwendig. Der Web Service steht damit für Clientzugriffe zur Verfügung. Achtung: in der buildServer.bat sind die Pfade auf die Variablen noch anzupassen! Aufgabe 1: Implementierung des XML-Dokumentes als Rückgabewertes für die Methode getBooking(…) Remote Methoden dürfen lediglich String als Rückgabewerte besitzen. Einfache Statusmeldungen können auf diese Weise ohne Probleme übertragen werden. Komplexe Nachrichten, wie zum Beispiel eine gesuchte Buchung müssen als XML-Dokument kodiert transportiert werden. In Aufgabe 1 ist die Methode „getBooking(String bookingNumber, String surName, String firstName)“ der Serverimplementierungsklasse 20 „Server_Impl.java“ zu vervollständigen. Die Methode soll ein dem XML-Schema „getBooking.xsd“ aus Anhang A konformes XML Dokument zurück geben. Es enthält die Buchung, die an den Client zurückgesendet wird. Sollte keine Buchung vorhanden sein, so fehlt das „booking“ Element in der XML-Antwort. Nach erfolgreicher Implementierung der getBooking(…) – Methode ist die Entwicklung des Servers abgeschlossen. 1.2 Clientapplikation Die Clientanwendung besteht insgesamt aus 6 Packages, deren Inhalt Tabelle 1 entnommen werden kann. Packagename Inhalt businessLogic Server-Proxy-Klasse, welche die Serverrequest absendet und die Antworten aufbereitet an den Client weiterleitet. businessLogic.parser XML-Parser der getBooking und getFlight Serverantworten. businessLogic.staticStubs Aus WSDL-Datei automatisch erzeugte Subs. Diese Klassen nicht ändern! gui MIDlet der Clientanwendung. Diese Klassen nicht ändern! gui.commands Commands der Clientanwendung gui.forms Forms der der Clientanwendung. Tabelle 1: Inhalt der einzelnen Clientpackages Die für die Clientanwendung notwendigen Bibliotheken midpapi20.jar j2me-ws.jar cldcapi11.jar aus WTK_HOME/lib sind bereits in das Eclipse-Projekt integriert. Zum deployen und starten der Clientanwendung ist die build.xml über den Kontextmenüeintrag „Run As/Ant Build“ auszuführen. (siehe Abbildung 19) 21 Abbildung 19: Starten von Antenna Achtung: In der build.xml muss in der Anweisung <property name="wtk.home" value="d:\WirelessToolkit" /> die Variable „wtk.home“ an das Homeverzeichnis der WTK 2.2 Installation angepasst werden. Startet man die build.xml als Ant Task, so wird der Compilierungsprozess gestartet und die Anwendung im Default-Emulator des WTK gestartet. Achtung: 22 In der build.xml wird die Bibliothek „j2me-ws.jar“ aus WTK_HOME/lib referenziert. Die Bibliothek ist allerdings unvollständig. Daher ist die j2me-ws.jar in WTK_HOME/lib mit der j2me-ws.jar aus dem Eclipse-Projekt „JME_SOAP_Client“ zu überschrieben. 2. Aufgabe: Implementierung der Stubaufrufe Die Klasse „businessLogic.Server.java“ besitzt für jede Web-Service-Operation (ServerMethode) eine gleichnamige Methode. Diese Methoden kapseln den technologiespezifischen Code zum Aufruf der Servermethoden. Sie werden im Rahmen der Clientanwendung als lokale Methoden benutzt. Auf diese Weise kann ohne Modifikation der restlichen Anwendung auf alternative Server bzw. Übertragungsprotokolle zurückgegriffen werden kann. Die Anwendung erhält einen generischen Aufbau. Die Methoden der Klasse „businessLogic.Server.java“ sind um die JSR 172 spezifischen Aufrufe der Stub-Methoden zu ergänzen. 3. Aufgabe: Erstellung eines xml-Parser für das Ergebnis der Methode getFlights(…) Methode „getFlights(String startAirport, String destinationAirport, int smoker, int window, int fClass)“ werden serverseitig in Die Rückgabewerte der einem XML-Dokument kodiert. Das Dokument enthält alle verfügbaren Flüge, die den Werten der eingegebenen Parameter entsprechen. Aus dem XML-Rückgabewert müssen die gesuchten Informationen wieder extrahiert werden. Hierfür ist ein entsprechender XML-Parser in der Klasse „businessLogic.parser.GetFlightParser.java“ zu implementieren Als Ergebnis soll der Parser über die Funktion „getResult()“ einen Vector mit folgendem Inhalt zurückgeben: status der XML-Antwort (ok, oder failed) flightsCG = ChoiceGroup mit den Namen aller Flüge names = Vektor mit den Namen aller Flüge (Achtung selbe Reihenfolge wie in flightsCG) startAirports = Vektor mit den Startflughäfen aller Flüge (Achtung selbe Reihenfolge wie in flightsCG) destinationAirports = Vektor mit den Zielflughäfen aller Flüge (Achtung selbe Reihenfolge wie in flightsCG) times = Vektor mit den Abflugzeiten aller Flüge (Achtung selbe Reihenfolge wie in flightsCG) freeSeats = Vektor, der pro Flug eine ChoiceGroup enthält. Die ChoichGroup speichert alle freien Sitze des Fluges. Beispiel: Als Antwort werden folgende 2 Flüge zurückgegeben DDK-BZO von Dresden-Klotsche nach Berlin-Zoo am 17.10.2001 um 10:00:00 mit dem freien Sitz Nr. 1 (Raucher, Fenster), Kl.: 1 DDS-DDP von Dresden-Striesen nach Dresden-Prohlis am 7.10.2001 um 11:30:00 mit dem freien Sitz Nr. 1 (Raucher, Fenster), Kl.: 1 23 Der Ergebnisvektor des XML-Parsers sieht dann wie folgt aus: status = ok flightsCG = {DDK-BZO, DDS-DDP} names = {DDK-BZO, DDS-DDP} startAirports = {Dresden-Klotsche, Dresden-Striesen} destinationAirports = {Berlin-Zoo, Dresden-Prohlis} times = {17.10.2001 10:00:00, 7.10.2001 11:30:00} freeSeats = {{Nr.: 1 (Raucher, Fenster) Kl.: 1}, {Nr.: 1 (Raucher, Fenster) Kl.: 1}} 4. Aufgabe: Erstellung einer Bestätigungsanzeige für gebuchte Flüge In Buchungsanwendungen ist es sinnvoll nach erfolgreicher Buchung diese dem Nutzer zu bestätigen. Als 4. Aufgabe soll eine solche Bestätigungsanzeige (siehe Abbildung 20) implementiert werden. Die entsprechende Klasse „gui.froms ConfirmationForm_Booking.java“ liegt bereits vor. Zusätzlich ist die Klasse „gui.commands.MyCommandListener.java“ zu ergänzen. Die Anzeige ist so zu gestallten, das dem Nutzer über einen Button die Möglichkeit gegeben wird eine neue Buchung einzugeben. Abbildung 20: Confirmation Form 24 1.3 Abgabe der Lösungen Die Client- und Serveranwendung sind als Eclipse Projekte auf dem Praktikumsserver abzulegen. 25 Anhang A getBooking.xsd <?xml version="1.0"?> <xsi:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema"> <xsi:element name="root"> <xsi:complexType> <xsi:sequence> <xsi:element name = "state"> <xsi:complexType> <xsi:attribute name = "value" type = "state" use = "required"/> </xsi:complexType> </xsi:element> <xsi:element name = "booking" minOccurs = "0" maxOccurs = "1"> <xsi:complexType> <xsi:attribute name = "bookingnumber" type = "number" use = "required"/> <xsi:attribute name = "seatNumber" type = "number" use = "required"/> <xsi:attribute name = "flightName" type = "xsi:string" use = "required"/> <xsi:attribute name = "startAirport" type = "xsi:string" use = "required"/> <xsi:attribute name = "destinationAirport" type = "xsi:string" use = "required"/> <xsi:attribute name = "smoker" type = "xsi:boolean" use = "required"/> <xsi:attribute name = "window" type = "xsi:boolean" use = "required"/> <xsi:attribute name = "class" type = "xsi:int" use = "required"/> </xsi:complexType> </xsi:element> </xsi:sequence> </xsi:complexType> </xsi:element> <xsi:simpleType name = "time"> <xsi:restriction base ="xsi:string"> <xsi:pattern value = "\d{2}.\d{2}.\d{4} \d{2}:\d{2}"/> </xsi:restriction> </xsi:simpleType> 26 <xsi:simpleType name = "state"> <xsi:restriction base = "xsi:string"> <xsi:enumeration value = "ok"/> <xsi:enumeration value = "failed"/> </xsi:restriction> </xsi:simpleType> <xsi:simpleType name = "number"> <xsi:restriction base = "xsi:int"> <xsi:minInclusive value="1"/> </xsi:restriction> </xsi:simpleType> </xsi:schema> getFlight.xsd <?xml version="1.0"?> <xsi:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema"> <xsi:element name="root"> <xsi:complexType> <xsi:sequence> <xsi:element name = "state"> <xsi:complexType> <xsi:attribute name = "value" type = "state" use = "required"/> </xsi:complexType> </xsi:element> <xsi:element name = "flights"> <xsi:complexType> <xsi:sequence> <xsi:element name = "flight" minOccurs = "0" maxOccurs = "unbounded"> <xsi:complexType> <xsi:sequence> <xsi:element name = "seats"> <xsi:complexType> 27 <xsi:sequence> <xsi:element name = "seat" maxOccurs = "unbounded"> <xsi:complexType> <xsi:attribute name = "number" type = "seatNumber" use = "required"/> <xsi:attribute name = "class" type = "xsi:int" use = "required"/> <xsi:attribute name = "smoker" type = "xsi:boolean" use = "required"/> <xsi:attribute name = "window" type = "xsi:boolean" use = "required"/> </xsi:complexType> </xsi:element> </xsi:sequence> </xsi:complexType> </xsi:element> </xsi:sequence> <xsi:attribute name = "name" type = "xsi:string" use = "required"/> <xsi:attribute name = "from" type = "xsi:string" use = "required"/> <xsi:attribute name = "to" type = "xsi:string" use = "required"/> <xsi:attribute name = "time" type = "time" use = "required"/> </xsi:complexType> </xsi:element> </xsi:sequence> </xsi:complexType> </xsi:element> </xsi:sequence> </xsi:complexType> </xsi:element> <xsi:simpleType name = "time"> <xsi:restriction base ="xsi:string"> <xsi:pattern value = "\d{2}.\d{2}.\d{4} \d{2}:\d{2}"/> </xsi:restriction> </xsi:simpleType> <xsi:simpleType name = "state"> <xsi:restriction base = "xsi:string"> <xsi:enumeration value = "ok"/> <xsi:enumeration value = "failed"/> 28 </xsi:restriction> </xsi:simpleType> <xsi:simpleType name = "seatNumber"> <xsi:restriction base = "xsi:int"> <xsi:minInclusive value="1"/> </xsi:restriction> </xsi:simpleType> </xsi:schema> 29 Abkürzungsverzeichnis API Application Programming Interface J2ME Java 2 Micro Edition J2SE Java 2 Standard Edition JAX-RPC Java API for XML-RPC JVM Java Virtual Machine JWSDP Java Web Service Developer Pack RMI Remote Method Invocation SEI Service Endpoint Interface SOA Service Orientated Architecture UDDI Universal Description and Discovery Interface XML Extensible Markup Language WSDL Web Service Description Language WTK Wireless Toolkit 30 Glossar API - Application Programming Interface Programmierschnittstelle. JWSDP - Java Web Service Developer Pack Entwicklungstool für Java Web Services. JAX-RPC - Java API for XML-RPC Web Service API, die das Java-SOAP-Mapping und den SOAP Nachrichtentransport automatisiert. JVM - Java Virtual Machine Laufzeitumgebung für Java Programme. RMI - Remote Method Invocation Java Standard Technologie zur Realisierung verteilter Anwendungen auf Basis lokaler Methodenaufrufe. SEI – Service Endpoint Interface Java Interface der Web Service API JAX-RPC, welches die Schnittstellenbeschreibung der Web Service Implementierung enthält. Stub Clientseitiger Proxy der Web Service API JAX-PRC, der das Mapping zwischen SOAP und Java-Objekten durchführt. Tie Serverseitiger Proxy der Web Service API JAX-PRC, der das Mapping zwischen SOAP und Java-Objekten durchführt. UDDI - Universal Description and Discovery Interface Verzeichnisdienst der Web Service-Architektur. WSDL - Web Service Description Language. Beschreibungssprache für Web Services. WTK -Wireless Toolkit Einwicklungsumgebung von SUN für Implementierung und Test von J2ME-Clients. XML - Extensible Markup Language Auszeichnungssprache, die im Gegensatz zu HTML die Definition eigener Tags gestattet und meist zur plattformunabhängigen Präsentation, Speicherung und Transport von Daten dient. 31 Abbildungsverzeichnis Abbildung 1: physische Struktur der Beispielanwendung ......................................................... 5 Abbildung 2: Einstellen des Compiler Levels............................................................................ 7 Abbildung 3: Einstellen von JDK 1.5.x - 1 ................................................................................ 8 Abbildung 4: Einstellen von JDK 1.5.x - 2 ................................................................................ 9 Abbildung 5: Einbinden von Antenna in Eclipse ..................................................................... 10 Abbildung 6: Tomcat Integration in Eclipse - GUI.................................................................. 10 Abbildung 7: Integration von Tomcat in Eclipse - Tomcat...................................................... 11 Abbildung 8: Hinzufügen der Datenbank „flugbuchung2.mdb“ - 1 ........................................ 12 Abbildung 9: : Hinzufügen der Datenbank „flugbuchung2.mdb“ – 2 ..................................... 13 Abbildung 10: Suchdienst von Google für Mensch und Maschine ......................................... 15 Abbildung 11: Architektur von Web Services: Grundprinzip, nach [Sev03] .......................... 15 Abbildung 12: Aufbau einer SOAP-Nachricht, nach [Zel03] .................................................. 16 Abbildung 13: SOAP mit TCP / IP Protokollstapel, [Wik05d] ............................................... 16 Abbildung 14: Web Service Architektur: konkret, nach [Wik05b] ......................................... 17 Abbildung 15: verteilte Anwendungen auf Basis von SOAP über HTTP ............................... 17 Abbildung 16: Buildprozess der Serverapplikation ................................................................. 19 Abbildung 17: Buildprozess der Clientapplikation .................................................................. 19 Abbildung 18: Klassendiagramm des Servers ......................................................................... 20 Abbildung 19: Starten von Antenna ......................................................................................... 22 Abbildung 20: Confirmation Form .......................................................................................... 24 32 Tabellenverzeichnis Tabelle 1: Inhalt der einzelnen Clientpackages ........................................................................ 21 33 Literaturverzeichnis [Fer05] Fergusson d.: „Introduction to Web Services Practical“ The 3rd International Summer School on Grid Computing, 2005 http://www.dma.unina.it/~murli/GridSummerSchool2005/reposito ry/tuesday-12/notes.doc [FWR04] Frei M., Wittwer R., Studer B.: „J2ME-Tutorial“. HTW Chur, Hochschule für Technik und Wirtschaft, Fachhochschule Ostwschweiz, 2004. http://www.bstuder.ch/sppmc/v20_Tutorial_J2ME_ohne_loe.pdf [Goy05] Goyal V.: „J2ME Tutorial“ Java. NET, The Source for Java Technology Collaboration, 2005. http://today.java.net/pub/a/today/2005/02/09/j2me1.html?page=1 [Sev03] Severiens T.: „Tutorial: Web Services“. Arbeitskreis Information (AKI), Institute for Science Networking, IuK-Herbsttagung, Bad Honnef, 2003. http://www.akidpg.de/Dokumente/Bad_Honnef_2003/webservicestutorial.pdf. [Wik05d] Wikipedia: „SOAP“. 2005. http://de.wikipedia.org/wiki/SOAP. [Wik05b] Wikipedia: „Web Services“. 2005. http://de.wikipedia.org/wiki/Web_Service. [Whi] White, J.: “Turn Your J2ME Mobile Devices into Web Service Clients“. Divx, Jupitermedia Corporation, 2005. http://www.devx.com/wireless/Article/28046/1954?pf=true Zeller H.: „Java Web Services – Entwicklung plattformübergreifender Dienste mit J2EE, XML und SOAP“. Addison-Wesley Verlag, ISBN 3-8273-2071-2, 2003. [Zel03] 34