Diplomarbeit Ein generisches Framework zur grafischen Anbindung von Web-Services Steffen Apfel Dezember 2004 Betreuer: Prof. Dr. Paul Müller Dipl. Inform. Markus Hillenbrand Fachbereich Informatik AG Integrierte Kommunikationssysteme Universität Kaiserslautern Postfach 3049 67653 Kaiserslautern Ich versichere, dass ich die vorliegende Diplomarbeit selbstständig verfasst und keine anderen als die angegebenen Quellen und Hilfsmittel verwendet habe. Kaiserslautern, den 28.12.2004 (Steffen Apfel) Abstract Web-Services interagieren miteinander, um in Service-orientierten, verteilten Umgebungen gemeinschaftlich Aufgaben zu bearbeiten. Web-Services bauen auf vorhandenen XML-basierten Technologien wie u. a. WSDL, SOAP und UDDI auf und verwenden diese, um unabhängig von verwendeter Plattform, Programmiersprache und Transport-Protokoll miteinander zu kommunizieren. Die Web Service Description Language (WSDL) beschreibt die Schnittstelle eines Web-Service und spielt somit eine herausragende Rolle in der Web-Service-Architektur. WSDL kann automatisch maschinell zur Ansprache des transparent dahinter liegenden Web-Service verwendet werden. In dieser Diplomarbeit wird untersucht werden, inwieweit aus WSDL generisch eine grafische Oberfläche (GUI) zur Ansprache von Web-Services erzeugt werden kann. Ausgangsdokument ist lediglich das WSDL-Dokument, aus dem alle relevanten Informationen zum GUI-Aufbau extrahiert werden. Neben einer Analyse von WSDL werden ein Modell und ein Prototyp entwickelt, die die Möglichkeiten und Grenzen der GUI-Generierung aus WSDL herausstellen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Inhaltsverzeichnis Kapitel 1: Einleitung ............................................................................................................ 9 1.1 Motivation .............................................................................................................. 10 1.2 Ziele ........................................................................................................................ 12 1.3 Struktur ................................................................................................................... 13 Kapitel 2: Technologien ..................................................................................................... 15 2.1 Web-Services ......................................................................................................... 15 2.1.1 Service-orientierte Architektur ...........................................................................................18 2.2 Grundlagentechnologie: XML ............................................................................... 19 2.3 Datenschema: XSD ................................................................................................ 20 2.4 Web Service Description Language 1.1 (WSDL) .................................................. 21 2.4.1 Aufbau eines WSDL-Dokumentes .....................................................................................22 2.4.2 Modularisierung durch Importieren ...................................................................................32 2.4.3 Vergleich WSDL 1.1 und WSDL 2.0.................................................................................34 2.5 Universal Description, Discovery and Integration (UDDI) ................................... 37 2.6 SOAP...................................................................................................................... 39 2.7 Zusätzliche Technologien ...................................................................................... 41 2.8 Zusammenfassung .................................................................................................. 42 Kapitel 3: Einordnung der Arbeit..................................................................................... 44 3.1 Apache Axis und WSDL2Java............................................................................... 44 3.1.1 Vergleich von WSDL2Java mit wscompile von Sun Microsystems ..................................50 3.2 Binding des Clients ................................................................................................ 53 3.3 Related Work: WSRP von OASIS ......................................................................... 57 3.4 Zusammenfassung .................................................................................................. 60 Kapitel 4: Modellbildung ................................................................................................... 61 4.1 Beschreibung des Frameworks............................................................................... 61 4.1.1 Anwendungsfälle................................................................................................................62 4.1.2 Grafische Komponenten .....................................................................................................65 4.2 Anforderungskatalog .............................................................................................. 67 4.3 Aufbau der GUI ...................................................................................................... 71 4.3.1 WSDL-Komponenten.........................................................................................................73 4.3.2 Datentypen in XSD ............................................................................................................74 7 Inhaltsverzeichnis 4.4 Einbettung semantischer Informationen ................................................................ 90 4.5 Zusammenfassung ................................................................................................. 93 Kapitel 5: Realisierung ...................................................................................................... 95 5.1 Architektur des Frameworks.................................................................................. 96 5.2 Aufbau der grafischen Komponenten .................................................................... 99 5.3 Anordnung der grafischen Komponenten ............................................................ 101 5.4 Realisierung des Bindings ................................................................................... 103 5.5 Zusammenfassung ............................................................................................... 104 Kapitel 6: Implementierung ............................................................................................ 105 6.1 Gestaltung der grafischen Oberfläche ................................................................. 105 6.2 Abbildung der Datentypen auf Java .................................................................... 109 6.3 Anzeigen von Dokumentationen ......................................................................... 117 6.4 Zusätzliche Implementierungsaspekte ................................................................. 122 Kapitel 7: Zusammenfassung und Ausblick .................................................................. 127 Kapitel 8: Anhang ............................................................................................................ 129 8.1 Vordefinierte, primitive Datentypen und ihre Fassetten...................................... 129 8.2 Abgeleitete Datentypen und ihre Fassetten ......................................................... 130 8.3 Übersicht: XSD-Datentypen, Java-Datentypen und Swing-Komponenten ......... 131 8.4 Modulares WSDL-Dokument durch Importieren ................................................ 133 8.5 Java-Klasse des XSD-Datentyps float ................................................................. 140 Literaturverzeichnis............................................................................................................. 144 Abbildungsverzeichnis ......................................................................................................... 149 Glossar .......................................................................................................................... 151 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 9 Kapitel 1: Einleitung Web-Services haben heutzutage eine fundamentale Bedeutung in der Verwendung des Internets, der Weiterentwicklung verteilter Systeme und bei der Softwareentwicklung eingenommen. Vor einigen Jahren waren die Softwarehersteller stets bemüht, Programme mit größtmöglicher Funktionalität zu entwickeln. Web-Services bieten nun eine völlig neue Perspektive der Programmentwicklung. Innerhalb eines Web-Service kann modular eine überschaubare Funktionalität implementiert werden. WebServices können zur Bewältigung komplexer Aufgaben orchestriert werden, diese gemeinsam erledigen, und danach in neuer Konstellation weitere Aufgaben erfüllen. Durch diese lose Kopplung je nach Problemstellung, bieten Web-Services ein mächtiges Konstrukt zum problemorientierten Bearbeiten von Aufgaben. Web-Services stellen primär keine neuartigen Dienste zur Verfügung, sondern stellen vielmehr Technologien zur unabhängigen Orchestrierung vorhandener Dienste bereit. Somit können bisher isoliert arbeitende Dienste zur Lösung vorhandener Probleme in einem größeren Wirkungsumfeld zusammengestellt werden. Bislang bestand das Hauptproblem beim Zusammenfügen von verteilten Diensten über Netzwerkgrenzen hinweg in der Inkompatibilität. In den 90iger Jahren fand eine Ausbreitung der Local Area Networks (LAN) statt. Anwendungen konnten nun über Rechnergrenzen hinweg miteinander kommunizieren und Aufgaben bearbeiten. Durch die Vernetzung der Computer gewannen verteilte Anwendungen immer mehr an Bedeutung. Microsoft entwickelte aus dem Component Object Modell (COM) das Distributed COM (DCOM). Bei COM wird die Funktionalität der verwendeten Objekte über Schnittstellenbeschreibungen definiert. Innerhalb einer DCOM-Architektur können Objekte auf Windows-Plattformen verteilt vorliegen und angesprochen werden [CHY+97]. Parallel dazu entwickelte die Object Management Group (OMG) die Common Object Request Broker Architecture (CORBA). CORBA-Programme können unabhängig von Plattform und Programmiersprache miteinander kommunizieren und Objekte austauschen, wobei beide Teilnehmer eine CORBAImplementierung und Bibliotheken benötigen [OMG04]. Zusätzlich brachte Sun Microsystems Remote Method Invocation (RMI) heraus. RMI ist eine Java-API zur Kommunikation zwischen entfernten, verteilten Java-Objekten in heterogenen Systemen [RMI03]. Allerdings wiesen diese drei Innovationen eine große Schwäche auf: Sie waren nicht miteinander kompatibel. Beim Ansatz von DCOM ist man auf die Windows-Plattform beschränkt. Bei RMI von Sun Microsystems besteht die Abhängigkeit zur Programmiersprache Java und bei CORBA von OMG war man auf der anderen Seite auf die zugrunde liegende Netzwerk-Technologie und Middleware beschränkt, die bei allen Kommunikationsteilnehmern vorhanden sein musste. Somit ist bei diesen drei Lösungen kein Einsatz in einer heterogenen Systemlandschaft gegeben. Web-Services überwinden diese drei Schwächen der Programmiersprachen-, Plattform- und Technologie-Abhängigkeit. Bei Web-Services basieren sämtliche verwendete Technologien auf der Extensible Markup Language 10 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. (XML) [BPS+04]. XML wird von jeder Plattform und Sprache unterstützt und schafft somit Interoperabilität. In XML können sämtliche Übertragungsdaten serialisiert werden. Diese werden dann über ein vorhandenes Transport-Protokoll gesendet, hauptsächlich HTTP. Der Empfänger kann die empfangenen Daten in ein für sein Programm verständliches Format deserialisieren. Dadurch können unterschiedliche Programme miteinander kommunizieren und Tätigkeiten zusammen ausführen. Selbst Legacy-Systeme, die wegen der Inkompatibilität mit neueren Standards oft nicht mehr zur Verwendung kamen, können nun in bestehende Systeme integriert werden. Jeder Service arbeitet völlig transparent mit seinen jeweiligen Partnern zusammen. Lediglich die Schnittstelle des Service wird veröffentlicht, um Informationen über Datenformate, Bindungsinformationen und verwendete Nachrichten zu publizieren. Von der dahinter liegenden Service-Realisierung wird abstrahiert. In diesem einleitenden Kapitel soll zunächst die Motivation zur Erstellung dieser Diplomarbeit angeführt werden. Im nächsten Unterkapitel wird das Ziel der Arbeit festgesetzt und dessen Erreichung beschrieben. Abschließend werden die nachfolgenden Kapitel dieser Publikation vorgestellt. 1.1 Motivation In dem Buch „XML, Web Services, and the Data Revolution“ bezeichnet der Autor F. Coyle WebServices als ein Phänomen [Coy02]. Einerseits hat der Autor sicherlich Recht, dass Web-Services die Benutzung des Internets erweitern und durch die neuartige Benutzung des Internets als ein Phänomen betrachtet werden können. Allerdings ist meiner Meinung nach der Begriff „Phänomen“ falsch verwendet. Web-Services stellen keine revolutionäre, neue Technologie dar, sondern Web-Services beruhen auf bewährten, etablierten Technologien. Diese führen sie in einer neuen Art der Verwendung zusammen. Web-Services schaffen durch ihre Interoperabilität einen wichtigen Schritt zur Integration verschiedener Plattformen wie Java, DCOM und CORBA und abstrahieren von Entwicklungsdetails. Da WebServices auf offenen, XML-basierten Standards aufsetzen, die von jeder Plattform unterstützt werden, kann man sich einzig und allein auf die Funktionalität von Services konzentrieren. Beim Anbinden eines Services ist lediglich dessen Funktionalität von Interesse und die verwendete Programmiersprache oder Entwicklungsplattform sind transparent. In dieser Eigenschaft liegt ein riesiges Potenzial für die Weiterentwicklung und Verbreitung von Web-Services. Softwareentwickler sind nicht darauf angewiesen, sich beim Entwickeln eigener Software auf eine Programmiersprache oder Plattform mit Kunden oder Geschäftspartnern zu einigen. Stattdessen können sie unabhängig von herrschenden Standards eigene Programme entwickeln und durch Web-Services ihren Kunden zur Verfügung stellen. In der Verwendung und Weiterentwicklung von Web-Services liegt also ein großes Potenzial für die weitere Entwicklung des Internets und die Softwareentwicklung. Zudem können durch WebServices kostspielige Standards wie z.B.: Electronic Document Interchange (EDI) im Business-toBusiness Bereich zur Bestell-, Dokument- und Rechnungsabwicklung umgangen oder gar ersetzt wer- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 11 den [EDI04]. Web-Services bieten also ein großes Reservoir für zukünftige Softwareerstellung. Im Bereich der verwendeten Technologien arbeiten seit geraumer Zeit große Unternehmen wie Microsoft und IBM oder aber auch Standardisierungsunternehmen wie das von Tim Berners-Lee geleitete World Wide Web Consortium (W3C) und der Organization for the Advancement of Structured Information Standards (OASIS) zusammen und entwickeln ständig neue Versionen der bestehenden Technologien. Web-Services sollen so aufgebaut werden, dass Systeme andere Web-Services selbstständig finden, deren Funktionalität integrieren und zusammen anliegende Aufgaben erledigen. Der automatisierte Datenaustausch ohne menschliche Interaktion und Hilfestellung zwischen Systemen steht dabei im Vordergrund der Weiterentwicklungen. Eine Fragestellung hat allerdings bisher kaum Beachtung bekommen: Wie kann ein Anwender einen Web-Service benutzen? Gibt es eine grafische Oberfläche zum Erstellen der Anfragen an einen Web-Service? Werden einem Anwender Hilfestellungen zum Editieren der erforderlichen Parameter und Benutzung eines Dienstes gegeben? Wie kann eine Oberfläche generisch und somit für alle existierenden Web-Services erzeugt werden? Reichen vorhandene Standards aus oder müssen diese erweitert, bzw. neue Standards entwickelt werden? Nach einschlägiger Literatur- und Netzrecherche wurden nur wenige Ansatzpunkte zur Lösung dieses Problems gefunden. OASIS entwickelt den Standard Web Service for Remote Portlets (WSRP). Durch diesen Standard sollen Web-Service-Anbieter (Provider) zusätzlich zu ihrem Web-Service eine eigene Graphical User Interface (GUI) mit parametrisierten Markup-Fragmenten erstellen. Die MarkupFragmente werden dann innerhalb eines Portals an das passende Endgerät angepasst und anschließend eine GUI erzeugt. Diese Lösung ist zurzeit auf Portale beschränkt und ein weiterer Nachteil bei dieser Lösung ist allerdings, dass ein Web-Service-Anbieter zusätzlich zu seinem Web-Service die MarkupFragmente entwickeln muss. Alte, bestehende Web-Services müssten um diese Markup-Fragmente erweitert werden. Ein erheblicher Programmieraufwand würde entstehen, um alle bereits existierenden Web-Services mit diesem neuen Standard konform zu halten. Daher sollte eine Lösung gefunden werden, die auf den bestehenden Standards aufbaut und diese zur Generierung einer GUI verwendet. In der vorliegenden Diplomarbeit wird deshalb untersucht, inwieweit der bestehende Standard zur Schnittstellenbeschreibung eines Web-Service, die Web Service Description Language (WSDL), als Grundlage zur Erzeugung einer grafischen Oberfläche verwendet werden kann. Ein WSDL-Dokument beschreibt die Schnittstelle des Web-Service, legt das Übertragungsprotokoll fest, spezifiziert alle verfügbaren Operationen, definiert alle zu übertragenen Daten und definiert mit der XML Schema Definition Language (XSD) sämtliche verwendete Datentypen [BM04b]. Somit sind alle relevanten Informationen zum Erstellen einer Anfrage an den Web-Service in einem WSDL-Dokument integriert. Aus diesem Grund sollte es möglich sein aus einem WSDL-Dokument generisch eine GUI zu erzeu- 12 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. gen, mit deren Hilfe ein Anwender alle Eingaben durchführen kann. Dies ist der zentrale Ansatzpunkt dieser Diplomarbeit. Es wird untersucht, ob die Extraktion der Informationen des WSDL-Dokumentes zur Erzeugung der GUI ausreichen. In diesem Falle wäre die Entwicklung eines neuen Standards, wie z.B. WSRP, in Frage zu stellen. Vielmehr könnte man den Standard WSDL erweitern und vorhandene Schwachstellen neu spezifizieren. 1.2 Ziele Zur Erläuterung des Ziels dieser Diplomarbeit, soll zunächst der Titel der Arbeit näher betrachtet werden: „Ein generisches Framework zur grafischen Anbindung von Web-Services“. Das Hauptziel der Diplomarbeit ist die Entwicklung eines Modells und Prototypen eines Frameworks zum Ansprechen von Web-Services. Die grafische Oberfläche soll generisch erzeugt werden und für sämtliche Web-Services eine einheitliche GUI erstellen. Diese GUI soll den Anwender intuitiv leiten und Hilfestellung beim Benutzen von Web-Services bieten. Die Benutzung schließt zum einen die Erstellung der Anfrage und zum anderen das Anzeigen der Antwort und evtl. übertragenener Anhänge (Attachments) mit ein. Als Ausgangsdokument zur Generierung der GUI soll ausschließlich die Schnittstellenbeschreibung eines Web-Service, das WSDL-Dokument, dienen. Das WSDL-Dokument enthält vielfältige Informationen, die an dieser Stelle kurz angesprochen werden. WSDL liefert Informationen zum Verbindungsaufbau, Netzwerkadresse, Name des Web-Service und sämtliche Operationen, die ausgeführt werden können. Mit diesen Informationen kann die Verbindung zum Web-Service aufgebaut werden. Des weiteren spezifiziert das WSDL-Dokument alle ausgetauschten Daten und deren Formate, die als XML-Schema angegeben werden. Diese Daten können nun zur Generierung einer Eingabemaske innerhalb der GUI verwendet werden. Für sämtliche Datentypen wird eine spezifische Eingabekomponente generiert, aus denen sich die GUI je nach vorliegendem WSDL-Dokument sukzessive aufbaut. Zusätzlich können die Datentypdefinitionen zu Vailidierungszwecken verwendet werden. Zur Erreichung dieses Ziels der Diplomarbeit, wird ein Schwerpunkt auf die Analyse von WSDL-Dokumenten und darin enthaltene XSD-Datentypen gelegt. In Kapitel zwei und drei werden zunächst die theoretischen Grundlagen aufbereitet. Kapitel vier erklärt das entwickelte Modell zur Realisierung des Projektes und Kapitel fünf geht auf die Realisierung des Frameworks ein. In Kapitel sechs werden einige Implementierungsaspekte bei der Realisierung des Modells vorgestellt. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 13 1.3 Struktur Zur Demonstration einiger Technologien, Verarbeitungsschritte und letztendlich Entwicklung der GUI wurden zwei Anwendungsbeispiele ausgewählt. Im ersten theoretischen Teil der Ausarbeitung veranschaulicht ein Taschenrechner-Web-Service den Aufbau eines WSDL-Dokumentes. Dieser WebService bietet zwei Operationen an. Eine Addition addiert zwei Ganzzahlwerte -einfache Datentypenund liefert als Ergebnis die Summe beider Werte. Die Subtraktion nimmt einen komplexen Datentyp, der aus zwei Gleitkommazahlen aufgebaut ist, entgegen und liefert die Differenz beider Werte. Anhand dieses überschaubaren Beispiels kann u. a. der Aufbau eines WSDL-Dokumentes illustriert, das Anbinden des Clients, sowie auf die unterschiedliche Behandlung von komplexen und einfachen Datentypen eingegangen werden. Dieses einfach aufgebaute Demonstrationsbeispiel soll vor allem zum Einstieg in die Beschreibungssprache WSDL dienen. Nachdem das theoretische Grundwissen von WSDL erklärt wurde, soll im zweiten praktischen Teil ein weiterer, komplexerer Web-Service als Anschauungsbeispiel dienen. Ein Bibliotheks-Web-Service bietet zum einen das Speichern neuer Bücher und Publikationen an und zum anderen das Suchen von Büchern oder Autoren. Durch dieses Beispiel soll der Aufbau der GUI erläutert werden, das Senden von Daten oder weitere komplexe Datentypen wie Felder und Aufzählungen beschrieben werden. Insbesondere bietet der entwickelte Prototyp die Möglichkeit bereits verwendete Eingaben erneut zu laden und wiederum einzubinden. Diese Diplomarbeit ist in die fünf Hauptkapitel Technologien, Einordnung der Arbeit, Modellbildung, Realisierung und Implementierung untergliedert. Im zweiten Kapitel werden Web-Services definiert und die wichtigsten Technologien vorgestellt. XML und die XML Schema Definition Language (XSD) werden als Basistechnologien vorgestellt. Im Mittelpunkt dieses Kapitels steht die Betrachtung der Web Service Description Language (WSDL), die als Ausgangspunkt zur Generierung der GUI dient. Neben WSDL werden schließlich die beiden anderen wichtigen Technologien im Zusammenhang mit Web-Services erklärt: Universal Description, Discovery and Integration (UDDI) und SOAP. Nachdem im zweiten Kapitel die theoretischen Grundlagen für diese Arbeit gelegt wurden, beschäftigt sich Kapitel drei mit der Einordnung der Arbeit. Zunächst wird das Projekt Axis der Apache Foundation vorgestellt und dessen Architektur erläutert. Weiterhin wird das Werkzeug WSDL2Java von Apache Axis vorgestellt. Mit Hilfe dieses Werkzeugs werden aus einem WSDL-Dokument JavaKlassen erzeugt, die zur weiteren Verwendung innerhalb des zu erstellenden Prototypen bereitgestellt werden. Da Sun Microsystems auch ein Werkzeug zur Verfügung stellt, findet danach ein Vergleich von WSDL2Java der Apache Foundation und wscompile von Sun Microsystems statt. Unter vorgegebenen Kriterien werden beide Werkzeuge getestet und abschließend bewertet. Nachkommend wird das verwandte Thema WSRP von OASIS vorgestellt, dessen Vorgehensweise geschildert und mit den Ergebnissen dieser Arbeit verglichen und abgegrenzt. Kapitel vier zeigt das entwickelte Modell zur Realisierung dieser Arbeit. Zunächst wird die Architektur des Frameworks erläutert. In diesem Zusammenhang wird auf die Problematik der Komplexität des WSDL-Dokumentes eingegangen. Anschließend werden die verwendeten XSD-Datentypen erklärt 14 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. und deren spätere grafische Präsentation festgelegt. Zusätzlich wird eine Möglichkeit zum Einbinden von semantischen Informationen in der GUI modelliert. In Kapitel fünf wird der praktische Teil der Arbeit vorgestellt. Zunächst wird die Architektur des Prototypen durch zwei statische UML-Diagramme beschrieben. Nachfolgend wird der Aufbau der grafischen Oberfläche aus den Informationen des WSDL- und XSD-Dokumentes vorgestellt. Anschließend wird die Realisierung der Anbindung des Clients diskutiert, bevor ausführlich auf die Realisierung des Frameworks Bezug genommen wird. In Kapitel sechs werden diverse Implementierungsaspekte näher vorgestellt. Es werden die Abbildungsvorschriften der XSD-Datentypen auf Java aufgelistet und in diesem Zusammenhang entstehende Namenskollisionen erläutert. Darüber wird gezeigt, wie durch gezieltes Einbinden von Dokumentationen semantisch eindeutige Eingabemasken zur Anfrage an einen Web-Service generiert werden. Nach diesen fünf Hauptkapiteln folgt in Kapitel sieben eine Zusammenfassung der Diplomarbeit und Ausblick auf weitere Entwicklungen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 15 Kapitel 2: Technologien In diesem Kapitel wird zunächst eine Definition für Web-Services angegeben und erklärt wie WebServices auf dem Prinzip der Service-orientierten Architekturen (SOA) beruhen. Danach werden die wichtigsten Technologien im Zusammenhang mit Web-Services vorgestellt. Zuerst wird im Unterkapitel 2.2 die Rolle von XML im Bezug auf Web-Services und deren Technologien erläutert. XML dient als Basis für die darauf aufbauenden anderen Technologien. Im Zusammenhang mit XML wird anschließend die XML Schema Definition Language (XSD) vorgestellt, die zur Beschreibung der Datentypen innerhalb der anderen Technologien verwendet wird. XSD wird im vierten Kapitel nochmals aufgegriffen, wenn die grafische Darstellung einzelner Datentypen diskutiert wird. Nach der Beschreibung dieser beiden Basistechnologien werden die drei Haupttechnologien von Web-Services erklärt. Unterkapitel 2.4 beschreibt die WSDL ausführlich und erläutert den Modularisierungs-Mechanismus des Importierens. Da WSDL in unterschiedlichen Versionen vorliegt, Werkzeuge zur automatischen Codegenerierung allerdings nur mit der älteren kompatibel sind, wird ein Vergleich der Versionen vorgenommen. WSDL stellt das Ausgangsdokument zur Erstellung der grafischen Oberfläche dar. Dementsprechend wird der Schwerpunkt in diesem Kapitel auf WSDL gelegt. Unterkapitel 2.5 stellt Universal Description, Discovery and Integration (UDDI) vor. Diese Technologie wird zum Beschreiben und Finden von Web-Services verwendet. Danach wird in Kapitel 2.6 SOAP, ein Protokoll zum strukturierten Datenaustausch, vorgestellt. Kapitel 2.7 erwähnt weitere Technologien, die im Zusammenhang mit Web-Services eine Rolle spielen. Die abschließende Zusammenfassung wiederholt die wichtigsten Aspekte dieses Kapitels. 2.1 Web-Services Das World Wide Web Consortium (W3C) definiert allgemein einen Web-Service wie folgt: „A Web service is a software system identified by a URI [RFC2396] 1, whose public interfaces and bindings are defined and described using XML. Its definition can be discovered by other software systems. These systems may then interact with the Web service in a manner prescribed by its definition, using XML based messages by Internet protocols.” [ABFG04] In dieser Definition wird herausgestellt, dass ein Web-Service auf dem Prinzip einer Serviceorientierten Architektur (SOA) basiert. Ein Web-Service kann demnach durch andere Softwaresysteme über eine URI gefunden werden und besitzt eine XML-basierte Schnittstellenbeschreibung. Andere Systeme kommunizieren mit dem Web-Service in der Schnittstellenbeschreibung definierten Art. Diese Definition wird im nächsten Unterkapitel nochmals herangezogen, wenn ein Web-Service im Zu- 1 RFC: Request for Comments (öffentliches Diskussionsdokument, siehe Glossar) 16 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. sammenhang mit der SOA erklärt wird. In einer weiteren Definition des W3C wird bei der Beschreibung eines Web-Service näher auf die verwendeten Technologien eingegangen: „A Web service is a software system designed to support interoperable machine-to-machine interaction over a network. It has an interface described in a machine-processable format (specifically WSDL). Other systems interact with the Web Service in a manner prescribed by its description using SOAP messages, typically conveyed using HTTP with an XML serialization in conjunction with other Web-related standards.” [BHM+04] In dieser technischen Definition des W3C wird zum einen darauf hingewiesen, dass Web-Services in automatisierbarer Weise Daten über ein Netzwerk senden. Eine menschliche Interaktion ist nicht zwingend erforderlich und Softwaresysteme können eigenständig miteinander kommunizieren und die Daten austauschen. Zum anderen werden zwei XML-basierte Standards erwähnt: WSDL zum Beschreiben der Schnittstellen eines Web-Service und SOAP als Nachrichtenformat zum Austausch der Daten. Durch die Darstellung und Übertragung der Daten in XML ist ein Web-Service sowohl unabhängig vom Betriebssystem, der Programmiersprache sowie vom Transport-Protokoll. Eine XMLbasierte Datenübertragung über HTTP kann somit über Netzwerk- und Firewallgrenzen hinweg vonstatten gehen. Darin liegt u. a. der fundamentale Vorteil gegenüber beispielsweise CORBA (Transport-Protokoll-abhängig: ORB), RMI (Sprachen-abhängig: Java) und DCOM (Plattform-abhängig: Windows). Die nachfolgende Abbildung 1 zeigt den Protokoll-Stack eines Web-Service und zeigt die vier unterschiedlichen Schichten mit den jeweils eingesetzten Technologien. Service-Discovery & Publishing (UDDI) Service-Beschreibung (WSDL) XML-Messaging (SOAP, XML-RPC) Transport (HTTP,SMTP,FTP,BEEP) Abbildung 1: Übersicht des Protokoll-Stacks eines Web-Service nach [Cer02] Transport-Schicht: Diese Schicht ist für den Transport der Nachrichten über ein Netzwerk verantwortlich. Der darüber liegende Web-Service abstrahiert von dieser Schicht. Somit können in dieser Schicht unterschiedliche Protokolle zum Einsatz kommen, wie z.B. das Hyper Text Transport Protokoll (HTTP) [RFC2616], das Simple Mail Transport Protokoll (SMTP) [RFC821], das File Transfer Protokoll (FTP) [RFC959], oder auch neuere Protokolle, wie das Blocks Extensible Exchange Protocol (BEEP) [RFC3080]. Die Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 17 Web-Service-Architektur beschreibt in den drei anderen, oberen Schichten die Funktionalität des Web-Service und ordnet in dieser vierten Schicht ein Transport-Protokoll zu. XML-Messaging-Schicht: Diese Schicht kodiert (verpackt) die Nachrichten in ein gängiges XML-Format, welches von allen Teilnehmern verstanden wird. Es findet eine Serialisierung der Daten in ein XML-basiertes Format statt (in der Literatur auch oft Marshalling genannt bei XML Remote Procedure Call-Aufrufen). Die Nachrichten können mit XML Remote Procedure Call (XML-RPC) und SOAP übertragen werden. SOAP wird in Kapitel 2.7 vorgestellt und RPC im Rahmen des Projekts Axis in Kapitel 3.1. Service-Beschreibung: In dieser Schicht wird mit Hilfe von einer Beschreibungssprache der Web-Service und dessen Schnittstelle (Interface) beschrieben, somit kann von der darunter liegenden Implementierung abstrahiert werden. Die Web Service Description Language (WSDL) bildet den De-facto-Standard zur Beschreibung von Web-Services. Die Autoren des Buches „Webservice-Programmierung mit SOAP“ [STK02] benennen als weitere Beschreibungssprachen Ressource Description Framework (RDF) [BG04] und DARPA Agent Markup Language (DAML) [HHP+01]. Allerdings ist das primäre Einsatzgebiet von RDF der Austausch und das Verwenden von Metadaten im Internet und von DAML das Beschreiben von Objekten und deren Relationen zueinander. Diese beiden Beschreibungssprachen sind daher eher ergänzend als substituierend für WSDL anzusehen. Service Discovery und Publishing: Service-Anbieter (Provider) können mit Hilfe von UDDI ihren Service beschreiben und in einem öffentlichen Verzeichnis publizieren. Anwender benutzen dieses Verzeichnis, um vorhandene WebServices zu suchen und danach in ihre Verarbeitung und Systeme einzubinden. Im Zusammenhang mit UDDI wird oft die Analogie zu den gelben Telefonbuchseiten gewählt, da beide eine ähnliche Suchfunktion bieten. WS-Inspection ist ein weiterer Mechanismus zum Finden von Web-Services [BEG+03]. Einige Autoren listen auch manchmal fünf Schichten innerhalb des Protokoll-Stacks auf, wie z.B. Kuschke und Wölfel in ihrem Buch „Web Service kompakt“ [KW02] oder Snell et al. in dem Buch „Webservice-Programmierung mit SOAP“ [STK02]. Diese Autoren fügen unterhalb der TransportSchicht eine Netzwerk-Schicht ein und als Vertreter dieser Schicht das TCP/IP-Protokoll. Allerdings ist diese Beschreibung einer untersten Schicht überflüssig, da Web-Services letztendlich auf höherer Schicht beschrieben werden und von den darunter liegenden abstrahieren. Eine Haupteigenschaft von Web-Services ist gerade die Unabhängigkeit von Transport-Protokollen. Ein Web-Service kann abstrakt beschrieben werden, indem seine Funktionalität ohne konkrete Angaben über das TransportProtokoll definiert wird. Einem Web-Service wird letztendlich ein Transport-Protokoll über eine Bindung zugeordnet. Also ist für die eigentliche funktionale Beschreibung des Web-Service die Trans- 18 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. port-Schicht erst später bei der konkreten Bindung wichtig. Eine weitere Schicht unterhalb der Transport-Schicht ist zur Beschreibung eines Web-Service somit nicht nötig. Web-Services können prinzipiell bei jeder verteilten, Netz-basierten Orchestrierung von Softwaresystemen eingesetzt werden. Einige Beispiele für Web-Services sind u. a. Reservierungsdienste, B2BAnwendungen, Kostenabrechnungen, E-Commerce-Anwendungen, Sprachübersetzer, Meldedienste (Wetter, Verkehr, Börseninformationen), verteilte Geschäftsprozesse und Rechnungssysteme 1. Nach der Definition von Web-Services und deren Einordnung in den zugrunde liegenden ProtokollStack, folgt nun die Einordnung eines Web-Service in die Service-orientierte Architektur. 2.1.1 Service-orientierte Architektur In diesem Unterkapitel wird zunächst erklärt, was eine Service-orientierte Architektur (SOA) ist, und wie sie definiert wird. Danach wird ein Zusammenhang zu Web-Services hergestellt, da diese eine spezielle Ausprägung und Realisierung der SOA darstellen. SOA basieren auf einem verteilten System, in dem diverse Service-Anbieter Dienste zur gegenseitigen Benutzung zur Verfügung stellen, um eine gemeinsame Aufgabe zu erledigen. Ein Service-Anbieter stellt den anderen Service-Nutzern eine Schnittstelle bereit, um den dahinter stehenden Dienst zu benutzen. Ein Service-Anbieter stellt seine Dienste durch eine Applikation, ein Legacy-System, ein Ausgabegerät oder eine Computereinheit zur Erbringung eines Dienstes bereit. Bei der Bereitstellung eines Dienstes ist lediglich das Interface zur Benutzung für andere Teilnehmer von Interesse, die darunter liegende Implementierung ist transparent gehalten. Somit kann diese beliebig verändert oder gänzlich ausgetauscht werden, solange sich dadurch die Schnittstelle für den Dienst nicht verändert. Die Schnittstelle definiert dabei die Funktionsweise des Dienstes und legt das Format der Nachrichten fest. Sämtliche Anbieter und Nutzer kommunizieren dabei durch Nachrichtenaustausch über Transport-Protokolle miteinander, um die vorliegende Aufgabe zu bearbeiten. In diesem verteilten System entsteht somit eine dynamische Orchestrierung unterschiedlicher Systeme. Je nach vorliegendem Aufgabenproblem arbeiten verschiedene einzelne Services zusammen, die nach Erledigung der Aufgabe wieder in neuer Konstellation zusammen arbeiten können. Aus dieser Definition von SOA wird deutlich, dass ein Web-Service auf dem Prinzip der SOA beruht und diese Architektur erweitert. Bei Web-Services erfolgt der Nachrichtenaustausch in XML-basierten Formaten und daher unabhängig von der jeweils benutzten Plattform und Programmiersprache. Abbildung 2 schematisiert die Zusammenarbeit von Anbietern, Nutzern und Registrierung und stellt die Service-orientierte Architektur übersichtlich dar. In dieses allgemeine Schaubild der SOA wird der Einsatz der Web-Service-Technologien WSDL, UDDI und SOAP eingebettet und somit der Zusammenhang zwischen SOA und Web-Services nochmals verdeutlicht. 1 Internetadresse mit einigen Web-Service-Beispielen: www.xmethods.net Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 19 Service Registry UDDI, WSDL UDDI find Service publish bind Requestor Service Provider SOAP Abbildung 2: Service-orientierte Architektur mit Web-Service-Technologien Der Dienst-Anbieter („Service Provider“ in Abb.2) publiziert („publish“ in Abb.2) mittels UDDI eine Schnittstellen- und eine Dienstbeschreibung im Service-Verzeichnis („Service Registry“ in Abb.2). Der Dienst-Anbieter ist verantwortlich für die Implementierung, Inbetriebnahme und Wartung des angebotenen Dienstes. Ein Dienst-Nutzer (in der Literatur oft als Client bezeichnet, „Service Requestor “in Abb.2) kann innerhalb des Service-Verzeichnisses nach Diensten und Dienst-Anbietern suchen. Die Suche kann über eine API oder Suchmaske von UDDI erfolgen. Das Service-Verzeichnis, auch Dienst-Makler (Service Broker) genannt, bietet eine Verwaltung und Speicherung der Dienstbeschreibungen für Web-Services an. Findet („find“ in Abb.2) ein Dienst-Nutzer einen Dienst, so erhält er in Form eines WSDL-Dokumentes eine Schnittstellenbeschreibung des vorliegenden Service. Der Dienst-Nutzer kann den Service des Dienst-Anbieters direkt in seine Applikationen integrieren und nutzen („bind“ in Abb.2). Zum Senden der Nachrichten wird ein Protokoll der XML-MessagingSchicht verwendet, in der vorliegenden Arbeit wird sich dabei auf SOAP beschränkt. Die Mächtigkeit dieser Architektur besteht darin, dass Aufgaben gemeinschaftlich durch verschiedene Dienst-Anbieter Plattform-unabhängig und über Organisationsgrenzen hinweg verteilt gelöst werden [Bur04]. 2.2 Grundlagentechnologie: XML Die Extensible Markup Language (XML) ist seit 1998 eine W3C-Empfehlung (Recommendation) [BPS+04]. XML ist eine einfache, strukturierte Datenbeschreibungssprache, die von der Standard Generalized Markup Language (SGML) abgeleitet wurde. XML ist eine Markupsprache zur strukturierten, wohlgeformten Darstellung von Daten und dabei unabhängig von Hersteller und Programmiersprachen. An dieser Stelle wird nicht auf die XML-Spezifikation eingegangen, sondern es soll die Bedeutung von XML für die Benutzung von Web-Services herausgestellt werden. Der offene Standard XML ist mehr als nur eine technische Spezifikation, denn XML hat die Entwicklung der vernetzten Welt beeinflusst. Die Entwicklung neuer Technologien (z.B.: WSDL, UDDI und SOAP) bauen dabei 20 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. auf der Basistechnologie XML auf. Zusätzlich ist XML als Schüsseltechnologie zum Datenaustauschformat zwischen Programmen in verteilten Systemen avanciert. Frank P. Coyle geht in dem Buch „XML, Web Services, and the Data Revolution“ sogar soweit, dass er von drei Revolutionen ausgeht, die XML in den letzten Jahren auslöste [Coy02]: Früher waren Daten stark an das Format einer Applikation gebunden, quasi jedes Programm benutzte sein eigenes Datenformat. XML löste diese spezifischen Datenformate in einer Datenrevolution ab, da XML unabhängig von Programmiersprachen und Betriebssystemen ist. Ferner ist XML unabhängig von Transport-Protokollen und somit müssen Daten nicht an Formate von bestehenden Technologien wie CORBA, RMI und DCOM angepasst werden. Diese Objekt-basierten Systeme sind nicht kompatibel zueinander und erschweren einen Datenaustausch über die Systemgrenzen hinweg. XML ermöglichte also eine Architekturrevolution, da XML als Netzwerk-Protokoll TCP/IP verwenden kann und somit mit jedem verteilten System kommunizieren vermag. Schließlich bewirkte der Einsatz von XML und Web-Services eine Softwarerevolution. Einfache Prozesse, Services, Geschäftsprozesse und sogar Legacy-Systeme können nun kombiniert werden, um zusammen Aufgaben zu bearbeiten. Durch die neue Möglichkeit der Interoperabilität stehen den Entwicklern von Programmen neue Wege offen. XML legte den Grundstein für die Entwicklung neuer Technologien und letztendlich auch zum Etablieren von Web-Services. 2.3 Datenschema: XSD Die XML Schema Definition Language (XSD) ist in der Version 1.0 seit dem 02.05.2001 eine Empfehlung (Recommendation) des W3C [FW04]. Diese Datenbeschreibungssprache wird im Rahmen dieser Diplomarbeit zum Spezifizieren von Datentypen in WSDL verwendet und daher näher untersucht. In Kapitel 4.3 werden Aufbau und Struktur von XSD vertieft, wenn die Konvertierung von Datentypen in grafische Konstrukte und Validierungskomponenten erklärt wird. Innerhalb der Modellbildung stellt XSD einen zentralen Punkt dieser Diplomarbeit dar. Zum einen wird die GUI anhand der vorliegenden Datentypen dynamisch generiert. Ein Zahlenwert wird z. B. anders grafisch dargestellt als ein selbstdefinierter, komplexer Datentyp. Zum anderen findet eine Validierung der Daten statt, falls Restriktionen für einen Datentypen in XSD durch Fassetten angegeben werden. XSD bietet ein Vokabular um Struktur und Inhalte von Datentypen innerhalb eines WSDL-Dokumentes zu definieren und ist selbst ein XML-Dokument. XSD definiert einerseits eine Reihe von Basisdatentypen (siehe Übersicht der Datentyp-Hierarchie in XSD im Kapitel 4.3) und erlaubt die Definition eigener Datentypen und explizite Behandlung von Namensräumen. Diese neuen Datentypen können aus Basisdatentypen aufgebaut und durch eigene Restriktionen erweitert werden. Somit hat der Entwickler von WebServices ein mächtiges Instrumentarium zur Verfügung zum Entwickeln Problem-bezogener Datenstrukturen. XML-Daten könnte man auch mit der Document Type Definition (DTD) beschreiben. DTD überprüft genauso wie XSD die Korrektheit und Wohlgeformtheit der XML-Daten. DTD weist Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 21 allerdings erhebliche Nachteile im Vergleich mit XSD auf und ist für den Einsatz innerhalb eines WSDL-Dokumentes nicht geeignet. DTD´s werden in der Extended Backus Naur Form (EBNF) und nicht in XML-konformer Syntax verfasst. Somit müsste man ein DTD in ein XML-Tag einbetten, um es zusammen mit dem WSDL-Dokument zu versenden. Zusätzlich unterstützt DTD keine Namensräume, somit entstehen durch den Import-Mechanismus Namenskollisionen. Des Weiteren werden keine Deklarationen von eigenen Datentypen unterstützt und DTD definiert selbst nur 10 Datentypen. XSD unterstützt im Gegensatz dazu 44 Datentypen und erlaubt die Bildung von eigenen Datentypen. Aus diesen Gründen ist die Verwendung von DTD sehr ungeeignet. Zur Erstellung des Modells und zur Implementierung des Prototypen wurde deshalb ausschließlich XSD verwendet. 2.4 Web Service Description Language 1.1 (WSDL) Die Web Services Description Language (WSDL) ist eine XML-basierte SchnittstellenBeschreibungssprache, mit deren Hilfe man Web-Services als eine Menge von Endpunkten beschreiben kann, die untereinander Nachrichten austauschen. Der Austausch und die gesendeten Nachrichten selbst werden abstrakt beschrieben. Danach werden sie an ein konkretes Transport-Protokoll und Nachrichtenformat gebunden, um so einen Endpunkt genau zu definieren. Von Microsoft, IBM und Ariba wurde WSDL entwickelt und das W3C brachte zunächst am 15.März 2001 Version 1.1 [CCMW01] als W3C Note1 zur Diskussion heraus, bevor am 11.Juni 2003 Version 1.2 [CGMW04] als W3C Working Draft2 herausgebracht wurde. Zurzeit liegt die Version 2.0 [CGM+04] seit dem 26.März 2004 als W3C Working Draft vor. Zur Diskussionsgrundlage wird in der vorliegenden Arbeit Version 1.1 herangezogen und am Ende des Unterkapitels ein Vergleich mit Version 2.0 durchgeführt. Werkzeuge, die WSDL parsen und Java-Code generieren, unterstützen zurzeit lediglich Version 1.1. Durch den Vergleich von WSDL 1.1 und WSDL 2.0 wird deutlich, dass der Kern der Sprache erhalten bleibt und lediglich an den genannten Stellen erweitert wird. Ein Update von Version 1.1 auf 2.0 würde keine großen Erweiterungen für die prototypische Implementierung des Modells verursachen und die Ergebnisse dieser Diplomarbeit nicht revidieren bzw. beeinflussen. Das W3C definiert WSDL folgendermaßen: “The Web Services Description Language WSDL Version (WSDL) defines an XML grammar for describing network services as collections of communication endpoints capable of exchanging messages. WSDL service definitions provide documentation for distributed systems and serve as a recipe for automating the details involved in applications communication.” 1 W3C Note: Das vom W3C veröffentlichte Dokument hat einen formellen Zustimmungsprozess durchlaufen und wird veröffentlicht. Von Seiten des W3C gibt es keine Garantie der Weiterbearbeitung 2 W3C Working Draft: Ein vom W3C veröffentlichtes Dokument zur Einsicht und Diskussion durch die Öffent- lichkeit, Veränderungen werden vorbehalten. 22 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Durch diese Definition wird ein weiterer wichtiger Aspekt von WSDL verdeutlicht, nämlich die automatische Integration durch Applikationen. WSDL ist nicht nur von Benutzern lesbar, sondern auch direkt von Applikationen. Dadurch sind Applikationen in der Lage nach dem Parsen des WSDLDokumentes den beschriebenen Service just in time in die eigene Verarbeitung einzubinden und zu nutzen. Dies ist auch der zentrale Ansatzpunkt dieser Diplomarbeit. Der zu entwickelnde Prototyp nimmt ein WSDL-Dokument entgegen und generiert dynamisch daraus die GUI, die der Benutzer zum Editieren der Anfrage und Anzeigen der Antwort verwendet. Bevor im nächsten Unterkapitel der allgemeine Aufbau von WSDL erörtert wird, soll zunächst eine Abgrenzung zwischen WSDL und der Interface Definition Language (IDL) aus der CORBA-Welt herausgestellt werden. IDL, sowie auch WSDL, beschreiben beide die Schnittstelle für einen entfernten Service und dessen Datentypen. Die einzelnen Komponenten der beiden Beschreibungssprachen sind sich sehr ähnlich: IDL-Types entsprechen WSDL-Types, IDL-Methoden korrespondieren zu WSDL-Operationen, IDL-Interfaces zu WSDL-Porttypes und IDL-CORBA-Objekte korrespondieren zu WSDL-Services. IDL ist eine Textdatei, die einen Service mit dessen Methoden und Parametern beschreibt. Diese Beschreibung erfolgt Programmiersprachen-unabhängig. Der Object Request Broker (ORB) nimmt lokale Aufrufe entfernter Objekte entgegen und leitet diese an den Service weiter. Die XML-basierte WSDL bietet ebenfalls eine Datenunabhängigkeit von verwendeten Programmiersprachen, allerdings auch Unabhängigkeit von verwendeter Middleware und Transport-Protokoll, was bei IDL und CORBA nicht gegeben ist. WSDL kann ebenfalls erweitert werden, somit können Nachrichten unabhängig von Protokoll und Format beschrieben werden. 2.4.1 Aufbau eines WSDL-Dokumentes Der Aufbau eines WSDL-Dokumentes wird nun näher erläutert und die einzelnen Elemente spezifiziert. Sämtliche Informationen sind aus der W3C Note WSDL 1.1 vom 15.März 2001 entnommen [CCMW01]. Zunächst sollen alle Elemente kurz andiskutiert und in Relation zueinander gestellt werden, bevor danach jedes Element im Detail erklärt wird. Ein WSDL-Dokument ist hierarchisch aufgebaut wobei das Definitions-Element (<definitions>) das Wurzelelement bildet und als Container für die anderen Elemente dient. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 23 Die allgemeine Struktur eines WSDL-Dokumentes1: <definitions targetNamespace="xs:anyURI" > <documentation />? [ <import /> ]* <types />? [ <message /> | <porttype /> | <binding /> | <service /> ]* </definitions> Das Definitions-Element beinhaltet als Attribute alle Namensraumdeklarationen des WSDLDokumentes. Hier werden neben dem Zielnamensraum (targetNamespace) der Elemente auch weitere Namensräume deklariert (u. a. Namensräume der verwendeten XSD-, SOAP-, WSDL- Version und eigene Namensräume) und jeweils einem Präfix zugeordnet. Das nachfolgende Beispiel zeigt die Verwendung von Präfixen und Namensräumen innerhalb des Definitions-Elementes. <wsdl:definitions … xmlns:myNamespace1="http://www.icsy.de/company/Myschema1" xmlns:myNamespace2="http://www.icsy.de/private/Myschema2" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> </wsdl:definitions> In dem obigen Beispiel wird dem Präfix myNamespace1, myNamespace2 und xsd jeweils ein separater Namensraum zugeordnet. Der Präfix xsd steht nun als Stellvertreter innerhalb dieses Dokumentes für den Namensraum des XML-Schemas und myNamespace1 repräsentiert einen selbst festgelegten Namensraum, myNamespace2 analog dazu. Durch Zuordnung von Namensräumen zu einzelnen Elementen wird deren eindeutige Identität gewahrt. Lokale Namen von Elementen können mehrfach vergeben werden. Eine Unterscheidung findet dann über den unterschiedlichen Namensraum statt. Elemente werden aus diesem Grund durch einen qualifizierten Namen (QName) angesprochen. Ein qualifizierter Name stellt einen XML-qualifizierten Namen dar, der eindeutig durch einen Namensraum und einen lokalen Namen spezifiziert ist. Das nächste Beispiel zeigt die Verwendung von qualifizierten Namen zur eindeutigen Ansprache von Elementen. <wsdl:complexType …> <xsd:element name="company_address" type="myNamespace1:Address"/> <xsd:element name="private_address" type="myNamespace2:Address"/> </wsdl:complexType …> Innerhalb eines nicht weiter spezifizierten komplexen Datentyps werden zwei weitere komplexe Datentypen referenziert, die beide den gleichen lokalen Namen Address aufweisen. Ohne Verwendung eines qualifizierten Namens wäre eine Unterscheidung der zwei unterschiedlichen Datentypen nicht möglich. Die Eindeutigkeit wird durch die Zuordnung des Namensraumes in Form des Präfixes bewahrt. 1 Informale Syntax: "?" (0 oder 1), "*" (0 oder mehr), "+" (1 oder mehr) 24 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Weiterhin können optional Dokumentationen für den Anwender zum besseren Verständnis des WSDL-Dokumentes im Dokumentations-Element (<documentation>) angeführt werden (siehe Kapitel 4.5) und weitere Dokumente durch das Import-Element (<import>) eingebunden werden (nächstes Unterkapitel). Das Datentyp-Element (<types>) wird zum Festlegen komplexer Datentypen verwendet und in Kapitel 4.4 untersucht. Zunächst sollen aber die vier Hauptelemente und deren Kindelemente eines WSDL-Dokumentes näher betrachtet werden. Abbildung 3 zeigt dazu eine schematische Übersicht über diese Elemente und deren Relationen zueinander. WSDL-Dokument Service … Port Binding … Port Binding Binding Porttype Operation Message Porttype … Operation Message Message konkretes Level abstraktes Level … Message Abbildung 3: vereinfachter Aufbau eines WSDL-Dokumentes Ein WSDL-Dokument beinhaltet ein Service-Element (<service>). Dieses Element gruppiert alle verwendeten Port-Elemente (<port>) und beinhaltet somit eine Kollektion von einem oder mehreren Ports. Jeder Port wird wiederum durch ein Anbindungs-Element (<binding>) an ein konkretes Transport-Protokoll und Nachrichtenformat gebunden. Neben der Bindung wird jeder Port zusätzlich durch einen Porttyp detailliert beschrieben. Das Porttyp-Element (<porttype>) beinhaltet mehrere Operationen, ohne Angaben über den Transport-Mechanismus anzugeben. Jedes Operations-Element (<operation>) ist letztendlich eine Kollektion von ein- und ausgehenden Nachrichten und legt deren Sequenz und Kardinalität fest. Ein Nachrichten-Element (<message>) stellt die BasisKommunikationseinheit dar und beinhaltet die gesendeten Daten. Die einzelnen Elemente können zur besseren Übersicht in zwei Levels unterteilt werden. Im konkreten Level werden das Service-Element (mit dem Port-Element als Kindelement) und das AnbindungsElement gruppiert. Diese drei Elemente beschreiben wie der Web-Service an ein Transport-Protokoll Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 25 gebunden wird und unter welcher Adresse er zu kontaktieren ist. Der Web-Service wird also auf konkreter Ebene beschrieben. Im abstrakten Level (Porttyp- und Nachrichten-Element) wird von der konkreten Realisierung abstrahiert und lediglich die Daten zum Nachrichtenaustausch festgelegt. Zum abstrakten Level werden ebenfalls die optionalen Datentyp-Elemente (<types>) gezählt, die die Parameter der Nachrichten spezifizieren. Datentyp-Elemente werden allerdings nur bei Verwendung von selbst definierten, komplexen Datentypen verwendet und daher in dieser allgemeinen Übersicht nicht berücksichtigt. Während das konkrete Level die Frage „Wie wird der Web-Service angesprochen?“ beantwortet, beschäftigt sich das abstrakte Level nur um das „Was der Web-Service leistet?“. Anhand des in der Einleitung bereits erwähnten Beispiels des Taschenrechner-Web-Service sollen die einzelnen Elemente nochmals anschaulich beschrieben werden. Bei diesem Beispiel in Abbildung 4 wird nicht auf die interne Darstellung der einzelnen Elemente eingegangen, sondern ein Gesamtüberblick dargestellt und von einigen Details abstrahiert. Innerhalb der einzelnen Elemente mussten zur besseren Übersicht Interna weggelassen werden. Im Anhang 8.4 befindet sich das komplette WSDLDokument. 26 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <wsdl:definitions targetNamespace="http://www.icsy.de/da/Cal" xmlns:calNS="http://www.icsy.de/da/apfel/wsdl/Cal"> <wsdl:message name="addRequest"> <wsdl:part name="addend1" type="xsd:int"/> <wsdl:part name="addend2" type="xsd:int"/> </wsdl:message> <wsdl:portType name="Calculator"> <wsdl:operation name="add" parameterOrder="addend1 addend2"> <wsdl:input message="calNS:addRequest" name="addRequest"/> <wsdl:output message="calNS:addResponse" name="addResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:binding name="CalSoapBinding" type="calNS:Calculator"> <wsdlsoap:binding style="rpc" transport="http://…/soap/http"/> <wsdl:operation name="add"> <wsdl:input name="addRequest"></wsdl:input> <wsdl:output name="addResponse"></wsdl:output> </wsdl:operation> </wsdl:binding> <wsdl:service name="prototype_Service"> <wsdl:port binding="calNS:CalSoapBinding" name="Calculator"> <wsdlsoap:address location="http://www.icsy.de/CalService"/> </wsdl:port> </wsdl:service> </wsdl:definitions> Abbildung 4: WSDL-Dokument des Taschenrechner-Web-Service Das Port-Element repräsentiert den Taschenrechner-Web-Service. Dieser Port kann nun mit mehreren anderen Ports in einem Service-Element spezifiziert werden. Das Service-Element würde somit unterschiedliche Web-Services beinhalten und eine Gruppierung dieser vornehmen. Durch das Anbindungs-Element wird dem Taschenrechner-Web-Service das Transport-Protokoll SOAP zugeordnet. Im Porttyp-Element werden die einzelnen erlaubten Operationen des Services festgelegt. In diesem Beispiel besteht der Web-Service aus den beiden Operationen Addition und Subtraktion. Für die Operation Addition wird dann im Operations-Element die ein- und ausgehenden Nachrichten festgelegt. Diese Operation besteht lediglich aus einer eingehenden Nachricht (beide Summanden als Parameter) und einer ausgehenden (Summe als Parameter). Für beide Nachrichten wird schließlich im Nachrichten-Element die Datentypen der Parameter festgelegt. Für die ausgehende Nachricht wären das zwei Ganzzahlwerte (int). Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 27 Nachfolgend werden die wichtigsten Elemente eines WSDL-Dokumentes aufgelistet und detailliert erläutert. Durch das Präfix wsdl wird verdeutlicht, dass es sich um ein WSDL-Element handelt. Die Elemente von Datentyp-Deklarationen in XSD verwenden als Präfix xsd und können somit von WSDL-Elementen unterschieden werden. Sämtliche Elemente können durch ein DokumentationsElement direkt im WSDL-Dokument näher beschrieben und erläutert werden. <wsdl:documentation> Die Dokumentation erläutert das umschließende Element. </wsdl:documentation> Innerhalb des Tags <documentation> kann eine Erläuterung zum dem Vaterelement angegeben werden. <types> Dieses Element beinhaltet Datentyp-Definitionen zum Spezifizieren der Datentypen innerhalb einer Nachricht. Um Plattformunabhängigkeit zu gewährleisten und eine Standardisierung festzulegen, wird die XML Schema Definition Language zur Definition der Datentypen verwendet. Alternativ könnte man auch andere Datenschemata nehmen, wie z.B. Document Type Definition (DTD), Relax NG1, Abstract Syntax Notation (ASN.1)2 oder falls man ausschließlich mit CORBA-Objekten kommuniziert das CORBA-Typsystem. Diese Datenschemata spielen allerdings in der Praxis im Bezug auf WebServices eher eine untergeordnete Rolle. Die Struktur dieses Elementes: <wsdl:types> <xsd:schema .... />* </wsdl:types> Die Verwendung des Datentyp-Elementes ist optional, je nach der Komplexität der verwendeten Datentypen bei einem Web-Service. Benötigt man lediglich einfache Datentypen (z. B. einen Zahlenwert ohne besondere Restriktionen als Parameter), so muss man diesen einfachen Datentyp nicht extra definieren. Einfache Datentypen werden implizit durch den Namensraum von XSD festgelegt. Wird allerdings als Parameter ein komplexerer Datentyp (z. B. eine Adresse bestehend aus Name und Anschrift) verwendet, so muss dieser Datentyp in einem Datentyp-Element näher spezifiziert werden. Diese einfachen und komplexen Datentyp-Definitionen können zum Teil sehr umfangreich werden, da alle sprachlichen Mittel von XSD zur Verfügung stehen. Aus diesem Grund werden die DatentypDefinitionen im Kapitel 4.3 separat behandelt. 1 weitere Informationen zu Relax NG findet man unter http://www.relaxng.org/ns/structure/1.0 2 ITU-T Recommendation X.680, weitere Informationen findet man unter http://www.itu.int/home/index.html 28 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Beispiel: <wsdl:types> <xsd:complexType name="SubType"> <xsd:element name="Minuend" type="xsd:float"/> <xsd:element name="Subtrahend" type="xsd:float"/> </xsd:complexType> </wsdl:types> Beim Taschenrechner-Web-Service werden bei der Addition zwei einfache Datentypen (Ganzzahlwerte) verwendet. Für diese beiden Parameter benötigt man keine extra Deklaration in einem DatentypElement. Bei der Subtraktion hingegen wird ein komplexer Datentyp (SubType) verwendet. Dieser Datentyp ist benutzerdefiniert und muss somit deklariert werden, damit Sender und Empfänger des Web-Service ein identisches Verständnis dieses Datentyps haben. In diesem Beispiel ist der komplexe Datentyp aus zwei einfachen Datentypen (Gleitkommazahlen, float) aufgebaut. <message> Eine Nachricht (Message) ist eine Basis-Kommunikationseinheit zwischen einem Web-Service und einer Anwender-Applikation und beinhaltet die gesendeten Daten innerhalb einer Nachricht zwischen beiden Teilnehmern. Das Nachrichten-Element listet alle Parameter auf, die innerhalb dieser Nachricht verwendet werden, und besitzt einen eindeutigen Namen innerhalb des Dokumentes. Besitzen mehrere Elemente einen identischen Namen, so muss die Identität durch Zusatz eines Namensraumes erreicht werden (qualifizierter Name). Die Struktur dieses Elementes: <wsdl:message name="nmtoken"> * <wsdl:part name="nmtoken" element="qname"? type="qname"?/> * </wsdl:message> Ein Nachrichten-Element besteht aus logischen Part-Elementen (<part>). Diese sind wiederum durch einen eindeutigen Namen innerhalb dieses Nachrichten-Elementes identifiziert. In den PartElementen werden die übertragenen Parameter benannt und der Datentyp festgelegt. Das Attribut element innerhalb von <part> referenziert ein XSD-Element durch einen qualifizierten Namen. Das Attribut type referenziert einen einfachen oder komplexen XSD-Datentyp. Beispiel: <wsdl:message name="addRequest"> <wsdl:part name="addend1" type="xsd:int"/> <wsdl:part name="addend2" type="xsd:int"/> </wsdl:message> In dieser Nachricht namens addRequest werden in den beiden Part-Elementen die Parameter addend1 und addend2 als Parameter festgelegt. Zusätzlich werden die Datentypen beider Parameter fixiert, in dem Beispiel zwei Ganzzahlwerte (int). Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 29 <porttype> Ein Porttyp-Element besteht aus einer Menge von Operationen, die wiederum die zuvor definierten Nachrichten-Elemente gruppieren. Das Porttyp-Element gehört wie die voran gegangenen Elemente zum abstrakten Level, somit werden keine Angaben über das Transport-Protokoll angegeben. Das Porttyp-Element bestimmt zwar Transmissions-Primitiven, legt aber nicht fest wie diese realisiert werden. Weiterhin legt das Porttyp-Element alle Operationen fest, die auf einem Port ausführbar sind. Somit wird der funktionale Rahmen des Web-Service festgelegt. Die Struktur dieses Elementes: <wsdl:portType name="nmtoken"> <wsdl:operation name="nmtoken" .... /> * </wsdl:portType> Ein Porttyp-Element besitzt einen eindeutigen Namen unter allen vorhanden Porttyps innerhalb des Dokumentes. Das Operations-Element ist ein Kindelement des Porttyp-Elementes und besitzt folgende Struktur: <wsdl:operation name="nmtoken" parameterOrder="nmtokens"*> <wsdl:input name="nmtoken"? message="qname"/>* <wsdl:output name="nmtoken"? message="qname"/>* <wsdl:fault name="nmtoken" message="qname"/>* </wsdl:operation> Mit dem Attribut parameterOrder können Angaben über die Parameterreihenfolge angegeben werden. Der Name muss nicht eindeutig sein, im Gegensatz zu den anderen Elementen von WSDL. Dadurch können einzelne Operationen überladen werden und lediglich durch die Anzahl der Nachrichten oder unterschiedliche Datentypen innerhalb einer Nachricht unterschieden werden. Das Überladen von Operationen kann man sich analog zum Überladen von Methoden bei einer Objekt-orientierten Sprache vorstellen. Zusätzlich wird spezifiziert, ob es sich bei den Nachrichten um Eingehende oder Ausgehende handelt. Ferner kann man in einer Fehlernachricht eine Ausgabe spezifiziert werden, die im Fehlerfall übermittelt wird. Die Elemente <input> und <output> beziehen sich dabei auf den Web-Service. <input> bedeutet dabei, dass der Web-Service eine Nachricht empfängt, der Anwender diese also sendet. <output> besagt, dass der Anwender eine Nachricht empfängt und der WebService sendet. WSDL unterstützt dabei vier Transmissions-Primitiven für Operationen, die festlegen wie ein Web-Service und eine Anwender-Applikation untereinander kommunizieren und welche Kombinationen von Nachrichten erlaubt sind: One-way: Der Service empfängt eine Nachricht vom Anwender und sendet keine Antwort zurück. <wsdl:input name="nmtoken"? message="qname"/> Anwendungsszenario: Hochladen einer Datei 30 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Request-Response: Der Service empfängt eine Nachricht und sendet eine Antwort zum Anwender. <wsdl:input name="nmtoken"? message="qname"/> <wsdl:output name="nmtoken"? message="qname"/> <wsdl:fault name="nmtoken" message="qname"/>* Anwendungsszenario: Anfrage nach dem Börsenkurs einer Aktie und aktueller Kursstand als Antwort. Solicit-Response: Der Service sendet eine Nachricht und empfängt eine Antwort vom Anwender. <wsdl:output name="nmtoken"? message="qname"/> <wsdl:input name="nmtoken"? message="qname"/> <wsdl:fault name="nmtoken" message="qname"/>* Anwendungsszenario: Benachrichtigung, dass persönliche Daten überprüft werden sollen, als Antwort Bestätigung der Einsicht der Daten und evtl. Änderungen. Notifikation: Der Service sendet eine Nachricht zum Anwender. <wsdl:output name="nmtoken"? message="qname"/> Anwendungsszenario: Service sendet eine Nachricht, dass sich das Nutzungsangebot eines Dienstes erweitert hat. Beispiel einer Request-Response Operation: <wsdl:portType name="Calculator"> <wsdl:operation name="add" parameterOrder=" addend1 addend2"> <wsdl:input message="addRequest" name="addRequest"/> <wsdl:output message="addResponse" name="addResponse"/> </wsdl:operation> </wsdl:portType> In diesem Beispiel, das aus Abbildung 4 entnommen wurde, wird eine komplette Addition mit Anfrage und Antwort beschrieben. Die Anfrage (<input>) und die Antwort (<output>) werden jeweils in dem zuvor beschriebenen Nachrichten-Element näher erläutert. Hier findet lediglich eine Komposition der enthaltenen Nachrichten innerhalb dieser Operation statt. Zusätzlich werden die Eingabeparameter von addRequest chronologisch festgelegt im Attribut parameterOrder. In diesem Beispiel wäre eine Vertauschung der Reihenfolge der Parameter ohne Auswirkungen auf das Ergebnis, da die Addition kommutativ ist. Bei der Subtraktion würde allerdings das Ergebnis falsch ausgewertet werden bei Nichteinhaltung der korrekten Parameterreihenfolge. <binding> Durch das Anbindungs-Element wird ein Nachrichtenformat definiert und dem abstrakten Porttyp ein konkretes Transport-Protokoll (z.B.: SOAP, HTTP Get/Post oder MIME) zugeordnet. Prinzipiell kann jedes Transport-Protokoll verwendet werden das XML-Daten transportieren kann. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 31 Die Struktur dieses Elementes: <wsdl:binding name="nmtoken" type="qname"> * <-- extensibility element (1) --> * <wsdl:operation name="nmtoken"> * <-- extensibility element (2) --> * <wsdl:input name="nmtoken"? > ? <-- extensibility element (3) --> </wsdl:input> <wsdl:output name="nmtoken"? > ? <-- extensibility element (4) --> * </wsdl:output> <wsdl:fault name="nmtoken"> * <-- extensibility element (5) --> * </wsdl:fault> </wsdl:operation> </wsdl:binding> Das Attribut name legt einen eindeutigen Namen unter sämtlichen Anbindungs-Elementen innerhalb des WSDL-Dokumentes fest und das type Attribut referenziert den korrespondierenden Porttyp des WSDL-Dokumentes. Prinzipiell ist es möglich mehrere Anbindungen für einen Porttyp zu spezifizieren, um so flexibel mit mehreren Transport-Protokollen zu sein. Bei der Entwicklung des Prototypen wurde sich allerdings auf Anbindungen mit dem weit verbreiteten Standard SOAP beschränkt. Eine Anbindung darf jedoch jeweils immer nur ein Transport-Protokoll unterstützen und keine Angaben über Netzwerkadressen machen, die erst im Port-Element definiert werden. Die <extensibility> Elemente stellen Platzhalter dar für weitere Spezifikationen. Eine exakte Darstellung des Anbindungs-Elementes würde den Rahmen dieser Diplomarbeit übersteigen, da das Anbindungs-Element sehr komplex ist. Es wird an dieser Stelle auf die Literatur [CCMW01] verwiesen. Zum Einbinden des Client wird das generische Werkzeug WSDL2Java von Apache Axis [Axis04] verwendet, welches ein implizites Anbinden der Porttyps auf SOAP durchführt. WSDL2Java wird in Kapitel 3.1 eingeführt. <service> Ein Service ist eine Kollektion von Ports. Das Service-Element stellt somit alle angebotenen WebServices innerhalb eines WSDL-Dokumentes zusammen. Die Struktur dieses Elementes: <wsdl:service name="nmtoken"> * <wsdl:port name="nmtoken" binding="qname"> * </wsdl:service> 32 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <port> Das Kindelement eines Services, der Port, assoziiert einen Web-Service-Endpunkt durch Zuordnung einer Netzwerkadresse zum vorliegenden Binding, welches über das Attribut binding identifiziert wird. Der Port repräsentiert in WSDL einen Web-Service, der über die Netzwerkadresse eindeutig zu erreichen ist. Ein Beispiel für Port- und Service-Element aus dem Taschenrechner-Beispiel: <wsdl:service name="prototype_Service"> <wsdl:port binding="calNS:CalSoapBinding" name="Calculator"> <wsdlsoap:address location="http://www.icsy.de/…/CalService"/> </wsdl:port> <wsdl:port>…</wsdl:port> </wsdl:service> Der Service namens prototype_Service gruppiert zwei Ports, wovon der zweite hier nur angedeutet ist. Der erste Port trägt den Namen Calculator und ihm wird eine Anbindung zugewiesen. Innerhalb der Anbindung wird, wie oben bereits erklärt, dem Port ein Transport-Protokoll zugeordnet, welches zum Senden der involvierten Operationen verwendet wird. Außerdem wird innerhalb des Port-Elementes dem Port eine konkrete Netzwerkadresse zugeordnet über die der Web-Service zu erreichen ist. Nach dem Aufbau eines WSDL-Dokumentes und Einführung der Elemente wird nun der ImportMechanismus vorgestellt, mit der die soeben vorgestellten Elemente auf verschiedene Dokumente verteilt werden können. 2.4.2 Modularisierung durch Importieren WSDL bietet die Möglichkeit, WSDL-Dokumente modular aufzubauen. Es steht dazu der ImportMechanismus durch das Import-Element zur Verfügung. Damit können Elemente aus dem gleichen und einem anderen Namensraum eingebunden werden. Hauptsächlich können Datentyp-Elemente in eigenen XSD-Dokumenten ausgelagert werden. Die Elemente mit einem anderem Namensraum können sich im gleichen WSDL-Dokument befinden oder aus einem anderen XSD- und WSDLDokument importiert werden. Das Import-Element besitzt das Attribut namespace zum Definieren des Namenraumes und location zur Angabe der URL des ausgelagerten Dokumentes. Das Attribut location ermöglicht die physikalische Verteilung einzelner Elemente in unterschiedliche Dokumente und gibt eine Referenz auf dessen URL an. Durch das Attribut namespace können Elemente aus einem anderen Namensraum importiert werden. Somit kann es innerhalb des WSDL-Dokumentes, mit seinen importierten Elementen, zu Namensgleichheit von lokalen Elementnamen kommen. Die eindeutige Identität eines Elementes wird allerdings immer in Kombination des Namens (lokaler Name) und dessen Namensraum gewährleistet. Zwei unterschiedliche komplexe Datentypen namens Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 33 „Adresse“ können somit z.B. zum einen die Adresse der Firma und zum anderen die Adresse von Mitarbeitern repräsentieren. Durch Zuordnung zweier separater Namensräume ist die Eindeutigkeit eingehalten, die von der WSDL-Spezifikation verlangt wird. Durch den Import-Mechanismus können somit klarere, übersichtlichere WSDL-Dokumente verfasst werden. Häufig verwendete Komponenten können in neue XSD- oder WSDL-Dokumente ausgelagert werden. Durch diese Modularisierung der WSDL-Dokumente wird die Wiederverwendbarkeit erhöht. WSDL-Dokumente können leicht nach dem Baukastenprinzip erstellt werden und die Lesbarkeit einzelner Dokumente wird durch die Reduktion der enthaltenen Komponenten pro Dokument erhöht. Zusätzlich müssen häufig verwendete Komponenten nicht jedes Mal neu definiert werden. Durch die Auslagerung von Datentyp-Elementen in externe XSD-Dokumente kann man sich z.B. eigene Bibliotheken mit spezifischen Datentypen für diverse Problemstellungen errichten. Je nachdem, welche Datenstrukturen der Web-Service benötigt, können diese dann importiert werden. Durch die Zusammenfassung von den Service-, Port- und Anbindungs-Elementen kann man die Elemente des konkreten Levels in ein WSDL-Dokument bündeln. In ein weiteres WSDL-Dokument könnte man die Elemente des abstrakten Levels (Porttyp-, Nachrichten- und Datentyp-Element) zusammenfassen. So kann man diese zwei logischen Levels trennen und durch Importieren zu einem vollständigen WSDLDokument vereinigen. Allerdings besteht natürlich auch die Möglichkeit die Granularität der Trennung innerhalb der logischen Levels noch zu erhöhen. Eine sinnvolle Trennung innerhalb des konkreten Levels wäre die Trennung des Service-Elementes auf der einen und dem Anbindungs-Element auf der anderen Seite. Da die Möglichkeit besteht, verschiedene Transport-Protokolle als Anbindung zu verwenden, könnten so verschiedene Anbindungs-Elemente erstellt werden und danach beliebig mit dem Service-Element kombiniert werden. Die Granularität der Aufsplittung wird begrenzt auf Element-Ebene. Eine Trennung von Vater- und Kindelementen ist nicht erlaubt, <service> und <port> können also nicht verteilt werden. Beim Importieren ist darauf zu achten, dass man ein XSD- oder WSDL-Dokument jeweils immer nur direkt importiert. Die Elemente des direkt importierten Dokumentes können aus dem importierenden Dokument angesprochen werden, transitiv importierte Elemente sind allerdings nicht erlaubt. Transitives Importieren ist nicht erlaubt, da es Probleme beim Erkennen des Namensraumes geben kann. Beim Importieren können Elemente mit dem gleichen oder einem anderen Namensraum importiert werden. Beim direkten Importieren wird der neue Namensraum, falls ein anderer Namensraum verwendet wird, dem importierenden Dokument übermittelt und ist somit auch in diesem Dokument bekannt. Beim transitiven Importieren eines Dokumentes ist dieser Namensraum im transitiv importierenden Dokument nicht bekannt, da lediglich der Namensraum dem direkt importierenden Dokument übermittelt wird. Dieser Sachverhalt wird in Abbildung 5 nochmals grafisch veranschaulicht. 34 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. direktes Importieren: transitives Importieren: Zugriff WSDL 1 Zugriff WSDL/ WSDL 1 XSD 2 <import> <import> WSDL/ WSDL/ XSD 2 XSD 3 <import> Abbildung 5: direktes und transitives Importieren Das linke Schaubild zeigt das erlaubte, direkte Importieren eines XSD- oder WSDL-Dokumentes. Auf alle Elemente innerhalb von WSDL/XSD2 kann aus WSDL1 zugegriffen werden. Das rechte Schaubild zeigt hingegen einen unerlaubten, fehlerhaften Zugriff, der durch transitives Importieren entsteht. Das von WSDL1 importierte WSDL/XSD2 importiert wiederum ein weiteres Dokument (WSDL/XSD3). WSDL/XSD2 kann auf alle Elemente von WSDL/XSD3 zu greifen, WSDL1 allerdings nicht, da es WSDL/XSD3 nicht selbst (direkt) importiert. Der Namensraum von WSDL/XSD3 wird lediglich WSDL/XSD2 übermittelt. Importiert WSDL1 nun WSDL/XSD2, so ist in WSDL1 der Namensraum von WSDL/XSD3 nicht bekannt. Aus diesem Grund darf WSDL1 nicht auf WSDL/XSD3 zugreifen. Es gibt keine Beschränkung in der Tiefe der Importhierarchie. Ein importiertes Dokument kann wiederum weitere Dokumente importieren, usw. Es muss lediglich darauf geachtet werden, dass der Zugriff auf Elemente immer direkt auf das importierte Dokument gerichtet ist und nicht transitiv durchgeführt wird. Russel Butek veröffentlicht in einem Artikel von IBM „Web Service Programming Tips and Tricks: WSDL file imports“ [But04] ein Beispiel über den Import-Mechanismus bei WSDL 1.1. Der interessierte Leser findet dort ein weiteres Beispiel für ein fehlerhaftes transitives Importieren, das anschließend in zwei direkte Import-Anweisungen aufgelöst wird. 2.4.3 Vergleich WSDL 1.1 und WSDL 2.0 In der vorliegenden Arbeit wurde WSDL 1.1 verwendet, da noch keine Werkzeug-Unterstützung zur Generierung von Java-Code für WSDL 2.0 vorliegt. Die erste Veröffentlichung des W3C von WSDL 2.0 erfolgte im November 2003 (Working Draft) [CGM+03]. Davor wurde WSDL 1.2 ebenfalls als Working Draft spezifiziert, allerdings recht kurzfristig durch die neue Version 2.0 abgelöst. Die Betrachtung von WSDL 1.2 entfällt somit, da weder Werkzeug-Unterstützung, noch weitere Forschungsarbeiten sich mit dieser Version befassen. Die Entwickler der Werkzeuge haben zurzeit immer noch einige nicht implementierte, offene Anforderungen bei der Generierung von Java-Code aus WSDL 1.1. Kapitel 3.2 beschäftigt sich nochmals ausführlich mit den offenen Anforderungen und Generierung von Java-Code aus WSDL. WSDL 2.0 liegt zurzeit als Working Draft vor, Veränderungen können also jederzeit vorgenommen werden. Dennoch werden die wichtigsten Veränderungen in diesem Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 35 Kapitel aufgeführt, die von Version 1.1 zu 2.0 entstanden. Für die weitere Entwicklung des Modells und Prototypen finden diese Veränderungen allerdings keine Berücksichtigung. Da noch kein Standard verabschiedet wurde für WSDL 2.0, können die nachfolgend angeführten Veränderungen von der endgültigen Version variieren. Operationen dürfen in Version 2.0 nicht mehr überladen werden. Bei WSDL 1.1 war es möglich Namensgleichheit bei Operationen zu erlauben und lediglich über die Anzahl der Parameter und Datentypen eine Unterscheidung vorzunehmen. Das Element <porttyp> wurde in Version 2.0 in <interfaces> und <port> in <endpoint> umbenannt. Die Funktionalität blieb jedoch unverändert. Das Attribut location des Elementes <import> wurde in schemaLocation geändert. Die Namensänderungen lassen sich dadurch erklären, da zur semantischen Beschreibung der alten Begriffe immer wieder die neuen verwendet wurden. Da die neuen Namen dadurch intuitiver und geläufiger sind, wurden diese Änderungen vorgenommen. Zusätzlich wurde die Möglichkeit zur Modularisierung von WSDL-Dokumenten verfeinert. Die Modularisierung stellt ein wichtiges Instrumentarium zur strukturierten Darstellung von WSDL und Wiederverwendung einzelner Komponenten dar. Wie im vorigen Unterkapitel bereits erwähnt, stand bisher in Version 1.1 lediglich der Import-Mechanismus dafür zur Verfügung. Nun besteht in der Version 2.0 die Möglichkeit XSD- und WSDL-Komponenten einzubetten (include) oder zu importieren (import). Die Möglichkeit der Modularisierung durch <import> wurde also durch <include> erweitert. Diese beiden Varianten werden nun vorgestellt und voneinander abgegrenzt. Das Hauptunterscheidungsmerkmal beider Varianten der Modularisierung ist die unterschiedliche Verwendung des Namensraumes. Bei einem <include> werden XSD- oder WSDL-Dokumente eingebettet, die den gleichen Namensraum haben. Bei einem <import> hingegen werden XSD- oder WSDL-Dokumente mit einem unterschiedlichen Namensraum importiert. Diese Unterscheidung fand bei WSDL 1.1 nicht statt. Hier wurde sowohl das Einbinden von Elementen mit gleichen als auch mit unterschiedlichen Namensräumen durch Importieren durchgeführt. Durch diese Erweiterungen entstanden auch unterschiedliche Vorraussetzungen für das Importieren von XSD- und WSDL-Dokumenten. Zuvor bei WSDL 1.1 wurden XSD und WSDL unter identischen Vorraussetzungen eingebunden. Ein bereits importiertes XSD darf beim Importieren in ein WSDL-Dokument kein weiteres XSD importieren. In diesem Fall muss das zweite importierte XSD ebenfalls in das WSDL-Dokument importiert werden (kein transitives Importieren erlaubt). Wird ein XSD allerdings eingebettet durch <include>, so verhält sich das Einbetten wie ein „Cut and Paste“-Vorgang des XSD in das Datentyp-Element des WSDL-Dokumentes. Da das XSD- und das WSDL-Dokument den gleichen Namensraum haben, können alle Komponenten identifiziert werden. Das WSDL kann Komponenten innerhalb des eingebetteten XSD ansprechen, so als wäre dieses physikalisch in das WSDL-Dokument eingebettet. Durch diese Eigenschaft entstehen einige Sonderfälle, die ein transitives Inkludieren von XSD 36 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. erlauben. Abbildung 6 zeigt jeweils ein Szenario für ein erlaubtes transitives Inkludieren und ein Fehlerhaftes. erlaubtes Szenario: WSDL 1 <Import> oder <include> XSD 1 fehlerhaftes Szenario: XSD 2 <Include> WSDL1 XSD 1 <Import> oder <include> XSD 2 <Import> Abbildung 6: transitiver Zugriff auf XSD in WSDL 2.0 In der linken Skizze wird XSD2 von XSD1 eingebettet. Somit sind alle Komponenten von XSD2 in XSD1 ansprechbar und werden so behandelt, als wären sie innerhalb des Datentyp-Elementes von XSD1 eingebettet. XSD1 und XSD2 haben den gleichen Namensraum. Wird nun XSD1 von WSDL1 importiert oder eingebettet, so werden die Komponenten aus XSD2 übernommen, da sie den gleichen Namensraum haben und als Komponenten innerhalb des Datentyp-Elementes angesehen werden. Auf der rechten Seite importiert allerdings XSD1 XSD2. Somit besitzt XSD2 einen eigenen, anderen Namensraum als XSD1. Beim Importieren oder Inkludieren von XSD1 in WSDL1 entstehen somit Konflikte durch den unbekannten Namensraum von XSD2 in WSDL1. Bei einem Einbetten von WSDL-Dokumenten können die Elemente, die den gleichen Namensraum haben, auf mehrere WSDL-Dokumente verteilt werden. Beim Einbetten ist wie beim Importieren darauf zu achten, dass nur direktes Inkludieren möglich ist und kein transitives (anders als bei XSD)1. Importiert nun das eingebettete WSDL-Dokument wiederum weitere XSD, so müssen diese im ursprünglichen WSDL-Dokument importiert werden, da unterschiedliche Namensräume vorliegen. Eingebettete XSD innerhalb eines inkludierten WSDL-Dokumentes sind allerdings erlaubt, da das eingebettete XSD als Teil des Datentyp-Elementes verstanden wird und den gleichen Namensraum aufweist. Nachfolgend sei noch ein Sonderfall aufgeführt, der in Abbildung 7 skizziert wird. 1 An dieser Stelle ist die Spezifikation des W3C sehr kurz gehalten. Darin wird lediglich ein transitives Inkludie- ren verboten, allerdings keine Gründe dafür genannt. Zusätzlich ist eine nicht vorhandene Referenz auf die XSDSpezifikation an dieser Stelle angegeben. Beim transitiven Inkludieren von XSD wird dies explizit erlaubt, da sich das Einbetten analog zu einem „Cut and Paste“-Verfahren verhält und bei allen Elementen der gleiche Namensraum vorliegt. Beim transitiven Inkludieren eines WSDL-Dokumentes wäre auch der gleiche Namensraum vorhanden, meiner Meinung nach allerdings ohne offensichtlichen Grund nicht erlaubt. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. WSDL 1 <Import> 37 WSDL 2 <Include> explizites <Import> notwendig XSD Abbildung 7: Sonderfall beim Importieren in WSDL 2.0 Das importierte WSDL2-Dokument inkludiert XSD. Beim Einbetten wird, wie bereits erwähnt, eine Namensraumgleichheit vorausgesetzt. XSD und WSDL2 verwenden somit den identischen Namensraum. Importiert nun WSDL1 WSDL2, so wird dem WSDL1-Dokument mitgeteilt, dass in WSDL2 ein anderer Namensraum zur Verwendung kommt. Allerdings erkennt WSDL1 nicht automatisch, dass in XSD ebenfalls ein anderer Namensraum, der gleiche wie in WSDL2, verwendet wird. Aus diesem Grund muss WSDL1 XSD explizit importieren, um auch diesen Namensraum zu erkennen, auch wenn er identisch zum Namensraum in WSDL2 ist. Wie die gerade angeführten Erläuterungen belegen, hat sich die Mächtigkeit zur Modularisierung erhöht, allerdings dadurch auch die Komplexität von erlaubten und verbotenen Szenarien innerhalb des Importierens und Inkludierens. Bis auf diese Möglichkeit der modularen WSDL-Bildung und Namensänderungen hat sich die Technologie zurzeit im Wesentlichen nicht verändert. 2.5 Universal Description, Discovery and Integration (UDDI) Universial Description, Discovery and Integration (UDDI) ist ein Plattform-unabhängiges Framework, das die Möglichkeit bietet, Web-Services zu beschreiben, publizieren und suchen [Bel02]. UDDI wurde 2001 von IBM, Microsoft und Ariba ins Leben gerufen und mittlerweile haben sich über 300 Unternehmen dieser Initiative angeschlossen, die im Internet unter www.uddi.org zu finden ist. Mittlerweile liegt UDDI in Version 3 vor. UDDI bietet ein Schema zum Beschreiben eines Unternehmens und dem angebotenen Dienst, ein globales Registrierungsverzeichnis, eine SOAP-API1 zum Registrieren und eine weitere zum Suchen eines Services. Die Definition der UDDI-Initiative verdeutlicht nochmals die Funktion und Anwendbarkeit von UDDI, wobei UDDI nicht auf Web-Services beschränkt ist, sondern allgemein auf Geschäftsinformationen. “Universal Description, Discovery and Integration, or UDDI, is the name of a group of web-based registries that expose information about a business or other entity and its technical interfaces (or API’s). These registries are run by multiple Operator Sites, and can be used by anyone who wants 1 SOAP-API: SOAP Applikation Programming Interface, SOAP- Programmierschnittstelle 38 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. to make information available about one or more businesses or entities, as well as anyone that wants to find that information.”[BRY02] Einige Unternehmen der Initiative, wie z.B.: IBM, HP, SAP und Microsoft, bieten RegistrierungsServer an, um Services zu veröffentlichen und zu suchen. Sämtliche Server werden regelmäßig synchronisiert, so dass die Auswahl eines Servers dem Benutzer freigestellt wird und eine äquivalente Auswahl bietet. UDDI bietet fünf Datenstrukturen an, über welche man die Suche und Registrierung durchführen kann. Da die UDDI-Verzeichnisse eine Analogie zu Telefonbüchern und den Gelben Seiten aufweisen, kann man von den Datenstrukturen auf eine höhere Sicht abstrahieren. Abbildung 8 zeigt die drei abstrakten Sichten von UDDI und die dahinter liegenden Datenstrukturen. Abstrakte Sicht: Datenstrukturen eines UDDI-Dokumentes: White businessEntity: Pages Top-Level-Struktur publisherAssertion <Wer?> Yellow businessService Pages <Was?> Green Pages bindingTemplate tModel <Wie?> Abbildung 8: Übersicht der Datenstrukturen in Beziehung zur abstrakten Sicht auf UDDI Die Sicht der weißen Seiten (White Pages) stellt das Unternehmen näher vor und liefert Informationen über Unternehmensname, Geschäftsadresse, Webseite und weitere Kontaktinformationen. Die Datenstruktur businessEntity speichert diese Daten. Die gelben Seiten (Yellow Pages) liefern genaue geografische Informationen, den Unternehmenstyp und seine Produkte, sowie Taxonomienummern, die in der Datenstruktur businessService gespeichert werden. Die grünen Seiten (Green Pages) beinhalten technische Informationen über den Service wie z.B. Netzwerkadresse und Anbindungsinformationen, sowie eine Referenz zu einem WSDL-Dokument. Diese Daten werden in der Datenstruktur bindingTemplate gehalten. Des Weiteren gibt es noch die Datenstruktur publisherAssertion, die Informationen über Beziehungen zwischen verschiedenen Unternehmen bietet. Schließlich erweitern tModels die Datenstruktur bindingTemplate und liefern eine Kollektion von Informationen über den Service und technische Informationen. [New02b] Somit bietet UDDI ein globales Verzeichnis zum Registrieren und Suchen von Services, das nicht nur auf Web-Services eingeschränkt ist. Die Web Service Inspection Language (WS-Inspection) von IBM und Microsoft bietet eine Alternative zu UDDI zum Suchen von Web-Services im Internet. Der aus- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 39 schlaggebende Punkt für diese neue Entwicklung parallel zu UDDI ist dessen Komplexität und hoher Anspruch. WS-Inspection bietet eine einfachere Registrierung von Services, in der neben WSDL auch UDDI-basierte Beschreibungselemente eingebettet werden können. Eine ausführliche Beschreibung von WS-Inspection findet der interessierte Leser unter [BEG+03]. 2.6 SOAP SOAP wurde 1998 von Microsoft unter dem Namen Simple Object Access Protocol1 entwickelt. Danach stießen einige weitere Unternehmen, wie z.B.: IBM, Lotus und Ariba, hinzu und im Mai 2000 veröffentlichte das W3C SOAP 1.1 als Note. Im Juni 2003 wurde schließlich SOAP 1.2 als W3C Recommendation verabschiedet [Mit03]. SOAP definiert einen Plattform- und Programmiersprachenunabhängigen Protokollstandard zum typisierten Datenaustausch zwischen Applikationen in dezentralisierten, verteilten Umgebungen. SOAP packt dazu die vorliegenden Daten in ein protokollspezifisches XML-Format und sendet die Daten über bestehende Transport-Protokolle, wie z.B. HTTP, FTP, SMTP oder BEEP. SOAP hat demnach den Vorteil gegenüber CORBA, RMI und DCOM, dass es nicht an ein spezifisches Transport-Protokoll oder eine Sprache gebunden ist und über Systemgrenzen mit anderen Applikationen Daten austauschen kann. Die Definition des W3C verdeutlicht nochmals diesen Aspekt: “SOAP Version 1.2 (SOAP) is a lightweight protocol intended for exchanging structured information in a decentralized, distributed environment. It uses XML technologies to define an extensible messaging framework providing a message construct that can be exchanged over a variety of underlying protocols. The framework has been designed to be independent of any particular programming model and other implementation specific semantics.” [GHM+03] Nachfolgend wird der Aufbau einer SOAP Nachricht und deren Hauptkomponenten erklärt und in Abbildung 9 illustriert. 1 Der Name suggeriert allerdings, dass das Übertragungsprotokoll zum Austausch von Objekten entwickelt wur- de. Allerdings werden alle Daten in XML serialisiert und übertragen. Deshalb schlug das W3C eine Namensänderung vor (u. a. XML Protocol). Die Abkürzung SOAP hatte sich allerdings schon so verbreitet und etabliert, dass beschlossen wurde lediglich die Abkürzung von nun an als Namen zu verwenden. 40 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. SOAPMessage SOAP-Part Envelope Header (optional) Body Attachment-Part (1..*) MIME Header Content Abbildung 9: Aufbau einer SOAP-Nachricht Eine SOAP-Nachricht besteht aus einem SOAP-Part und optional aus beigefügten Anhängen („Attachment-Part“ in Abb. 9). Der im SOAP-Part befindliche Umschlag („Envelope“ in Abb. 9) besteht wiederum aus einem optionalen Kopf („Header“ in Abb. 9) und einem vorgeschrieben Körper („Body“ in Abb. 9). Der Kopf enthält Applikations-spezifische Informationen, die Angaben zur Authentifizierung, Autorisierung, Kostenabrechnung, Angabe von Zwischenempfängern und allgemeine Routinginformationen der Nachricht enthalten. Der Körper enthält die in XML-Syntax angegebene Nachricht mit den Nutz- und Anwendungsdaten, die gesendet werden soll. Dabei kann der Inhalt des Körpers auf zwei Arten interpretiert werden. Erstens kann der XML-Inhalt des Körpers Dokumentenbasiert (Document/literal) interpretiert werden. Der Inhalt des Körpers wird als Ganzes dem Empfänger übermittelt, der eine Auswertung des Inhalts vornimmt und die Daten ausliest. Zweitens kann der Körper als Remote Procedure Call (RPC/encoded) interpretiert werden. Dabei wird spezifiziert, ob es sich bei der SOAP-Nachricht um eine Anfrage, Antwort oder Fehlermeldung handelt. Dabei liegen die einzelnen Parameter der SOAP-Nachricht kodiert vor. Optional kann einer SOAP-Nachricht ein Anhang hinzugefügt werden. Sämtliche Daten innerhalb des Umschlags werden XML-basiert dargestellt. Durch Hinzufügen eines Anhangs können die Daten oder auch komplette Dateien nicht nur in XML kodiert vorliegen, sondern auch im ursprünglichen binären Format erhalten bleiben. Die Daten werden im MIME-Format (Multipurpose Internet Mail Extensions) [RFC2045] mit Angabe des Typs im Kopf des Anhangs übertragen [ABB+04]. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 41 2.7 Zusätzliche Technologien In diesem zweiten Kapitel wurden die wichtigsten Standards erläutert und spezifiziert. Zur Komplettierung und marktreifen Einführung der Web-Service-Architektur müssen noch zusätzliche Technologien herangezogen werden. Im Bereich Sicherheit, Prozess-Fluss, Transaktionskoordination und Routing von Nachrichten gibt es bereits eine große Anzahl von Technologien und Standards, auf die u. a. Eric Newcomer in seinem Buch „Understanding Web Services“ [New02a] hinweist. Auf die einzelnen Technologien wird in dieser Arbeit nicht eingegangen, lediglich inhaltlich sollen hier einige offene Punkte angesprochen werden, wobei keine vollständige Auflistung aller eingesetzter Verfahren durchgeführt wird. Weitere Informationen können aus den Literaturangaben entnommen werden. Beim Austausch geschäftssensibler Daten muss ein hoher Wert auf Sicherheit gelegt und dementsprechende Technologien eingebettet werden. Da SOAP-Nachrichten zwischen Web-Services primär über HTTP gesendet werden, passieren sie Firewalls über Port 80 (es kann auch ein anderer Port spezifiziert werden). Somit stellen die übertragenen Daten eine Sicherheitslücke dar, da Angriffe auf lokale Systeme gestartet werden können. Daher müssen Web-Services um sicherheitsrelevante Protokolle erweitert werden, damit ein sicherer Betrieb gewährleistet werden kann. Stellvertretend für eine Fülle von Sicherheitsprotokollen kann HTTP over Secure Socket Layer (HTTP over SSL, auch HTTPS genannt) zur Authentifikation und Autorisation der Teilnehmer verwendet werden und SOAP über HTTPS gesendet werden [RFC2818]. Ein weiteres Authentifizierungssystem ist die Security Assertions Markup Language (SAML) von der OASIS Initiative [MPM04]. XML Key Management Specifikation (XKMS) bietet ein Verschlüsselungsverfahren für die gesendeten Daten an [FBF+01]. Ebenso müssen Web-Services in den Geschäfts-Prozess-Fluss (Bussiness Process Flow) automatisch eingebettet werden. Die Mächtigkeit von Web-Services liegt u. a. in der losen Orchestrierung verschiedener Services, die zusammen eine Aufgabe erfüllen. Zur Einbettung einzelner Web-Services in den Geschäfts-Fluss kann XLANG von Microsoft [Tha01] oder die Web Service Flow Language (WSFL) zur Beschreibung von Workflows herangezogen werden [Ley01]. Bei der Zusammenarbeit von Web-Services besteht immer die Möglichkeit, dass einer davon seinen Dienst nicht erfüllen kann. Bei einem Reise-Reservierungssystem können z. B. verschiedene WebServices für die Reservierung von Hotel, Auto und Flug zuständig sein. Scheitert allerdings der Service zur Flugreservierung, benötigt der Benutzer auch kein Hotel und Auto vor Ort. Aus diesem Grund sollte ein Transaktionsmanagement für zusammengehörige Web-Services eingeführt werden. Da HTTP ein unzuverlässiger, nicht Verbindungs-orientierter Transportdienst ist, müssen zusätzliche Protokolle länger laufende Transaktionen überwachen und managen. Das Business Transaction Protocol (BTP) kann diese Koordinierung in einem gesamten Transaktionskontext bewerkstelligen [CDF+02]. Schließlich wäre eine zuverlässige Nachrichtenübertragung mit garantierten Übertragungen und zuvor festgelegten Quality of Service-Aspekten (QoS) wünschenswert. Für die zuverlässige Übertragung 42 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. kann hier das Blocks Extensible Exchange Protocol (BEEP) [RFC3080] oder Reliable HTTP (HTTPR) [BCC+04] eingesetzt werden. Im Gegensatz zu den Kerntechnologien (WSDL, SOAP und UDDI) hat sich im Bereich der zusätzlichen Technologien für Web-Services noch kein einheitlicher Standard herauskristallisiert. Aus diesem Grund kann nach Etablierung einiger Technologien der Protokoll-Stack von Web-Services, der in Abbildung 1 vorgestellt wurde, durch einige der genannten Technologien erweitert werden. 2.8 Zusammenfassung Nachdem im ersten Kapitel auf Web-Services, deren Entwicklung und neue Rolle in der verteilten, internetbasierten Softwareentwicklung eingegangen wurde, betrachtet das zweite Kapitel die technische Seite von Web-Services näher. Ein Web-Service ist demnach ein verteiltes Software-System zur Maschinen-gesteuerten Interaktion über Netzwerke. Ein Web-Service bietet eine XML-basierte Schnittstellenbeschreibung an, mit der die ausgetauschten Daten und Datentypen festgelegt werden. Der Datenaustausch kann unabhängig von Plattform, Programmiersprache oder Betriebssystem über gängige Transport-Protokolle wie z.B. HTTP durchgeführt werden. Jeder Web-Service ist modular aufgebaut und kann beliebig kombiniert werden mit weiteren Web-Services. Diese Service-orientierte Architektur bietet eine lose Kopplung von Web-Services je nach anstehendem Problem. Nach dieser Definition von Web-Services und der Einordnung wurden die grundlegenden Technologien vorgestellt. Die Markupsprache XML dient als Grundlage sämtlicher Standards, derer sich Web-Services bedienen. Mit Hilfe von XML werden die Daten strukturiert und in wohlgeformten Ausdrücken zur weiteren Verarbeitung bereitgestellt. In der XML Schema Definition Language (XSD) wird das Format der einzelnen einfachen und komplexen Datentypen näher spezifiziert. Da XSD erweiterbar ist, können damit beliebige eigene Datentypen spezifiziert werden. Kapitel 4.3 wird darauf nochmals im Detail Bezug nehmen. Anschließend wurde WSDL vorgestellt. WSDL beschreibt die Schnittstelle eines Web-Service und bietet Maschinen als auch Anwendern eine Schnittstelle zu diesem und definiert die Kommunikation zwischen beiden. Um die Komplexität innerhalb eines WSDL-Dokumentes zu beschränken, die Wiederverwendung zu erhöhen und die Lesbarkeit zu steigern, wurde durch den Import-Mechanismus die Möglichkeit zur Auslagerung einzelner XSD- und WSDL-Komponenten ermöglicht. Da WSDL als Ausgangsdokument zur Generierung einer GUI herangezogen wird und somit zentrales Thema dieser Diplomarbeit ist, greift Kapitel vier nochmals auf WSDL zu. Schließlich wurden die beiden Technologien SOAP und UDDI vorgestellt, die zusammen mit WSDL die drei Haupttechnologien in der Web-Service-Architektur bilden. UDDI stellt Strukturen zum Publizieren und Finden von Web-Services bereit. Einerseits beschreibt ein Service-Anbieter seinen Service in UDDI und kann ihn in einem Service-Verzeichnis veröffentlichen. Anderseits kann ein Service- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 43 Nutzer über UDDI nach Web-Services suchen. Nachdem ein Web-Service gefunden wurde, muss ein Datenformat für die auszutauschenden Daten festgelegt werden. SOAP spezifiziert ein solches Datenformat zum XML-basierten Datenaustausch. Im letzten Unterkapitel wurden einige ergänzende Technologien vorgestellt. Um die Architektur von Web-Services zu komplettieren, müssen in den Bereichen Sicherheit, Prozess-Fluss, Transaktionskoordination und Routing von Nachrichten weitere Standards zu den bestehenden hinzugefügt werden. 44 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Kapitel 3: Einordnung der Arbeit Nachdem im vorigen Kapitel die theoretischen Grundlagen und Technologien der Web-ServiceArchitektur erläutert wurden, werden nun in diesem Kapitel einige Grundlagen zur Realisierung von Web-Services vorgestellt. Unterkapitel 3.1 stellt das Projekt Axis und dessen Werkzeug WSDL2Java vor. Das Projekt Axis der Apache Foundation stellt ein Framework zur Generierung von Client- und Server-Software zur Verfügung. Mit Hilfe des Werkzeugs WSDL2Java, das zur Realisierung des Prototypen verwendet wurde, kann aus einem WSDL-Dokument Java-Code generiert werden. Sun Microsystems bietet ebenfalls ein Werkzeug zur Code-Generierung aus WSDL an. Das Werkzeug wscompile1 wird innerhalb des Web Service Developer Pack (WSDP) angeboten. Daher findet im Unterkapitel 3.2 ein Vergleich zwischen WSDL2Java und wscompile des Web Service Developer Pack von Sun Microsystems statt. Die Open Source Gemeinschaft Sourceforge.net bietet eine Plattform für Entwickler, die ebenfalls ein Werkzeug namens „wsdlgenerator“ zur automatischen Code-Generierung entwickeln. Allerdings befindet sich das Projekt noch in der Entwicklung und konnte daher nicht zum Vergleich herangezogen werden. Anschließend befasst sich Unterkapitel 3.3 mit den unterschiedlichen Möglichkeiten, einen Client in einen Web-Service einzubinden. Dieser kann über Stubs, Dynamic Proxy oder Dynamic Invocation Interface (DII) auf entfernte Methoden eines Web-Service zugreifen. Das JAX-RPC-Package dient dabei als Grundlage, um entfernte Methoden eines Web-Service auszuführen. Daher wird das JAXRPC-Package ebenfalls vorgestellt. Nachfolgend wird die neue Technologie Web Service for Remote Portlets (WSRP) von OASIS eingeführt. Mit WSRP können grafische Oberflächen innerhalb von Portalen für Web-Services dargestellt werden. Diese Technologie hat eine ähnliche Zielsetzung wie diese Diplomarbeit. Daher wird neben der Vorstellung dieser neuen Technologie ein Vergleich und eine Abgrenzung zur vorliegenden Arbeit durchgeführt. Schließlich wird im letzten Unterkapitel eine Zusammenfassung dieses Kapitels geliefert. 3.1 Apache Axis und WSDL2Java Das Apache EXtensible Interacion System (AXIS) der Apache Foundation wurde am 16.Juni 2003 in der Version 1.1 veröffentlicht. Version 1.2 liegt zurzeit (Dezember 2004) erst als Release Kandidat vor und wurde nicht in dieser Arbeit verwendet. Axis ist ein Nachfolgeprojekt der Apache SOAPImplementierung, die aus dem IBM Projekt SOAP4J hervorging. Die Open Source-Entwicklung Axis ist eine SOAP-Engine und stellt ein Framework zur Konstruktion von SOAP-Prozessoren, Clients, 1 Homepage von Sun Microsystems zum Download des WSDP mit wscompile: http://java.sun.com/webservices/downloads/webservicespack.html Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 45 Servern und Gateways zur Verfügung. Ursprünglich sollte das Framework unter dem Namen Apache SOAP 3.0 veröffentlicht werden, allerdings stand der Name des SOAP-Protokolls beim W3C noch nicht fest. Daher entschied man sich für den allgemein gehaltenen Namen Axis. Axis bietet eine APIUnterstützung an, um sowohl die Client- als auch die Serverseite eines Web-Service zu implementieren. In der vorliegenden Arbeit wird allerdings lediglich die Realisierung des Clients untersucht und die serverseitige Implementierung eines Web-Service außen vorgelassen. Die serverseitige Nutzung von Axis und die hier vorgestellten Funktionen können auf der Homepage des Projektes unter http://ws.apache.org/axis/ nachgelesen werden. Axis ist zum einen ein Standalone-Server, kann aber andererseits auch in bestehende Server integriert werden. AXIS unterstützt SOAP 1.1, teilweise auch SOAP 1.2, und generiert aus WSDL 1.1 Java-Code und umgekehrt. Mit zwei integrierten Werkzeugen kann mit JAVA2WSDL aus Java Beans ein WSDL-Dokument generiert werden. WSDL2Java generiert umgekehrt aus WSDL-Dokumenten Java-Klassen. Zusätzlich bietet das Framework zwei weitere Werkzeuge an: TCPMonitor und SOAPMonitor. Der TCPMonitor kann in den Kommunikationskanal zwischen Client und Server eingeklinkt werden. Bevor der Client eine Anfrage an den Server sendet, passieren die SOAP-Nachrichten den TCPMonitor und werden zum Debugging angezeigt. Ebenso können Antworten vom Server zuerst im TCPMonitor dargestellt werden, bevor der Client sie verarbeitet. Während der TCPMonitor ständig den Port nach ein- und ausgehenden Nachrichten abhört, wird der SOAPMonitor über einen speziellen Handler über auftretende SOAP-Nachrichten informiert. Der SOAPMonitor, der als Applet im Browser läuft, stellt dann ebenfalls die ein- und ausgehenden SOAP-Nachrichten dar. Die Wirkungsweise eines Handlers in diesem Framework wird im nächsten Abschnitt gesondert beschrieben. Intern verwendet AXIS einen SAX-Parser zum Parsen eines WSDL-Dokumentes. Beim Parsen von XML können prinzipiell zwei unterschiedliche Arten von Parsern mit spezifischen Eigenschaften eingesetzt werden. Daher werden die beiden Parserklassen DOM und SAX kurz vorgestellt und voneinander abgegrenzt. Das Document Object Model (DOM) ist ein vom W3C unterstützter Standard (Recommendation), welcher eine Plattform- und Programmiersprachen-unabhängige Schnittstelle bereit stellt. Mit dieser Schnittstelle werden Inhalt und Struktur von Baum-strukturierten Dokumenten (z.B. HTML, XML) extrahiert und modifiziert. Der DOM-Parser hat die Möglichkeit innerhalb des kompletten Dokumentes zu navigieren und Daten auszulesen oder zu manipulieren. DOM unterstützt aber kein Eventhandling und hält die Baumstruktur während des Parsens als Objektmodell im Hauptspeicher, was zu Effizienzproblemen führen kann. Zusätzlich kann die Überführung von DOMInterfaces in eine sprachliche Datenstruktur sehr komplex werden. Daher wurde eine einfachere API entwickelt. Das Simple API for XML (SAX) ist ein Ereignis-orientierter Parser, der mittels Events das Auftreten von gesuchten Elementen signalisiert. Mit einem SAX-Parser ist nur eine lineare Bearbeitung von Dokumenten möglich. Lediglich das referenzierte Element kann gelesen werden. Der größte Vorteil gegenüber dem DOM-Parser liegt in seiner besseren Effizienz. 46 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Axis wurde Transport-unabhängig entwickelt und kann unterschiedliche Protokolle, wie z. B. SMTP, FTP und HTTP zum Senden der SOAP Nachrichten verwenden, die jeweils an das vorliegende Protokoll durch einen SOAP-Sender und SOAP-Listener angepasst werden. Alle Basisdatentypen von XSD können auf Java-Datentypen abgebildet werden. Außerdem werden komplexe XSD-Daten durch eine Abbildungsvorschrift (Type Mapping System) auf Java-Klassen abgebildet. Vor dem Senden und dem Empfang von Nachrichten findet jeweils ein Serialisierungs- und Deserialisierungsprozess statt. Beim Serialisierungsprozess werden vor dem Senden die Java-Objekte in XML transformiert, beim Empfang in einem Deserialisierungsprozess werden die XML-Elemente auf Java abgebildet. Dadurch entsteht eine Unabhängigkeit der verwendeten Programmiersprache beim Anwender und WebService-Anbieter. Intern können beim Anwender Java-Objekte zum Speichern der Daten verwendet werden. Bevor diese Benutzerdaten allerdings zum Web-Service gesendet werden, müssen diese serialisiert vorliegen. Eigene (De-) Serialisierer können implementiert werden, um benutzerdefinierte Abbildungen zwischen Java und XML zu realisieren. SOAP kann Dokumenten-basierte und RPC-basierte Inhalte im Body führen, daher bietet Axis eine API-Unterstützung zum Auslesen der Daten beider Inhaltstypen an. Axis implementiert auf der einen Seite das JAX-RPC-Interface zum entfernten Prozeduraufruf und auf der anderen Seite auch das SAAJ-Interface1 zum Übertragen von Anhängen (Attachments). Das Mitführen von Anhängen bei einer SOAP-Nachricht ist allerdings noch fehlerhaft in der Version 1.1 und kann nur eingeschränkt verwendet werden. Abschließend wird der Kommunikationsvorgang eines Clients mit einem Web-Service und die Architektur von Axis in Abbildung 10 beschrieben. Abbildung 10: Client-Architektur der AXIS-Engine [Axis04] Die Axis-Engine besteht aus einer losen Kopplung von Handlern. Bevor eine Nachricht zu einem Web-Service gesendet wird, durchläuft diese zuerst intern eine Kollektion von Service-, Global- und Transporthandlern. Diese Reihenfolge muss aber nicht zwingend eingehalten werden und zudem kön1 SAAJ = SOAP with Attachments API for Java Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 47 nen Handler ausgelassen werden. Ein Handler ist eine wiederverwendbare, modifizierbare Klasse, die diverse Bearbeitungen mit der SOAP-Nachricht durchführt, bevor die Nachricht letztendlich über ein Transport-Protokoll gesendet wird. Um die Axis-Engine an eigene Bedürfnisse anzupassen, können in diese Kette von Handlern weitere eingereiht werden. So kann z. B. ein Authorisationshandler einer Nachricht Benutzerinformationen hinzufügen, ein Kompressionshandler kann die Daten der Nachricht vor dem Senden komprimieren oder ein Encryptionhandler kann die Daten verschlüsseln. Ebenso kann der weiter oben besprochene SOAPMonitor in diese Kette eingereiht werden, um die SOAPNachrichten in einem Applet anzuzeigen. Sämtliche Handler können über Konfigurationsdateien selbst angepasst werden. Die Axis-Engine übernimmt allerdings automatisch die Konfiguration und Aneinanderreihung der Handler, somit muss der Anwender nur bei speziellen Anforderungen Änderungen vornehmen. Bevor der Client eine Anfrage an den Web-Service richten kann, müssen zuvor alle Daten serialisiert und in eine SOAP-Nachricht verpackt werden. Diese SOAP-Nachricht wird durch einen MessageContext referenziert. Der MessageContext ist eine Struktur, die Referenzen auf die Anfrage- und Antwortnachricht besitzt. Zu Beginn des Sendevorgangs hat somit der MessageContext eine Referenz auf die Antwort, die aber noch keine Inhalte hat. Der Client übergibt den MessageContext samt Anfragenachricht an die Kette von Handlern. In der Abbildung 10 werden die Handler als kleine Zylinder dargestellt und die großen Zylinder präsentieren jeweils eine Kollektion von mehreren Handlern. Stellvertretend für die Modifikationen, die die einzelnen Handler durchführen, werden zwei Funktionen nochmals hervorgehoben: Der Servicehandler legt u. a. fest, ob der SOAP-Inhalt Dokumenten- oder RPC-basiert zu interpretieren ist. Der Transporthandler bestimmt das zu verwendende Transport-Protokoll. Nachdem der MessageContext durch die Handler modifiziert wurde, leitet der Sender die SOAP-Nachricht an den Web-Service weiter. Erreicht eine Antwort vom Web-Service die SOAP-Engine, so durchläuft sie in umgekehrter Reihenfolge die einzelnen Handler, bis sie schließlich die Client-Applikation erreicht und dort zur weiteren Verarbeitung vorliegt. Nach dieser Einführung in die Architektur von Axis soll nun das Werkzeug WSDL2Java vorgestellt werden. WSDL2Java Das Werkzeug WSDL2Java parst ein WSDL-Dokument und erzeugt Java-Klassen für Server und Client. Zur Erstellung des Prototypen werden allerdings nur die erzeugten Klassen für den Client benötigt, die in diesem Abschnitt erläutert werden. WSDL2Java kann als Systemprogramm ausgeführt werden oder über eine Java-API in ein bestehendes Java-Programm integriert werden. WSDL2Java generiert Stub-Klassen, über die ein Web-Service kontaktiert und Anfragen gestellt werden können. Zusätzlich werden für komplexe Datentypen eigene Klassen generiert, die zur Speicherung der Einga- 48 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. bedaten des Anwenders verwendet werden. Nachfolgend werden die generierten Klassen beschrieben. Das zugrunde liegende WSDL-Dokument ist im Anhang (Kapitel 8.4) zu finden. Für jedes Porttyp-Element wird ein Interface generiert. Der Name leitet sich aus dem Namen des Port-Elementes ab. Dieses Interface beschreibt für jede Operation eine Methode. Diese Methoden repräsentieren wiederum die Methoden des Web-Service. Das Interface stellt die Schnittstelle zum Web-Service da und wird daher auch Service Endpunkt Interface (SEI) genannt. Aus folgendem WSDL-Fragment wird die Klasse Bib.java generiert: <wsdl:portType name="Bib"> <wsdl:operation name="SearchBookByTitle"> <wsdl:input message="bookTitleRequest" name="bookTitleRequest"/> <wsdl:output message="bookTitleResponse" name="bookTitleResponse"/> </wsdl:operation> </wsdl:portType> <wsdl:message name="bookTitleRequest"> <part name="title" type="xsd:string"/> </wsdl:message> <wsdl:message name="bookTitleResponse"> <part name="book" type="bibNS:bookEntryData"/> </wsdl:message> Abbildung 11: WSDL-Fragment mit Porttyp- und Nachrichten-Element Die Klasse Bib.java beschreibt die Operation SearchBookByTitle durch folgende Methode: public BookEntryData searchBookByTitle(String title); Der Parameter title ergibt sich für diese Methode durch das Part-Element der eingehenden Nachricht. Der Parameter der ausgehenden Nachricht legt den Rückgabewert der Methode fest. Durch dieses Abbildungsschema werden für alle Operationen die entsprechenden Methoden generiert. Für jedes Anbindungs-Element wird eine Stub-Klasse generiert. Diese Stub-Klasse implementiert das Interface. Der Stub wird von der Axis-Engine als Stellvertreter (Proxy) für den Web-Service verwendet. Anfragen an den Web-Service werden an diesen Stub gerichtet, der dann anschließend die Anfrage weiterleitet. Der Name dieser Klasse setzt sich aus dem Namen des Port-Elementes und der Endung SOAPBindingStub.java zusammen, falls das SOAP-Protokoll als Binding verwendet wird. Ansonsten wird die Endung BindingStub.java ohne Bezeichnung für das verwendete Protokoll erzeugt. Innerhalb des Stubs wird nach der Übergabe der Parameter eine Serialisierung der Parameter durchgeführt, falls erforderlich. Erst danach wird die Anfrage durch die Handlerkette der Axis-Engine geleitet. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 49 Für das Service-Element des WSDL-Dokumentes werden zwei Klassen generiert. Einerseits ein weiteres Interface das seinen Namen aus dem Namen des Service-Elementes ableitet. Das Interface beinhaltet für jeden Port innerhalb des Service-Elementes eine get()-Methode, um den generierten Stub für den Port zu erhalten und eine get<Portname>Address()-Methode, um die Adresse des Ports als String zu erhalten. Außerdem wird eine Klasse generiert, die das Interface implementiert. Der Name dieser Klasse setzt sich aus dem Namen des Service-Elementes und der Endung Locator.java zusammen. Die Methoden des Interface werden implementiert und für jeden Stub wird eine Instanz erzeugt. Neben den get()-Methoden für jeden Port liefert die Methode getPorts() eine Kollektion mit allen Ports zurück. Abbildung 12 veranschaulicht nochmals alle generierten Klassen und ihre Beziehung zueinander. Service-Interface liefert implementiert Service-Locator Porttype-Interface implementiert erzeugt Bindingstub liefert Abbildung 12: Beziehung zwischen den generierten Klassen von WSDL2Java Der Service-Locator implementiert das Service-Interface und beinhaltet eine getPort()-Methode für jeden Port innerhalb des Service-Elementes. Der Service-Locator erzeugt jeweils einen Bindingstub für jeden Port. Dieser Bindingstub implementiert die Porttyp-Schnittstelle (PorttypeInterface) und repräsentiert lokal den entfernten Web-Service. Zusätzlich verfügt der Bindingstub über alle Methoden, die auf dem Web-Service auszuführen sind. Wenn der Client eine Anfrage an den Web-Service senden will, so wird die Anfrage an den zugehörigen Bindingstub gestellt, der die Anfrage dann weiterleitet. Neben diesen Klassen, die aus den Elementen des WSDL-Dokumentes generiert werden, erzeugt WSDL2Java auch Klassen für die XSD-Datentypen. Die generierten Klassen erhalten den Namen des komplexen Datentyps und werden in einem Package gespeichert, das sich aus dem Namensraum des Datentyps ableitet. Diese Namensableitungen werden im sechsten Kapitel nochmals untersucht, da es hier zu Namenskollisionen mit reservierten Namen in der Programmiersprache Java kommen kann. Jede Klasse besitzt eine get()- und set()-Methode, um die einzelnen Parameter zu setzen, bzw. zu erhalten. Zusätzlich beinhalten alle generierten Klassen Methoden, um den spezifischen Serialiser und Deserialiser zu erhalten, zwei Objekte dieses Typs auf Gleichheit zu testen, den Hashcode zu ermitteln und eine Methode, um die qualifizierten Namen der Parameter zu erhalten. Diese Methoden werden allerdings nicht weiter verwendet. Die qualifizierten Namen sind alle bekannt durch das Parsen des WSDL-Dokumentes und die Serialisierer werden im Prototypen in einer eigenen Klasse bereitgestellt. 50 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Lediglich die get()- und set()-Methoden werden als Speichermedium gebraucht für Benutzereingaben und Antworten vom Web-Service. Beispiel: <xsd:complexType name="Author"> <xsd:all> <xsd:element name="forename" type="xsd:Name"/> <xsd:element name="name" type="xsd:Name"/> </xsd:all> </xsd:complexType> Aus dem komplexen Datentyp Author wird die Klasse Author.java generiert. Diese Klasse enthält für jedes Element eine get()- und set()-Methode. Für das Element namens forename werden die Methoden getForename() und setForename(Name name) bereit gehalten. Im WSDL-Dokument können einzelne Parameter sowohl als input als auch output deklariert werden. Solche inout Parameter werden in einer speziellen Holder-Klasse gespeichert. Eine Holder-Klasse besitzt zusätzlich eine Instanz von sich selbst im Konstruktor. An dieser Stelle werden aber lediglich Parameter betrachtet, die entweder ein- oder ausgehende Parameter sind. Abschließend sei vermerkt, dass WSDL2Java nicht alle Funktionalitäten unterstützt, die durch WSDL 1.1 und XSD möglich wären. Dies mag zum Teil auch daran liegen, dass WSDL 1.1 kein verabschiedeter Standard des W3C ist. WSDL 1.1 wurde als „Note“ publiziert. Unter einem als „Note“ veröffentlichten Dokument des W3C wird ein Dokument bezeichnet, das einen formellen Zustimmungsprozess durchlaufen hat und veröffentlicht wird. Von Seiten des W3C gibt es keine Garantie der Weiterbearbeitung. Mittlerweile arbeitet eine Arbeitsgruppe an der Version WSDL 2.0, die als „Working Draft“ vorliegt. Hier behält es sich das W3C ebenfalls vor Veränderungen vorzunehmen. Daher bleibt es abzuwarten bis letztendlich WSDL als verabschiedeter W3C-Standard veröffentlicht wird. Erst dann können Werkzeuge genau darauf abgestimmt werden. Nicht unterstützte Funktionen werden im nächsten Kapitel aufgelistet und ein Vergleich mit wscompile von Sun Microsystems durchgeführt. 3.1.1 Vergleich von WSDL2Java mit wscompile von Sun Microsystems Nachdem nun das Werkzeug WSDL2Java vorgestellt wurde, soll nun ein Vergleich dieses Werkzeugs mit wscompile des Web Service Developer Pack von Sun Microsystems erfolgen. Dazu wurden einige Bewertungskriterien erstellt und diese mit beiden Werkzeugen untersucht. Nach dieser Testreihe wird der Vergleich der beiden Werkzeuge erörtert. In der folgenden Tabelle wurden in der linken Spalte einige Bewertungskriterien aufgelistet und daneben die beiden Werkzeuge. In der anschließenden Bewertung werden die wichtigsten Punkte nochmals aufgegriffen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Bewertungskriterien Einfache Datentyp-Abbildung WSDL2Java 51 wscompile Unterstützt alle 44 XSD- Nicht alle XSD-Datentypen Datentypen werden unterstützt, Abbildung auf Strings bei Nichtunterstützung (z.B.: gDay) Komplexe DatentypUnterstützung: -einfaches Feld (Array) -doppeltes Feld -Fassetten innerhalb von Fel- nein nein -Listen nein nein Fassetten innerhalb von <simp- Nein, generiert Klasse, aber Nein, bricht mit einer Fehler- leType> ohne get()-Methoden meldung ab - Pattern (spezielle Fassette) Nein, generiert separate Klasse Nein, Pattern wird als Stringpa- für Patternparameter rameter deklariert dern - Aufzählung (Enumeration) Generierte Klassen für Datentyp Eine Klasse pro Datentyp 2 oder 3 Klassen pro Datentyp, für jeden Datentyp eine Klasse mit Serialisierer Generierte Klassen für WSDL- Stub mit Serialisierer, Service- Stub und für jede Nachricht Elemente Locator (siehe oben) (input und output) eine Klasse API Eigene API vorhanden, Keine API vorhanden, wscom- WSDL2Java kann in Java inte- pile wird als System-Programm griert werden oder als System- gestartet Programm gestartet werden. Kompositor1 -all -choice Nein, generiert aber Klasse mit Nein, bricht Parsen ab allen get()- und set()-Methoden -sequence Holderklassen Abbildung 13: tabellarischer Vergleich von WSDL2Java und wscompile 1 Wird erst im Kapitel 4.4 eingeführt 52 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Beim Vergleich der beiden Werkzeuge fällt auf, dass beide nicht alle Bewertungskriterien erfüllen konnten. Das Werkzeug wscompile unterstützt nicht alle Datentypen. Erkennt das Werkzeug einen Datentyp nicht, so wird dieser auf einen String abgebildet. WSDL2Java hingegen kann alle Datentypen erkennen und bildet sie auf einen Java-Datentyp ab. WSDL2Java verfeinert sogar noch XSD-Datentypen, indem diese je nach den Binding-Informationen auf unterschiedliche Datentypen abgebildet werden. Der binäre Datentyp base64Binary könnte einfach auf ein byte[] abgebildet werden. Es findet aber eine Unterscheidung statt, welche Inhalte der binäre Datentyp repräsentiert. Wird ein Bild gespeichert, so wird base64Binary auf Image abgebildet, bei einer einfachen Textdatei auf String (genauere Betrachtung im fünften Kapitel). Ein weiterer Vorteil von WSDL2Java ist die Möglichkeit das Werkzeug über eine Java-API direkt in das Programm zu integrieren und von dort auszuführen. Ein Vorteil von wscompile mag sein, dass für jede ein- und ausgehende Nachricht eine eigene Klasse generiert wird. Dies könnte für manche Entwickler einen Vorteil bringen oder für gewisse Problemstellungen, wenn für sämtliche Nachrichten eine Klasse vorliegt. Für einfache Datentypen, die sich nicht innerhalb eines komplexen Datentyps befinden, bietet WSDL2Java keine Klassen zum Speichern an. Hier muss der Anwendungsentwickler selbst die Speicherung der Daten vornehmen. Wscompile hingegen bietet die Möglichkeit, alle Datentypen in diesen Klassen zu speichern in Korrelation mit der Nachricht. Für den Prototypen wurden allerdings separat für jeden einfachen Datentyp Klassen entwickelt mit grafischen Komponenten, so dass generierte Klassen überflüssig werden. Allerdings zeigt sich bei dem Werkzeug wscompile ein gravierender Nachteil. Bei einigen Kriterien bricht das Werkzeug mit einer Fehlermeldung ab und beendet nicht nur das Parsen des WSDLDokumentes, sondern es werden auch keine Klassen erzeugt. Innerhalb eines <simpleType> -Tag können Fassetten zu dem zugrunde liegenden Datentyp spezifiziert werden. WSDL2Java kann ebenfalls die Fassetten nicht erfassen und in der generierten Klasse verarbeiten. Allerdings bricht WSDL2Java nicht ab und erzeugt dennoch eine Klasse, die um die Funktionalität ergänzt werden muss, aber durchaus verwendet werden kann. Der letzte angeführte Punkt ist ausschlaggebend zur Bevorzugung von WSDL2Java gegenüber wscompile. Die wichtigste Funktionalität des Prototypen ist die generische Erstellung einer GUI aus einem WSDL-Dokument, welches vor der Laufzeit nicht bekannt ist und eine beliebige Komplexität aufweisen kann. Der Prototyp muss also davon ausgehen, dass das Werkzeug immer das Parsen erfolgreich beendet, damit es auf die Klassen zugreifen kann. Wscompile scheidet daher für die Verwendung für diesen Prototyp aus, weil es das Parsen nicht immer erfolgreich beendet. WSDL2Java zeigt zwar auch einige Schwachstellen auf, ist aber insgesamt gesehen besser geeignet und ausfallsicherer. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 53 3.2 Binding des Clients Nachfolgend werden drei unterschiedliche Arten beschrieben, wie ein Client an einen Web-Service gebunden wird. Der Client kann über Stubs, Dynamic Proxy oder das so genannte Dynamic Invocation Interface (DII) an einen bestehenden Web-Service gebunden werden und dessen entfernte Methoden aufrufen. Axis verwendet dazu das JAX-RPC-Package und erweitert dieses. Das JAX-RPC-Package ist eine „Java API for XML based Remote Procedure Calls“. Diese von Sun Microsystems veröffentlichte Programmierschnittstelle spezifiziert eine Java-API zum Ausführen von entfernten Methoden. Ein RPC simuliert lokal einen entfernten Prozeduraufruf über ein Netzwerk und ermöglicht das Ausführen einer Methode auf einem entfernten Rechner. Diese Programmierschnittstelle kann somit zur Entwicklung von Web-Services und Anwender-Applikationen verwendet werden. Der Datenaustausch zwischen beiden Parteien erfolgt über SOAP. Interne Daten müssen vor dem Sendevorgang nach XML serialisiert und nach dem Empfang wieder deserialisiert werden. Durch den Serialisierungsprozess können Anwender und Web-Service-Anbieter unterschiedliche Plattformen und Programmiersprachen verwenden. JAX-RPC verbirgt die Komplexität der Datentypabbildung für den Anwender und führt diese intern durch. Neben dem JAX-RPC-Package verwendet Axis ebenfalls SOAP with Attachments API for Java (SAAJ), um SOAP-Nachrichten mit Anhängen zu senden. SAAJ beschreibt auf einer niedrigeren, weniger abstrakten Ebene als JAX-RPC den Aufbau einer SOAP-Nachricht. Somit kann mit dieser API eine SOAP-Nachricht modelliert und Anhänge hinzugefügt werden. Im Anschluss werden nun die drei verschiedenen Arten des Bindings eines Clients in Anlehnung an das Java™ Web Services Developer Pack [OMM02] und The J2EE™ 1.4 Tutorial [ABB+04] vorgestellt und jeweils an dem Beispiel des Taschenrechner-Web-Service veranschaulicht. Stubs: Ein Stub ist so angelegt, dass der entfernte Methodenaufruf vereinfachend wie ein lokaler Methodenaufruf ausgeführt wird. Der Stub repräsentiert dabei das entfernte Objekt lokal auf dem Rechner, und der Client führt seine Methodenaufrufe auf dem Stub aus. Der Stub nimmt den Methodenaufruf entgegen und führt eine Serialisierung (auch Marshalling genannt) durch und leitet so den Aufruf an den Server weiter. Durch den Marshalling-Prozess wird der Methodenaufruf durch den Stub in das richtige Format umgewandelt und an den Server weitergeleitet. Es findet eine Typüberprüfung der Parameter statt, bevor der Methodenaufruf an den Server geschickt wird. Serverseitig nimmt eine so genannte Tie-Klasse (in diversen Quellen auch Skeleton genannt) den Methodenaufruf entgegen. Die Tie-Klasse wandelt die empfangene Nachricht in das verwendete Format, um (auch Unmarshalling genannt) und führt den Methodenaufruf aus. In einem umgekehrten Prozess werden dann alle Daten zurück an den Client gesendet. 54 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Wird ein Stub verwendet, so muss im Voraus bekannt sein, welche Parameter der Methodenaufruf benötigt, der Name der Methode und des Ports. Diese Informationen werden benötigt, um den Code zu schreiben. Liegen allerdings diese Informationen erst zur Laufzeit vor, so kann diese Art einen Client einzubinden nicht verwendet werden. Abbildung 14 veranschaulicht das Einbinden des Clients mit einem Stub. Der Service-Locator (service) und der Bindingstub (cal) sind generierte Klassen von WSDL2Java, die in Kapitel 3.1 allgemein vorgestellt wurden. 01: 02: 03: public class StubClient{ public static void main(String [] args) { try { 04: CalculatorService service = new CalculatorServiceLocator(); 05: Calculator cal = service.getCalculator(); 06: int result = cal.add(5, 3); 07: 08: System.out.println(“result of 5+3: “+result; } catch (Exception e) {…} Abbildung 14: Code des Stub-Client In Zeile 4 wird zunächst eine Instanz des Service-Locators erzeugt. Der Service-Locator implementiert das Service-Interface und dessen getPort()-Methoden. Diese Instanz besitzt also für jeden Port des Services eine get()-Methode, die den gewünschten Stub des vorliegenden Ports liefert. In Zeile 5 wird die Methode getCalculator() aufgerufen, die nun den lokalen Stub zum Einbinden des Clients liefert. Da der Name des Ports bekannt ist, kann direkt getCalculator() aufgerufen werden, anstatt sich mit getPorts() erst alle Ports liefern zu lassen, um dann über Namensvergleiche den richtigen Port zu finden. Auf diesem Stub kann man nun die beiden Methoden add() und subtract() des Web-Service aufrufen. In diesem Beispiel wurde in Zeile 6 die Methode add() ausgeführt mit den beiden Ganzzahlwerten 5 und 3. Nach Aufruf dieser Stubmethode findet ein Marshalling-Prozess statt und das Weiterleiten der Daten an den Server. Der Server bearbeitet diesen Aufruf und schickt das Ergebnis zurück zum Stub. In Zeile 7 kann nach Erhalt des Ergebnisses dieses ausgegeben werden. Dynamic-Proxy: Eine Dynamic-Proxy-Klasse benötigt keine erzeugten Stubs, sondern lediglich das Service-EndpunktInterfaces (SEI), das von WSDL2Java generiert wird. Bei der Entwicklung des Anwender-Programms muss also der benutzte Web-Service, die verwendete Methode mit Parametern und dessen ServiceInterface bekannt sein. Der Name des Ports muss hingegen bei der Erstellung des Codes nicht bekannt sein. Diese Informationen können zur Laufzeit aus dem WSDL-Dokument extrahiert werden. Die Proxy-Klasse erzeugt einen dynamischen Proxy zur Laufzeit durch die Methode getPort() des SEI. Das JAX-RPC-Package enthält die abstrakte Klasse ServiceFactory. Mit dieser Klasse kann man durch die Methode createService() ein neues Service-Objekt erzeugen. Die Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 55 ServiceFactory benötigt lediglich die URL des WSDL-Dokumentes und den Servicenamen. Das erzeugte Service-Objekt bietet eine Schnittstelle auf den dahinter liegenden entfernten Web-Service. Zum Aufruf einer Operation des Services wird die dynamisch erzeugte Proxy-Klasse verwendet. Abbildung 15 zeigt einen Ausschnitt aus dem Dynamic-Proxy-Client-Programm des TaschenrechnerWeb-Service1. 01: import javax.xml.namespace.QName; 02: import javax.xml.rpc.*; 03: public class DynamicProxyClient { 04: public static void main(String [] args) { 05: try { 06: String wsdlUrl = "http://www.icsy.de/Calculator.wsdl"; 07: String nameSpaceUri = "http://www.icsy.de/Cal"; 08: String serviceName = "CalculatorService"; 09: String portName = "Add"; 10: ServiceFactory serviceFactory = ServiceFactory.newInstance(); 11: Service service = serviceFactory.createService(new java.net.URL(wsdlUrl),new QName(nameSpaceUri, serviceName)); 12: CalculatorServiceIntf proxy = (CalculatorServiceIntf) service.getPort(new QName(nameSpaceUri, portName), CalculatorServiceIntf.class); 13: System.out.println(“result= " + proxy.add(5, 3)); 14: } catch (Exception e) {…} Abbildung 15: Code des Dynamic-Proxy-Client In Zeile 6 bis 9 wurden zum besseren Verständnis des Programms einzelne Variablen mit Werten aus dem WSDL-Dokument deklariert. Diese Werte könnten auch erst zur Laufzeit feststehen und dann direkt an die entsprechenden Methoden geleitet werden. Zunächst wird in Zeile 10 eine neue Instanz einer ServiceFactory erzeugt. Diese Factory erzeugt dynamisch in der nächsten Zeile einen Service (javax.xml.rpc.Service) durch Übergabe der URL des WSDL-Dokumentes und dem qualifizierten Namen des Web-Service. In Zeile 12 wird schließlich der Dynamic-Proxy(proxy) durch die getPort()-Methode des Service erzeugt. Diese Methode benötigt als Parameter den Portnamen und das Service-Interface. Die von WSDL2Java erzeugte Klasse wird hier übergeben. Der DynamicProxy wird erzeugt und stellt den implementierten Service lokal dar. Auf diesem Proxy können nun die einzelnen Operationen, die der Service zur Verfügung stellt, ausgeführt werden. In dem Beispiel wird in Zeile 13 die Operation add() durch Übergabe zweier Ganzzahlwerte ausgeführt und das Ergebnis dargestellt. 1 Zur übersichtlicheren Darstellung wurden einige Namen gekürzt, das zugrunde liegende WSDL-Dokument im Anhang enthält die kompletten Namensangaben 56 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Dynamic Invocation Interface: Das Dynamic Invocation Interface (DII) bietet die Möglichkeit entfernte Methoden eines Web-Service auszuführen, ohne dessen Namen und Adresse bei der Erstellung des Anwenderprogramms zu kennen. Zur Erstellung des Programm-Codes werden keine Informationen über den Web-Service benötigt. Zur Laufzeit werden lediglich Informationen über die URL des Web-Service, den Portnamen, den Namensraum des Services, den Operationsnamen und die Parameter erforderlich. Diese Informationen sind alle im WSDL-Dokument enthalten und können vor dem Ausführen des Aufrufs extrahiert werden. Durch die dynamische Übergabe der Parameter zur Laufzeit kann allerdings keine Typüberprüfung durchgeführt werden. Diese Überprüfung muss im Vergleich mit den Parameterangaben innerhalb des WSDL-Dokumentes geschehen. Der entfernte Methodenaufruf wird über ein Call-Objekt (javax.xml.rpc.Call) ausgeführt. Das Service-Objekt erzeugt mit der Methode createCall() ein Call-Objekt, das eine speicherinterne Repräsentation des WSDL-Dokumentes bereit hält und den Web-Service beschreibt. Das Call-Objekt besitzt mehrere get()- und set()-Methoden zum Setzen der Operationsnamen, Eingabeparameter, Rückgabeparameter, Rückgabetyp, ServiceEndpunkt-Adresse und Porttyp. Zwei der vier vorgestellten Transmissions-Primitiven von WSDL werden vom Call-Objekt unterstützt (siehe Kapitel 2.4). Ein synchroner Request-Response kann über die Methode invoke(Object[])durchgeführt werden. Der Client sendet eine Anfrage an den Web-Service und wartet auf dessen Antwort. Neben der Möglichkeit eines Request-Response kann über das Call-Objekt eine One-Way-Nachricht gesendet werden durch Aufruf der Methode invokeOneWay(Object[]). Bei dieser Transmissions-Primitive sendet der Client eine Nachricht an den Server ohne eine Rückmeldung zu erhalten. Nach dem Absenden ist der Client nicht blockiert, da er auf keine Antwort wartet, und kann im Programmfluss weiterfahren. In einem Objektfeld(Object[]) werden dem Call-Objekt alle Parameter der Operation übergeben. Wie bereits im vorigen Unterkapitel erwähnt, wird für jeden komplexen Datentyp durch das Werkzeug WSDL2Java eine eigene Klasse generiert. Jede Java-Klasse Class erbt von Object. Somit können alle Parameter über ein Object[]dem Call-Objekt übermittelt werden (alle einfachen Datentypen werden ebenso durch eine Klasse präsentiert, die von Objekt erbt). Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 57 Abbildung 16 zeigt für das Taschenrechner-Beispiel einen DII-Client. 01: import javax.xml.rpc.Call; 02: import javax.xml.rpc.Service; 03: import javax.xml.namespace.QName; 04: public class AddClient { 05: 06: public static void main(String [] args) { try { 07: ServiceFactory factory = ServiceFactory.newInstance(); 08: Service service = factory.createService(newQName(service)); 09: Call call = (Call) service.createCall(); 10: call.setOperationName(new QName(namespace, operation)); 11: call.setTargetEndpointAddress(new URL(endpoint) ); 12: Integer ret= (Integer)call.invoke(new Object[]{op1,op2}); 13: 14: System.out.println(“result = " + ret); } catch (Exception e) {… } Abbildung 16: Code des DII-Client Die Werte für alle unterstrichenen Parameter entstammen dem WSDL-Dokument und werden erst zur Laufzeit festgelegt. Zunächst wird in Zeile 7 eine neue Instanz der ServiceFactory erzeugt. Mit dieser Instanz wird ein Service-Objekt generiert mit dem qualifizierten Namen des Web-Service. Auf dem Service-Objekt kann dann in Zeile 9 mit der Methode createCall() ein CallObjekt zum vorliegenden Service gebildet werden. Auf dem Call-Objekt werden einige der oben genannten set()-Methoden ausgeführt. In Zeile 10 wird der Operationsname gesetzt und in Zeile 11 wird die Adresse des Web-Service benannt. Danach kann auf dem Call-Objekt das Object[] mit den Parametern übergeben werden. In diesem Fall werden die beiden Ganzzahlwerte übergeben. Es wird ein Request-Response-Aufruf durchgeführt und das Programm unterbricht, bis es die Antwort vom Server erhalten hat. Danach findet in Zeile 12 ein Cast des Rückgabewertes statt, um das Ergebnis in der nächsten Zeile auszugeben. 3.3 Related Work: WSRP von OASIS Web Service for Remote Portlets (WSRP) ist seit August 2003 in der Version 1.1 ein Standard von OASIS. Der Standard geht u. a. aus der Zusammenlegung zweier weiterer Standards hervor, die sich mit einer ähnlichen Problemstellung beschäftigten. Zum einen die Web Services Experience Language (WSXL) von IBM [DLW02] und zum anderen dem Web Service User Interface (WSUI) [ACM01]. In Anlehnung an das Whitepaper von OASIS [DFLS02] und deren Spezifikation [KLT03] wird dieser neue Standard vorgestellt und anschließend von der Herangehensweise in dieser Diplomarbeit abgegrenzt. Zur grafischen Darstellung eines Web-Service in Portalen musste man bisher für jeden WebService eine eigene GUI entwickeln. Oft war zusätzlich die Entwicklung mehrerer GUI-Versionen für unterschiedliche Portalhersteller von nöten. In der bisherigen Entwicklung von Web-Services themati- 58 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. sieren die Technologien und Standards hauptsächlich die Darstellung der Daten, Datenstrukturen und Austauschformate. Für eine grafische Darstellung der Daten gibt es noch keine Standardisierung. In Abbildung 17 wird dieser Aspekt verdeutlicht. In diesem Beispiel wird der Ausdruck „Datenorientierter Web-Service“ verwendet. Dabei handelt es sich um herkömmliche Web-Services, die auch in dieser Arbeit als Grundlage dienen. Durch Hervorhebung der Datenorientierung wird verdeutlicht, dass bei diesen Web-Services die Daten und nicht die Präsentation im Vordergrund stehen. Abbildung 17: Daten-orientierter Web-Service [DFLS02] In der Abbildung wird anhand zweier Web-Services (Aktienkurs- und Wetterdienst-Web-Service) dargelegt, dass für jeden Web-Service zur grafischen Darstellung eine eigene GUI erzeugt werden muss. Mit steigender Anzahl von einzubindenden Web-Services steigt natürlich auch proportional der Programmieraufwand zur Erstellung der GUI. Dieses Problem der Portal-Betreiber soll durch den WSRP-Standard gelöst werden. Durch WSRP werden Web-Services durch ein Benutzerinterface erweitert, welches der Anbieter entwickelt und zur Verfügung stellt. In Abbildung 18 wird diese Erweiterung grafisch veranschaulicht. Abbildung 18: WSRP-Erweiterung für Web-Services [DFLS02] Der Entwickler eines Web-Service erstellt nach dieser Spezifikation neben dem eigentlichen Service noch GUI-Informationen. Diese GUI ist aus parametrisierten Markup-Fragmenten aufgebaut, die in eine generische GUI innerhalb eines Portals eingebettet wird. Die GUI des Portals benutzt die Markup-Fragmente des Web-Service, um dessen Elemente grafisch darzustellen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 59 Das Hauptziel von WSRP ist es also, statt der Entwicklung von Daten-orientierten, klassischen WebServices zu Präsentations-orientierten Web-Services zu wechseln. Diese können leichter in bestehende Portale integriert werden. Auf der einen Seite entsteht durch diesen neuen Standard eine Arbeitserleichterung für Portalentwickler, die lediglich neue Services integrieren müssen, statt eine komplette GUI zu entwickeln. Zusätzlich kann der Web-Service-Anbieter seine eigene GUI entwickeln und so gezielt Schwerpunkte setzen oder Editierhilfen anbieten. Der Anbieter kann alle Komponenten nach Belieben auf der Seite platzieren und dadurch eine strukturierte Oberfläche entwickeln. Aus marktwirtschaftlicher Sicht bietet sich der weitere Vorteil, eigene oder externe Werbung einzubauen, wodurch neue Einnahmequellen entstehen. Auf der anderen Seite entsteht für Web-Service-Anbieter mehr Programmieraufwand. Hauptsächlich müssen Updates für alte Web-Services vorgenommen werden, um sie konform mit dem neuen Standard zu halten. Es besteht die Gefahr, dass dadurch eine der wichtigsten Eigenschaften von WebServices verloren geht, nämlich deren Interoperabilität zwischen diversen Web-Services. Nicht nach diesem neuen Standard entwickelte Web-Services können dadurch nicht mehr in Portale integriert werden, was die Komposition mehrerer Web-Services einschränkt. Die Einführung soll erst in ein paar Jahren erfolgen, was zur Folge hat, dass bis dahin die Menge an Web-Services weiter gestiegen ist und evtl. neue Standards zwischenzeitlich entstehen. Der Hauptunterschied zur vorliegenden Diplomarbeit besteht in der Erweiterung der Web-ServiceStandards. Bei der Lösung mit WSRP muss sich dieser Standard erst etablieren bzw. davor erst fertig spezifiziert werden. Außerdem stellt der Standard einen erheblichen Mehraufwand bei der Entwicklung von Web-Services dar und beschränkt sich zurzeit auf die grafische Darstellung in Portalen. Der Ansatz zur grafischen Darstellung von Web-Services in dieser Arbeit verwendet nur existierende, etablierte Standards. Schnittstellen eines Web-Service werden in WSDL spezifiziert, um den genauen Datenaustausch und Datentypen festzulegen. Daher liegt es nahe, dieses ohnehin schon vorhandene Dokument zur grafischen Präsentation von Web-Services heranzuziehen. Das WSDL-Dokument beinhaltet alle Daten, die der Anwender mit dem Web-Service-Anbieter austauscht und zusätzlich auch das Format der Datentypen. Da WSDL auf XML aufbaut, kann somit das WSDL-Dokument geparst werden, um so generisch eine GUI aufzubauen. Neben der generisch erstellten Präsentation, beinhaltet das WSDL-Dokument sämtliche in XSD angegebene Validierungsangaben zu den einzelnen Datentypen. Bei WSRP soll die Validierung möglichst Anwender-nah durchgeführt werden durch Verwendung von XForms im Browser. XForms sind XML-basierte Eingabefelder, die die Funktionalität von HTML-Formularen erweitern. Bei der Generierung der GUI direkt aus dem WSDL-Dokument kann die Validierung direkt eingebettet werden und erspart dem Anwender die Benutzung von XForms, die zurzeit ohnehin nicht von jedem Browser unterstützt werden. 60 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 3.4 Zusammenfassung Das dritte Kapitel beschäftigt sich mit der praktischen Einbettung eines Clients und den benutzten Werkzeugen dazu. Das Framework Axis der Apache Foundation bietet mit WSDL2Java ein Werkzeug an zum Generieren von Java-Code aus einem WSDL-Dokument. Besonders von Interesse für die Erstellung des Prototypen ist die Generierung von Java-Klassen für komplexe Datentypen. Diese Klassen werden als Objekte zum Speichern der Daten während des Editiervorgangs verwendet. Die Daten werden vor dem Senden einer Anfrage aus den Klassen ausgelesen und in XML serialisiert, damit sie innerhalb einer SOAP-Nachricht an den Web-Service gesendet werden können. Anschließend wurden die beiden Werkzeuge WSDL2Java und wscompile des WSDP verglichen. Durch eine Reihe von praktisch durchgeführten Tests konnte der Vorteil von WSDL2Java gegenüber wscompile aufgezeigt werden. Das Werkzeug wscompile bricht bei einigen XSD-Elementen mit einer Fehlermeldung ab und kann deswegen nicht verwendet werden. Daraus resultiert die Entscheidung für WSDL2Java beim Entwurf für den Prototypen. Danach wurde das JAX-RPC-Package vorgestellt. Diese Java-API dient als Grundlage zum Aufruf einer entfernten Methode eines Web-Service. Die unterschiedlichen Arten zum Einbinden eines Clients wurden nochfolgend aufgeführt. Das Kapitel Realisierung greift diesen Aspekt nochmals auf und zeigt die Umsetzung innerhalb des Prototypen. WSRP von OASIS widmet sich einem ähnlichen Themengebiet wie diese Diplomarbeit. Mit WSRP soll Web-Service-Anbietern die Möglichkeit gegeben werden eine GUI für ihren Web-Service zu entwickeln Diese GUI wird dann innerhalb von Portalen generisch zur Anzeige des Web-Service verwendet. Für die Portalentwicklung stellt dieser neue Standard eine große Vereinfachung dar, da man lediglich ein Framework anbietet und grafische Oberflächen können dynamisch eingebettet werden. Allerdings entsteht ein großer Programmieraufwand, da für jeden bestehenden Web-Service erst einmal diese GUI-Elemente entworfen werden müssen. Daher grenzt sich dieser neue Standard von der Vorangehensweise in dieser Diplomarbeit ab. Beim Ansatz in dieser Diplomarbeit werden keine neuen Technologien herangezogen, um eine GUI für einen Web-Service generisch zu erzeugen. Lediglich WSDL dient als Informationsquelle zu Generieren der GUI. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 61 Kapitel 4: Modellbildung In diesem Kapitel wird das Modell eines Frameworks zum generischen Aufbau einer grafischen Oberfläche aus einem WSDL-Dokument schrittweise entwickelt und vorgestellt. Zunächst wird das Gesamtsystem beschrieben, bevor danach der Entwurf verfeinert wird und auf einzelne Details des Modells eingegangen wird. Die Entscheidung für ein solches Top Down-Verfahren zur Entwicklung des Modells wurde aufgrund der Problemstellung und der daraus resultierenden komplexen Detailanforderungen abgeleitet. Aus einem WSDL-Dokument mit enthaltenen XSD-Datentypen soll generisch eine GUI aufgebaut werden. Der Aufbau und die Verteilung der Komponenten hängt somit von der Gestaltung des WSDL-Dokumentes und von den in XSD spezifizierten Datentypen ab, wobei die Komplexität nicht eingeschränkt werden kann. Das Modell und der daraus resultierende Prototyp sollen für alle WSDL-Dokumente eine einheitliche GUI aufbauen. Diese soll komfortabel zu bedienen sein und trotz nicht bekannter Komplexität immer einen gleichen strukturellen Aufbau haben. Daher sollen zuerst grundlegende Anforderungen an das Modell der GUI festgelegt werden, bevor in einem weiteren Verfeinerungsschritt Details zur Gesamtlösung hinzugenommen werden. Zunächst wird eine Beschreibung des Gesamtsystems des zu entwickelnden Frameworks herausgearbeitet. In mehreren Anwendungsfällen (UML Use Cases) wird die Schnittstelle zwischen Anwender und Gesamtsystem definiert. Danach folgt eine Vorstellung der grafischen Elemente, die in diesem Modell verwendet werden. Parallel dazu werden die verschiedenen Möglichkeiten zur Validierung von Benutzereingaben vorgestellt. Nach der Beschreibung des Frameworks folgt im Unterkapitel 4.2 in Form eines Anfragekatalogs eine Festlegung diverser Anforderungen, die das Modell berücksichtigen soll. Nach Zusammenstellung der wichtigsten Anforderungen wird der allgemeine Aufbau der GUI festgelegt. Dazu findet eine Analyse der WSDL-Komponenten statt. Diese Komponenten legen den Gesamtaufbau der grafischen Oberfläche fest und strukturieren diese. Danach wird eine detailliertere Sicht der GUI durch Beschreibung der XSD-Datentypen und deren spätere Darstellung vorgenommen. Unterkapitel 4.4 beschäftigt sich mit semantischen Aspekten, die bei der Erstellung der GUI berücksichtigt werden müssen. Die abschließende Zusammenfassung stellt nochmals die wichtigsten Arbeitsschritte zur Entwicklung des Modells dar. 4.1 Beschreibung des Frameworks Durch Anwendungsfälle wird die Benutzung des Systems durch den Anwender veranschaulicht. In den Anwendungsfällen wird die Schnittstelle zwischen dem Anwender und dem Modell spezifiziert. Nach dieser ersten Beschreibung des Systems folgt eine Einführung möglicher grafischer Elemente zum Aufbau der GUI. Parallel dazu wird das Modell zur Validierung der Benutzereingaben entwi- 62 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. ckelt. Es wird heraus gearbeitet, wie die Auswahl der grafischen Elemente die Validierungsmöglichkeiten beeinflusst. 4.1.1 Anwendungsfälle Abbildung 19 veranschaulicht die wichtigsten Interaktionen eines Anwenders mit dem Web-ServiceFramework und zeigt fünf Anwendungsfälle zwischen System und Anwender. Durch die einzelnen Anwendungsfälle wird die Funktionalität des Gesamtsystems festgelegt. Die Anwendungsfälle sind chronologisch geordnet und beschreiben das Interaktionsverhalten des Systems nach dem Start bis zum Empfang einer Antwort durch einen angesprochenen Web-Service. WebServiceFramework setWSDL createService showServiceGUI «verwendet» Parser selectOperation «verwendet» showEditorGUI DatatypeAlternative createEditor «verwendet» reutilisation takeDatatype edit Anwender status validate send «verwendet» showResult sendWebService Axis getHelp showHelp help Abbildung 19: UML-Anwendungsfälle zwischen Anwender und Gesamtsystem Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 63 createService Die erste Schnittstelle eines Anwenders mit dem Gesamtsystem besteht im Übermitteln einer WSDLURL. In einem Eingabefenster wird der Anwender aufgefordert die Netzwerkadresse in Form einer Zeichenkette (String) zu übergeben mit setWSDL. Das System nimmt die Eingabe entgegen und startet das Parsen des WSDL-Dokumentes unter Verwendung eines internen Anwendungsfalls Parser. Existiert das WSDL-Dokument unter angegebener URL, so werden alle relevanten Informationen des WSDL-Dokumentes zur Darstellung aller Web-Services und deren Operationen innerhalb des Parsers extrahiert. In diesem Anwendungsfall werden noch keine Details über einzelne Parameter innerhalb von Operationen extrahiert. Lediglich eine komplette Auswahl aller Web-Services mit allen Operationen innerhalb dieses WSDL-Dokumentes werden erstellt. Der Parser liefert die aufbereiteten Informationen zurück und innerhalb des Anwendungsfalls createService wird die GUI zum Anzeigen der enthalten Web-Services und ihren Operationen generiert. Durch die Assoziation showServiceGUI wird dem Anwender die GUI zur weiteren Interaktion angezeigt. createEditor Der Anwendungsfall createEditor lässt sich nochmals in zwei Anwendungsszenarien unterteilen, die chronologisch aufeinander aufbauen. Der Anwender kann im ersten Schritt unter den aufgeführten Web-Services mit ihren Operationen eine Operation zur Nutzung aussuchen. Seine Auswahl teilt er mit selectOperation dem System mit. Anschließend werden alle Parameter dieser Operation durch ihre grafischen Komponenten in einer Eingabemaske untereinander aufgereiht. Befindet sich unter den Parametern ein komplexer Datentyp, so ermittelt der Parser in einem weiteren Arbeitsschritt den Aufbau und zerlegt den komplexen Datentyp in seine elementaren Datentypen oder Listendatentypen (siehe Kapitel 4.3). Dieser Vorgang kann bei verschachtelten komplexen Datentypen mehrmals durchgeführt werden, bis alle Datentypen durch eine grafische Komponente dargestellt werden können. Übersteigt die Anzahl der Komponenten den sichtbaren Bereich der GUI, so werden die Elemente in mehreren Ebenen angeordnet. Über Navigationshilfen können diese jeweils ebenenweise auf dem Bildschirm sichtbar angezeigt werden. Nach der Aufbereitung aller Parameter wird durch showEditorGUI dem Anwender die komplette Eingabemaske präsentiert. Im zweiten Anwendungsszenarium kann zum anderen nach Anzeige der Eingabemaske ausgewählt werden, ob früher getätigte Eingaben wieder verwendet werden sollen. Diese Wiederverwendung wird allerdings nur für komplexe Daten ermöglicht und setzt natürlich voraus, dass der Anwender schon Eingaben für diesen Datentyp getätigt hat. Liegen Daten von früheren Eingaben zu dem gerade aktuell angezeigten komplexen Datentyp vor, so bietet das System die Möglichkeit der Wiederverwendung durch DatatypeAlternative an. Dazu wird die Wiederverwendungskomponente reutilisation kontaktiert von createEditor, die alle Eingaben für komplexe Datentypen persistent speichert. Innerhalb einer angezeigten Liste kann der Anwender alle getätigten Eingaben 64 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. einsehen und bei Bedarf mit takeDatatype dem System mitteilen, dass eine Eingabe wieder verwendet wird. Diese Eingaben werden in der Eingabemaske angezeigt und können vor dem Senden abgeändert werden, d.h. der Anwender muss nicht alle Eingaben exakt übernehmen. validate Dieser Anwendungsfall läuft während des Editierens der Daten ständig im Hintergrund. Der Anwender tätigt über edit seine Eingaben in der Eingabemaske. Im Hintergrund überprüft das System permanent, ob die Eingaben korrekt sind und den Anforderungen des Datentyps entsprechen. Liegt eine Verletzung vor, z.B. eine Bereichsübertretung, ein unzulässiges Zeichen, oder ein Verstoß gegen bestehende Fassetten, so wird der Anwender durch eine status-Meldung über den Fehler informiert. Über status werden lediglich Fehler angezeigt, korrekte Eingaben werden nicht kommentiert. sendWebService Dieser Anwendungsfall nimmt alle Daten der Eingabemaske entgegen und sendet eine Anfrage an den entsprechenden Web-Service. Über send teilt der Anwender dem System mit, dass alle Eingaben vorgenommen wurden. Nach einer systemseitigen Überprüfung der Daten auf Korrektheit und Vollständigkeit wird die komplette Anfrage an die Axis-Komponente weitergeleitet, die den Sendevorgang ausführt. Nach Erhalt der Antwort leitet Axis die Antwortdaten an das System und sendWebService bereitet die Daten grafisch auf. Danach wird durch showResult dem Anwender das Ergebnis seiner Anfrage präsentiert. Diese vier vorgestellten Anwendungsfälle erläutern aus der Sicht des Anwenders eine typische Benutzung des Gesamtsystems. Der Anwender hat darüber hinaus noch mehr Interaktionsmöglichkeiten mit dem System, die aber an dieser Stelle zum Verständnis des Gesamtsystems nicht beitragen und erst bei detaillierter Betrachtung erläutert werden. Lediglich ein weiterer Anwendungsfall soll an dieser Stelle neben dem eigentlichen Erstellen der Anfrage und Erhalt der Antwort betrachtet werden. help Der Anwender hat die Möglichkeit zu jedem Zeitpunkt während der Systemnutzung eine Hilfefunktion aufzurufen. Durch getHelp kann der Anwender allgemeine Hilfethemen nach Informationen durchsuchen oder direkt Komponenten anklicken, um spezielle Hilfe über diese angezeigt zu bekommen. Sofern eine Hilfefunktion vorliegt wird diese über showHelp dem Anwender in einem Extrafenster angezeigt, damit diese Hilfe parallel zur Editierung verwendet werden kann. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 65 4.1.2 Grafische Komponenten Nachfolgend werden die wichtigsten grafischen Komponenten des Modells vorgestellt. Zur Interaktion mit einzelnen grafischen Komponenten stehen dem Anwender üblicherweise Tastatur und Maus zur Verfügung. Die äußerste, grafische Komponente stellt ein Fenster dar und ist somit Sammelcontainer für alle anderen Komponenten. Die Größe dieses Fenster soll variabel sein, damit das Fenster je nach verwendeter Bildschirmauflösung angepasst werden kann. Darauf folgend werden nun grafische Komponenten vorgestellt, die zur Darstellung der Informationen zur Verfügung stehen. Eine Zuordnung der grafischen Komponenten zu den Elementen des WSDL- und XSD-Dokumentes erfolgt in den nachfolgenden Unterkapiteln. Die einfachste Möglichkeit zur Darstellung von Informationen ist die textuelle Präsentation. Informationen können nacheinander als Texte innerhalb des Fensters dargestellt werden. Der Platz, den ein Text einnimmt, wird durch die Länge der Information bestimmt. Ist ein Text länger als die Breite des umschließenden Fensters, so wird er entweder abgeschnitten oder durch einen Zeilenumbruch in der nächsten Zeile des Fensters fortgesetzt. Ein Text kann lediglich zur Darstellung verwendet werden, aber nicht, um Interaktionen des Anwenders entgegen zu nehmen. Zur Präsentation von Informationen können Texte verwendet werden, aber um Benutzereingaben entgegen zu nehmen, muss ein Element die Fähigkeit haben Aktionen des Anwenders zu registrieren und weiterzuleiten. Ein Button führt jeweils eine zuvor definierte Funktion aus, nachdem der Anwender ihn betätigt hat. Jeder Button repräsentiert dabei genau eine festgelegte Aktion und kann keine weiteren Aktionen ausführen. Die Größe eines Buttons kann beliebig skaliert werden. Daher bietet sich die Verwendung eines Buttons an, wenn Aktionen benötigt werden, zu deren Darstellung entweder wenig Platz zur Verfügung steht oder genau eine Aktion ausgeführt werden soll.. Ein Eingabefeld nimmt Eingaben über die Tastatur entgegen und stellt dafür einen zuvor begrenzten Raum zur Verfügung. Die Eingabe sämtlicher druckbarer Zeichen erscheint als Echo innerhalb des Eingabefeldes. Diese Eingabemöglichkeit kann prinzipiell zur Eingabe sämtlicher textueller Informationen verwendet werden, da von der Komponente keine Einschränkungen vorgenommen werden. Diese Komponente zeigt jeweils einen beschränkten Inhalt der Eingabe an, wenn dieser die Länge des Sichtbereichs überschreitet. Durch Bewegung des Cursors können die Inhalte des Eingabefeldes in den sichtbaren Bereich verschoben werden. Neben dem Eingabefeld bieten auch Checkboxen und Auswahlboxen die Möglichkeit, Eingaben des Benutzers entgegen zu nehmen. Allerdings erlauben diese beiden Elemente keine unbegrenzte Eingabemöglichkeit. Vielmehr bieten sie eine Auswahl von zuvor festgelegten Möglichkeiten an, die per Maus selektiert werden können. Eine Checkbox stellt einen Wert einer Menge (z. B.: einen Text oder eine Zahl aus einer Zahlenmenge) dar und bietet durch Voranstellen eines Buttons die Möglichkeit, den dahinter dargestellten Wert zu aktivieren. Werte aus einer begrenzten Menge können somit durch eine Gruppe von aneinander gereihten Checkboxen aufgebaut werden, von der jeder einen Wert darstellt. Der benötigte Platz in- 66 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. nerhalb der GUI für diese Komponente variiert mit der darzustellenden Anzahl von Werten, da für jeden Wert eine Checkbox generiert wird. Kann die Menge der Werte nicht eingeschränkt werden, so wird dieses Element nicht verwendet. Die generierte GUI soll übersichtlich und leicht zu bedienen sein. Daher wird dieses Element nur benutzt, wenn die Größe zuvor kalkuliert werden kann. Die Auswahlbox bietet dem Anwender ebenfalls eine Auswahl von Werten an, hat aber im Gegensatz zu einer Checkbox-Gruppe immer die gleiche Größe. Die Auswahlbox zeigt dazu immer den zuletzt ausgewählten Wert an. Alle anderen Werte werden transparent in einer Liste gehalten. Nach Aktivierung kann der Inhalt der Liste angezeigt werden, um eine neue Auswahl zu treffen. Bei Checkboxen und Auswahlboxen ist darauf zu achten, dass die Anzahl der Werte beschränkt sein sollte. Bei steigender Wertemenge steigt proportional der Platzanspruch der Checkbox-Gruppe und bei der Auswahlbox wird die Liste der inaktiven Werte unübersichtlicher. Letztendlich benötigt das Modell eine Komponente, die das Laden und Speichern von Daten übernimmt. Diese Komponente nimmt Daten in Form einer Datei oder eines Feldes von Bytes an und leitet die Daten weiter an das Framework oder an das Dateisystem. Diese Komponente sollte beim Speichern die Möglichkeit aufweisen, Namen und Ort für die Speicherung der Daten frei zu wählen. Beim Laden der Daten sollte man die Möglichkeit haben, durch Suche im Dateisystem eine Auswahl der Daten zu treffen. Diese Komponente wird während der Realisierung weiter spezifiziert. Validierung der dargestellten Informationen Jede der vorgestellten Komponenten kann eine Validierung der verwendeten Informationen vornehmen. Zur späteren Auswahl einer Komponente ist dieser Aspekt wichtig und beeinflusst die Wahl einer Komponente. Prinzipiell könnte die Validierung der Informationen und Daten von einer externen Komponente des Frameworks übernommen werden. Die vorgestellten Komponenten könnten lediglich zur Darstellung der Informationen verwendet werden und abschließend könnte, z. B. vor dem Sendevorgang, eine Validierung erfolgen. Allerdings würden dann punktuell viele Fehler auf einmal angezeigt werden. Außerdem müssten jeweils die Stellen gesucht werden, bei denen der Fehler aufgetreten ist. Dadurch entsteht ein Zeitverlust zur Erstellung einer Anfrage für den Anwender. Ferner können Folgefehler auftreten, die nicht während des Editierens erkannt werden. Ein Anwender könnte den Wertebereich eines Datentyps falsch verstehen und mehrmals falsche Angaben machen. Würde er gleich bei der ersten Eingabe den Fehler erkennen, so kann dieser Fehler bei mehrmaliger Anwendung vermieden werden. Aus diesen Gründen scheidet also eine Validierung der Daten nach Abschluss der Eingaben aus. Für Texte und Buttons wird keine Validierung der Informationen benötigt. Diese zeigen immer nur Informationen oder Funktionen des Systems an. Ein Text und ein Button werden nicht zur Eingabe durch den Anwender verwendet, daher entfällt die Überprüfung der Daten. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 67 Ein Eingabefeld validiert die eingetippten Daten nach jedem Tastendruck oder beim Bestätigen mit „Return“. Durch diese permanente Validierung können fehlerhafte Eingaben schnellstmöglich erkannt werden. Eine Checkbox und die Auswahlbox erzeugen nur valide Werte. Die Menge der Werte ist vor der grafischen Darstellung bekannt. Es werden lediglich die vom System generierten, korrekten Daten dargestellt. Der Anwender kann keine falschen Werte eingeben, da nur eine Auswahl zur Verfügung steht und nicht selbst Werte hinzugefügt werden können. Die Komponente zum Laden und Speichern kann durch einen Filter festlegen, welche Daten verwendet werden können. Diese Überprüfung kann durch Einschränkung der Dateienden oder durch Überprüfung des Inhalts der Daten (Vergleich von einzelnen Bytes) erfolgen. 4.2 Anforderungskatalog Die nicht funktionalen Anforderungen an das Modell werden nun sukzessive in einem Anfragekatalog entwickelt. Internationalisierung Der zu entwickelnde Prototyp wird in englischer Sprache verfasst, bietet aber die Möglichkeit leicht in jede andere Sprache übersetzt zu werden. Die Richtlinien zur Internationalisierung eines Programms wurden u. a. dem Java Tutorial von Sun Microsystems entnommen [SUN04]. Innerhalb des Codes werden keine festkodierten, sprachspezifischen Texte oder Beschriftungen eingefügt. Sämtliche sprachabhängigen Texte (wie z.B. Beschriftung der Buttons, Dialoge, Fehlermeldungen und Benutzerführungen) werden in einer Skriptdatei gesammelt und über ein Ressourcenbündel (Resource Bundle) dynamisch eingebunden. Somit können an einer zentralen Stelle Veränderungen bezüglich der verwendeten Sprache durchgeführt werden. Landesabhängige Formate (wie z.B.: Postleitzahlen, Telefonnummern), Maß- und Währungseinheiten werden im WSDL-Dokument vom jeweiligen Web-ServiceAnbieter festgelegt und durch die GUI lediglich dargestellt. Daher brauchen diese Richtlinien bei der Entwicklung nicht beachtet zu werden. Legt ein Anbieter beispielsweise ein Format für eine Artikelnummer aus einer bestimmten Sequenz von Ziffern und Buchstaben fest, so kann er dies innerhalb eines Pattern spezifizieren. Dieses Pattern wird dann generisch in der Eingabemaske angezeigt und erlaubt lediglich die festgelegten Eingabesequenzen. Zusätzlich wird das Pattern dem Benutzer in der Hilfefunktion angezeigt und erklärt, was die einzelnen Formatangaben als Eingabe benötigen. Somit ist eine leichte Umstellung auf verschiedene Sprachen gewährleistet. Lediglich die Leserichtung von links nach rechts und oben nach unten wurde festgelegt. 68 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Wiedererkennung Bei der Generierung der GUI wurde großer Wert auf eine einheitliche grafische Präsentation mit Wiedererkennungswert gelegt. Unabhängig vom verwendeten Web-Service soll der Aufbau der GUI jeweils einen gleichen Grundaufbau vorweisen. Dieser Aspekt wird im nächsten Unterkapitel bei der Darstellung der WSDL-Komponenten aufgegriffen. Die GUI soll ein einheitliches Erscheinungsbild aufweisen, egal ob ein Web-Service aus einer Operation oder aus einer beliebigen Anzahl besteht. Somit kann ein Anwender das Programm nach Kennen lernen der Funktionalität immer auf die gleiche Art und Weise benutzen. Dynamische Größenanpassung Jede Komponente, die in der GUI dargestellt wird, kann je nach vorhandenem Platz verschiedene Größen annehmen. Eine Komponente hat eine bevorzugte Größe, die immer angenommen wird, solange der Platz dafür vorhanden ist. Bei Verringerung des Platzangebots können die Komponenten ihre Größe bis zu einer minimalen Größe verringern. Ab einer unteren Schranke wird die Komponente abgeschnitten, da sie ihre Größe nicht weiter verringern kann. Somit erreicht man beim Minimieren des Fensters eine Schwelle, bei der die angezeigten Komponenten nicht kleiner und näher zusammenrücken können. Beim Füllen der Eingabemaske mit Komponenten der Datentypen wird jeweils die aktuelle Größe des Fensters verwendet, um die Anzahl der Komponenten für eine sichtbare Seite in Abhängigkeit zu ihrer Größe zu bestimmen. Übersteigt die Anzahl der Komponenten die maximale Anzahl der Komponenten, die auf einmal angezeigt werden können, so werden die Komponenten in mehreren Ebenen aufgeteilt. Die Ebenen sind dann über entsprechende Navigationselemente erreichbar. Portabilität Das Framework wird in der Programmiersprache Java entwickelt und ist somit plattformunabhängig. Entwickelt und getestet wurde das System auf Windows- und Linux-Plattformen. Die Struktur der Dateiverzeichnisse und Pfadnamen wird vom jeweiligen Betriebssystem generiert und ist somit variabel anpassbar. Lediglich das grafische Erscheinungsbild wird vom jeweiligen Betriebssystem beeinflusst. Dieser Punkt wird in Kapitel sechs bei der Vorstellung des Layouts nochmals erläutert. Hilfefunktion und Zusatzinformationen Die Hilfefunktion soll dem Benutzer Hilfestellung bei jedem Schritt der Erstellung der Anfrage an den Web-Service bis zum Erhalten und Anzeigen der Antwort bieten. Die Hilfe soll innerhalb des Menüs und der Symbolleiste geöffnet werden können und dem Anbieter sämtliche Schritte verdeutlichen und erklären. Zusätzlich kann über eine Suchfunktion selbstständig nach Hilfefunktionen gesucht werden oder extern über eine Linksammlung relevante Themen nachgeschlagen werden. Neben dieser allge- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 69 meinen Hilfefunktion soll eine spezifische Hilfefunktion angeboten werden. Nach Aktivierung dieser zusätzlichen Hilfe kann man innerhalb der GUI Komponenten mit der Maus anklicken und erhält eine gesonderte Beschreibung. Diese Funktion wurde vor allem wegen der hohen Anzahl von unterschiedlichen Datentypen entwickelt. Da jeder Datentyp nur spezifische Eingaben erlaubt, die überprüft werden und somit vom Anwender beachtet werden müssen, können für jedes Eingabefeld eines Datentyps durch diese Hilfefunktion Informationen angezeigt werden. Als Beispiel sei hier das unterschiedliche Format der beiden XSD-Datentypen Name und NCName angeführt. Beide Datentypen dürfen nicht mit einer Ziffer beginnen, bei Name darf ein Doppelpunkt an beliebiger Stelle auftreten, bei NCName ist der Doppelpunkt gänzlich verboten. Bei Missachtung dieser Formatvorschriften wird ein Fehler im Programm angezeigt. Um dem Anwender die Eingabe zu erleichtern, kann er sich die Hilfeseite per Mausklick anzeigen lassen. Somit kann er jeden Datentyp fehlerfrei editieren, auch wenn dieser zuvor nicht bekannt war. Korrektheitsüberprüfung Für sämtliche Benutzereingaben, die über die Eingabemaske oder zusätzliche Bearbeitungsfenster eingegeben werden, findet sofort eine Validierung statt. Diese Validierung wird durchgeführt nach jedem Tastendruck oder nachdem die Eingabekomponente den Fokus verloren hat. Bei fehlerhafter Editierung wird ein Fehler angezeigt, bei Erkennung der Art des Fehlers, zusätzlich eine detaillierte Fehlerbeschreibung. Nur nach korrekter Eingabe eines Datentyps wird dieser temporär in einem Objekt bis zum Senden gespeichert. Somit ist gewährleistet, dass nur korrekte Daten an den Web-Service beim Sendevorgang weitergeleitet werden. Zusätzlich wird vor dem Senden überprüft, ob der Anwender alle erforderlichen Eingaben betätigt hat. Falls dies nicht der Fall ist, bekommt der Anwender angezeigt welche Eingaben noch durchzuführen sind. Durch diese beiden Mechanismen ist gewährleistet, dass nur korrekte und vollständige Anfragen an einen Web-Service geleitet werden. Benutzertypen Die Verwendung des Programms ist primär für Anwender ausgelegt, die Web-Services noch nie oder selten benutzt haben und keine Computerexperten sind. Es werden keine technischen Kenntnisse über die Realisierung von Web-Services oder die verwendeten Technologien vorausgesetzt. Durch Einbeziehen von Hilfefunktionen kann die Erstellung der Anfrage erleichtert werden. Allerdings wird zusätzlich die Anforderung an den Aufbau der GUI gestellt, dass diese selbsterklärend ist und leicht mit Maus und Tastatur zu bedienen ist. Des weiteren sollen auch Funktionen für fortgeschrittene Benutzer angeboten werden. Diese werden im Menü platziert, so dass sie bei einfacher Nutzung des Programms nicht stören oder ablenken. Dem interessierten Benutzer soll die Möglichkeiten gegeben werden, sämtliche ein- und ausgehenden SOAP Nachrichten einzusehen. Zusätzlich kann die Struktur des WSDLDokumentes und extrahierte Service-Informationen aufgelistet werden oder eine baumgesteuerte Na- 70 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. vigation durch das WSDL-Dokument steht zur Auswahl der Operationen. Somit kann jeder Benutzertyp das Framework nach seiner Fasson nutzen. Zeitrestriktionen Es können keine Zeitgarantien bis zum Anzeigen der einzelnen Ports und Operationen des WebService in der Start-GUI angegeben werden, nachdem der Anwender eine WSDL-URL übermittelt hat. Je nach der Komplexität, Tiefe der Importhierarchie und Anzahl der Ports und Operationen kann der Ladevorgang unterschiedlich lange dauern, bevor die erzeugte GUI dargestellt wird. Über das Antwortverhalten eines Web-Service und das Anzeigen der Antwort kann ebenfalls keine Zeitgarantie gegeben werden. Da es sich bei Web-Services um verteilt arbeitende Systeme handelt, können keine Zeitgarantien bis zum Erhalt einer Antwort nach dem Absenden einer Anfrage gegeben werden. Sämtliche Daten werden üblicherweise über das zustandslose Transport-Protokoll HTTP übertragen, das keine Garantie über den fehlerlosen Transport und Übertragungszeiten festlegt. Nach einem Timeout und Nichterhalten einer Antwort muss der Anwender die Anfrage erneut starten. Erweiterbarkeit Das Modell und der daraus resultierende Prototyp können für zukünftige Neuerungen erweitert werden. Eine externe Bearbeitung der Parameter für einige Datentypen kann dadurch simuliert werden. So kann man einen String über ein separates Eingabefenster modifizieren oder Datumseingaben über eine grafische Oberfläche eingeben, die beide separat zur eigentlichen Eingabemaske zur Verfügung stehen (siehe nächstes Kapitel). Bei Weiterentwicklung könnten hier externe Programme für die Modifizierung einzelner Datentypen herangezogen werden. Zusätzlich kann das Modell leicht durch Hinzunehmen neuer Datentypen erweitert werden. Jeder Datentyp wird separat behandelt und erhält eine spezifische Eingabekomponente. In XSD Version 1.1, seit dem 16.07.2004 Working Draft des W3C, werden zurzeit Diskussionen über die Hinzunahme weiterer Datentypen geführt. Nach Etablierung von XSD 1.1 als W3C-Standard können somit diese weiteren Datentypen eingebunden werden durch Hinzufügen der entsprechenden Eingabekomponenten. Neben Erweiterungen können auch Veränderungen der grafischen Komponenten für einzelne Datentypen modular ausgeführt werden. Durch das Modell wird jedem Datentyp eine grafische Komponente zugeordnet. Dadurch kann für jeden Datentyp eine Neuregelung der Komponente erfolgen, ohne das restliche System zu verändern. Skalierbarkeit Die Skalierbarkeit des Systems ist teilweise gegeben. Der grafische Aufbau und das Layout des Modells sind beliebig skalierbar, die benötigte Zeit zum Aufbau der GUI allerdings nicht. Die Struktur und der Aufbau eines WSDL-Dokumentes ist bekannt, allerdings werden Inhalt und Komplexität erst zur Laufzeit erkannt. Somit ist das Modell unter der Vorraussetzung unbekannter Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 71 Komplexität entwickelt worden und kann somit dynamisch alle WSDL-Dokumente darstellen. Der Grundaufbau der GUI ändert sich nicht mit steigender Komplexität das WSDL-Dokumentes. Dieser Aspekt wird im nächsten Kapitel aufgegriffen. Wie bei der Anforderung der Zeitrestriktion schon erwähnt, kann keine Aussage über die Dauer bis zum vollständigen GUI-Aufbau gemacht werden. Daher ist die Skalierbarkeit nur auf das Erscheinungsbild der GUI gegeben. In der praktischen Anwendung sollten allerdings die Ladezeiten bis zum Aufbau der GUI nicht zu lange ausfallen. WebServices zeichnen sich gerade durch die Eigenschaft aus, dass sie eine überschaubare Teilaufgabe in einem komplexen Verbund mit weiteren Web-Services erledigen. Ein Web-Service sollte daher modular und einfach aufgebaut sein und daher die Ladezeit nicht zu lange benötigen bis zur vollständigen Darstellung der GUI. 4.3 Aufbau der GUI Der Aufbau der grafischen Oberfläche wird nun schrittweise entwickelt. Die nachfolgende Abbildung zeigt die Einteilung der Oberfläche des Prototypen in verschiedene Segmente. Durch diese Einteilung wird eine erste Festlegung zur Platzierung der einzelnen Komponenten erstellt und Platzhalter für die Informationen aus dem WSDL-Dokument geschaffen. In zwei weiteren Unterkapiteln wird festgelegt, welche Informationen aus dem WSDL-Dokument extrahiert und grafisch dargestellt werden und welche Informationen aus den enthalten XSD-Daten relevant sind. Die Informationen aus WSDL und XSD komplettieren somit den Aufbau der GUI. Hauptfenster Menüleiste Symbolleiste Servicesegment 1 Editorsegment (1..n) zusätzliches Editorsegment (1..n) 2 2 Eingabemaske mit Eingabemaske mit Datentypkomponenten Datentypkomponenten Statussegment 3 Abbildung 20: allgemeiner Aufbau der GUI 72 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 20 zeigt den allgemeinen Aufbau des Hauptfensters der GUI. Die kariert unterlegten Menüund Symbolleisten werden unabhängig vom vorliegenden WSDL-Dokument modelliert und bieten zusätzliche Dienste, die im sechsten Kapitel bei der Implementierung dargelegt werden. Die beiden Leisten sind nicht Teil der generischen Erstellung der GUI, da Menü- und Symbolleiste unabhängig vom WSDL-Dokument immer den gleichen Aufbau vorweisen. Die Menü- und Symbolleiste benötigen lediglich einen minimalen Platz. Das Menü öffnet nach Aktivieren eines Menüpunktes ein PopupMenü, das nach Auswahl eines Menüeintrags danach wieder deaktiviert wird. In der Symbolleiste werden in einer Reihe Buttons, mit bestimmten Funktionen, aufgeführt. Die anderen Komponenten werden inhaltlich durch Informationen aus den WSDL- und XSD-Daten gefüllt. Nach dem Start des Systems sind lediglich die Positionen innerhalb der GUI festgelegt. Nachdem der Anwender dem System die URL des WSDL-Dokumentes übermittelt hat, werden alle WebServices (Ports) und deren Operationen durch Parsen ermittelt und in dem Servicesegment angezeigt (Stern 1, siehe auch Anwendungsfall createService). Aus den dargebotenen Operationen kann der Anwender eine Operation selektieren. Für jede Operation wird ein Editorsegment und ein zusätzliches Editorsegment zum Anzeigen von erweiterten Eingaben erzeugt (Stern 2). Die graue Unterlegung dieser beiden Segmente und des Servicesegmentes soll anzeigen, dass sie aus WSDL-Elementen aufgebaut werden. Informationen über XSD-Datentypen werden nicht benötigt zum Generieren dieser Komponenten. Innerhalb des Editorsegmentes werden alle Parameter dieser Operation in einer Eingabemaske aufgereiht (Stern 2, siehe Anwendungsfall createEditor). Bestehen die Parameter aus komplexen Datentypen, so werden diese komplexen Datentypen in einfache zerlegt, wie oben bereits geschildert. Nach diesen beiden Schritten ist die GUI generisch aufgebaut und kann zur Editierung der Parameter verwendet werden. Das Editorsegment wird aus Informationen des Operations-Elementes und Porttyp-Elementes aus dem WSDL-Dokument erzeugt. Der Inhalt allerdings wird durch die enthaltenen Parameter, die in XSD spezifiziert werden, generiert. Dieser Sachverhalt wurde durch den angedeuteten Rahmen (gestrichelte Begrenzung) verdeutlicht. Das Editorsegment beinhaltet die Eingabemaske und wird daher primär zum Editieren der Daten verwendet. Daher soll diesem Segment der größte Raum zugeordnet werden. Tritt eine fehlerhafte Eingabe auf bei der Editierung der Daten, so wird dies über die Statusmeldungen im Statussegment der GUI angezeigt. Somit ergibt sich der Inhalt dieser Komponente erst nach Aufbau und Verwendung des Editorsegmentes zur Laufzeit (Stern 3). Die Fehlermeldung besteht meistens nur aus einem kurzen Text. Daher wird für diese Komponente ein minimaler Platz angeboten. Durch diese Teilung des GUI-Aufbaus wird die Komplexität reduziert. Ein komplettes Parsen am Anfang, das alle Informationen aufbereitet, könnte sehr lange Zeit in Anspruch nehmen. Denn in diesem Fall müssten alle Parameter innerhalb jeder Operation zur Darstellung vorbereitet werden. Unter Umständen möchte der Anwender aber nur eine Operation von einem Web-Service nutzen. Er müsste allerdings warten, bis alle Informationen vorliegen, die er zur Erstellung seiner Anfragen nicht benö- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 73 tigt. Daher wurde eine Zweiteilung des Parsens eingeführt, um die Komplexität und Wartezeiten einzuschränken. Die ersten beiden Schritte können beliebig oft wiederholt werden, um andere Operationen darzustellen und auszuführen. Die Anzahl der Editorsegmente ist durch die Anzahl vorhandener Operationen im WSDL-Dokument beschränkt. Jede Operation wird höchstens einmal angezeigt. 4.3.1 WSDL-Komponenten Das Servicesegment baut sich wie oben beschrieben aus allen Ports und deren Operationen auf. Abbildung 21 zeigt in einem aufspannenden Baum die Problematik, dass die Komplexität mit Hinzunahme von weiteren Ports und Operationen schnell ansteigen kann. Service Port Port Operation … Operation … Port … Operation … Operation Port Port Operation … Operation Abbildung 21: Komplexitätsentstehung durch Ports mit korrespondierenden Operationen Daher werden die Operationen und Ports in Auswahlboxen repräsentiert, die unabhängig von der Anzahl ihrer Elemente immer den gleichen Platz beanspruchen. In den Auswahlboxen kann der Anwender seine Selektion vornehmen. Zur Wahl stehen drei Auswahlboxen. Eine Auswahlbox beinhaltet eine Liste mit allen Ports und Operationen, die in der Form „Portname:Operationsname“ angegeben werden. Hier findet der Anwender auf einen Blick alle Operationen. Bei geringer Anzahl ermöglicht sie einen schnellen Zugriff auf gegebene Operationen. Bei großer Anzahl von Ports und Operationen kann diese Auswahl jedoch sehr unübersichtlich werden. Daher wird eine zweite Auswahlmöglichkeit angeboten. In jeweils einer Auswahlbox werden Ports und Operationen getrennt voneinander geführt. Durch Wahl des Ports, werden nur jeweils dessen Operationen in der anderen Auswahlbox aufgeführt. Dem Anwender stehen also immer zwei Möglichkeiten zur Auswahl einer Operation zur Verfügung. Die Entwurfsentscheidung fiel auf die Verwendung von Auswahlboxen und gegen die Verwendung von Buttons, Checkbox-Gruppe oder textueller Aufreihung. Eine Anforderung an das System ist neben der einfachen Bedienung die Wiedererkennung. Würde man Buttons, Checkbox-Gruppe oder eine textuelle Aufreihung verwenden, so variiert die Anzahl bei jedem WSDL-Dokument. Die Komplexität kann schnell ansteigen, wie Abbildung 21 verdeutlicht. Die Größe des Servicesegmentes müsste also auch variieren und würde dem Anwender jeweils eine andere Sicht bieten. Die Auswahlboxen nehmen einen einheitlichen Platz in Anspruch, unabhängig von der Anzahl der enthaltenen Elemente, und sind somit ideal zum Generieren des Servicesegmentes geeignet. 74 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Zusätzlich können im Menü oder der Symbolleiste eine Baumdarstellung aller Ports und Operationen in einem zusätzlichen Fenster angeführt werden. Das Wurzelelement bildet das Service Element, das wie in Abbildung 21 angezeigt- einen Baum aufspannt. Im Baum kann somit auch eine Operation ausgewählt werden. Diese Option ist primär für erfahrenere Anwender, die den Umgang mit Baumstrukturen kennen. Nachdem der Grundaufbau der GUI vorgestellt wurde, sollen nun im nächsten Unterkapitel die einzelnen grafischen Komponenten für die XSD-Datentypen bestimmt werden. 4.3.2 Datentypen in XSD Im nächsten Schritt werden die Datentypen und einige Strukturen des XML-Schema vorgestellt und anschließend ein Modell zur grafischen Darstellung entwickelt. Die Informationen über die Datenstrukturen sind der überarbeiteten XSD-Spezifikation 1.0 Part 1 des W3C entnommen [BM04a] und die Informationen über die Datentypen findet man in der XSD-Spezifikation Part 0 [FW04] und XSDSpezifikation Part 2 [BM04a]. Die angeführten Definitionen entstammen der deutschen Übersetzung der XSD-Spezifikation 1.0 [BEG+01]. Zunächst wird das verwendete Vokabular durch folgende Definitionen eingeführt. Ein Datentyp kann durch ein Tripel beschrieben werden, das aus einem Wertebereich, einem lexikalischen Bereich und Fassetten besteht. Definition 1: Wertebereich „Ein Wertebereich ist eine Menge von Werten zu einem gegebenen Datentyp. Jeder Wert im Wertebereich eines Datentyps ist durch ein oder mehrere Literale im lexikalischen Bereich bezeichnet." Definition 2: Lexikalischer Bereich „Ein lexikalischer Bereich ist eine Menge von zulässigen Literalen für einen Datentyp.“ Definition 3: Fassette „Eine Fassette ist ein Aspekt der Definition des Wertebereichs. Allgemein gesagt, jede Fassette charakterisiert einen Wertebereich entlang unabhängiger Achsen oder Dimensionen.” Ein Datentyp besteht demnach aus einem Wertebereich, der die Menge aller erlaubten Literale festlegt. Für einen Datentyp sind nur Eingaben erlaubt, deren Werte sich im Wertebereich befindet. Somit liefert der Wertbereich den ersten Ansatzpunkt zur Validierung der Benutzereingaben. Weiterhin kann ein Wertebereich durch Angabe von Fassetten weiter spezifiziert werden. Die Fassetten schränken den Wertebereich nochmals weiter ein und werden somit ebenfalls zur Validierung herangezogen. Einfache Datentypen Durch den Wertebereich eines Datentyps wird für das Modell des Prototypen festgelegt, welche Eingaben für dessen grafische Komponente durch den Benutzer erlaubt sind. Nur Eingaben, die den Literalen des Wertebereichs entsprechen, werden als gültig angesehen. Somit wird durch den gegebenen Wertebereich die Validierung eines Datentyps festgelegt. Der Datentyp short wird z. B. durch den Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 75 Wertebereich mit Ganzzahlwerten zwischen -32768 (-215) und 32767 (215-1) definiert. Nur Eingaben innerhalb dieses Intervalls sind zulässig. Bei Eingabe von Sonderzeichen, Buchstaben oder Zahlen, die den Werteberreich über- oder unterschreiten, wird durch die Validierungskomponente dieses Datentyps eine Fehlermeldung erzeugt. Da dem Anwender nicht alle Wertebereiche bekannt sind, bietet die Hilfefunktion zu jedem Datentyp eine Übersicht des vorgeschriebenen Wertebereichs. Zusätzlich kann ein Datentyp durch Angabe von Fassetten innerhalb seines zulässigen Wertebereichs weiter eingeschränkt werden. Daher werden die Fassetten ebenfalls zur Validierung verwendet. Die Fassetten werden in einem weiteren Absatz nochmals näher erläutert. Zunächst wird eine Einteilung der einfachen Datentypen vorgenommen. Datentypen unterscheiden sich in einigen grundlegenden Charakteristiken und können dadurch in Gruppen unterteilt werden. Datentypen können in atomare, Listen- und Vereinigungsdatentypen unterteilt werden. Atomare Datentypen können nicht weiter unterteilt oder zerlegt werden. Listendatentypen bauen sich aus einer Sequenz von atomaren Datentypen zusammen. Vereinigungsdatentypen „sind solche, deren Wertebereiche und lexikalische Bereiche die Vereinigung der Wertebereiche und lexikalischen Bereiche von einem oder mehreren anderen Datentypen darstellen.“ [BEG+01] Ein nächstes Unterscheidungsmerkmal teilt die Datentypen in primitive und abgeleitete Datentypen. Primitive Datentypen werden nicht durch andere Datentypen definiert und können daher als gegeben angesehen werden. Abgeleitete Datentypen werden dagegen durch andere Datentypen definiert und sind von diesen abgeleitet. Bei abgeleiteten Datentypen leitet sich auch automatisch der Wertebereich und die gegebenen Fassetten von dem abgeleiteten Datentyp ab. Ein weiteres Unterscheidungsmerkmal teilt die Datentypen in vordefinierte und benutzerdefinierte Datentypen ein. Ein vordefinierter Datentyp kann ein primitiver oder abgeleiteter Datentyp sein und wird durch die XSD-Spezifikation vorgeschrieben. Benutzerdefinierte Datentypen sind abgeleitete Datentypen, die zuzüglich zu den vordefinierten Datentypen von einem Entwickler modelliert werden. Abbildung 22 zeigt eine hierarchische Übersicht über alle vordefinierten Datentypen in XSD. 76 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 22: Übersicht der XSD-Datentyp-Hierarchie (nach Quelle [BM04b]) Die erste Einteilung in dieser Übersicht aus der XSD-Spezifikation teilt die Datentypen in komplexe und einfache auf. Die einfachen Datentypen werden weiter unterteilt, die komplexen Datentypen und deren Ableitung werden erst im Anschluss betrachtet. Der Datentyp anySimpleType stellt den Urtyp unter den Datentypen dar und ist der Basistyp für alle primitiven Datentypen. Der Wertebereich ergibt sich aus der Vereinigung der Wertebereiche aller primitiven Datentypen. Darunter reihen sich die vordefinierten („built-in“ in Abb.22), primitiven Datentypen und die von diesen abgeleiteten („derived“ in Abb.22), primitiven Datentypen ein. Abgeleitete Datentypen werden entweder durch eine Einschränkung („derived by restriction“ in Abb.22) oder durch Listenbildung („derived by list“ in Abb.22) abgeleitet. Als Beispiel für eine Listenbildung sei der Datentyp NMTOKENS angeführt. Dieser setzt sich aus einer Sequenz, bestehend aus einzelnen NMTOKEN, zusammen und bildet somit eine Liste von NMTOKEN. Der Datentyp short leitet sich durch Einschränkung von int ab. Der Datentyp Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 77 int kann Ganzzahlwerte zwischen -2147483648 (-231) und 2147483647 (231-1) darstellen, Grenzen eingeschlossen. Der Wertebereich vom short wird eingeschränkt auf Werte zwischen -32768 (-215) und 32767 (215-1), einschließlich Grenzen. Nach dieser Definition von einfachen Datentypen werden deren grafische Komponenten an jeweils einem Beispiel vorgestellt. Im Anhang (Kapitel 8.3) befindet sich eine Übersicht, die zu jedem einfachen Datentyp zum einen den abgebildeten Java-Datentyp anzeigt und zum anderen die grafische Komponente, mit der dieser Datentyp dargestellt wird. In dieser Übersicht werden schon die JavaSwing-Komponenten aufgelistet. An dieser Stelle werden die Datentypen auf sprachunabhängige Komponenten abgebildet. Da allerdings diese Zuordnung nicht vollständig an dieser Stelle erläutert wird, sei daher auf den Anhang verwiesen. Grafische Komponenten für einfache Datentypen Bei der Auswahl der grafischen Komponenten muss für jeden Datentyp gewährleistet werden, dass alle Literale des Wertebereichs durch die Komponente eingegeben werden können. Ein Eingabefeld, das Tastatureingaben entgegen nimmt, kann prinzipiell für jeden Datentyp verwendet werden und kann als Basiskomponente angesehen werden. Durch die Verknüpfung mit einer Validierungseinheit können die Eingaben auf Korrektheit überprüft werden. Diese Überprüfung findet jeweils nach der Eingabe statt. Ideal wäre eine Eingabemöglichkeit, die nur korrekte Eingaben anbietet. Diese ist aber nur bei einigen Datentypen realisierbar, deren Wertebereich sehr klein ist, so dass dieser aufgelistet werden kann. Bei den meisten Datentypen ist allerdings der Wertebereich zu komplex, um eine Einschränkung vorab vorzunehmen. Daher wird bei diesen Datentypen ein Eingabefeld verwendet, das alle Tastatureingaben entgegen nimmt. Der Datentyp float wird z. B. durch ein Eingabefeld grafisch repräsentiert. Der Wertebereich setzt sich aus Gleitkommazahlen mit den Grenzen m×2e (m ist eine Ganzzahl, deren Absolutwert kleiner als 224 ist, und e ist eine Ganzzahl zwischen -149 und 104, Grenzen eingeschlossen). Neben dieser einfachen Verwendung eines Eingabefelds werden beim Datentyp QName zwei Eingabefelder verwendet. Ein QName baut sich aus einem lokalen Namen und aus einem Namensraum auf. Diese Eingabe könnte man auch in einem Eingabefeld entgegen nehmen und beide Eingaben durch Komma oder Leerzeichen trennen. Allerdings besteht bei einem QName auch die Möglichkeit, den Namensraum nicht anzugeben und nur den lokalen Namen zu verwenden. Diese Eingabe würde bei nur einem Eingabefeld zu Problemen führen und könnte den Anwender zu falschen Eingaben verleiten. Daher wurden im Modell zwei separate Eingabefelder eingeführt, die durch Bezeichnung dem Anwender die erforderliche Eingabe signalisieren. Bei Datentypen mit überschaubarem Wertebereich wird eine Auswahlbox als grafische Komponente generiert. In dieser Auswahlbox kann der Anwender per Mausklick eine Selektion vornehmen. Das 78 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. einfachste Beispiel stellt hier der Datentyp boolean dar. Der Wertebereich dieses Datentyp besteht nur aus wahr oder falsch (alternativ 1 oder 0). Die Auswahlbox beinhaltet also lediglich diese beiden Werte. Ein weiterer Datentyp in dieser Gruppe ist gMonth. Dieser Datentyp baut sich aus einer Auswahlbox mit allen Monaten auf. Bei allen Datentypen mit überschaubaren Wertebereich wird eine Auswahlbox zur Präsentation verwendet. Der Hauptvorteil dieser Komponente ist, dass sie jeweils den gleichen Platz innerhalb der Eingabemaske einnimmt, unabhängig von der Anzahl ihrer Elemente. Ferner besteht nicht die Möglichkeit, dass der Anwender eine falsche Eingabe betätigt. Die Komponente enthält nur gültige Werte, die aus dem WSDL-Dokument entnommen werden und generisch die Auswahlbox füllen. Eine Checkbox-Gruppe würde auch nur gültige Werte enthalten, aber sie würde mehr Platz beanspruchen. Für den Datentyp gMonth bräuchte man 12 einzelne Checkboxen. Zudem würde der Platzbedarf mit jedem Wert aus dem Wertebereich steigen. Dadurch würde die grafische Oberfläche zu viele Elemente enthalten und der Überblick würde verloren gehen. Die Auswahlbox zeigt zudem immer nur den ausgewählten Wert an. So kann der Anwender auch schneller überblicken, welche Werte er ausgewählt hat. Aus letzterem Grund wurde auch für den Datentyp boolean die Auswahlbox ausgesucht, obwohl auch bei der Checkbox-Gruppe, bestehend aus zwei Checkboxen, der Platzbedarf gering ist. Der Anwender sieht die getroffene Wahl und wird durch keine weiteren Angaben abgelenkt. Bei der Checkbox würde er beide Möglichkeiten sehen, wovon eine selektiert ist. Bei einer schnellen Prüfung seiner Angaben könnte der Anwender sich aber dennoch täuschen bei der Kontrolle seiner Angaben. Das Eingabefeld und die Auswahlbox stellen die beiden verwendeten Eingabemöglichkeiten innerhalb der Eingabemaske dar (außer bei binären Daten). Zusätzlich bauen sich einige Datentypen aus Kombinationen dieser beiden Komponenten auf. Der Datentyp date baut sich z. B. aus zwei Auswahlboxen und einem Eingabefeld auf und wird zur Eingabe eines Datums verwendet. In den Auswahlboxen können Angaben über Monat und Tag selektiert werden und im Eingabefeld kann eine Jahreszahl eingegeben werden. Einige Datentypen generieren noch eine zweite Eingabemöglichkeit. Neben der Komponente innerhalb der Eingabemaske wird für diese Datentypen ein separates Fenster geöffnet. In diesem Fenster kann über ein Editor Eingaben für einen string und über eine grafische Darstellung eines Kalenders Datumsangaben eingeben werden für date, duration, dateTime, gYearMonth und gMonthDay. Die extra Eingabemöglichkeit für einen string wurde hinzugefügt, da bei einem string die Länge beliebig lang sein kann. Über string kann man z.B. auch ganze Texte eingeben. Für lange Eingaben wäre das Eingabefeld sehr unflexibel in der Benutzung. Man würde immer nur einen kleinen Ausschnitt seiner Eingabe auf einmal sehen, da die Größe des Eingabefeldes beschränkt ist. Durch die Nutzung eines zusätzlichen Fensters kann man dort den eingegebenen Text komplett anzeigen. Die Eingabekomponente und das separate Fenster müssen synchronisiert werden, so dass Veränderungen überall übernommen werden und der Text im Eingabefeld und Fenster gleich ist. Für Datumseingaben wird in dem separaten Fenster eine grafische Komponente angezeigt, die für jeden Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 79 ausgewählten Monat dessen Tage grafisch anzeigt samt Zuordnung zu einzelnen Wochentagen. Zum einen hat der Anwender dadurch eine komfortable Bedienung und zum anderen kann somit eine externe Bearbeitung der Daten simuliert werden. Binäre Daten (base64Binary und hexBinary) können durch ein Auswahlfenster aus dem Dateisystem hoch geladen werden. Handelt es sich dabei um ein Bild, so wird dieses im zusätzlichen Editorsegment angezeigt. Handelt es sich allgemein um eine Datei, deren Inhalt nicht bekannt ist, so wird der Dateiname nach der Auswahl einer Datei angegeben. Analog zum Hochladen, können Dateien auch wieder beim Empfang einer Antwort gespeichert werden. Der Name kann frei gewählt werden beim Speichern. Handelt es sich um ein Bild, so wird dieses im zusätzlichen Editorsegment angezeigt. Durch Klick auf das Bild kann man das Bild in voller Größe in einem extra Fenster ansehen. Ebenso besteht die Möglichkeit einen Text direkt in einem extra Fenster anzeigen zu lassen. An dieser Stelle kann das Modell noch erweitert werden, indem für mehrere Dateitypen eine Behandlung direkt mit dem Programm stattfindet. Alternativ kann man auch einfach die Möglichkeit anbieten die empfangene Datei mit einem Programm zu öffnen, das man aus einer Liste auswählt oder indem man den Pfad angibt. Einschränkende Fassetten Jeder der Datentypen in XSD kann durch Angabe spezifischer Fassetten seinen Wertebereich einschränken. Insgesamt gibt es 12 einschränkende Fassetten. Ein Datentyp kann von diesen 12 Fassetten jeweils eine Teilmenge anwenden. Im Anhang (Kapitel 8.1 und 8.2) befindet sich eine Liste mit allen Fassetten für alle vordefinierten, primitiven Datentypen und eine Liste mit abgeleiteten Datentypen und ihren Fassetten. Die Fassetten werden innerhalb der Validierung des Datentyps ausgewertet. Für Fassetten, außer der Fassette enumeration, werden daher keine extra grafischen Komponenten benötigt, da die Komponente des Datentyps verwendet wird. Lediglich eine textuelle Aufreihung aller verwendeter Fassetten wird dem Anwender in der Eingabemaske mit angezeigt, damit er seine Eingaben dementsprechend abstimmen kann. Die Fassette enumeration stellt eine Ausnahme dar, da sie nicht nur den Wertebereich des Datentyps einschränkt, sondern auch eine Aufzählung aller erlaubten Werte angibt. Daher wird für diese Fassette eine Auswahlbox verwendet, egal welche grafische Komponente der zugrunde liegende Datentyp normalerweise hat. Sind dem Anwender die verwendeten Fassetten unbekannt, so kann er auf einer Hilfeseite Informationen über alle Fassetten erhalten. Nachfolgend werden alle Fassetten vorgestellt und jeweils an einem Beispiel erklärt. Zuvor wird der allgemeine Aufbau des XSD-Tags zur Angabe von Fassetten für einfache Datentypen angegeben. Fassetten können auch bei komplexen Datentypen verwendet werden, dies wird allerdings im nächsten Abschnitt gesondert behandelt. 80 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Allgemeiner Aufbau: <simpleType name= ”name”> <restriction base= ”datatype”> <facette with attributes>* </restriction> </simpleType> Innerhalb des Tags <simpleType> werden eine oder mehrere Fassetten für einen Datentypen angegeben. Sobald man für einen einfachen Datentypen Fassetten angibt, wird der Datentyp als ein benutzerdefinierter, komplexer Datentyp behandelt. <simpleType> erhält einen Namen über das Attribut name. Im Tag <restriction> wird mit dem Attribut base der Datentyp festgelegt, für den der Wertebereich durch Fassetten eingeschränkt wird. Innerhalb des Tags <restriction> werden schließlich die einschränkenden Fassetten angegeben, auf die nun eingegangen wird. Die ersten drei Fassetten length, minLength und maxLength werden bei allen Datentypen, die von string abgeleitet sind, string, base64Binary, hexBinary und Listen angewendet. Listen sind die Datentypen ENTITIES, IDREFS und NMTOKENS (siehe Übersicht in Abbildung 22). length Definition 4: length „length gibt die Anzahl der Längeneinheiten an, wobei die Längeneinheiten je nach Typ, von dem abgeleitet wird, variieren. Der Wert von length muss vom Typ nonNegativeInteger sein.“ Der Wert von length ist immer eine positive Zahl oder 0. Bei string und davon abgeleiteten Datentypen gibt length die Anzahl der Charakterwerte an. Bei base64Binary und hexBinary hingegen wird durch length die Anzahl der Bytes angegeben. Bei Listen wird die Anzahl der Elemente festgelegt. Beispiel: <simpleType name= ”lengthFacetteExample”> <restriction base= ”NCName”> <length =”10” fixed=”true”/> </restriction> </simpleType> In diesem Beispiel wird der Datentyp NCName, der von string abgeleitet ist, in seinem Wertebereich beschränkt. Eingaben für diesen Datentyp müssen exakt die Länge 10 haben. Das Attribut fixed gibt an, dass bei Verwendung dieses Datentyps innerhalb eines anderen Datentyps, die Fassette nicht nochmals anders belegt werden darf. Bei der Belegung des Attributs fixed=“false“ darf die Fassette innerhalb eines anderen Datentyps diesen Wert ändern und ersetzen. Initial ist der Wert immer false und muss nicht angegeben werden. Das Attribut fixed wird bei der Fassette Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 81 length einmal im Beispiel verwendet, bei den anderen Fassetten wird das Attribut nicht mehr angegeben, kann aber bei allen Fassetten verwendet werden. minLength Definition 5: minLength „minLength gibt die minimale Anzahl von Längeneinheiten an, wobei die Längeneinheiten je nach Typ, von dem abgeleitet wird, variieren. Der Wert von minLength muss vom Typ nonNegativeInteger sein.“ Der Wert von minLength ist immer eine positive Zahl oder 0. Bei string und davon abgeleiteten Datentypen gibt minLength die minimale Anzahl der Charakterwerte an. Bei base64Binary und hexBinary hingegen wird durch minLength die minimale Anzahl der Bytes angegeben. Bei Listen wird die Mindestanzahl der Elemente festgelegt. Beispiel: <simpleType name= ”minLengthFacetteExample”> <restriction base= ”NMTOKENS”> <minlength =”1”> </restriction> </simpleType> In diesem Beispiel wird der Datentyp NMTOKENS, der eine Liste des Datentyps NMTOKEN ist, in der Anzahl seiner Elemente beschränkt. Es wird festgelegt, dass mindestens ein Element in der Liste enthalten sein muss, sie also nicht leer sein darf. maxLength Definition 6: maxLength „maxLength gibt die maximale Anzahl von Längeneinheiten an, wobei die Längeneinheiten je nach Typ, von dem abgeleitet wird, variieren. Der Wert von maxLength muss vom Typ nonNegativeInteger sein.“ Der Wert von maxLength ist immer eine positive Zahl oder 0. Bei string und davon abgeleiteten Datentypen gibt maxLength die maximale Anzahl der Charakterwerte an. Bei base64Binary und hexBinary hingegen wird durch maxLength die maximale Anzahl der Bytes angegeben. Bei Listen wird die Höchstanzahl der Elemente festgelegt. Beispiel: <simpleType name= ” maxLengthFacetteExample”> <restriction base= ”hexBinary”> <maxLength =”1024”> </restriction> </simpleType> 82 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. In diesem Beispiel wird der Datentyp hexBinary auf eine Größe von 1024 Bytes beschränkt. Die eingefügte Datei darf also diese Größe nicht überschreiten. pattern Definition 7: pattern „pattern ist eine Beschränkung des Wertebereiches eines Datentyps; dies wird erreicht, indem der lexikalische Bereich auf Literale beschränkt wird, die in ein bestimmtes Muster passen. Der Wert von pattern muss ein regulärer Ausdruck sein.“ Ein pattern gibt also ein Muster an, welches der Datentyp erfüllen muss. Das Muster wird durch einen regulären Ausdruck angegeben. Die Definition eines regulären Ausdrucks ist komplex und für das Verständnis eines Pattern nicht unbedingt erforderlich und kann in der Spezifikation nachgelesen werden. Beispiel: <simpleType name= ”patternFacetteExample”> <restriction base= ”string”> <pattern value="\d{3}-[A-Z]{2}"/> </restriction> </simpleType> Der Datentyp string wird durch das gegebene Muster („\d{3}-[A-Z]{2}“) in seinem Wertebereich beschränkt. Das Muster spezifiziert in diesem regulären Ausdruck die erlaubten Eingaben bei Verwendung dieses Datentyps. Die Zeichenkette „\d“ steht für die Kategorie „Dezimalzahlen“. In Geschweiften Klammern dahinter wird die Anzahl festgelegt. Die Zeichenkette „[A-Z]“ steht stellvertretend für alle Buchstaben. Das Muster erlaubt demnach Eingaben, die mit drei Ziffern beginnen, danach ein Bindestrich aufweisen und mit 2 Buchstaben enden. Eine erlaubte Eingabe bei diesem Muster wäre demnach „123-XY“. Bei der Darstellung eines Pattern in der Eingabemaske wird immer das Muster mit angezeigt. In der Hilfeseite sind dann alle Erklärungen und Ersetzungsregeln für die Zeichenketten innerhalb des Musters. Allerdings könnten die Ersetzungsregeln bei komplexen Mustern für unerfahrene Anwender keine triviale Aufgabe werden. Daher wäre ein Beispiel, beigefügt als Dokumentation vom Web-Service-Anbieter, sehr hilfreich. enumeration Definition 8: enumeration „Die Aufzählung enumeration beschränkt den Wertebereich auf bestimmte benannte Werte.“ Diese Fassette kann für alle Datentypen außer boolean angewendet werden. Bei der Aufzählung (englisch: enumeration) werden Werte des Wertebereichs aufgereiht und einer kann ausgewählt werden. Eine Aufzählung hat immer eine endliche Anzahl von Werten und wird daher in einer Auswahl- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 83 box angezeigt. Unabhängig vom verwendeten Datentyp werden in einer Aufzählung immer alle Werte als Strings angegeben. Diese werden dann in der Auswahlbox angezeigt und der Anwender kann einen Wert mit der Maus selektieren. Beispiel: <simpleType name= ”enumerationFacetteExample”> <restriction base= ”string”> <enumeration value=”Niederlande”/> <enumeration value=”Belgien”/> <enumeration value=”Luxemburg”/> </restriction> </simpleType> Bei dieser Aufzählung werden drei strings namentlich aufgeführt. Diese drei Werte können dann in der Auswahlbox angezeigt werden. Diesen Datentyp könnte man beispielsweise verwenden, um ein Beneluxland auszuwählen. whiteSpace Definition 9: whiteSpace „whiteSpace beschränkt den Wertebereich von Typen, die von string abgeleitet sind so, dass verschiedene Verhaltensweisen, die in Attribute Value Normalization in [XML 1.0 (Second Edition)] spezifiziert sind, in Kraft treten. Der Wert von whiteSpace muss einer der folgenden sein: {preserve, replace, collapse}.“ Diese Fassette regelt die Behandlung und Einfügung von Leerzeichen bei einem Datentyp, der von string abgeleitet ist und string selbst. Die Fassette kann drei Werte annehmen. preserve bedeutet, dass keine Normalisierung vorgenommen wird. Bei replace werden alle von Tab, Zeilenvorschub und Return durch ein Leerzeichen ersetzt. collapse entfernt Vorkommen schließlich führende und abschließende Leerzeichen. Zusätzlich werden mehrere Leerzeichen zu einem zusammengefasst. Beispiel: <simpleType name= ”whiteSpaceFacetteExample”> <restriction base= ”QName”> <whiteSpace value=”collapse”> </restriction> </simpleType> Bei diesem Beispiel wird collapse als Wert für die Fassette beim Datentyp QName angewendet. Ein Anwender könnte folgende Eingaben betätigen: Als lokalen Namen gibt er „ Diplom arbeit “ und als Namensraum „ www.icsy.de “ ein. Nach Anwendung der Regel ergibt sich dann für den lokalen Part „Diplom arbeit“ und für den Namensraum „www.icsy.de“. Die führenden und abschlie- 84 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. ßenden Leerzeichen werden abgeschnitten und die drei Leerzeichen in der Mitte des lokalen Parts werden zu einem zusammengefasst. maxInclusive, maxExclusive Definition 10: maxInclusive „maxInclusive gibt die obere inklusive Schranke des Wertebereichs für einen Datentyp mit der geordnet-Eigenschaft an. Der Wert von maxInclusive muss im Wertebereich des Basistyps liegen.“ Definition 11: maxExclusive „maxExclusive gibt die obere exklusive Schranke des Wertebereichs eines Datentyps mit der geordnet-Eigenschaft an. Der Wert von maxExclusive muss im Wertebereich des Basistyps liegen.“ Diese beiden Fassetten geben Schranken für den Datentyp an, welche selbst innerhalb des Wertebereichs des Datentyps liegen müssen. Bei maxInclusive müssen die Werte kleiner oder gleich der Schranke sein und bei maxExclusive müssen die Werte kleiner als die Schranke sein. Bei maxInclusive ist also die Schranke auch ein erlaubter Wert, bei maxExclusive allerdings nicht. Beispiel: <simpleType name= ”maxInclusiveFacetteExample”> <restriction base= ”int”> <maxInclusive value=”10”> </restriction> </simpleType> In dem Beispiel dürfen alle Ganzzahlwerte im Wertebereich von int, die kleiner oder gleich 10 sind eingegeben werden. Der Wert 11 oder größer würde zu einem Fehler führen. Bei der Fassette maxExclusive und einem Wert von 10 dürften alle Ganzzahlwerte die kleiner sind als 10 eingegeben werden. Hier wäre die Eingabe von 10 oder größer ein Fehler. minExclusive, minInclusive Definition 12: minInclusive „minInclusive gibt die inklusive untere Schranke des Wertebereichs eines Datentyps mit der geordnetEigenschaft an. Der Wert von minInclusive muss im Wertebereich des Basistyps liegen.“ Definition 13: minExclusive „minExclusive gibt die exklusive untere Schranke der Wertebereich eines Datentyps mit der geordnetEigenschaft an. Der Wert von minExclusive muss im Wertebereich des Basistyps liegen.“ Diese beiden Fassetten geben Schranken für den Datentyp an, welche selbst innerhalb des Wertebereichs des Datentyps liegen müssen. Bei minInclusive müssen die Werte größer oder gleich der Schranke sein und bei minExclusive müssen die Werte größer als die Schranke sein. Bei minInclusive ist also die Schranke auch ein erlaubter Wert, bei minExclusive allerdings nicht. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 85 Beispiel: <simpleType name= ”minExclusiveFacetteExample”> <restriction base= ”short”> <minExclusive value=”10”> </restriction> </simpleType> In dem Beispiel dürfen alle Ganzzahlwerte im Wertebereich von short eingegeben werden, die größer als 10 sind. Der Wert 10 oder kleiner würde zu einem Fehler führen. Bei der Fassette minInclusive und einem Wert von 10 dürften alle Ganzzahlwerte, die größer oder gleich als 10 sind, eingegeben werden. totalDigits, fractionDigits Definition 14: totalDigits „totalDigits gibt die maximale Anzahl von Dezimalstellen in Werten an, die von decimal abgeleitet sind. Der Wert von totalDigits muss vom Typ positiveInteger sein.“ Definition 15: fractionDigits „fractionDigits gibt die maximale Anzahl von Nachkommastellen bei Werten, die von decimal abgeleitet sind, an. Der Wert von fractionDigits muss vom Typ nonNegativeInteger sein.“ Diese beiden Fassetten können auf allen Datentypen angewendet werden, die von decimal abgeleitet sind und decimal selbst. totalDigits gibt an, wie viele Ziffern insgesamt verwendet werden dürfen. Die Ziffern vor und nach dem Komma addiert dürfen nicht größer sein als der Wert von totalDigits. Dieser Wert muss ein positiveInteger sein, kann also ein Ganzzahlwert größer oder gleich 1 annehmen. fractionDigits gibt an wie viele Ziffern maximal nach dem Komma vorkommen dürfen. Der Wert wird als nonNegativeInteger angegeben. Es sind also für diesen Wert Ganzzahlwerte größer oder gleich 0 erlaubt. Beispiel: <simpleType name= ”total_fractionDigitsFacetteExample”> <restriction base= ”decimal”> <totalDigits value=”5”> <fractionDigits value=”2”> </restriction> </simpleType> Bei diesem Beispiel dürfen nur Zahlen des Datentyps decimal eingegeben werden, die höchstens drei Ziffern vor dem Komma haben und bis zu zwei Nachkommazahlen. Insgesamt dürfen höchstens fünf Ziffern verwendet werden. Einige erlaubte Eingaben: „-20,33“, “100,00“. „45,6“, „42“, „-999,99“, 86 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Komplexe Datentypen In diesem Abschnitt wird die Darstellung für komplexe Datentypen modelliert. Gibt man eine einschränkende Fassette für einen einfachen Datentyp an und spezifiziert somit das Tag <simpleType>, so wird aus dem einfachen Datentyp ein komplexer. Diese Darstellung wurde im vorigen Absatz diskutiert. Bei der Definition der komplexen Datentypen und der grafischen Komponenten kann aufgrund der Komplexität der XSD-Spezifikation nicht auf alle Details und Möglichkeiten eingegangen werden. Es werden daher die wichtigsten Elemente vorgestellt, die auch durch den Prototypen verwirklicht werden. Definition 16: Vereinigung „Der Wertebereich und der lexikalische Bereich einer Vereinigung entsprechen der Vereinigung der Wertebereiche und der lexikalischen Bereiche der an der Vereinigung beteiligten memberTypes … Ein Vereinigungs-Datentyp kann von einem oder mehreren atomaren, Listen- oder VereinigungsDatentypen abgeleitet sein. Das sind die sog. memberTypes dieses Vereinigungs-Datentyps.“ Dieser komplexe Datentyp setzt sich aus einem oder mehreren Basisdatentypen (atomaren-, Listenoder weiteren Vereinigungsdatentypen) zusammen. Die Basisdatentypen werden auch memberTypes genannt. Grafisch werden die einzelnen Basisdatentypen mit ihren entsprechenden Komponenten dargestellt. Der Benutzer wird darauf aufmerksam gemacht, dass es sich um eine Vereinigung handelt. Beispiel: <simpleType name= ”unionMonth”> <union> <simpleType name= ”listOfInt”> <list item=”1 2 3 4 5 6 7 8 9 1 0 11 12”/> </simpleType> <simpleType> <restriction base= ”string”> <enumeration value=”January”/> <enumeration value=”February”/> … <enumeration value=”December”/> </restriction> </simpleType> <union> </simpleType> Der Vereinigungsdatentyp unionMonth besteht aus der Vereinigung von dem Listendatentyp listOfInt (Auflistung wird im nächsten Absatz eingeführt) und einer Aufzählung des einfachen Datentyps string. Der Listendatentyp besteht aus einer Liste von 12 Ganzzahlwerten, beginnend bei dem Wert 1. Die Aufzählung besteht aus 12 Elementen (hier nur 3 aufgeführt) des Datentyps Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 87 string. Jedes Element stellt den Namen eines Monats dar. Mit dieser Vereinigung können Monate angegeben werden. Alternativ kann der Anwender entweder eine Zahl eingeben oder aus der Auswahlbox einen Monatsnamen selektieren. Eine der beiden Möglichkeiten kann der Anwender verwenden. Durch die Vereinigung wird also dem Anwender eine äquivalente Auswahl von Eingaben angeboten, die den gleichen Sachverhalt darstellen. Eine Eingabe von „7“ ist also äquivalent mit der Eingabe von „July“. Definition 17: Auflistung „Ein Listen-Datentyp muss von einem atomaren oder einem Vereinigungs-Datentyp abgeleitet sein, dem sog. itemType des Listen-Datentyps. Daraus entsteht ein Datentyp, dessen Wertebereich aus Sequenzen endlicher Länge von Werten aus dem Wertebereich des itemType besteht und dessen lexikalischer Bereich sich aus durch Leerraum getrennte Listen von Literalen zusammensetzt.“ Bei der Auflistung kann ein Vereinigungs- oder atomarer Datentyp als Basis (itemType) genommen werden. Die Auflistung ist eine Aneinanderreihung dieser Basis. Dargestellt wird dieser Datentyp aus der Komponente der Basis im Editorsegment. Überdies wird im zusätzlichen Editorsegment eine Liste angezeigt. Nachdem der Anwender den Wert für die Basis editiert hat, kann er durch Druck auf einen Button signalisieren, dass das Editieren abgeschlossen ist und der Wert wird in der Liste übernommen. Nach der Übernahme befindet sich der Wert am Ende der Liste, die sich dadurch sukzessive aufbaut und die Eingabekomponente wird zurückgesetzt. Bei einem Eingabefeld werden die eingegebenen Werte gelöscht und bei einer Auswahlbox wird der erste Wert selektiert dargestellt. Im zusätzlichen Editorsegment wird neben der Liste noch ein Editierungsbutton angebracht. Nach Auswahl eines Elementes in der Liste kann dieses durch Druck auf den Button wieder in der Eingabekomponente angezeigt werden. Nach erfolgreicher Editierung wird der neue Wert anstatt des alten in der Liste weiter geführt. Beispiel: <simpleType name= ”listofBytes”> <list item=”byte”/> </simpleType> In diesem Beispiel wurde der komplexe Datentyp listofBytes spezifiziert. Er besteht aus einer Liste von Werten des Datentyps byte. Model Group Definition: Durch eine Model Group Definition kann ein komplexer Datentyp strukturiert werden. Durch eine Model Group wird angegeben, wie die Elemente des komplexen Datentyps zusammengesetzt werden. Die Elemente eines komplexen Datentyps können wiederum komplex sein. So können komplexe Datentypen beliebig verschachtelt werden. Die grafische Präsentation baut sich aus den Komponenten der einzelnen Elemente auf. Bestehen einzelne Elemente wiederum aus einem komplexen Datentyp, so 88 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. wird dieser ebenfalls in seine Elemente zerlegt. Diese Zerlegung wird solange fortgesetzt, bis schließlich nur noch Elemente aus Basisdatentypen (atomaren-, Listen- oder Vereinigungsdatentypen) vorliegen. Bei der Realisierung im fünften Kapitel und den Implementierungsaspekten im folgenden Kapitel wird ein mehrfach verschachtelter, komplexer Datentyp vorgestellt. Eine Model Group zur Strukturierung baut sich folgendermaßen zusammen: {compositor} : Auswahl der Komposition: all, choice or sequence. {particles} : Liste von Partikeln {annotation} : optionale Dokumentationen Gruppierungsmöglichkeiten durch Komposition: Durch die Komposition wird angegeben, wie die einzelnen Elemente innerhalb des komplexen Datentyps auszuwerten sind. An zwei Beispielen werden die drei Gruppierungsmöglichkeiten veranschaulicht. sequence: Die Reihenfolge der Deklarationen muss eingehalten werden. choice: Eine der angegebenen Deklarationen muss vorkommen. Beispiel für sequence und choice: <complexType name=„Time"> <sequence> <element name=”hour” type=„int"/> <choice> <element ref=„pm"/> <element ref=„am"/> </choice> </sequence> </complexType> Der komplexe Datentyp „Time“ baut sich aus einer Sequenz auf. Die Sequenz besteht aus dem einfachen Datentyp int und einem weiteren komplexen Datentyp, der sich aus einer Auswahl (choice) aufbaut. Die Auswahl erlaubt entweder „pm“ oder „am“ auszuwählen. Der komplexe Datentyp baut sich also aus einem Ganzzahlwert auf, der die Uhrzeit präsentiert und der Möglichkeit „pm“ oder „am“ auszuwählen. Die grafischen Komponenten in diesem Fall wären ein Eingabefeld und eine Auswahlbox. Bestünde das choice-Element wiederum aus einem komplexen Datentyp, so würde der Anwender durch einen Text aufgefordert werden, die nachfolgenden komplexen Datentypen als Auswahl anzusehen und sich für einen zu entscheiden. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. all: 89 Entweder alle angegebenen Deklarationen oder keine (Reihenfolge unerheblich) müssen vorkommen. Beispiel für all: <complexType name=“AuthorName“> <all> <element name=”firstName” type=”string”/> <element name=”familyName” type=”string”/> </all> </complexType> Der komplexe Datentyp AuthorName baut sich aus den beiden Elementen firstName und familyName auf. Durch Angabe des Partikels all wird festgelegt, dass entweder beide Elemente angegeben werden müssen oder keine. Wenn man für firstName einen Wert angibt, so muss dies auch für familyName erfolgen. Ein Partikel kann das minimale Vorkommen (minOccurs) oder das maximale Vorkommen (maxOccurs) eines Elementes innerhalb eines komplexen Datentyps angeben. Außerdem kann der Partikel wieder eine Model Group, Wildcards oder eine Elementdeklaration beinhalten. Beispiel: <element name=„writtenBooks" type="String" minOccurs="0" maxOccurs="unbounded"/> Dieses Element kann innerhalb eines komplexen Datentyps enthalten sein. Der Basisdatentyp ist ein string und es wird festgelegt, dass dieses Element entweder nicht vorkommt (minOccurs=0) oder beliebig oft verendet werden kann. Dieser Teil eines komplexen Datentyps gibt den Namen von Büchern an, die ein Autor bisher geschrieben hat. Entweder hat er noch kein Buch veröffentlicht oder eine beliebige Anzahl von Büchern. Felder (Arrays): Felder werden an dieser Stelle stellvertretend für Kollektionen vorgestellt. Deren Aufbau und Präsentation gleicht dem Aufbau einer Liste. Eine zyklische Feldinitialisierung ist nicht erlaubt. Ein Feld kann als Datentyp nicht wieder das aufrufende Feld sein, verschachtelte Felder sind aber erlaubt. Ein Feld kann als Datentyp wiederum ein anderes Feld haben. Ebenso kann ein Feld aus einem komplexen Datentypen bestehen. Die grafische Darstellung eines Feldes baut sich aus der Komponente des Feldtyps auf. Ist dieser ein einfacher Datentyp, so wird dessen Komponente angezeigt. Bei einem komplexen Datentyp wird die Komponente, wie im vorigen Absatz beschrieben, aufgebaut und angezeigt. Der Anwender erhält als Information angezeigt, dass es sich um ein Feld handelt und den Namen des Feldtyps. Außerdem wird die Begrenzung des Feldes (minOccurs, maxOccurs) angezeigt, falls diese angegeben wurde. Im zusätzlichen Editorsegment wird eine Liste angezeigt, die die Elemente des einfachen Feldes beinhaltet. 90 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Felder können verschiedene Felddimensionen haben. Das Modell nimmt keine Einschränkungen einer maximalen Felddimension vor. Ein fertig editiertes Feld wird jeweils in das Feld höherer Dimension eingefügt. Als Beispiel wird die Editierung eines doppelten Feldes besprochen. Mehrdimensionale Felder bauen sich analog auf. Bei einem doppelten Feld ist noch eine zweite Liste im zusätzlichen Editorsegment angelegt. Sobald man das erste einfache Feld editiert hat, kann man durch Druck auf einen Button dieses einfache Feld in das doppelte Feld einfügen. Danach wird die Anzeige im einfachen Feld zurück gesetzt und ein neues einfaches Feld kann eingegeben werden. Möchte man ein bereits eingefügtes einfaches Feld nochmals editieren, so muss zunächst im doppelten Feld ein einfaches Feld ausgewählt werden. Dieses einfache Feld wird dann in der Anzeige für das einfache Feld aufgelistet. In dieser Auswahl kann man dann wiederum ein Element auswählen, das dann in der normalen Eingabemaske angezeigt wird und editiert werden kann. Mehrdimensionale Felder bauen sich ebenfalls analog nach diesem Schema auf. Beispiel eines Feldes: <complexType name="KeyWordSearchArray"> <complexContent> <restriction base="Array"> <attribute ref="arrayType" arrayType="string[][]"/> </restriction> </complexContent> </complexType> Das Beispiel zeigt ein doppeltes Feld, das aus dem einfachen Datentyp string besteht. Dieses Beispiel wird im sechsten Kapitel nochmals angeführt und die grafische Präsentation angezeigt. 4.4 Einbettung semantischer Informationen WSDL-Dokumente beschreiben die Schnittstelle zu einem Web-Service und wurden primär entwickelt, um von Parsern gelesen zu werden und danach den präsentierten Web-Service dynamisch in Applikationen einzubinden. Die maschinelle Verarbeitung steht dabei im Vordergrund. Maschinen benötigen keine semantischen Informationen über einen verwendeten Dienst. Sie extrahieren die Informationen und Daten des WSDL-Dokumentes und Verarbeiten die gesendeten und empfangenen Daten. Für Anwender ist es allerdings wichtig semantische Informationen zu erhalten, um den WebService richtig zu nutzen und zu verstehen. WSDL und XSD machen keine Vorgaben für Entwickler, dass diese semantische Informationen mit einbinden müssen. Vorgeschrieben ist lediglich die Einhaltung einer korrekten Syntax. Ein Beispiel dafür ist die Namensgebung von Parametern und Operationen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 91 Eine Addition mit zwei Ganzzahlwerten könnte man in WSDL folgendermaßen darstellen: <wsdl:message name="xyz"> <wsdl:part name="userName" type="xsd:int"/> <wsdl:part name="password" type="xsd:int"/> </wsdl:message> Für eine Maschine ist lediglich der Datentyp und Anzahl der Parameter zur Anfrage an den WebService wichtig, damit die richtigen Werte übergeben werden und der Name der Operation. Da der Prototyp die GUI generisch aus dem WSDL-Dokument aufbaut und keine weiteren Dokumente zur Verfügung hat, kann er nach dem Parsen auch lediglich die angegeben Namen in der GUI anzeigen. Der Anwender würde in diesem Beispiel in der Eingabemaske für eine Addition zwei Felder für Ganzzahlwerte sehen mit den entsprechenden Namen userName und password. Durch die Namensgebung wäre dem Benutzer nicht intuitiv klar, dass es sich hier wirklich um eine Addition handelt und nicht um einen Einwahlvorgang. Durch dieses Beispiel soll eine entscheidende Schwäche des Modells, aber auch von WSDL aufgezeigt werden. Da der Prototyp lediglich vorhandene Namen aus dem WSDL-Dokument zur Darstellung verwenden kann, ist der Anwender auf eine menschenlesbare Wahl der Namen durch die Entwickler angewiesen. Die GUI-Generierung aus folgendem WSDLAusschnitt wäre für den Anwender leichter verständlich und würde nicht irritieren. <wsdl:message name="summation"> <wsdl:part name="addend1" type="xsd:int"/> <wsdl:part name="addend2" type="xsd:int"/> </wsdl:message> Wünschenswert wäre die Aufnahme einer semantischen Namensgebung in einer der folgenden WSDL-Spezifikationen. Eine komplett semantisch zweifelsfreie Namensgebung wird eher unwahrscheinlich sein, aber erste Richtlinien würden die generische Erzeugung einer GUI für Anwender erleichtern. Semantik kann nicht nur durch Verwendung von eindeutigen Namen erreicht werden, sondern auch durch gezielte Dokumentation. Ein Datentyp Adresse kann unterschiedlich verwendet und interpretiert werden. Eine Unterscheidung allein durch den Namen ist in diesem Fall nicht möglich. Innerhalb eines WSDL-Dokumentes kann der gleiche Datentyp Adresse zur Angabe der Privatanschrift und z. B. des Arbeitsplatzes verwendet werden. Diese Mehrdeutigkeiten kann eine WSDL-interne Dokumentation beheben. Zu jedem Parameter kann eine Dokumentation hinzugefügt werden, dadurch kann der Benutzer die Verwendung des Parameters leichter verstehen. Denn lediglich der Name des Parameters reicht oft nicht zur unmissverständlichen Erkennung. Im Modell soll diese Möglichkeit zur Verfügung gestellt werden, auch wenn die Dokumentation zurzeit noch nicht ausreichend von den Web-ServiceAnbietern genutzt wird. Das Modell bietet die Möglichkeit, Dokumentation auf drei Ebenen anzubieten. Eine Dokumentation kann für einen Parameter, eine Operation oder einen ganzen Port angegeben werden. 92 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Wird für einen Parameter auch eine Dokumentation im WSDL-Dokument gefunden, so wird bei der zugehörigen grafischen Komponente ein Informationsbutton hinzugefügt. Durch Anklicken wird diese in einem separaten Fernster aufgeführt. Alternativ könnte man auch alle Dokumentationen für die Parameter einer Operation gebündelt innerhalb einer Hilfeseite anbieten. Allerdings würde diese Seite dann sämtliche Dokumentationen zu den Parametern führen. Bei steigender Komplexität ginge leicht der Überblick verloren. Deshalb fiel die Entscheidung zur Realisierung dieser Hilfefunktion in Form von individuellen Buttons. Ein weiterer Vorteil dieses Entwurfs liegt in der transparenten Bekanntmachung der Dokumentation. Wären sämtliche Informationen innerhalb einer Hilfeseite, so müsste man diese erst durchsuchen, um die gewünschte Information zu erhalten. Ist die Information aber gar nicht vorhanden, so entdeckt der Anwender dies erst nach gründlichem Studium der Hilfeseite. Wird allerdings für jede vorhandene Dokumentation zu einem Parameter ein Button generiert, entfällt die Suche. Ist zu einem Parameter kein Button generiert worden, so wird dem Anwender sofort signalisiert, dass keine Dokumentation vorhanden ist. Zusätzlich könnten die Dokumentationen auch immer zu dem gerade aktivierten Parameter automatisch in der Statusanzeige oder einem Extrafenster angezeigt werden. Die Statusanzeige ist primär zur Anzeige von Fehlern vorgesehen. Sobald ein Fehler auftritt, wird er in der Anzeige angegeben. Aus diesem Grund kann die Dokumentation nicht in der Statusanzeige angeführt werden. Daher müsste die dauerhafte Anzeige der Dokumentationen in einem Extrafenster realisiert werden. Sobald eine Eingabekomponente aktiviert wird zur Eingabe der Daten, könnte die zugehörige Dokumentation im separaten Fenster angezeigt werden. Dies würde allerdings den Bearbeitungsfluss stören. Der Anwender würde unnötig von der Eingabe seiner Daten abgelenkt werden. Bei der Anzeige in einem Extrafenster würde der Text der Dokumentation bei jedem Wechsel des Parameters durch den Fokuswechsel auch seinen Inhalt variieren. Selbst wenn dies in einem Extrafenster durch geführt wird, so wird der Anwender dennoch davon Kenntnis nehmen und abgelenkt werden. Daher wird die zusätzliche Information zu einem Parameter durch einen Button angeboten, der nur bei Gebrauch aktiviert wird. Zusätzlich können Dokumentationen zu einer Operation oder einem Port angezeigt werden. Falls eine Dokumentation zu einer Operation vorliegt, wird im unteren Segmentbereich des Editors ein entsprechender Button generiert. Die Dokumentation des korrespondierenden Ports wird ebenfalls mit angezeigt. Da jede Operation im Kontext des Ports benutzt wird, können diese Informationen im Zusammenhang mit den Informationen des Ports stehen. Anders als bei den Parametern kann hier keine Informationsüberflutung entstehen, da lediglich die Information zu einem Port angezeigt wird. Des Weiteren kann eine Operation innerhalb mehrerer Ports verwendet werden. Daher ist es unter Umständen wichtig zu wissen, welche spezifischen Unterschiede diese Ports aufweisen und in welchem Zusammenhang die Operation verwendet wird. Die Reihenfolge bei der Darstellung der Parameter sollte bei der Generierung der GUI nicht geändert werden. Bei vorhandenem Platz auf einer Ebene könnte man zwar vom Platzverbrauch kleinere Kom- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 93 ponenten noch zu einer Ebene dazu fügen, um den Platz optimal zu nutzen. Dieses Vorgehen ist allerdings durch das Modell nicht erlaubt. Die Reihenfolge der Parameter soll beibehalten werden, da darin evtl. auch semantische Informationen des Entwicklers stecken. Eine Eingabe im hinteren Bereich der Operation könnte sich auf Eingaben davor beziehen. Eine Umstrukturierung der Parameter könnte so Probleme bereiten. Beispielsweise könnte der Anwender aufgefordert werden seine private und seine geschäftliche E-Mail-Adresse anzugeben. Danach wird gefragt welche E-Mail-Adresse bevorzugt verwendet werden soll, um aktuelle Informationen über Angebote zu senden. Erfolgt diese Abfrage zuerst, weiß der Anwender nicht, was mit dieser Frage gemeint ist. Daher wird bei der Generierung der GUI die Reihenfolge stets beibehalten, auch wenn dadurch u. U. Lücken am unteren Ende einer Ebene entstehen, falls die nächste, darzustellende Komponente das restliche Platzangebot übersteigt. Bei der Entwicklung des Modells wurden somit Möglichkeiten geschaffen, semantische Aspekte zu verwirklichen. Durch den späteren Prototypen soll herausgearbeitet werden, dass eine semantisch einwandfreie Interpretation der angezeigten Daten erreicht werden kann. Auch wenn diese Daten generisch erzeugt werden und somit eine Kontrolle des GUI-Aufbaus zur Laufzeit nicht möglich ist. Durch die Entwicklung dieses Modells sollten einige Anregungen gegeben und später in der Realisierung gezeigt werden, dass das Modell in der Praxis einsetzbar ist. Sämtliche Vorgaben müssten allerdings erst einmal von den Web-Service-Anbietern übernommen und verwirklicht werden. 4.5 Zusammenfassung In diesem Kapitel wurde das Modell für den Prototypen sukzessive nach dem Top Down Verfahren entwickelt. Zunächst wurde die Beschreibung des Gesamtsystems aus der Sicht des Anwenders geschildert, um einen Überblick über die einzelnen Interaktionsschritte bei der Benutzung des Systems zu erhalten. Der anschließende Aufbau der grafischen Oberfläche erfolgte in zwei Schritten. Zunächst werden alle Web-Services und deren Operationen angezeigt. Aus dieser Auswahl kann der Anwender eine Operation auswählen. In einem zweiten Schritt werden dann die Details dieser Operation in einer Eingabemaske angezeigt. Dieser zweigeteilte Aufbau ist erforderlich, um einen schnellstmöglichen GUIAufbau zu gewährleisten und somit nur die nötigsten Informationen aus dem WSDL-Dokument zu extrahieren. Des weiteren wurden die einfachen und komplexen Datentypen und ihre grafischen Eingabekomponenten vorgestellt. Ein einfacher Datentyp baut sich entweder aus einer Auswahlbox auf, wenn der Wertebereich überschaubar klein ist, oder aus einem Eingabefeld. Die Eingabemaske für eine Operation baut sich sukzessive aus den einzelnen Komponenten auf. Die Anzahl der Parameter innerhalb einer Operation kann beliebig komplex sein, da sich die Komponenten bei Übersteigung des Platzbedarfs generisch auf mehrere Ebenen verteilen. Schließlich wurde versucht eine Sensibilisierung zur Schaffung semantischer Informationen innerhalb eines WSDL-Dokumentes zu geben. Das Modell ist 94 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. zwar in der Lage sämtliche WSDL-Dokumente in der GUI darzustellen, ob die abgebildeten Informationen aber vom Anwender verstanden werden, kann nicht garantiert werden. Das Modell bietet die Möglichkeit gezielte Dokumentationen anzuzeigen, diese müssen aber vom Web-Service-Anbieter auch bei der Erstellung des WSDL-Dokumentes integriert werden. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 95 Kapitel 5: Realisierung Nach dem Entwurf des Modells zur Generierung der GUI wird in diesem Kapitel die Realisierung des Modells durch die Entwicklung eines Prototypen vorgestellt. Der Prototyp realisiert das entworfene Modell und zeigt die Umsetzung der erarbeiteten Ergebnisse. Zunächst wird die Architektur des Frameworks erläutert und durch zwei statische Strukturdiagramme illustriert. Die Architektur wird dabei in zwei Verfeinerungsschritten aus dem Modell entwickelt. Ein UML-Paketdiagramm stellt zunächst die verwendete Package-Struktur (Paket-Struktur) des Prototypen vor. Im nächsten Verfeinerungsschritt werden in einem UML-Klassendiagramm einzelne Klassen und ihre Funktionen innerhalb des Prototypen vorgestellt. Anschließend wird der Aufbau und die Generierung der grafischen Komponenten eingeführt. Dazu werden die beteiligten Klassen nochmals genauer untersucht und der Prozess vom Extrahieren der Informationen aus dem WSDL-Dokument bis zum Fertigstellen der grafischen Komponenten für einzelne Parameter beschrieben. Darauf folgend wird der Aufbau der Eingabemaske der GUI diskutiert, die sich aus den grafischen Komponenten aufbaut und diese übersichtlich anordnet. Anschließend wird das eingesetzte Verfahren zum Binden des Client an einen Web-Service erörtert. Darauf aufbauend wird in diesem Zusammenhang das Senden von binären Daten angesprochen. Diese können kodiert und innerhalb der SOAP-Nachricht gesendet werden oder als Anhang im ursprünglichen Format hinzugefügt werden. Zum Schluss findet eine Zusammenstellung der wichtigsten Punkte der Realisierung statt. 96 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 5.1 Architektur des Frameworks Die Architektur des Frameworks beschreibt die Realisierung und Umsetzung des Modells. Das UMLPaketdiagramm in Abbildung 23 zeigt zunächst die Package-Struktur und die Kommunikation zwischen den einzelnen Packages. Somit wird ein erster Gesamtüberblick über den Prototypen vermittelt. «verwendet» «verwendet» guiFramework «verwendet» «verwendet» externPrg xsdDatatypes «verwendet» resources «verwendet» «verwendet» libraries Abbildung 23: UML-Paketdiagramm des Prototypen Das Package guiFramework stellt das zentrale Package innerhalb des zu entwickelnden Prototyps dar. In diesem Package wird die grafische Oberfläche des Frameworks generiert, das WSDLDokument geparst, Eingaben des Benutzers validiert, Eingaben für komplexe Datentypen persistent gespeichert und der Sende- und Empfangsvorgang in Kombination mit der Axis-Engine durchgeführt. Wegen der zentralen Bedeutung dieses Packages innerhalb des Prototypen wird es im folgenden Klassendiagramm detailliert beschrieben. Dieses Package greift zur Erstellung seiner Dienste auf andere Packages zu. Das Package externPrg ist als Schnittstelle zum Einbinden externer Programme vorgesehen. Bei Erweiterung des Prototypen können hier externe Programme zum Editieren der Datentypen eingebunden werden. Zur Demonstration wurde ein Programm zur grafischen Darstellung von Datumseingaben eingebunden. Für Datumseingaben steht also nicht nur die normale generierte Komponente innerhalb der Eingabemaske zur Verfügung, sondern auch die Möglichkeit über ein zusätzliches Fenster Eingaben zu betätigen. Prinzipiell könnte bei einer Erweiterung des Prototypen in diesem Package für jeden Datentyp ein Programm zur externen Editierung involviert werden. Neben dem Package guiFramework stellt das Package xsdDatatypes das zweite zentrale Package des Prototypen dar. Innerhalb dieses Packages wird für jeden der zurzeit 44 einfachen XSDDatentypen eine eigene Klasse zur Speicherung der Eingabedaten, Erzeugung der grafischen Eingabekomponente und Validierung bereit gestellt. Die Struktur dieser Klassen unterliegen einem einheitlichen Modell. Der Aufbau einer Klasse wird im Kapitel 6.2 vorgestellt und im Anhang (Kapitel 8.5) befindet sich beispielhaft ein Programmlisting für den Datentyp float. Zusätzlich enthält das Packa- Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 97 ge Klassen für Fassetten und Kollektions-Datentypen. Angesprochen werden alle Klassen über eine Wrapper-Klasse, die ein einheitliches Interface für alle Datentyp-Klassen bietet und diese transparent kapselt. Anfragen an eine Datentyp-Klasse werden an den Wrapper gesendet, der die Daten durch ein Mapping an die entsprechende Klasse des Datentyps weiterleitet. Im Package resources befinden sich Dateien, die innerhalb des guiFrameworks zum Aufbau der GUI benötigt werden. Darin enthalten sind alle Bilddateien, Skripte mit landesspezifischen Texten und sämtliche lokalen HTML-Seiten, die innerhalb der Hilfefunktion angezeigt werden. Das letzte Package libraries beinhaltet alle verwendeten JAR-Dateien, die von allen anderen Packages verwendet werden. Darunter befinden sich u. a. JAR-Dateien von Axis, Xerces oder Sun Microsystems. Auf die einzelnen JAR-Dateien wird an dieser Stelle nicht weiter eingegangen. Abbildung 24 zeigt im nächsten Verfeinerungsschritt das UML-Klassendiagramm der beiden Packages guiFramework und xsdDatatypes. In diesem Klassendiagramm werden lediglich die Klassen aufgeführt ohne auf Interna einzugehen. Zur besseren Übersicht wurden die Methoden nicht aufgeführt. Die Funktionen der einzelnen Methoden werden allgemein in der Beschreibung der Klasse mit integriert. guiFramework xsdDatatypes «verwendet» Helper Reutilisation «verwendet» XSDDateTime «verwendet» GuiBuilder ButtonFactory «verwendet» «verwendet» «verwendet» «verwendet» ComponentFactory «verwendet» «Schnittstelle» XSDWrapper «verwendet» XSDString «verwendet» XSDFacettes «verwendet» ExtraWindow WSDLFactory SynchronisationFactory Abbildung 24: UML-Klassendiagramm des Prototypen Zentrale Klasse innerhalb des guiFramework-Packages bildet die Klasse GuiBuilder. Diese Klasse erstellt die grafische Oberfläche und stellt Anfragen an andere Klassen innerhalb des Packages. Die Klasse erzeugt das Menü, die Symbolleiste (Toolbar), die Hilfefunktion und präsentiert die Eingabemaske zum Editieren der Anfrage und Anzeige der Antwort. Die Klasse ButtonFactory generiert diverse Buttons für GuiBuilder, darunter u. a. ein Informations-, Sende-, Reset- und CloseButton für jede Operation und ein Navigationspanel, falls die Eingabemaske über mehrere Ebenen hinweg die Parameter anzeigt. Bei jeder neuen Operation wird neben der Eingabemaske auch die Buttons generiert und im Editorsegment angezeigt. 98 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. In der Klasse ExtraWindow können zusätzliche Fenster erzeugt werden zum Anzeigen von Informationen, Hilfethemen, grafische Eingabemöglichkeit von Datumsangaben und Dokumentationen aus dem WSDL-Dokument. Durch die zusätzlichen Fenster wird eine Informationsüberflutung im Hauptfenster verhindert und somit die übersichtliche Darstellung bewahrt. Außerdem können die separaten Fenster bei der Bearbeitung der Anfrage im Hintergrund geöffnet bleiben und bei Bedarf eingesehen werden. Dies ist vor allem bei der Hilfefunktion von Vorteil, die dem Anwender nach dem Öffnen zur Verfügung steht, aber durch die Darstellung in einem separaten Fenster den normalen Programmfluss nicht stört. In der Klasse WSDLFactory wird das WSDL-Dokument geparst und alle benötigten Informationen zum Erstellen der grafischen Oberfläche GuiBuilder zugänglich gemacht. Sämtliche Elemente des WSDL-Dokumentes werden extrahiert und in dieser Klasse gespeichert. Zusätzlich werden sämtliche Dokumentationen einzelner Elemente aufbereitet zur späteren Anzeige. Nach Anfrage des Anwenders können diese in der GUI dargestellt werden. Über die Klasse Reutilisation können bereits getätigte Eingaben für komplexe Datentypen geladen und wieder verwendet werden. Vor jedem Sendevorgang werden die Daten der Eingabemaske für jeden komplexen Datentypen nach einer Abfrage gespeichert. Bearbeitet der Anwender eine Operation, die komplexe Datentypen verwendet und für die bereits Eingaben getätigt wurden, so können diese wieder verwendet werden. Die Klasse ComponentFactory dient als Schnittstelle zum Package xsdDatatpyes. Innerhalb der ComponentFactory werden die einzelnen grafischen Komponenten für die Parameter einer Operation zusammengestellt. Besteht ein Parameter aus einem komplexen Datentyp, so wird WSDLFactory kontaktiert, damit dieser Datentyp geparst wird. Sind die einzelnen Datentypen bekannt, so wird über die Klasse XSDWrapper eine Anfrage gestellt, um die grafische Komponente des jeweiligen Datentyps zu erhalten. Die Klasse XSDWrapper wird als Interface benutzt und leitet alle Anfragen an die jeweiligen Klassen weiter (stellvertretend wurden einige Klassen aufgelistet). Nach Erhalt der grafischen Komponenten für alle Datentypen werden diese in einer Eingabemaske gruppiert und wieder zurück an die Klasse GuiBuilder geleitet, um sie in der GUI anzuzeigen. Das nachfolgende Unterkapitel beschreibt nochmals detailliert diesen Sachverhalt. Die Klasse SynchronisationFactory wird zum Synchronisieren der Daten vor dem Senden und dem Empfang verwendet. Für einfache Datentypen, komplexe Datentypen und binäre Daten stellt die Klasse Serialisierer bereit. In Kapitel 5.4 wird ein Beispiel angeführt. Schließlich beinhaltet die Hilfsklasse Helper einige Methoden, die von mehreren Klassen verwendet werden. Die Klasse enthält z. B. Methoden zum Ausführen von WSDL2Java und TCP-Monitor, zum Auslesen des Datenstroms einer WSDL-URL oder Datei oder zum Erzeugen von Objekten der generierten Klassen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 99 5.2 Aufbau der grafischen Komponenten Der Aufbau der grafischen Komponenten für die Parameter einer Operation aus den Daten des WSDLDokumentes stellt eine zentrale Funktion innerhalb der GUI-Generierung dar. Aus diesem Grund wird in Abbildung 25 der Prozess zum Aufbau einer grafischen Komponenten illustriert und die beteiligten Klassen vorgestellt. Die Abbildung zeigt die fünf beteiligten Klassen und durch nummerierte Pfeile wird der Datenaustausch zwischen ihnen chronologisch dargestellt. GuiBuilder 1: Operationsname 9: Eingabemaske 8: Aufbau der Eingabemaske 2: fordert Datentypen an* ComponentFactory -getComponent() WSDLFactory 3: Liste der Datentypen* 7: grafische 4: fordert graf. Komponente für XSD- Komponente Datentyp 5: erzeugt Instanz XSDWrapper Java-Datentyp - Mapping - Eingabekomp. - Validierung 6: grafische Komponente Abbildung 25: Aufbau der grafischen Komponenten Der Ausgangspunkt zum Generieren der Komponenten stellt die Selektion einer Operation dar. Nachdem eine Operation durch den Anwender ausgewählt wurde, müssen die Parameter der Operation ermittelt werden. Die Klasse GuiBuilder übergibt der Klasse ComponentFactory den selektierten Operationsnamen (1). Zusätzlich wird auch der Portname übermittelt, damit die Operation eindeutig zugeordnet werden kann, da mehrere Ports die gleiche Operation verwenden können. Zum Aufbau der GUI ist diese Information redundant, da die Operation immer die gleiche GUI generiert, unabhängig vom verwendeten Port. Allerdings werden die erzeugten grafischen Komponenten im Zusammenhang mit dem Portnamen gespeichert, damit beim Sendevorgang auch die richtigen Eingaben verwendet werden. Beispielhaft könnte eine Operation von zwei Ports angeboten werden und der Anwender möchte beide Ports verwenden mit unterschiedlichen Daten. Daher wird für jeden Port eine Eingabemaske für die Operation erzeugt und die Daten unabhängig voneinander gespeichert. 100 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Die Klasse ComponentFactory startet nun eine Anfrage in der Methode getComponent() an die Klasse WSDLFactory und fordert alle Datentypen der eingehenden Nachricht (<input message>) der ausgewählten Operation an (2). WSDLFactory ermittelt die Parameternamen der Part-Elemente der eingehenden Nachricht und liefert eine Liste mit allen Parameternamen und deren Datentypen zurück (3). Die Parameter samt Datentypen wurden zuvor in der WSDLFactory gespeichert und liegen nun für alle Operationen vor. ComponentFactory wertet nun in der Methode nacheinander alle Parameter dieser Liste aus. Ist der Datentyp eines Parameters ein Basisdatentyp, so wird mit dem 4. Schritt fortgefahren. Bei einem komplexen Datentyp wird Schritt 2 und 3 modifiziert wiederholt, damit man die Basisdatentypen (z. B.: einfache Datentypen, Listendatentypen, Felder) ermitteln kann. Dafür wird die Methode getComponent() rekursiv aufgerufen und erneut eine Anfrage an die WSDLFactory gestartet. Bei einem komplexen Datentyp benötigt man zur Darstellung seine Basisdatentypen. Zur Einhaltung der Reihenfolge der Parameter muss zunächst der komplexe Datentyp komplett dargestellt werden. Daher wird nun der komplexe Datentyp übermittelt (2*) und WSDLFactory parst das Datentyp-Element und extrahiert seine Parameter und Datentypen. Die Parameter und Datentypen des komplexen XSD-Datentypen werden dann zurückgeliefert (3*) und diese neue Liste erneut ausgewertet. Durch den rekursiven Aufruf der Methode zur Zusammenstellung der Basisdatentypen wird die Reihenfolge der Basisdatentypen eingehalten, da jeweils die Liste mit den restlichen Parametern gespeichert und nachträglich abgearbeitet wird. Zusätzlich wird bei jedem rekursiven Aufruf ein Ebenenzähler inkrementiert. Die Ebene gibt für einen Basisdatentyp an, wie viele komplexe Datentypen um die Komponente geschachtelt sind. Die Methode getComponent() der Klasse ComponentFactory enthält letztendlich mehrere Listen mit Basisdatentypen (falls komplexe Datentypen vorhanden sind) oder eine Liste mit Basisdatentypen, die sukzessive abgearbeitet wird. Die Klasse XSDWrapper wird nun mit einem Basisdatentyp aufgerufen (4). Intern wird der Datentyp auf die entsprechende, stellvertretende Klasse abgebildet, von der eine neue Instanz gebildet wird (5). Dadurch wird eine entsprechende grafische Komponente und Validierungseinheit erzeugt (vgl. Modellbildung). Die grafische Komponente besteht aus einer Eingabekomponente und einem Label, welches den Datentyp angibt (nächstes Unterkapitel stellt die grafische Komponente nochmals detailliert vor). Diese Komponente wird wieder zurück an den XSDWrapper geleitet (6), der die Komponente weiter an die ComponentFactory schickt (7). Die grafische Komponente wird nun in die Eingabemaske eingefügt. Zuvor wird der grafischen Komponenten der Parametername zugeordnet und falls Dokumentationen enthalten sind im WSDLDokument für diesen Parameter zusätzlich ein Button. Im 8. Schritt werden die Schritte 4 bis 7 für alle Basisdatentypen der Operation wiederholt. Bei einem Basisdatentyp innerhalb eines komplexen Datentyps wird die grafische Komponente durch den Wert des Ebenenzählers eingerückt. Neben dem Einrücken der Komponenten, können zusammengehörige Komponenten zusätzlich durch einen umschließenden Rahmen gekennzeichnet werden. Dieser Rahmen wird verwendet zum Kennzeichnen Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 101 eines komplexen Datentyps innerhalb eines Feldes (siehe Kapitel 6.2). Zum Schluss wird die Eingabemaske zurück an die Klasse GuiBuilder geschickt, die die Eingabemaske im Editorsegment darstellt (9). 5.3 Anordnung der grafischen Komponenten Im vorigen Unterkapitel wurde der Aufbau der grafischen Komponenten diskutiert und an dieser Stelle soll die Anordnung dieser Komponenten in der GUI beschrieben werden. Während der Modellbildung in Kapitel 4.3 wurde bereits der Grundaufbau der GUI eingeführt. In der Abbildung 26 wird dieser Grundaufbau weiter verfeinert und zeigt die Umsetzung des Modells. Das Menü, die Symbolleiste und das Statussegment wurden nicht weiter beachtet, da sie unabhängig vom WSDL-Dokument immer identisch sind. Servicesegment Port-Liste Operations-Liste Port:Operations-Liste Editorsegment Operation XY Eingabemaske zusätzliches Editorsegment einfacher Datentyp Name I Typ+Eingabe Zusatzinfo Kollektionen komplexer Datentyp Name Name x/y I I Liste für Werte von Typ+Eingabe Zusatzinfo C R Binäre Daten anzeigen Wieder verwendbare Datentypen anzeigen Typ+Eingabe Zusatzinfo I S Abbildung 26: Anordnung der GUI-Komponenten Das Servicesegment wird nach dem ersten Parsen des WSDL-Dokumentes mit Informationen der vorhanden Ports und Operationen gefüllt. Es werden drei Auswahlboxen zum Auswählen einer Operation angeboten. Die beiden linken Auswahlboxen werden in Kombination zueinander verwendet. Die Linke Auswahlbox beinhaltet eine Liste mit allen Ports des WSDL-Dokumentes. Nach Auswahl eines Ports werden alle korrespondierenden Operationen in der zweiten Auswahlbox angezeigt. In dieser Operations-Liste kann eine Operation zum Editieren der Daten selektiert werden. Die dritte Auswahl- 102 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. box dient als Alternative und beinhaltet alle Operationen auf einmal und gibt jeweils den Portnamen mit an. Nach Selektion einer Operation wird ein Editorsegment geöffnet, das die Eingabemaske der Operation beinhaltet und ein zusätzliches Editorsegment für weitere Daten. Jedes Editorsegment erhält einen eindeutigen Namen. Wird die Operation von keinem anderen Port verwendet, so erhält das Editorsegment den Namen der Operation („Operation XY“ in Abb. 26). Ansonsten wird der Name des Ports mit angegeben. Somit können mehrere Editorsegmente geöffnet werden und jeweils eindeutig über den Namen ausgewählt und sichtbar gelegt werden. Jeweils eine Operation ist aktiv und wird angezeigt, die anderen Operationen werden im Hintergrund gehalten und können durch Auswahl der Operation aktiviert werden. Bevor die grafischen Komponenten der Eingabemaske im Editorsegment angezeigt werden, wird zuerst die aktuelle Höhe des Segmentes ermittelt. Können nicht alle Eingabekomponenten auf einmal angezeigt werden, so verteilen sich die Komponenten auf mehreren Ebenen. Sukzessive wird immer eine Komponente der Eingabemaske auf die aktuelle Ebene hinzugefügt. Zur Berechnung des Platzbedarfs wird dabei die bevorzugte Höhe der Komponente herangezogen. Überschreitet die Summe der eingefügten Komponentenhöhen die Segmenthöhe, so wird eine neue Ebene eingefügt. In diese werden die weiteren Komponenten aus der Eingabemaske eingefügt. Im sichtbaren Editorsegment wurde beispielhaft eine Eingabemaske mit einem einfachen Datentyp und einem komplexen Datentyp, der wiederum aus zwei einfachen besteht, skizziert. Die grafischen Komponenten innerhalb des komplexen Datentyps werden eingerückt, damit die Zugehörigkeit zu dem übergeordneten komplexen Datentyp erkenntlich wird. Die grafische Komponente für einen einfachen Datentyp besteht primär aus dem Namen des Parameters und einem Eingabefeld mit Angabe des Datentyps. Zusätzlich kann bei vorliegender Dokumentation ein Informations-Button hinter den Namen eingefügt werden und bei bestimmten einfachen Datentypen zusätzliche Informationen angegeben werden. Zu den Zusatzinformationen gehören u. a. die Angabe von Fassetten, ein weiterer Button zum externen Editieren der Eingabedaten oder weitere Informationen über den Datentyp. Unterhalb der Eingabemaske befindet sich in jedem Editorsegment eine Interaktionsleiste. Links in der Interaktionsleiste befinden sich 2 Buttons und eine Textanzeige. Durch die beiden Buttons kann zwischen den Ebenen gewechselt werden. Neben den beiden Richtungs-Buttons wird jeweils die aktuelle Position im Bezug auf die Anzahl der Ebenen angezeigt. In der Mitte befindet sich ein InformationsButton zum Anzeigen von Dokumentationen über den Port und die Operation. Beinhaltet das WSDLDokument keine Dokumentation für den jeweiligen Port oder Operation, so wird dieser Button auch nicht angezeigt. In der rechten Ecke der Interaktionsleiste befindet sich eine weitere Button-Gruppe. Der linke Button schließt die Operation (Close), der mittlere Button setzt alle Eingaben der aktiven Operation zurück (Reset) und der rechte Button leitet den Sendevorgang der Operation ein (Send). Das zusätzliche Editorsegment wird verwendet, um weiterführende Informationen zu einem Parameter anzuzeigen. Besteht der Parameter aus einem Kollektions-Datentyp (z. B. ein Feld), so wird in diesem Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 103 Editorsegment die Liste mit den einzelnen Einträgen für das Feld angezeigt. Bei binären Daten mit bekanntem Inhalt, kann dieser im zusätzlichen Editorsegment angezeigt werden. Außerdem kann bei der Wiederverwendung von Eingabedaten für komplexe Datentypen, diese bereits getätigten Eingaben in einer Liste zur Auswahl angeboten werden. Im Kapitel Implementierung wird nochmals auf das zusätzliche Editorsegment eingegangen und durch Beispiele die Verwendung verdeutlicht. 5.4 Realisierung des Bindings In Kapitel 3.2 wurden drei Arten vorgestellt zum Einbinden eines Clients an einen Web-Service. Der Client kann über Stubs, Dynamic Proxy, oder das so genannte Dynamic Invocation Interface (DII) an einen Web-Service gebunden werden. Zur Realisierung des Prototypen wurde das Dynamic Invocation Interface zum Aufrufen der entfernten Methoden des Web-Service verwendet. Bei der Verwendung eines Stubs oder Dynamic Proxy müssen vor der Implementierung der Name der Methode und die Namen der Parameter bekannt sein. Beim Stub müssen zusätzlich Informationen über den Namen des Ports vorliegen. Der Prototyp wird allerdings unter der Annahme entwickelt, dynamisch zur Laufzeit erst diese Informationen durch das WSDL-Dokument mitgeteilt zu bekommen. Der Prototyp ist also nicht mit bestimmten Web-Services fest in einem Verbund stehend, sondern kann mit jedem WebService kommunizieren, der durch ein WSDL-Dokument beschrieben wird. Beim Einbinden durch das DII wird ein Call-Objekt verwendet, welches vor dem Senden die benötigten Informationen übergeben bekommt (siehe Kapitel 3.2). Vor dem Senden müssen dem Call-Objekt zusätzlich die Serialisierer und Deserialisierer für die einzelnen Datentypen übergeben werden, damit die Daten der Parameter nach XML serialisiert, bzw. beim späteren Empfang der Antwort wieder zurück in das ursprüngliche Format transformiert werden können. Axis bietet dazu eine Reihe von (De-)Serialisierer an. Der Autor G. Bong listet in dem Artikel „Apache SOAP type mapping, Part 1: Exploring Apache´s serialization API´s” [Bo02] Serialisierer für einfache und komplexe Datentypen auf, die außerdem in der API von Axis in aktuellerer Form aufgeführt werden. Allerdings weist der Autor auch darauf hin, dass binäre Daten, je nach der Darstellung im WSDL-Dokument, durch drei unterschiedliche Serialisierer nach XML transformiert werden können. Bei Verwendung des Datentyps base64Binary wird der Base64Serializer von Axis verwendet und beim Datentyp hexBinary wird der HexSerializer eingesetzt. In beiden Fällen werden die binären Daten durch das jeweilige Format kodiert und als Parameter dem Call-Objekt übergeben. Beim Kodieren der binären Daten in das jeweilige Format steigt aber die Größe zur Darstellung der Daten. Bei base64Binary wird die Größe um etwa 50% gegenüber dem Originalformat erhöht und bei hexBinary verdoppelt sich sogar die Größe. [Ma04] Daher kann die Datenmenge bei Verwendung dieser beiden Datenformaten schnell ansteigen und eine Anfrage an einen Web-Service kann dadurch lange dauern. Binäre Daten können jedoch auch durch 104 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Angabe des MIME-Formats als Anhang einer SOAP-Nachricht zum Web-Service gesendet werden. Die binären Daten müssen nicht kodiert werden, sondern können in ihrem ursprünglichen Format erhalten bleiben. Dadurch kann die Datenmenge gegenüber den anderen beiden Varianten verringert werden. Werden die binären Daten als Anhang gesendet wird zur Serialisierung der JAFDataHandlerSerializer von Axis verwendet. Der Prototyp muss somit neben der Parameterübergabe an das Call-Objekt auch die Möglichkeit realisieren die Daten als Anhang beizufügen. 5.5 Zusammenfassung Zuerst wurden aus dem Modell zwei Strukturdiagramme erstellt, die einen Überblick über die Funktionalität des Prototypen festlegen. Daraufhin wurde der Aufbau der grafischen Komponenten für die Parameter einer Operation beschrieben. Nachdem eine Operation in der GUI ausgewählt wurde, werden für alle Parameter die korrespondierenden grafischen Komponenten erstellt. Besteht ein Parameter aus einem Basisdatentyp, so kann direkt die grafische Komponente erstellt werden und der Eingabemaske hinzugefügt werden. Ein komplexer Datentyp muss allerdings zuerst in seine Basisdatentypen zerlegt werden, bevor er grafisch durch die Komponenten seiner Basisdatentypen dargestellt werden kann. Die einzelnen Komponenten der Eingabemaske werden schließlich in einem Editorsegment angeordnet. Komponenten eines komplexen Datentyps werden dabei eingerückt oder durch einen Rahmen markiert. Übersteigt die Anzahl der Komponenten den sichtbaren Bereich des Eingabefensters, so werden die Komponenten unter Beibehaltung der Reihenfolge auf mehrere Ebenen verteilt. Nach der Komposition der einzelnen Komponenten innerhalb der GUI wurde danach das verwendete Verfahren zum Binden des Prototypen an einen Web-Service vorgestellt. Über das Dynamic Invocation Interface führt der Prototyp die Methoden des Web-Service aus. Bei diesem Verfahren können alle relevanten Informationen zum Kontaktieren des Web-Service dynamisch zur Laufzeit eingebunden werden. Vor dem Senden einer Anfrage an den Web-Service müssen zuvor alle Parameter der Anfrage serialisiert werden. In diesem Zusammenhang wurde die Möglichkeit aufgezeigt, binäre Daten einerseits in kodierter Form als Parameter einer SOAP-Nachricht zu verwenden oder andererseits im Originalformat als Anhang beizufügen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 105 Kapitel 6: Implementierung Der Prototyp wurde in der Programmiersprache Java1 entwickelt und die grafischen Komponenten mit Java Swing realisiert. Zusätzlich zu der Swing-API wurde eine Erweiterung dieser API zum Entwickeln des Prototypen verwendet. Die Java GUI Programming Extensions (Java-GPE)2 sind eine Kollektion von Klassen zur Erstellung grafischer Oberflächen mit Java. Zunächst wird der Aufbau der grafischen Oberfläche durch Swing-Komponenten erläutert. Danach wird die Abbildung einfacher XSD-Datentypen auf Java-Klassen angesprochen und die Swing-Komponenten eingeführt. Mit dem Werkzeug WSDL2Java des Projekts Axis wurden zum einen Klassen für komplexe Datentypen generiert und zum anderen der Prototyp an den jeweils verwendeten Web-Service gebunden. In diesem Kapitel wird die Verwendung der generierten Klassen aufgegriffen und die Einbettung in den Prototypen vorgestellt. Unterkapitel 3.4 zeigt eine Möglichkeit zum Einbetten von semantischen Informationen. Wie bereits in der Modellbildung erwähnt, kann durch gezieltes Anzeigen von Dokumentationen die Eingaben für den Anwender erleichtert werden. Durch drei Beispiele wird die Verwendung von Dokumentationen verdeutlicht. Abschließend werden einige Implementierungsaspekte vorgestellt, um verschiedene Schwerpunkte während der Entwicklung des Prototypen herauszustellen. 6.1 Gestaltung der grafischen Oberfläche In diesem Unterkapitel wird der Aufbau der grafischen Oberfläche durch Java Swing-Komponenten erläutert. Neben dem allgemeinen Aufbau der GUI wird zusätzlich der verwendete Layout-Manager und der Aufbau des Menüs und der Symbolleiste vorgestellt. Aufbau der GUI Die GUI wurde nach den Vorgaben der Realisierung des Modells entwickelt (siehe Kapitel 5.3). Anhand einer grafischen Übersicht werden die einzelnen Swing-Komponenten eingeführt, die zum Implementieren der GUI verwendet wurden. Abbildung 27 bietet einen Gesamtüberblick über die generierte GUI. 1 Internetseite der Java-API 1.4.2: http://java.sun.com/j2se/1.4.2/docs/api/ 2 Homepage von Markus Hillenbrand mit Dokumentationen und Downloadangebot der Java-GPE: http://www.markus-hillenbrand.de/javagpe 106 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 27: Aufbau der GUI Nach dem Start des Prototypen baut sich das Hauptfenster des Programms auf, welches durch ein HFrame1 implementiert wurde. Im oberen Bereich des Hauptfensters befinden sich das Menü und die Symbolleiste. Beide Kontrollstrukturen werden später detailliert vorgestellt. Der übrige Teil der grafischen Oberfläche kann in drei vertikal angeordnete Segmente unterteilt werden. Jedes Segment wird durch einen JPanel dargestellt. Jedes der Panels dient als Container zum Einfügen weiterer SwingKomponenten. Das obere Panel stellt das Service-Panel dar und beinhaltet Informationen über sämtliche Web-Services und ihre Operationen. Das mittlere Panel dient als Editor und wird zur Eingabe der Benutzereingaben verwendet. Darunter schließt sich das Status-Panel an zur Anzeige von fehlerhaften Eingaben. Das Service-Panel besteht aus den drei Auswahlboxen zur Selektion einer Operation. Es werden drei HComboBox–Elemente (Auswahlboxen) zum Auswählen einer Operation angeboten. Das mittlere Panel nimmt räumlich den größten Platz in Anspruch. In diesem Editor-Panel werden die Parameter einzelner Operationen editiert. Der Editor-Panel ist nochmals horizontal unterteilt. In der linken Hälfte 1 Alle Swing-Komponenten, die mit einem „H“ beginnen, entstammen der Java-GPE. Diese Komponenten er- weitern jeweils die ursprüngliche Swing-Komponente. Sofern die Erweiterungen zum Verständnis der Komponenten nicht relevant sind, werden diese nicht angegeben und können in der API der Java-GPE nachgelesen werden. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 107 wird die Eingabemaske für die ausgewählten Operationen angezeigt und in der rechten Hälfte werden zusätzliche Informationen zu einzelnen Datentypen angebracht. Für jede Operation wird ein JTabbedPane erzeugt und alle Parameter in der Eingabemaske angezeigt. Die Eingabemaske wird in einem HCardPanel gespeichert. Ein HCardPanel stellt eine Erweiterung und Vereinfachung zu einem JPanel mit dem java.awt.CardLayout dar. In einem HCardPanel können auf verschiedenen Ebenen Swing-Komponenten angebracht werden und jeweils eine Ebene sichtbar dargelegt werden. Die Komponenten werden dazu auf Karten (Cards) verteilt, die in beliebiger Reihenfolge durch einen eindeutigen Namen sichtbar gelegt werden können. Die Elemente der Eingabemaske werden auf mehrere Karten verteilt, wenn das Platzangebot nicht für alle Komponenten ausreichend ist. Über die JButtons im Navigations-Panel kann zwischen den Karten beliebig gewechselt werden. Jeweils die aktivierte Operation ist sichtbar und der Anwender kann die einzelnen Parameter editieren. Im Hintergrund befindliche, inaktive JTappedPanes können durch einen Mausklick innerhalb des jeweiligen Etiketts (Tab) in den Vordergrund transferiert werden. Die jeweils aktivierte Eingabekomponente hat den Fokus und kann die Benutzerdaten entgegennehmen. Somit ist die Bearbeitung mehrerer Operationen durch Wechsel der JTabbedPanes möglich. Die Anzeige des Ergebnisses wird ebenfalls in einer eigenen JTabbedPane dem Benutzer zur Einsicht angeboten. Im unteren Bereich jeder JTabbedPane befindet sich eine Interaktionsleiste mit diversen JButtons. Links befindet sich das Navigations-Panel und in der rechten Ecke des JTabbedPanes befindet sich eine JButton-Gruppe. Liegt für die Operation oder deren Port eine Dokumentation vor, so wird ein Button zur Anzeige generiert (linker Button). Der zweite Button v. l. setzt alle Eingaben der aktiven Operation zurück, der dritte Button v. l. schließt die Operation und der rechte leitet den Sendevorgang der Operation ein. In der rechten Hälfte des Editor-Panels werden zwei HCardPanels eingesetzt. Für jeden Parameter einer Operation wird jeweils eine Ebene (Karte) in den HCardPanels für weitere Darstellungen reserviert. Das untere Panel wird ferner zur Anzeige von fehlerhaften Eingaben verwendet. Layout Als Layout-Manager wurde das GridBag-Layout ausgewählt, da es unter den vorhandenen LayoutManagern in Swing am besten geeignet ist für die gegebene Problemstellung. Dieser Layout-Manager ist sehr flexibel und kann am besten komplexe Inhalte darstellen. Alle Komponenten werden in einem Gitter (Netz, Rechteckschema) von Reihen und Spalten angeordnet. So spannt sich ein Netz aus einzelnen Zellen auf. Eine Komponente kann nun innerhalb einer Zelle platziert werden oder auch mehrere Zellen überspannen. Innerhalb einer Komponente (z. B. ein JPanel) kann wiederum ein Gitter aufgespannt werden und mit weiteren Komponenten aufgefüllt werden. Dadurch kann die GUI sehr detailliert aufgebaut werden und beliebige Verschachtelungstiefen aufweisen. Zusätzlich passen sich 108 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. die Größen der einzelnen Zellen proportional zu der Gesamtgröße des Fensters an. Beim Skalieren des Fensters werden die Größen der Inhalte somit angepasst. Im Java Swing Tutorial, ein Unterkapitel des Java Tutorials, findet der interessierte Leser weitere Informationen über das GridBag-Layout und weitere Layout-Manager von Swing [SUN04]. Menü und Symbolleiste Das Menü (JMenu) ist aus den Untermenüs „File“, „Configuration“, „View“ und „Help“ aufgebaut. Im Untermenü „File“ kann ein neuer Web-Service gestartet oder das Programm beendet werden. Zum Starten eines neuen Web-Service wird ein Eingabefenster geöffnet, das die URL des WSDLDokumentes entgegennimmt. Danach wird aus dem WSDL-Dokument die GUI generiert. Das Untermenü „Configuration“ bietet die Möglichkeit das angegebene WSDL-Dokument in einem separaten Fenster einzusehen oder speziell extrahierte Informationen und Dokumentationen aus dem WSDLDokument über Service-, Port- und Anbindings-Informationen zu erhalten. Im Untermenü „View“ kann das optische Erscheinungsbild der GUI verändert werden. Zusätzlich kann der TCP-Monitor von Axis geöffnet werden, um ein- und ausgehende SOAP-Nachrichten einzusehen. Letztlich kann in diesem Untermenü eine Baumstruktur aller Ports mit ihren angebotenen Operationen dargestellt werden. In diesem Baum kann navigiert werden, um eine Operation auszuwählen und sie im Editor anzuzeigen. Schließlich kann im letzten Untermenü, neben einer allgemeinen Information über das Programm, die Hilfefunktion ausgewählt werden. „Help“ öffnet die allgemeine Hilfeseite, von der aus die Suche nach spezifischen Informationen gestartet werden kann. Zum besseren Verständnis der einzelnen Menüpunkte wird beim Kontakt der Maus ein Tooltip mit einer Kurzinformation angezeigt. Jeder Menüpunkt kann über eine Tastenkombination (Accelerator) ohne vorherige Aktivierung des Menüs ausgewählt werden. Ist ein Menü aktiviert und das entsprechende Untermenü wird angezeigt, kann durch Druck des zugeordneten Buchstabens (Mnemonik) der Menüpunkt ausgewählt werden. Die wichtigsten Menüpunkte wurden zudem separat in der Symbolleiste, die durch eine HToolBar implementiert wurde, zum schnelleren Zugriff ausgelagert. Zusätzlich wurde in der Symbolleiste eine weitere Hilfefunktion zugefügt. Der rechte Button „ContextHelp“ aktiviert einen Zeiger, mit dem eine Komponente der GUI angeklickt werden kann. Darauf wird eine eigens für diese Komponente entwickelte Hilfeseite angezeigt. Diese Funktion wurde primär dazu entwickelt, um Informationen über die Datentypen zu erhalten. Für jeden Datentyp wird eine Hilfeseite bereit gestellt. Abbildung 28 zeigt das Menü und Symbolleiste des Prototypen (as Untermenü „File“ wurde in die Grafik integriert). Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 109 Abbildung 28: Aufbau des Menüs und Toolbar Das Eingabefenster zum Eingeben einer WSDL-URL kann somit über die Tastenkombination (Strg + N), den Menüpunkt „New“ im Untermenü „File“ oder über den „New“-Button (linker Button) in der Symbolleiste geöffnet werden. Im Menü wurden zusätzliche Funktionen, wie der TCP-Monitor, die Baumstruktur und extrahierte Informationen über das WSDL-Dokument integriert. Diese Informationen werden zum Erstellen einer Anfrage und Empfang der Antwort nicht benötigt. Sie stellen lediglich zusätzliche Funktionen für interessierte Anwender bereit. Damit der Programmablauf jedoch nicht unnötig gestört wird, wurden diese Funktionen in das Menü ausgelagert. 6.2 Abbildung der Datentypen auf Java Für einfache Datentypen generiert das Werkzeug WSDL2Java keine Klassen. Daher wurde zur Realisierung des Modells eine einheitliche Klassenstruktur entworfen und für jeden einfachen Datentyp eine eigene Klasse vorbereitet. In jeder Klasse wird neben der Speicherung der Eingabewerte, auch die Validierung und Erstellen einer Eingabekomponente durchgeführt. Lediglich für benutzerdefinierte Datentypen werden Klassen generiert von WSDL2Java, die durch get()-und set()-Methoden Zugriff auf die internen Datentypen bieten. Der Name für die Klasse leitet sich aus dem Namen des Datentyps ab. Die Klassengenerierung bei verwendeten Fassetten wird durch WSDL2Java nur unzureichend unterstützt. Lediglich für die Fassette enumeration wird eine Klassenstruktur generiert, die zur Speicherung der Eingabedaten verwendet werden kann. Bei anderen Fassetten wird entweder keine Klasse generiert, und das Auftreten der Fassette einfach ignoriert, oder eine Klasse wird generiert, die nicht verwendet werden kann. Daher werden für alle Fassetten ebenfalls eine eigene Klasse entworfen. Diese Klasse prüft für einen gegebenen Datentyp samt der Benutzereingabe die Korrektheit der Eingabe durch Vergleich mit den angegebenen Fassetten. Nachfolgend wird zuerst eine Klasse für einen einfachen Datentyp vorgestellt, danach folgen die Beschreibung einer Klasse für einen benutzerdefinierten, komplexen Datentyp und eine Klasse zur Speicherung von Feldern (stellvertretend für Listen und Kollektionen). einfacher Datentyp Die Grundfunktionalität der Klasse für einen einfachen Datentyp baut sich aus der Bereitstellung einer grafischen Komponente und die Validierung der Benutzereingaben auf. Im vierten Kapitel wurde ein 110 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Modell entwickelt, um für jeden Datentyp eine geeignete grafische Komponente zu ermitteln. Die Klasse JComponent der Java Swing-API ist die Basisklasse für alle verwendeten grafischen SwingKomponenten zur Darstellung der grafischen Komponenten. Von dieser Klasse leiten sich die verwendeten grafischen Komponenten ab. Nachfolgend werden die Abbildungen der grafischen Komponenten auf ihr Java-Äquivalent vorgestellt werden. Diese vorgestellten Komponenten werden zur Darstellung der einfachen Datentypen verwendet und spezialisieren JComponent. Ein Eingabefeld wird durch ein HFormattedTextField realisiert. Dieses Textfeld erweitert JFormattedTextField, indem es u. a. zusätzlich eine Redo-Undo-Funktion anbietet. Das Textfeld bietet die Möglichkeit vordefinierte oder eigene Formatierungen durchzuführen, die nach jeder Eingabe eines Zeichens aufgerufen werden. Somit können verschiedene Validierungen bereits durch das Textfeld durchgeführt werden. Eine vordefinierte Formatierung ist z. B. das Festlegen einer Nummerneingabe. Das Textfeld nimmt in diesem Fall nur Ziffern als korrekte Eingaben entgegen. Diese erste Validierung der Eingabe kann danach durch Überprüfen von Wertebereichsübertretungen verfeinert werden. Die Validierungsvorgaben für einen Datentyp leiten sich jeweils aus der XSDSpezifikation des Datentyps ab. Durch den Wertebereich des Datentyps werden die erlaubten Eingaben spezifiziert. Eine Auswahlbox wird durch eine HComboBox realisiert. Dieser Komponente werden die einzelnen Werte des Wertebereichs übergeben. Jeweils der ausgewählte Wert wird angezeigt und die anderen Werte können aus einer aufspannenden Liste ausgewählt werden. Für binäre Daten wird die Möglichkeit angeboten, eine Datei im Dateisystem zu suchen und danach hochzuladen, um die Daten in der Datentyp-Klasse zu speichern. Die verwendete Komponente HFileString besteht aus einem Button und einem Textfeld. Über den Button kann ein Auswahlfenster angezeigt werden, über das im Dateisystem navigiert werden kann. Nach Auswahl einer Datei wird anschließend der Pfad im Textfeld angezeigt. HFileString wird ebenso beim Empfang von binären Daten zum Speichern verwendet. Dazu wird lediglich der Modus geändert und die Daten werden in einer Datei mit frei wählbarem Namen gespeichert. Zusätzlich zur grafischen Komponente wird ein Label (JLabel) erzeugt, das den Namen des Datentyps angibt. In dem Label werden auch verwendete Fassetten des Datentyps angegeben. Dadurch werden dem Anwender alle Restriktionen auf diesem Datentyp angezeigt und er kann dementsprechend seine Eingaben betätigen. Abbildung 29 zeigt die Swing-Komponenten zur Darstellung eines einfachen Datentyps. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 111 Abbildung 29: grafische Komponenten für einfache Datentypen Die Abbildung zeigt für den Parameter „wrong_Value“ eine falsche Eingabe. Das Label des Textfelds weist den Anwender darauf hin, welcher Datentyp verwendet werden soll. Dieser Datentyp (int) erlaubt nur Ganzzahlwerte. Dementsprechend wird durch die Formatierung des Textfelds lediglich Ziffern als Eingabe erlaubt. Bei Eingabe von Buchstaben oder Sonderzeichen erkennt die Klasse des Datentyps den Fehler schon nach Eingabe des ersten falschen Zeichens und sendet eine Nachricht an die Klasse GuiBuilder, welche den Fehler im Status-Panel anzeigt. Der Parameter „base64Binary“ ist ein binärer Datentyp. Daher wird ein Button angezeigt, der nach Mausklick ein Fenster zum Hochladen einer binären Datei öffnet. Aus dem Dateisystem kann eine Datei ausgesucht werden. Der Dateiname wird danach in einem Textfeld angezeigt. Bei bekanntem Datentyp (Bild oder Text) kann zusätzlich der Inhalt der Datei in der rechten Hälfte des Editor-Panels angezeigt werden. Der Parameter „JFormattedTextField“ zeigt die Darstellung eines qualifizierten Namens (QName) an. Durch zwei zusätzliche Textangaben wird der Anwender auf die richtige Verwendung der beiden Textfelder hingewiesen. Der dritte Parameter zeigt die Verwendung einer Combobox, die zwei Werte zur Auswahl anbietet. Diese beiden Werte stellen den ganzen Wertebereich des Datentyps boolean dar und stehen dem Anwender in einer Liste zur Auswahl, die durch Mausklick auf den aktuell ausgewählten Wert geöffnet wird. Nachfolgend wird nun die Klassenstruktur für einfache Datentypen vorgestellt. Jede Klasse für einen einfachen Datentyp ist nach der gleichen Grundstruktur aufgebaut. Ein Programmlisting für eine JavaKlasse des Datentyps float befindet sich als Beispiel im Anhang (Kapitel 8.5). Durch Bildung einer Instanz der Klasse wird die grafische Komponente erzeugt und mit der Validierung verknüpft. Jede 112 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Klasse speichert die Benutzereingaben in einer Variablen value. Des weiteren hat jeder dieser Klassen Methoden, die über den Wrapper ausgeführt werden können: getPanel(): Die Methode liefert ein JPanel zurück mit dem spezifischen JComponent und dem JLabel. Bei einigen Datentypen wird zusätzlich noch ein beschreibender Text (siehe Abbildung 29, QName) dem Panel zugefügt oder ein Button zum externen Editieren der Eingabedaten (siehe Kapitel 6.4). getValue(): Die Methode wird verwendet, um die gespeicherte Eingabe der Variable value zu erhalten. Die Methode wird vor dem Senden verwendet, um die Eingabe des Anwenders zu bekommen. setValue(Object obj): Diese Methode übergibt einen Wert für die Variable value. Der Wert wird zusätzlich in der grafischen Komponente angezeigt. Sie wird z. B. verwendet, um einen gespeicherten Wert eines einfachen Datentyps innerhalb eines komplexen Datentyps bei der Wiederverwendung zu setzen. setResult(Object obj): Die Methode ruft setValue(Object obj) auf und zusätzlich wird die grafische Komponente mit der Eigenschaft versehen, nicht mehr editierbar zu sein. Bei der Anzeige eines Ergebnisses sollen die Werte nicht verändert werden können und lediglich angezeigt werden. reset(): Die Methode löscht den Wert der Variable value und setzt die grafische Komponente zurück. Ein Textfeld zeigt danach ein Leerzeichen an und die Combobox wird auf den ersten Wert in der Liste gesetzt. setFacettes(Object[] facettes): Diese Methode wird ausgeführt, falls Fassetten für den Datentyp angegeben wurden. Dadurch wird die Validierung beeinflusst. Bevor ein Wert gespeichert werden kann, wird zuerst die Klasse Fassettes mit allen gesetzten Fassetten aufgerufen. Diese überprüft, ob diese Fassetten erfüllt sind. Das übergebene Object[] hat die Länge 12. Für jede der 12 Fassetten kann ein spezifischer Wert aus dem WSDL-Dokument übergeben werden. Beispielhaft könnte für den Datentyp token im WSDL-Dokument die Fassette minLength mit „5“ und die Fassette maxLength mit „10“ angegeben werden. Der Klasse des Datentyps werden an der jeweiligen Position innerhalb des Feldes diese beiden Werte übergeben, ansonsten Null-Werte. Die Klasse Fassettes wird aufgerufen und überprüft die Benutzereingabe mit den angegeben Fassetten und liefert das Ergebnis der Überprüfung. Bei einer Eingabe, deren Anzahl von Literalen kleiner als 5 und größer als 10 ist, würde eine Fehlermeldung durch die Klasse erzeugt, die durch GuiBuilder angezeigt wird. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 113 benutzerdefinierter, komplexer Datentyp Ein komplexer Datentyp baut sich letztendlich aus seinen Basisdatentypen auf, die innerhalb der Eingabemaske dargestellt werden. Der Aufbau eines komplexen Datentyps wurde bereits in Kapitel 5.2 vorgestellt. An dieser Stelle soll auf die grafische Präsentation, Speicherung der Eingabedaten und Namenskonventionen eingegangen werden. Abbildung 30 zeigt den komplexen Datentyp „bookEntryData“ der Operation „bookEntry“. Abbildung 30: grafische Darstellung eines benutzerdefinierten, komplexen Datentyps Der komplexe Datentyp „bookEntryData“ besteht aus zwei komplexen Datentypen („Author“ und „Address“), zwei einfachen Datentypen („Title“ und „Key“) und einem Feld („Key_words“). Die letzten drei Datentypen sind Basisdatentypen und können direkt dargestellt werden. Die beiden komplexen Datentypen werden nochmals weiter zerlegt. Der Datentyp „Address“ besteht u. a. wiederum aus einem komplexen Datentyp „Phone“. Sobald ein komplexer Datentyp innerhalb eines anderen komplexen Datentyps auftritt, wird er mit einem Bindestrich gekennzeichnet und seine unmittelbaren Parameter eine Ebene eingerückt. Befindet sich unter diesen Parametern wiederum ein komplexer, erfolgt wiederum eine Einrückung. Zusätzlich wird in diesem Beispiel ein separates Eingabefenster für einen String angezeigt. Die Klasse des Datentyps String erzeugt neben dem normalen Eingabefeld einen Button, über den ein separates Fenster geöffnet werden kann. In dem Beispiel wird für den Parameter „Title“ das separate Fenster geöffnet (rechts unten in der Abbildung). Die Eingabe im Fenster und Textfeld wird synchronisiert und zeigt den identischen Text an. Der Parameter „Key_words“ ist ein einfaches Feld aus String-Werten. Felder werden im nächsten Abschnitt separat erklärt. Der 114 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Parameter „Country“ ist eine Aufzählung von String-Werten. Auf dem einfachen Datentyp String wurde in diesem Fall die Fassette Enumeration angewendet. Die Combobox zeigt alle Werte dieser Aufzählung an. Der Anwender kann eins von drei Ländern aus der Liste auswählen. Letztendlich zeigt der Parameter „Key“ die Fassette Pattern. Dieses Beispiel wurde aus der Modellbildung übernommen und kann dort eingesehen werden. Anhand dieses Datentyps soll nun die Speicherung der einzelnen Eingabedaten und die spätere Speicherung in der generierten Klasse von WSDL2Java erklärt werden. Erst vor dem Senden werden alle Eingabedaten angefordert und in die generierte Klasse eingefügt. Nachdem alle Eingaben in der generierten Klasse gespeichert sind, wird ein Objekt dieser Klasse dem Call-Objekt übergeben. Danach erfolgt über das Call-Objekt der entfernte Methodenaufruf. Bei dieser Operation wird ein Objekt der Klasse BookEntryData an das Call-Objekt übergeben. Für alle Basisdatentypen wurde eine Klasse entwickelt im Prototypen, die die Eingaben des Anwenders speichert. Durch die Methode getValue() wird der Eingabewert für den Basisdatentyp zurückgeliefert. Die Klasse BookEntryData besitzt set()-Methoden für alle unmittelbaren Parameter („Author“, „Address“, „Title“, „Key“ und „Key_words“). Bei dem Parameter „Title“ wäre das z. B. ein String. Für alle Basisdatentypen liegen die Werte vor und können gesetzt werden, aber für die weiteren komplexen Datentypen („Author“ und „Address“) noch nicht. Der Parameter „Title“ wird durch die Methode setTitle(String title) gesetzt. Der Parameter „Address“ wird allerdings durch die Methode setAddress(Address address) gesetzt. Zum Speichern dieses komplexen Datentyps muss somit eine weitere komplexe Klasse Address verwendet werden, die aber noch keine Werte gespeichert hat. Jeder innere, komplexe Parameter wird ebenfalls durch eine generierte Klasse vertreten. Aus diesem Grund muss die Speicherung der Eingabedaten zuerst bei der innersten, komplexen Klasse durchgeführt werden. Wurden für eine innere Klasse alle Werte gesetzt, so kann diese dann in der ihr umschließenden Klasse gesetzt werden. Zur Realisierung der Speicherung aller Werte in der äußeren, komplexen Klasse wurde die Datenstruktur java.util.Stack (dt. Stapel) verwendet. Diese Datenstruktur eignet sich am besten zur Implementierung der gegebenen Problemstellung, weil ein Stack nach dem LIFO-Prinzip (last in first out) geleert wird. Der Stack wird bereits bei der Generierung der Eingabemaske gefüllt, indem immer Objekte des komplexen Datentyps mit Objekten seiner unmittelbaren Parameter hinzugefügt werden. In den Stack wird jeweils ein Object[] der Größe vier eingefügt. Das Object[] beinhaltet als Vater (Position 0) ein Objekt der generierten Klasse des komplexen Datentyps. Als Kind (Position 1) wird entweder ein Objekt des Basisdatentyps, der den Eingabewert speichert, oder ein weiterer innerer, komplexer Datentyp gespeichert. Zusätzlich wird der Name des Parameters (Position 3) gespeichert, um die richtige set()-Methode aufzurufen. Ferner wird an Position 4 vermerkt, ob es sich bei dem Kind um einen Basis- oder komplexen Datentyp handelt. Der Stack wird während des rekursiven Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 115 Aufbaus der Eingabemaske gefüllt (siehe Kapitel 5.2), wobei der Vater immer der komplexe Datentyp ist, dessen Basisdatentypen ermittelt werden. Da der Stack wieder in umgekehrter Reihenfolge geleert wird, kann garantiert werden, dass ein innerer, komplexer Datentyp schon die Werte seiner Basisdatentypen gespeichert hat, bevor er in den ihn umschließenden komplexen Datentyp gespeichert wird. Bei der Abbildung der XSD-Namen auf Java-Namen muss schließlich noch auf einige Konventionen geachtet werden. Axis bildet die Namen von XSD-Datentypen nach bestimmten Regeln auf JavaNamen ab. Da die generierten Klassen für komplexe Datentypen vom Prototypen zum Speichern der Eingabedaten verwendet werden, müssen diese Konventionen beachtet werden. Ein komplexer XSDDatentyp wird durch einen qualifizierten Namen im WSDL-Dokument referenziert. Der Name der generierten Java-Klasse ergibt sich aus dem lokalen Namen, der immer mit einem Großbuchstaben beginnt. Die Java-Klasse wird zusätzlich einem Package zugeordnet, das sich aus dem Namensraum des Datentyps ergibt. Der Datentyp mit dem Namensraum „www.icsy.de/myNamespace“ wird auf das Package „de.icsy.www.myNamespace“ abgebildet. Die Axis-API bietet eine Methode an, die für einen Namensraum den Package-Namen ermittelt. Alternativ könnte man das Werkzeug WSDL2Java konfigurieren, dass alle Datentypen in ein benutzerdefiniertes Package abgebildet werden. Allerdings entstehen dann Probleme, wenn im WSDL-Dokument zwei Datentypen den gleichen lokalen Namen haben und nur durch ihren Namensraum unterschieden werden können. Daher wird die abgebildete Package-Struktur beibehalten. Des weiteren können bei der Bildung der Klassennamen für komplexe Datentypen Konflikte mit der Javakonvention auftreten. Reservierte Namen wie z.B. „class“, „extends“ oder „implements“ werden mit einem beginnenden Unterstrich auf Java abgebildet. Aus dem XSD-Namen „class“ entsteht die Java-Klasse „_class“ (Umwandlung in einen Großbuchstaben am Anfang entfällt wegen dem Unterstrich). Namen, die reserviert sind innerhalb einer Klasse, wie z. B. „Object“, „String“, „int“ usw. können als Klassennamen verwendet werden, da sie keine reservierte Bedeutung auf Klassenebene haben. Zusätzlich werden noch weitere Abbildungsregeln festgelegt, wie z. B. führende Zahlen und Leerzeichen werden entfernt, die aber nicht weiter erläutert werden. Die Namenskonvention gilt nicht nur auf Klassenebene, sondern auch für die Parameter eines komplexen Datentyps. komplexer Datentyp: Felder Die Vorstellung der grafischen Präsentation und Speicherung von Feldern wird stellvertretend für Listen- und Kollektions-Datentypen (wie z. B.: Vektoren, Map und Hashtable) ausgeführt, da diese Datentypen einen ähnlichen Aufbau haben. Für Felder wurden beim Prototypen eine eigene Klasse implementiert, da die Unterstützung durch das Werkzeug WSDL2Java nicht ausreichend ist. Für ein Feld, das innerhalb eines komplexen Datentyps verwendet wird, generiert WSDL2Java keine eigene Klasse. Lediglich bei einem Feld ohne äußeren 116 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. komplexen Datentyp wird eine Holderklasse zur Speicherung der Daten generiert. Daher wurde zur allgemeinen Behandlung von Feldern eine eigene Klasse implementiert. WSDL2Java unterstützt allerdings lediglich höchstens zweidimensionale Felder, bei der Speicherung eines Feldes innerhalb eines komplexen Datentyps. Daher beschränkt sich die Realisierung im Prototyp auf diese Felddimension. Einschränkende Fassetten in Feldern werden zwar von WSDL2Java ebenfalls nicht unterstützt, wurden aber dennoch übernommen aus dem Modell und separat entwickelt im Prototyp. Die Klasse für ein Feld erzeugt ein eigenes Label, in dem der Name des Feldes und der Name des komplexen- oder Basisdatentyps angezeigt wird. Zusätzlich können die verwendeten einschränkenden Fassetten angezeigt werden. Das Eingabefeld wird allerdings von der Klasse des Feld-Datentyps erzeugt. Durch die Methode getPanel() kann man das Eingabefeld samt Label eines einfachen Datentyps erhalten. Die Feldklasse ruft diese Methode bei der Feld-Datentyp-Klasse auf und fügt es zu seinem Label. Der Feld-Datentyp kann entweder ein einfacher Datentyp sein oder ein komplexer, der sich wiederum aus Basisdatentypen aufbaut. Bei einem komplexen Feld-Datentyp wird um diesen ein Rahmen gelegt, damit der Anwender erkennt, dass alle Eingaben innerhalb dieses Rahmens, einen Wert des Feldes darstellen. Abbildung 31 zeigt die Hervorhebung eines Feldeintrags. Abbildung 31: grafische Darstellung eines Feldes mit komplexem Inhalt Aus dieser Abbildung wird ebenfalls deutlich, dass sich die Eingabemaske für ein Feld aus den Eingabefeldern der Basisdatentypen aufbaut. Ein Eintrag im Feld baut sich demnach aus den beiden Basisdatentypen „forename“ und „name“ auf. Die beiden Textfelder wurden von den jeweiligen Basisdatentypen erzeugt und lediglich durch die Klasse des Feldes innerhalb eines Rahmens angezeigt. Die nächste Abbildung zeigt ein doppeltes Feld. Anhand dieser Abbildung wird die grafische Präsentation eines Feldes erläutert und zusätzlich auf die interne Struktur der Klasse eingegangen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 117 Abbildung 32: grafische Darstellung eines doppelten Feldes Zum Einfügen eines Eintrags in das Feld stehen zwei Buttons zur Verfügung. Entweder kann der Wert ans Ende eingefügt werden (Button „last“ in Abb. 32) oder an der Stelle, die mit dem Cursor zuvor markiert wurde (Button „cursor“ in Abb. 27). In dem zusätzlichen Editor-Panel werden dann beide Felder durch eine Liste (JList) dargestellt. Die obere Liste präsentiert das einfache Feld, das nach dem Editieren in das doppelte Feld (unten) eingefügt wird. Jedes Feld bietet die Möglichkeit an jeweils eine Position zu in- oder dekrementieren, ein Feldeintrag kann gelöscht oder wieder editiert werden. Soll ein Eintag editiert werden, so wird sein Wert wieder in die Eingabemaske transferiert. Beim doppelten Feld wird der Eintrag zuerst ins einfache Feld transferiert und dort kann wiederum ein Wert ausgewählt werden zum Editieren in der Eingabemaske. Die Werte im Feld werden in einer Liste aufgereiht und erst wenn das Feld zur weiteren Verarbeitung benötigt wird, werden die Felder in der Klasse java.lang.reflect.Array gespeichert. Mit dieser Klasse kann dynamisch auf unbekannte Objektfelder zugegriffen werden. Ein weiterer Vorteil dieser späten Speicherung in einem Feld ist, dass die Werte im Feld nicht ständig umgeordnet werden müssen. Die Reihenfolge der Werte kann sich stets ändern durch Einfügen an einer Position oder durch Löschen eines Wertes. 6.3 Anzeigen von Dokumentationen Um semantisch eindeutige Eingabemasken zu erstellen, bedarf es oft zusätzlicher Informationen. In der Eingabemaske können lediglich der Name eines Parameters und dessen Typ angezeigt werden. Aus diesen Informationen und evtl. noch dem Namen der Operation und dem Port muss der Anwender Rückschlüsse ziehen auf die Verwendung des Parameters. In der Modellbildung wurde gezeigt, dass es dabei zu Problemen kommen kann und eine eindeutige Verwendung der Parameter nicht immer gegeben ist. Daher muss dem Anwender zusätzlich Hilfestellung angeboten werden, damit er zweifelsfrei seine Eingaben betätigen kann. Da WSDL die Möglichkeit der Dokumentation für jedes Element anbietet, soll mit dem Prototypen gezeigt werden, wie diese sinnvoll eingesetzt werden kann. Die Vorraussetzung ist natürlich, dass der Web-Service-Anbieter entsprechende Dokumentationen in das 118 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. WSDL-Dokument einbettet. Im Modell wurden drei abstrakte Ebenen zum Einbetten der Dokumentation entwickelt. Eine Dokumentation kann für jeden Parameter, jede Operation und jeden Port angezeigt werden. Diese drei Möglichkeiten sollen nun an einem Beispiel verdeutlicht werden. In Abbildung 33 werden einige Parameter innerhalb der Operation „enterBookForAuthor“ angeführt, die namentlich zu Missverständnissen und Fehlinterpretationen führen. Es werden drei namentlich fast identische Parameter direkt hintereinander dargestellt. Abbildung 33: Einbinden von Dokumentationen für Parameter Die drei Parameter tragen die Namen „Name1“, „Name2“ und „Name3“. Durch den Namen können diese drei Parameter nicht unterschieden werden. Der Name der Operation wurde so gewählt, dass der Anwender eine gewisse Vorstellung über den Inhalt und Verwendung der Parameter hat. Allerdings kann mit dieser Information keine Eingabe durchgeführt werden. Vor dem Eingabefeld ist für jeden dieser drei Parameter ein Informations-Button platziert. Durch Klick kann die Dokumentation für den jeweiligen Parameter angezeigt werden. Aus dieser Dokumentation geht hervor, dass ein Parameter sich auf den Namen des Autors, einer auf den Namen des Buchs oder der letzte auf den Namen des Verlags bezieht. Durch diese zusätzlichen Informationen kann nun die Eingabe eindeutig durchgeführt werden. Im nächsten Beispiel wird die Anwendung von Dokumentation auf Operationsebene verdeutlicht. Die Operation trägt den Namen „enterPhone“ und als Eingabemaske wird ein komplexer Datentyp mit zwei Eingabefeldern für die Vorwahl und Durchwahl angezeigt. Die Eingabe für die einzelnen Parameter ist in diesem Beispiel eindeutig. Allerdings ist die Verwendung dieser Operation nicht eindeutig. Durch den Namen der Operation wird nur suggeriert, dass eine Telefonnummer verlangt wird als Eingabe. Es wird aber keine Angaben gemacht, ob z. B. die Telefonnummer des Autors oder des Verlags erwünscht ist. Abbildung 34 zeigt daher die Verwendung der Dokumentation auf Operationsebene. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 119 Abbildung 34: Einbinden von Dokumentationen für Operationen Für Operationen wird der Informations-Button unterhalb der Eingabemaske angezeigt. Somit ist dieser bei der Bearbeitung auf mehreren Ebenen innerhalb der Eingabemaske immer sichtbar. Die angezeigte Dokumentation bettet die angezeigte Operation in einen Kontext. Dem Anwender wird mitgeteilt, dass der Web-Service-Anbieter Informationen über die Autoren veröffentlichen möchte und daher für Rückfragen die Telefonnummer der Autoren benötigt. Im letzten Beispiel wird der Einsatz von Dokumentationen auf Portebene vorgestellt. Ein Port repräsentiert einen Web-Service, welcher durch einen Aufruf einer Operation kontaktiert wird. Daher ist die Dokumentation für einen Port immer im Zusammenhang mit der angeboten Operation zu betrachten. Die Dokumentation für einen Port wird immer durch den gleichen Button wie die Dokumentation für eine Operation angezeigt. Das Beispiel in Abbildung 35 zeigt, dass die Operation „add“ von zwei Web-Service-Anbietern (repräsentiert durch zwei Ports) angeboten wird. Der Port „Calculator“ und „CalculatorXtra“ bieten beide die gleiche Operation an. 120 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 35: Einbinden von Dokumentationen für Ports Durch die Dokumentation wird dem Anwender mitgeteilt, dass der Web-Service-Anbieter „CalculatorXtra“ für den identischen Service wie der zweite Anbieter weniger berechnet und zusätzlich auch die Anfrage schneller beantwortet. Die Dokumentation für die beiden letzten Beispiele kann natürlich auch kombiniert dargestellt werden. Liegen Dokumentationen Für eine Operation und den verwendeten Port vor, so werden diese zusammen in einem Fenster angezeigt. Daher wird bei der Darstellung der Dokumentation immer eine einleitende Zeile automatisch generiert. Diese Zeile gibt an, für welches Element die Dokumentation angezeigt wird und wie der Name lautet. Diese drei Beispiele verdeutlichen, dass Hintergrundinformationen bei manchen Eingaben erforderlich sind. Der Prototyp bietet die Möglichkeit an, diese Informationen zielgerecht dem Anwender anzubieten. Diese Dokumentationen wurden dem WSDL-Dokument entnommen und sind somit inhaltlich vom Anbieter abhängig. Daher müssen Web-Service-Anbieter für eine gute Qualität ihrer Dokumentation sorgen. Zusätzlich zu den WSDL-bedingten Problemen können allerdings auch Probleme mit dem Prototypen oder mit der Editierung der Daten auftreten. Ferner sind dem Anwender vielleicht nicht alle verfügbaren XSD-Datentypen bekannt, womit er den Wertebereich nicht kennt und somit fehlerhafte Eingaben tätigen kann. Daher wurde eine Hilfefunktion für den Prototypen entwickelt. Zum Anzeigen und Verwalten der Hilfefunktion wurde die JavaHelp-API von Sun Microsystems verwendet1. Diese API bietet ein Hilfeformat an zum XML- und HTML-basierten Anzeigen von Informationen. Das Hilfe-System bietet die Möglichkeit zum Suchen, Navigieren und Anzeigen von Informationen, die als HTML-Seiten angezeigt werden. Das Hilfe-System generiert die Hilfefunktion durch Aufruf eines Helpset-Dokumentes. In diesem XML-Dokument können verschiedene Sichten (Views) 1 Dokumentation und Download von JavaHelp: http://java.sun.com/products/javahelp/ Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 121 festgelegt werden. Zum Aufbau der Hilfefunktion wurden drei Sichten verwendet. Eine Sicht bietet ein thematisch geordnetes Inhaltsverzeichnis der angebotenen Hilfefunktionen an. Eine weitere Sicht kann zum indexierten Suchen nach Informationen verwendet werden. Beide Sichten bieten jeweils eine andere Art der Darstellung der gleichen Informationen an. In einer Map-Datei wird für einen eindeutigen Schlüssel eine HTML-Seite festgelegt. Die beiden Sichten ordnen jeweils ihre Schlüssel anders, bieten aber die gleichen Informationen an. Die dritte Sicht ermöglicht die Suche im Internet. Die Eingaben im Suchfeld werden an eine Suchmaschine von Sun Microsystems weitergeleitet. Die Hilfe wird zur besseren Programmübersicht in einem separaten Fenster aufgebaut. Somit wird im Hauptfenster kein Platz für Hilfefunktionen vergeudet und der Benutzer kann das Hilfefenster im Hintergrund offen lassen, wenn er mit der Editierung der Daten fortfährt und gelegentlich Hilfe zur Editierung der Daten benötigt. Das Hilfefenster kann auf zweierlei Weise geöffnet werden. Zum einen wird das Fenster im Menü und Symbolleiste zum Öffnen angeboten und zum anderen kann man eine Kontexthilfe aktivieren. Mit einem Hilfezeiger kann man eine grafische Komponente eines Datentyps anklicken und erhält die entsprechende Dokumentation und Hilfestellung angezeigt. Jedem Datentyp und dessen grafischer Komponente wurden eindeutige Identifikationsnummern zugewiesen. Dadurch kann durch Suche in der Map-Datei die gewünschte Hilfeseite angezeigt werden. So kann für jeden Datentyp eine spezielle Dokumentation angelegt werden, die dem Benutzer Angaben über den Wertebereich, erlaubte Zeichen und die verwendeten Fassetten angibt oder allgemeine Hilfestellung zum Aufbau und Benutzung der GUI. 122 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 36 zeigt das Hilfe-System von JavaHelp: Abbildung 36: Hilfefunktion für den Datentyp Float Im linken Bereich des Hilfefensters kann zwischen den drei Sichten ausgewählt werden. Die aktivierte Ebene zeigt das Inhaltsverzeichnis mit verschiedenen Themenbereichen. In der rechten Seite wird die Hilfeseite für den Datentyp float angezeigt, die durch die Kontexthilfe ausgewählt wurde. Durch Aktivierung der Kontexthilfe und Klick auf das Textfeld des Datentyps wurde diese Hilfeseite geöffnet 6.4 Zusätzliche Implementierungsaspekte An dieser Stelle werden einige weitere Implementierungsaspekte aufgelistet. Zunächst wird der verwendete Parser WSDL4J von IBM vorgestellt, der einzelne Daten aus dem WSDL-Dokument extrahiert und dem Prototyp zur weiteren Verarbeitung zur Verfügung stellt. Nachfolgend wird der Mechanismus zur konsistenten Speicherung von komplexen Datentypen vorgestellt. Ferner wird die Problematik eines Timeouts während des Sendevorgangs angesprochen, bevor schließlich auf die Möglichkeit zum externen Editieren von Datentypen eingegangen wird. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 123 Parser WSDL4J Intern verwendet Axis als Parser WSDL4J von IBM1. Dieser Parser realisiert die Referenzimplementierung der Java API for WSDL (JWSDL). [DF03] JWSDL ist ein Java Specification Request (JSR110)2 der unter dem Java Community Process (JCP) entwickelt wurde. Zunächst wird der Parser WSDL4J vorgestellt, bevor auf die Erweiterung durch die Axis-API eingegangen wird. Der Parser kann verwendet werden zum Lesen, Schreiben, Erzeugen und Modifizieren von WSDLDokumenten. Der Prototyp benötigt allerdings lediglich die Funktion des Auslesens von Informationen aus dem WSDL-Dokument. Über die zur Verfügung stehende API können alle Service-, Port-, Porttyp-, Anbindungs-, Operations-, Nachrichten- und Datentyp-Elemente extrahiert werden. Nach der Übergabe der URL des WSDL-Dokumentes parst WSDL4J das WSDL-Dokument und alle korrekt importierten WSDL-Dokumente und bietet Zugriff auf alle Elemente. Sämtliche extrahierten Elemente können über eine eigens für dieses Element zugeschnittene API weiter untersucht werden. Beispielhaft werden zwei Methoden zur Bearbeitung von Elementen angeführt: Für ein Port-Element kann über die Methode getBinding() der Klasse com.ibm.wsdl.PortImpl das entsprechende Binding für diesen Port ermittelt werden. Die Methode getParameterOrdering()der Klasse com.ibm.wsdl.OperationImpl liefert bei einem Operations-Element die vorgegebene Parameterreihenfolge innerhalb der Operation. WSDL4J bietet eine komfortable API zum Zugriff auf das WSDL-Dokument. Allerdings wurde WSDL4J lediglich zum Parsen von WSDL entwickelt und nicht für XSD. Es wird zwar das DatentypElement extrahiert, allerdings wird keine Möglichkeit geboten zum Parsen einzelner komplexer Datentypen in XSD. Die Axis-API bietet beim Parsen von XSD-Datentypen eine Erweiterung des WSDL4J-Parsers an. In Verbindung mit dem Dom-Parser der Java-API (org.w3c.dom) kann eine Symboltabelle mit allen Datentypen generiert werden. Dazu wird lediglich ein geparstes Dokument (org.w3c.dom.Document) des WSDL-Dokumentes vom Dom-Parser benötigt, um diese Tabelle zu erzeugen. Danach kann mit der Axis-API auf die XSD-Datentypen zugegriffen werden. Der unbekannte Datentyp kann durch Abfragen Schritt für Schritt näher spezifiziert werden. Zur Einordnung des Datentyps muss dabei aber auf Erkenntnisse der XSD-Spezifikation zurückgegriffen werden. Beispielhaft kann getestet werden, ob der vorliegende Datentyp ein <complexType> oder <simpleType> ist. Nach dieser ersten Kategorisierung kann der Datentyp weiter untersucht werden. Die Axis-API bietet dazu eine Reihe von Methoden an. Bei einem <simpleType> kann man sich z.B. den Basisdatentyp geben lassen und danach den einfachen Datentyp nach Attributen untersuchen. Bei einem <complexType> kann eine Abfrage erstellt werden, ob der vorliegende Datentyp ein 1 Dokumentation und Download von WSDL4J: http://www-124.ibm.com/developerworks/projects/wsdl4j/ 2 Informationen über JSR-110 im Internet: http://www.jcp.org/jsr/detail/110.jsp 124 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Feld ist. Falls dies der Fall ist, kann man sich den Feld-Datentyp geben lassen. Außerdem kann man bei einem <complexType> die enthalten Elemente mit ihren Datentypen extrahieren. Diese Elemente werden durch eine Komposition („all“, „sequence“ oder „choice“) gruppiert (siehe Kapitel 4.3). Es werden lediglich die Elemente geliefert, aber nicht die zugehörige Komposition. Diese kann durch den DOM-Parser ermittelt werden und somit die Verwendung der Elemente festgelegt werden. Die AxisAPI weist somit einige Lücken auf beim Parsen von XSD-Datentypen. Daher müssen Kenntnisse aus der XSD-Spezifikation verwendet werden, um die verschiedenen Datentypen richtig einzuordnen. Durch diese Kategorisierung der Datentypen können letztendlich die Datentypen bestimmt werden. Nach der Identifizierung kann danach eine grafische Komponente zugeordnet werden (siehe Kapitel 5.2). Persistente Speicherung komplexer Datentyp-Objekte Der Prototyp speichert jede Editierung eines komplexen Datentyps vor dem Senden, wenn der Anwender dies wünscht. Aus Gründen des Datenschutzes wird der Anwender gefragt, ob er eine dauerhafte Speicherung seiner Eingabedaten zur Wiederverwendung erlaubt. Möchte ein Anwender erneut eine Anfrage an einen Web-Service richten, so wird ihm angeboten bereits durchgeführte Editierungen nochmals zu verwenden. Für komplexe Datentypen generiert WSDL2Java Klassen, deren erzeugte Objekte jeweils vor dem Senden mit Benutzereingaben gefüllt werden. Zur persistenten Speicherung der Objekte dieser Klassen müssen die Objekte zuvor serialisiert und in einer XML-Datei gespeichert werden. Zum Serialisieren der Objekte wird die Klasse java.beans.XMLEncoder verwendet und zum Deserialisieren java.beans.XMLDecoder. Zum Serialisieren wird das Objekt zuvor einer java.util.ArrayList hinzugefügt. In dieser Liste befinden sich alle Objekte von komplexen Datentypen. Außerdem können mehrere Objekte des gleichen Datentyps in der Liste aufgereiht werden. Diese Liste wird dann anschließend durch den XMLEncoder serialisiert und in einer XML-Datei gespeichert. Um Speicherplatz zu sparen, kann alternativ ein komprimierter Datenstrom in der Datei gespeichert werden. Zum Deserialisieren wird aus der Datei die ArrayList extrahiert und die einzelnen enthaltenen Objekte werden namentlich mit dem aktuellen Datentyp der Operation verglichen. Alle Objekte dieses Datentyps werden dann in einem Feld gespeichert. Dieses Feld wird dann wie oben beschrieben als einfaches Feld dem Anwender präsentiert. Wählt er ein Feldelement an, so werden die Werte für die einzelnen Parameter in der entsprechenden grafischen Komponenten der Eingabemaske angezeigt. Der Anwender kann anschließend diese Daten nochmals neu editieren und zur Erstellung der Anfrage nutzen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 125 Timeout beim Senden Axis unterstützt zwei der vier möglichen Transmissions-Primitiven von WSDL (siehe Kapitel 2.4.1). Einerseits kann ein „One-Way-Request“ durchgeführt werden. Der Prototyp sendet eine Nachricht an den Web-Service und arbeitet weiter im Programmfluss. Bei dieser Transmission findet keine Blockierung des Prototypen statt und die Bearbeitung kann fortgesetzt werden. Anderseits kann ein „RequestResponse-Request“ erstellt werden. Der Prototyp sendet eine Nachricht an den Web-Service und unterbricht den Programmfluss bis eine Antwort wieder eintrifft. Dies ist die primäre Benutzung des Prototypen. Bei diesem synchronem Request-Response kann es zu Fehlern kommen, falls die Verbindung über das Transport-Protokoll HTTP unterbrochen wird. HTTP ist ein zustandsloses, unzuverlässiges Transport-Protokoll und kann keine Garantien für eine Verbindung geben. Zusätzlich könnte ein Web-Service nicht auf eine Anfrage eingehen, weil evtl. intern ein Fehler vorliegt, eine falsche Adresse angegeben wurde oder der Web-Service nicht aktiv ist. Da also bei der Kommunikation Fehler auftreten können, darf das Programm nicht dauerhaft blockiert sein durch einen fehlerhaften Aufruf. Daher wurde ein Timeout eingeführt. Nach Ablauf des Timeouts bricht das Programm den Sendevorgang ab und ist nicht mehr blockiert. Die Operation muss dann erneut gesendet werden oder eine andere Operation wird bearbeitet. Externes Editieren der Daten JCalendar ist eine Open Source Entwicklung eines grafischen Kalendar-Programms zur Anzeige eines übergebenen Datums von Kai Toedter1. Dieses Programm unterliegt der GNU Lesser General Public License2 und ist somit frei zugänglich und kann in den bestehenden Prototypen eingebunden werden. Eine Teilmenge dieses Packages wurde verwendet und für den vorliegenden Prototyp angepasst. Dieses Programm wurde in den Prototypen im Package externPrg integriert, damit eine externe Editierung der Eingabedaten simuliert werden kann. Das Programm liefert nach der Editierung Daten zurück zum Prototypen, der diese entgegen nimmt und in der Eingabemaske für den entsprechenden Datentyp anzeigt. Durch diese Simulation externer Editierung soll die Erweiterbarkeit des Prototypen demonstriert werden. Die eingebettete Komponente erhält als Eingabe Ganzzahlwerte für Jahr, Monat und Tag und zeigt diese Daten in einer grafischen Übersicht an. Abbildung 37 zeigt die die grafische Darstellung des Datums in einem separaten Fenster. 1 Homepage: http://www.toedter.com/en/jcalendar/ 2 Informationen über GNU Lesser General Public License: http://www.gnu.org/copyleft/lesser.html 126 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 37: Screenshot des JCalendar zum Anzeigen eines Datums Über eine Combobox kann der Monat ausgewählt werden und über einen Spinner kann das Ausgangsjahr jeweils um eins in- oder dekrementiert werden. Für den ausgewählten Monat erscheint eine Monatsübersicht in der ein Tag per Mausklick ausgewählt werden kann. Durch Betätigen des UpdateButtons werden die Editierungen übernommen und ein entsprechendes Update in den Eingabefeldern des aufrufenden Datentyps durchgeführt. Jeder Datentyp, der Datumseingaben entgegen nimmt (Date, Duration, DateTime, gYearMonth und gMonthDay), erzeugt neben seinen spezifischen Eingabefeldern einen Button zum Öffnen dieser separaten Komponente. Der Benutzer hat also die Möglichkeit über die generierten Eingabefelder oder über dieses grafische Ergänzungsprogramm seine Editierung von Datumsinformationen einzugeben. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 127 Kapitel 7: Zusammenfassung und Ausblick In der vorliegenden Diplomarbeit wurde ein generisches Framework zur Ansprache von Web-Services entwickelt. Es wurde untersucht, inwieweit die Schnittstellen-Beschreibungssprache WSDL zur Generierung einer GUI ausreichend Informationen liefert. Durch das Framework sollen Anfragen an einen Web-Service erstellt und anschließend die Antwort ebenfalls wieder angezeigt werden. Zur Erreichung dieses Ziels wurde zunächst die Architektur von Web-Services, ihre Bedeutung für die Internetentwicklung und die eingesetzten Technologien erläutert. Ein Web-Service ist ein Softwaresystem, das in verteilten, heterogenen Systemlandschaften mit anderen Softwaresystemen interagiert, um gemeinsam Aufgaben zu erfüllen. Ein Web-Service verwendet dazu vorhandene XML-basierte Technologien, wie u. a. WSDL, SOAP und UDDI, um unabhängig von verwendeter Plattform, Programmiersprache und Transport-Protokoll mit anderen Services zu kommunizieren. Die Schnittstelle eines Web-Service wird dabei durch die Web Service Description Language (WSDL) beschrieben. Diese Beschreibungssprache legt fest, wie andere Systeme mit dem Web-Service kommunizieren können und abstrahiert von der dahinter liegenden Implementierung des Dienstes. Der Protokollstandard SOAP packt die Übertragungsdaten in ein XML-basiertes Format und ermöglicht den typisierten Datenaustausch zwischen Web-Services. Die Universal Description, Discovery and Integration (UDDI) ist ein Plattform-unabhängiges Framework zum Beschreiben, Veröffentlichen und Suchen von Web-Services. Der Schwerpunkt dieser Diplomarbeit lag in der Analyse von WSDL und der XML Schema Definition Language (XSD), mit der die verwendeten Datentypen in WSDL spezifiziert werden. WSDL wird als Ausgangsdokument zur Generierung der GUI herangezogen und wurde daher ausführlich vorgestellt. Zur Reduzierung der Komplexität innerhalb eines WSDL-Dokumentes, Erhöhung der Wiederverwendung und Steigerung der Lesbarkeit, können durch den Import-Mechanismus einzelne XSD- und WSDL-Elemente ausgelagert werden. Zusätzlich wurde analysiert, wie die Daten aus dem WSDLDokument zur Generierung einer GUI verwendet werden können, ohne zusätzliche Informationen heranzuziehen. In der anschließenden Modellbildung fand zunächst eine Analyse möglicher grafischer Komponenten statt. Es wurde ein Entwurf einer grafischen Oberfläche entwickelt, die unabhängig von der Komplexität des WSDL-Dokumentes jeweils einen identischen Grundaufbau hat. Nach dieser Festlegung konnten Detailinformationen aus dem WSDL-Dokument extrahiert werden. Des weiteren wurde eine Abbildungsvorschrift entwickelt, wie einzelne XSD-Datentypen innerhalb einer Eingabemaske grafisch dargestellt und editiert werden können. Die Modellbildung und spätere Entwicklung des Prototypen zeigen, dass prinzipiell die Generierung einer GUI aus einer WSDL-Beschreibung möglich ist. Das Hauptproblem bei der generierten GUI ist allerdings das Fehlen semantischer Informationen. 128 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. WSDL wurde primär entwickelt, um von Parsern verarbeitet zu werden und danach den präsentierten Web-Service dynamisch in bestehende Applikationen einzubinden. Die maschinelle Verarbeitung steht dabei im Vordergrund bei der Entwicklung dieses Standards. Maschinen benötigen keine semantischen Informationen zum Verständnis eines Dienstes. Die Namen von Operationen und Parametern können frei gewählt werden und müssen keinen semantischen Bezug zur Funktion des Web-Service haben. Zur Darstellung innerhalb der GUI besteht allerdings nur die Möglichkeit diese Namen zu extrahieren und anzuzeigen. Aus diesem Grund wurde eine Heuristik aufgestellt zur gezielten Integration von Dokumentationen innerhalb der grafischen Oberfläche. Dadurch wurde mit dem Einbinden von Dokumentationen die Möglichkeit geschaffen, semantische Aspekte zu verwirklichen und eine selbstbeschreibende GUI aufzubauen. Im Gegensatz zu verwandten Arbeiten, wie beispielsweise WSRP von OASIS, wurde in dieser Arbeit eine Möglichkeit aufgezeigt zur generischen Darstellung eines Web-Services in einer GUI durch vorhandene Technologien. Mit WSRP sollen Web-Service-Anbieter aus parametrisierten MarkupFragmenten eine zusätzliche GUI für den angebotenen Web-Service entwickeln, der dann in einem Portal integriert wird. Ein Vorteil des Ansatzes dieser Diplomarbeit liegt in der Nutzung vorhandener Standards. Es müssen keine neuen Technologien entwickelt und integriert werden. Im Prototypen wird ein gezielter Einsatz von Dokumentationen vorgestellt. Lediglich eine Sensibilisierung der Web-Service-Anbieter zur gezielten Verwendung der Dokumentationsmöglichkeit müsste erreicht werden. In diesem Zusammenhang könnte man den WSDL-Standard dahingehend verändern, dass Richtlinien zur Erstellung dieser Dokumentationen erstellt werden. Ebenso könnte die Verwendung der Dokumentationen nicht mehr nur optional angeboten werden. Durch ein verbindliches Einbinden von Dokumentationen könnte die generierte GUI um die fehlenden semantischen Informationen ergänzt werden. Vielleicht können Erkenntnisse, die bei der Entwicklung des Semantic Web errungen werden, auf die fehlende Semantik innerhalb von WSDL-Dokumenten übertragen werden. Tim Berners-Lee schrieb in einem Artikel über das Semantic Web: „The concept of machine-understandable documents does not imply some magical artificial intelligence which allows machines to comprehend human mumblings. It only indicates a machine's ability to solve a well-defined problem by performing well-defined operations on existing well-defined data. Instead of asking machines to understand people's language, it involves asking people to make the extra effort.” [BL98] Auch wenn zurzeit noch keine konkreten anwendbaren Konzepte für ein Einbinden semantischer Aspekte in WSDL-Dokumenten vorliegen, so können diese durch Forschungsarbeiten in den nächsten Jahren sicherlich voran getrieben werden. Durch die Diplomarbeit konnte ein erster Ansatzpunkt zur gezielten Verwendung von Dokumentationen dargestellt werden. Insbesondere wurde gezeigt, dass die Möglichkeit zum generischen Aufbau einer GUI aus Informationen des WSDL-Dokumentes bestehen. Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 129 Kapitel 8: Anhang 8.1 Vordefinierte, primitive Datentypen und ihre Fassetten XSD-Datentypen\ L minL maxL pat E wS maxI maxE minI maxE tD fD Fassetten xsd:string X X X X X X xsd:gMonth X X X X X X X xsd:gDay X X X X X X X xsd:gMonthDay X X X X X X X xsd:gYear X X X X X X X xsd:gYearMonth X X X X X X X xsd:date X X X X X X X xsd:time X X X X X X X xsd:dateTime X X X X X X X xsd:duration X X X X X X X xsd:boolean X X xsd:base64Binary X X X X X X xsd:hexBinary X X X X X X xsd:float X X X X X X X xsd:double X X X X X X X X X X X xsd:anyURI X X X X X X xsd:QName X X X X X X xsd:NOTATION X X X X X X X X X xsd:decimal Legende: X L = length, minL = minLength, maxL = maxLength, pat = pattern, E = enumeration, wS = whiteSpace, maxI = maxInclusive, maxE = maxExclusive, minI = minInclusive, minE = minExclusive, tD = totalDigits, fD = fractionDigits Quelle: [BM04b] X 130 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 8.2 Abgeleitete Datentypen und ihre Fassetten XSD-Datentypen\ L minL maxL pat E wS maxI maxE minI maxE tD fD Fassetten xsd:integer X X X X X X X X X xsd.long X X X X X X X X X xsd:int X X X X X X X X X xsd:short X X X X X X X X X xsd:byte X X X X X X X X X xsd: nonPositiveIn- X X X X X X X X X X X X X X X X X X xsd:negativeInteger X X X X X X X X X xsd:unsignedLong X X X X X X X X X xsd:positiveInteger X X X X X X X X X xsd:unsignedInt X X X X X X X X X xsd:unsignedShort X X X X X X X X X xsd:unsignedByte X X X X X X X X X teger xsd: nonNegativeInteger xsd:normalizedString X X X X X X xsd:token X X X X X X xsd:language X X X X X X xsd:Name X X X X X X xsd:NCName X X X X X X xsd:NMTOKEN X X X X X X xsd:NMTOKENS X X X X X xsd:ID X X X X X X xsd:IDREF X X X X X X xsd:IDREFS X X X X X xsd:ENTITY X X X X X xsd:ENTITIES X X X X X Legende: X L = length, minL = minLength, maxL = maxLength, pat = pattern, E = enumeration, wS = whiteSpace, maxI = maxInclusive, maxE = maxExclusive, minI = minInclusive, minE = minExclusive, tD = totalDigits, fD = fractionDigits Quelle: [BM04b] Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 131 8.3 Übersicht: XSD-Datentypen, Java-Datentypen und SwingKomponenten XSD Datentypen Swing Komponenten Java Datentypen xsd:anySimpleType java.lang.String JFormattedTextField (JFT) xsd:gMonth org.apache.axis.types.Month JComboBox xsd:gDay org.apache.axis.types.Day JComboBox xsd:gMonthDay org.apache.axis.types.MonthDay 2*JComboBox + JCalendar1 xsd:gYear org.apache.axis.types.Year JComboBox xsd:gYearMonth org.apache.axis.types.YearMonth 2*JComboBox + JCalendar xsd:date java.util.Calendar 2*JComboBox(Tag, Monat) +JFT (Jahr)+ JCalendar xsd:time org.apache.axis.types.Time 2*JComboBox (Stunde, Minute) xsd:dateTime java.util.Calendar Kombination von xsd:date + xsd:time xsd:duration org.apache.axis.types.Duration Siehe XSD :dateTime+ 2*JComboBox (Sek., Auswahl positive o. negative) xsd:boolean boolean JCheckBox (true,false) xsd:base64Binary2 javax.mail.internet.MimeMultipart, de.hillenbrand.swing.HFileString (Auswahlfenster zum Laden und org.apache.axis.attachments.OctetStream, javax.xml.transform.Source, java.lang.String, java.awt.Image Speichern der binären Daten), Extra-Anzeige je nach MIME Typ xsd:hexBinary Siehe xsd:base64Binary Siehe xsd:base64Binary xsd:float float JFormattedTextField xsd:double double JFormattedTextField xsd:anyURI java.lang.String JFormattedTextField xsd:QName javax.xml.namespace.QName Zwei JFT für lokalen Bezeichner und Namensraum xsd:NOTATION org.apache.axis.types.Notation Komponente baut sich aus NCName und 2+URI auf xsd:decimal java.math.BigDecimal JFormattedTextField xsd:integer java.math.BigInteger JFormattedTextField 1 JCalendar: Grafische Kalender-Darstellung in einem Extra-Fenster 2 je nach verwendeten MIME-Typ bei der Bindung wird ein unterschiedlicher Java-Datentyp verwendet 132 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. xsd.long long JFormattedTextField xsd:int int JFormattedTextField xsd:short short JFormattedTextField xsd:byte byte JFormattedTextField xsd: nonPositiveInte- org.apache.axis.types.NonPositiveInteger JFormattedTextField xsd: nonNegativeInte- org.apache.axis.types. NonNegativeInte- JFormattedTextField ger ger xsd:negativeInteger org.apache.axis.types.NegativeInteger JFormattedTextField xsd:unsignedLong org.apache.axis.types.UnsignedLong JFormattedTextField xsd:positiveInteger org.apache.axis.types.PositiveInteger JFormattedTextField xsd:unsignedInt org.apache.axis.types.NegativeInteger JFormattedTextField xsd:unsignedShort org.apache.axis.types.UnsignedShort JFormattedTextField xsd:unsignedByte org.apache.axis.types.UnsignedByte JFormattedTextField xsd:string java.lang.String JFormattedTextField + Extra ger Eingabefenster für längere Eingaben xsd:normalizedString org.apache.axis.types.NormalizedString JFormattedTextField xsd:token org.apache.axis.types.Token JFormattedTextField xsd:language org.apache.axis.types.Language JFormattedTextField xsd:Name org.apache.axis.types.Name JFormattedTextField xsd:NCName org.apache.axis.types.NCName JFormattedTextField xsd:NMTOKEN org.apache.axis.types.NMToken JFormattedTextField xsd:NMTOKENS org.apache.axis.types.NMTokens JFormattedTextField xsd:ID org.apache.axis.types.Id JFormattedTextField xsd:IDREF org.apache.axis.types.IDRef JFormattedTextField xsd:IDREFS org.apache.axis.types.IDRefs JFormattedTextField xsd:ENTITY org.apache.axis.types.Entity JFormattedTextField xsd:ENTITIES org.apache.axis.types.Entities JFormattedTextField Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 133 8.4 Modulares WSDL-Dokument durch Importieren Zur besseren Übersicht werden lediglich im ersten WSDL-Dokument sämtliche Namensräume aufgeführt. Die Dokumentationen wurden nur für die drei Beispiele aus Kapitel 6.3 angeführt. Zusätzlich wurden einige Internetadressen verkürzt, damit die WSDL-Dokumente übersichtlicher wurden. Die Abkürzung „www“ steht dabei stellvertretend für „www.icsy.de/~s_apfel“. 8.4.1 prototype.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/prototype" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:apachesoap="http://xml.apache.org/xml-soap" xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:calNS="http://www.icsy.de/da/apfel/wsdl/Cal" xmlns:bibNS="http://www.icsy.de/da/apfel/wsdl/Bib" xmlns:serviceNS="http://www.icsy.de/da/apfel/wsdl/prototype" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <!-- IMPORT SOAP-BINDINGS --> <import namespace="http://www.icsy.de/da/apfel/wsdl/Bib" location="http://www/prototype_Bib_SoapBinding.wsdl"/> <import namespace="http://www.icsy.de/da/apfel/wsdl/Cal" location="http://www/prototype_Calculator_SoapBinding.wsdl"/> <import namespace="http://www.icsy.de/da/apfel/wsdl/Cal" location="http://www/prototype_Calculator2_SoapBinding.wsdl"/> <!-- SERVICE AND PORT DEFINITION --> <wsdl:service name="da_prototype_Service"> <wsdl:port binding="calNS:CalculatorSoapBinding" name="Calculator"> <wsdlsoap:address location="http://localhost:8008/axis/Calculator"/> </wsdl:port> <!-- DOCUMENTATION FOR A PORT --> <wsdl:port binding="calNS:CalculatorSoapBinding" name="CalculatorXtra"> <documentation> This Web-Service is cheaper and faster than the other CalculatorService! </documentation> <wsdlsoap:address location="http://localhost:8008/axis/CalculatorXtra"/> </wsdl:port> <wsdl:port binding="bibNS:BibSoapBinding" name="Bib"> <documentation> This Web-Service is used to store authors and their published books in a database and offers some operations to access information about the stored data. </documentation> 134 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <wsdlsoap:address location="http://localhost:8008/axis/BibService"/> </wsdl:port> </wsdl:service> </wsdl:definitions> 8.4.2 prototype_Calculator_SoapBinding.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/Cal" xmlns:calNS="http://www.icsy.de/da/apfel/wsdl/Cal"> <!-- IMPORT PORTTYPE --> <import namespace="http://.../wsdl/Cal" location="http://www/prototype_Calculator_Porttype.wsdl"/> <!-- BINDING DEFINITION --> <wsdl:binding name="CalculatorSoapBinding" type="calNS:Calculator"> <wsdlsoap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http"/> <wsdl:operation name="add"><wsdlsoap:operation soapAction=""/> <wsdl:input name="addRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://.../wsdl/Cal" use="encoded"/> </wsdl:input> <wsdl:output name="addResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://.../wsdl/Cal" use="encoded"/> </wsdl:output> </wsdl:operation> <wsdl:operation name="subtract"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="subtractRequest"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://.../wsdl/Cal" use="encoded"/> </wsdl:input> <wsdl:output name="subtractResponse"> <wsdlsoap:body encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" namespace="http://.../wsdl/Cal" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> </wsdl:definitions> 8.4.3 prototype_Bib_SoapBinding.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/Bib" xmlns:bibNS="http://www.icsy.de/da/apfel/wsdl/Bib"> <!-- IMPORT PORTTYPE --> <import namespace="http://www.icsy.de/da/apfel/wsdl/Bib" location="http://www/prototype_Bib_Porttype.wsdl"/> Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <!-- BINDING DEFINITION --> <wsdl:binding name="BibSoapBinding" type="bibNS:Bib"> <wsdlsoap:binding style="rpc" transport="http://…/soap/http"/> <wsdl:operation name="bookEntry"><wsdlsoap:operation soapAction=""/> <wsdl:input name="bookEntryRequest"> <wsdlsoap:body encodingStyle="http://.../encoding/" namespace="http://.../wsdl/Bib" use="encoded"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="enterBookForAuthor"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="enterBookDocRequest"> <wsdlsoap:body encodingStyle="http://.../encoding/" namespace="http://.../wsdl/Bib" use="encoded"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="enterPhone"> <wsdlsoap:operation soapAction=""/> <wsdl:input name="enterPhoneDocRequest"> <wsdlsoap:body encodingStyle="http://.../encoding/" namespace="http://.../wsdl/Bib" use="encoded"/> </wsdl:input> </wsdl:operation> <wsdl:operation name="SearchBookByTitle"><wsdlsoap:operation soapAction=""/> <wsdl:input name="bookTitleRequest"> <wsdlsoap:body encodingStyle="http://.../encoding/" namespace="http://.../wsdl/Bib" use="encoded"/> </wsdl:input> <wsdl:output name="bookTitleResponse"> <wsdlsoap:body encodingStyle="http://.../encoding/" namespace="http://.../wsdl/Bib" use="encoded"/> </wsdl:output> </wsdl:operation> </wsdl:binding> </wsdl:definitions> 8.4.4 prototype_Calculator_porttype.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/Cal" xmlns:calNS="http://www.icsy.de/da/apfel/wsdl/Cal"> <!-- Import MESSAGES --> <import namespace="http://.../wsdl/Cal" location="http://.../prototype_Cal_Messages.wsdl"/> <!-- PORTTYPE DEFINITION --> 135 136 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <wsdl:portType name="Calculator"> <wsdl:operation name="add" parameterOrder="addend1 addend2"> <wsdl:input message="calNS:addRequest" name="addRequest"/> <wsdl:output message="calNS:addResponse" name="addResponse"/> </wsdl:operation> <wsdl:operation name="subtract" parameterOrder="operand"> <wsdl:input message="calNS:subtractRequest" name="subtractRequest"/> <wsdl:output message="calNS:subtractResponse" name="subtractResponse"/> </wsdl:operation> </wsdl:portType> </wsdl:definitions> 8.4.5 prototype_Bib_porttype.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/Bib" xmlns:bibNS="http://www.icsy.de/da/apfel/wsdl/Bib"> <!-- Import MESSAGES --> <import namespace="http://.../wsdl/Bib" location="http://www/prototype_Bib_Messages.wsdl"/> <!-- PORTTYPE DEFINITION --> <wsdl:portType name="Bib"> <wsdl:operation name="bookEntry"> <wsdl:input message="bibNS:bookEntryRequest" name="bookEntryRequest"/> </wsdl:operation> <wsdl:operation name="enterBookForAuthor"> <wsdl:input message="bibNS:enterBookDocRequest" name="enterBookDocRequest"/> </wsdl:operation> <!-- DOCUMENTATION FOR A OPERATION --> <wsdl:operation name="enterPhone"> <documentation> Phone number of the author required! We want to publish a short story about all authors. </documentation> <wsdl:input message="bibNS:enterPhoneDocRequest" name="enterPhoneDocRequest"/> </wsdl:operation> <wsdl:operation name="SearchBookByTitle"> <wsdl:input message="bibNS:bookTitleRequest" name="bookTitleRequest"/> <wsdl:output message="bibNS:bookTitleResponse" name="bookTitleResponse"/> </wsdl:operation> Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. </wsdl:portType> </wsdl:definitions> 8.4.6 prototype_Calculator_Messages.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/Cal" xmlns:calNS="http://www.icsy.de/da/apfel/wsdl/Cal"> <!-- DATATYPE DEFINITION --> <wsdl:types> <xsd:complexType name="SubType"> <xsd:element name="Minuend" type="xsd:float"/> <xsd:element name="Subtrahend" type="xsd:float"/> </xsd:complexType> </wsdl:types> <!-- MESSAGE DEFINITION --> <wsdl:message name="subtractRequest"> <wsdl:part name="operand" type="calNS:SubType"/> </wsdl:message> <wsdl:message name="subtractResponse"> <wsdl:part name="subtractResult" type="xsd:float"/> </wsdl:message> <wsdl:message name="addResponse"> <wsdl:part name="addResult" type="xsd:int"/> </wsdl:message> <wsdl:message name="addRequest"> <wsdl:part name="addend1" type="xsd:int"/> <wsdl:part name="addend2" type="xsd:int"/> </wsdl:message> </wsdl:definitions> 8.4.7 prototype_Bib_Messages.wsdl <?xml version="1.0" encoding="UTF-8"?> <wsdl:definitions targetNamespace="http://www.icsy.de/da/apfel/wsdl/Bib" xmlns:bibNS="http://www.icsy.de/da/apfel/wsdl/Bib"> <!-- Import XSD DATATYPES --> <wsdl:types> <xsd:schema targetNamespace=".../wsdl/Bib" > <xsd:import namespace=".../wsdl/Bib" schemaLocation="http://www/prototype_Bib_Datatypes.xsd" /> </xsd:schema> 137 138 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. </wsdl:types> <!-- MESSAGE DEFINITION --> <wsdl:message name="bookEntryRequest"> <part name="bookEntry" type="bibNS:bookEntryData"/> </wsdl:message> <wsdl:message name="bookTitleResponse"> <part name="book" type="bibNS:bookEntryData"/> </wsdl:message> <wsdl:message name="bookTitleRequest"> <part name="title" type="xsd:string"/> </wsdl:message> <!-- DOCUMENTATION FOR A PARAMETER --> <wsdl:message name="enterBookDocRequest"> <part name="Name1" type="xsd:Name"> <documentation> enter the name of the author </documentation> </part> <part name="Name2" type="xsd:Name"> <documentation> enter the title of the book </documentation> </part> <part name="Name3" type="xsd:Name"> <documentation> enter the name of the publisher of this book </documentation> </part> </wsdl:message> <wsdl:message name="enterPhoneDocRequest"> <part name="title" type="bibNS:Phone"/> </wsdl:message> </wsdl:definitions> 8.4.8 prototype_Bib_Datatypes.xsd <?xml version="1.0" encoding="UTF-8"?> <schema targetNamespace="http://www.icsy.de/da/apfel/wsdl/Bib" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:bibNS="http://www.icsy.de/da/apfel/wsdl/Bib"> <!-<!-- XSD DATATYPES DEFINITION --> USER-DERIVED DATATYPE --> Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <complexType name="bookEntryData"> <all> <element name="Author" type="bibNS:Author"/> <element name="Address" type="bibNS:Address"/> <element name="Title" type="string"/> <element name="key_words" type="bibNS:SearchArray"/> <element name="key" type="bibNS:Key_Pattern"/> <element name="first_appearance" type="date"/> </all> </complexType> <!-- FACETTE FOR THE DATATYPE STRING: PATTERN --> <simpleType name="Key_Pattern"> <restriction base="string"> <pattern value="\d{3}-[A-Z]{2}"/> </restriction> </simpleType> <!-- USER-DERIVED DATATYPE --> <complexType name="Address"> <all> <element name="Street" type="string"/> <element name="City" type="string"/> <element name="Country" type="bibNS:Country"/> <element name="Phone" type="bibNS:Phone"/> <element name="EMail" type="string"/> </all> </complexType> <!-- USER-DERIVED DATATYPE --> <complexType name="Phone"> <all> <element name="areaCode" type="int"/> <element name="directDial " type="int"/> </all> </complexType> <!-- FACETTE FOR THE DATATYPE STRING: ENUMERATION --> <simpleType name="Country"> <restriction base="string"> <enumeration value="Germany"/> <enumeration value="England"/> <enumeration value="USA"/> </restriction> </simpleType> <!-- USER-DERIVED DATATYPE --> <complexType name="Author"> <all> <element name="name" type="Name"> 139 140 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. <documentation> PLEASE ENTER THE FORE NAME FOR THIS PARAMETER. </documentation> <element/> <element name="name" type="Name"> <documentation> PLEASE ENTER THE FAMILY NAME FOR THIS PARAMETER. </documentation> <element/> </all> </complexType> <!-- COLLECTION DATATYPE: ARRAY --> <complexType name="SearchArray"> <complexContent> <restriction base="soapenc:Array"> <attribute ref="soapenc:arrayType" wsdl:arrayType="string[]" /> </restriction> </complexContent> </complexType> </schema> 8.5 Java-Klasse des XSD-Datentyps float // package for all xsd datatypes package de.icsy.da.apfel.xsdDatatypes; // imports import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.text.NumberFormat; import java.text.ParseException; import javax.help.CSH; import javax.swing.*; import de.hillenbrand.system.UIPreferences; import de.icsy.da.apfel.guiFramework.*; /** * this class represent the xsd datatype float * xsd datatype float is represented by the Java datatype Float * XSDWrapper is used to communicate with this class */ public class XSDfloat { // for validation, tests if the input from the user is a number private NumberFormat numFormat=NumberFormat.getNumberInstance(); // field to edit the parameter in the GUI Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. private JFormattedTextField ftf = new JFormattedTextField(numFormat); // constraints for the GridBag Layout private GridBagConstraints c = new GridBagConstraints(); // all graphical informations of this datatype are stored in this panel private JPanel panel=new JPanel(new GridBagLayout()); // variable to store the value of the users edit private Float value=null; // Object, used to test if all the specified facettes are handled correct private Facettes facettes; // Object[] with 12 values, one for each of the 12 given facettes from xsd // one item of the array: nullfacette not used; !=nullvalue of the // facette private Object[] facettesValues=null; /** * Constructor * Creates a new Object and the presentation panel. * Validation and facettes tests are handled here. */ public XSDfloat(){ JLabel typeLabel =createTypLabel(); ftf.setColumns(20); ftf.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent e) { String test = ftf.getText(); try{ if(test.length()>0){ GuiBuilder.setFaultContent(null); ftf.commitEdit(); // tries to create a float from the users edit float fl=((Number)ftf.getValue()).floatValue(); // tests if the value from the user is in the right range if(fl>Float.MIN_VALUE || fl<Float.MAX_VALUE){ value=new Float(fl); // tests, if there are facettes specified if(facettesValues!=null){ facettes= new Facettes(facettesValues); // calls the facette-object with the value, but only when // facettes are specified in the wsdl boolean facettesCorrect=facettes.getResult(value); if(!facettesCorrect){ reset(); //fault, value is out of the range from the facettes GuiBuilder.setFaultContent(Helper.GRS("JReqTools.FacFault")); } }else{ GuiBuilder.setFaultContent(null); } } // value is higher than max_value or smaller than min_value 141 142 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. else GuiBuilder.setFaultContent(Helper.GRS("JReqTools.FloatFault2")); } }catch (NumberFormatException ne){ // fault, value is not a number GuiBuilder.setFaultContent(Helper.GRS("JReqTools.FloatFault")); } catch (ParseException pe) { // fault, value is not a number GuiBuilder.setFaultContent(Helper.GRS("JReqTools.FloatFault")); } } }); // graphical presentation of the datatype, consists of the textfield and // a label c.gridx = 0; c.gridy=0;c.gridwidth =2;c.gridheight=1; c.weightx = 1; panel.add(createTypLabel(), c); c.gridx = 0; c.gridy=1;c.gridwidth =1;c.gridheight=1; c.weightx = 1; panel.add(ftf, c); // field help ID for the textfield, when the user uses the contextHelp // then a help-side opens with specific informations about the datatype CSH.setHelpIDString(ftf, "xsd:float"); } /** * method sets datatype result variable to null and deletes the displayed * value in the textfield */ public void reset(){ value=null; ftf.setText(""); ftf.setValue(null); } /** * method creates the datatype label, the label gives information which * datatype is used */ private JLabel createTypLabel(){ JLabel typeLabel = new JLabel("xsd:float"); typeLabel.setFont(UIPreferences.getAcceleratorFont()); return typeLabel; } /** * the parameter facettesValues is filled with all facettes values from the * wsdl for the given datatype, if facettes are specified */ public void setFacettes(Object[] facettesValues){ this.facettesValues=facettesValues; } Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 143 /** * returns the presentation panel of this datatype with the label and * textfield inside */ public JPanel getPanel(){ return panel; } /** * returns the value of the datatype object, the users edit is stored in the * variable value */ public Float getValue(){ return value; } /** * sets the value for the datatype object, in the variable “value” the new * value is stored and also displayed in the textfield */ public void setValue(Float value){ this.value=value; ftf.setText(value.toString()); ftf.setValue(value); } /** * method is used to set the result from an answer * sets the value of the datatype object and mark all presentation * components uneditable * @param value */ public void setResult(Float value){ setValue(value); ftf.setEditable(false); } } 144 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Literaturverzeichnis [ABB+04] E. Armstrong, J. Ball, S. Bodorf, D. Bode Carson, I. Evans, D. Green, K. Haase, E. Jendrock: The J2EE™ 1.4 Tutorial, 2004, Sun Microsystems, verfügbar im World Wide Web: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/ [ABFG04] D. Austin, A. Barbir, C. Ferris, S. Garg.: Web Services Architecture Requirements, W3C Working Group Note 11 February 2004, 2004, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2004/NOTE-wsa-reqs-20040211 [ACM01] E. Anuff, M. Chaston; D. Moses: Web Service User Interface (WSUI) 1.0, Working Draft – 22 June 2001, 2001, Epicentric Inc, verfügbar im World Wide Web: http://www.wsui.org/doc/20010622/WD-wsui-20010622.html [Axis04] Homepage von Apache, Projekt AXIS: http://ws.apache.org/axis/ [BCC+04] A. Banks, J. Challenger, P. Clarke, R. P. King, K. Witting, A. Donoho, T. Holloway, J. Ibbotson, S. Todd: Specification: HTTPR Specification, 2002, IBM, verfügbar im World Wide Web: http://www-106.ibm.com/developerworks/webservices/library/wshttprspec/ [BEG+01] T. Baier, M. Ebert, A. Geissel, M. Jeckle, N. Klever, E. Meier, S. Werner: XML Schema Teil 2: Datentypen, W3C Empfehlung 02.Mai.2001, deutsche Übersetzung, 2001, W3C, verfügbar im World Wide Web: http//www.w3.org/TR/2001/Rec-xmlschema2-20010502 [BEG+03] K. Ballinger, D. Ehnebuske, M. Gudgin, M. Nottingham, P. Yendluri: Basic Profile Version 1.0a, final Specification, 2003, Web Services Interoperability Organization (WS-I), verfügbar im World Wide Web: http://www.wsi.org/archive/Profiles/Basic/2003-08/BasicProfile-1.0a.htm [Bel02] T. Bellwood.: UDDI Version 2.04 API Specification, UDDI Committee Specification, 2002, verfügbar im World Wide Web: http://uddi.org/pubs/ProgrammersAPI-V2.04Published-20020719.htm [BG04] D. Brickley, R. V. Guha: RDF Vocabulary Description Language 1.0: RDF Schema, W3C Recommendation 10 February 2004, 2004, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/rdf-schema/ [BHM+04] D. Booth, H. Haas, F. McGabe, E. Newcomer, C. Ferris, D. Orchard: Web Services Architecture, W3C Working Group Note 11 February 2004, 2004, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2004/NOTE-ws-arch-20040211 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. [BL98] 145 T. Berners-Lee: What the Semantic Web can represent, 1998, W3C, verfügbar im World Wide Web: http://www.w3.org/DesignIssues/RDFnot.html [BM04a] P.V. Biron, A. Malhotra: XML Schema Part1: Structures Second Edition, W3C Proposed Edited Recommendation 18 March 2004, 2004, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2004/PER-xmlschema-1-20040318/ [BM04b] P.V. Biron, A. Malhotra: XML Schema Part2: Datatypes Second Edition, W3C Proposed Edited Recommendation 18 March 2004, 2004, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2004/PER-xmlschema-2-20040318/ [Bo02] G. Bong: Apache SOAP type mapping, Part 1: Exploring Apache´s serialization API´s, 2002, IBM, verfügbar im World Wide Web: http://www106.ibm.com/developerworks/library/ws-soapmap1/ [BPS+04] T. Bray, J. Poali, C. M. Sperberg-McQueen, E. Maler, F. Yergeau: Extensible Markup language (XML) 1.0 (Third Edition), W3C Recommendation 04 february 2004, 2004, W3C, verfügbar im World Wide Web: :http://www.w3.org/TR/2004/REC-xml20040204/ [Bur04] M. Burner: Service Orientation and its Role in Your Connected Systems Strategy, 2004, Microsoft Corporation, verfügbar im World Wide Web: http://msdn.microsoft.com/library/default.asp?url=/library/enus/dnbda/html/SrOrientWP.asp [But04] R.Butek : Web Service Programming Tips and Tricks: WSDL file imports, 2004, IBM, verfügbar im World Wide Web: http://www106.ibm.com/developerworks/xml/library/ws-tip-imports.html [CCMW01] E. Christensen, F. Curbera, G. Meredith, S.Weerawarana.: Web Service Description Language (WSDL) 1.1, W3C Note 15 March 2001, 2001, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2001/NOTE-wsdl-20010315 [CDF+02] A. Ceponkus, S. Dalal, T. Fletcher, P. Furniss, A. Green, B. Pope: Business Transaction Protocol, AN OASIS Committee Specification, 2002, OASIS, verfügbar im World Wide Web: http://www.oasis-open.org/committees/download.php/1184/2002-0603.btp%20cttee-spec-1.0.pdf [Cer02] E. Cerami: Web Services, Essentials, 2002, O´Reilly, p. 10 [CGMW04] R. Chinnici, M. Gudgin, J.-J- Moreau, S. Weerawarana : Web Service Description Language (WSDL) Version 1.2 Part 1: Core Language, W3C Working Draft 11 June 2003, 2003, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2003/WDwsdl12-20030611 146 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. [CGM+03] R. Chinnici, M. Gudgin, J.-J. Moreau, J. Schlimmer, S.Weerawarana.: Web Service Description Language (WSDL) 2.0 Part 1: Core Language, W3C Working Darft 10 November 2003, 2003, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2001/NOTE-wsdl-20010315 [CGM+04] R. Chinnici, M. Gudgin, J.-J. Moreau, J. Schlimmer, S. Weerawarana.: Web Service Description Language (WSDL) Version 2.0 Part 1: Core Language, W3C Working Draft 26 March 2004, 2004, W3C , verfügbar im World Wide Web: http://www.w3.org/TR/wsdl20/ [CHY+97] P. E. Chung, Y. Huang, S.Yajnik, D. Liang, J. C. Shih, Y. M. Wang: DCOM and CORBA Side by Side, Step by Step, and Layer by Layer, 1997, Microsoft, verfügbar im World Wide Web: http://research.microsoft.com/~ymwang/papers/HTML/DCOMnCORBA/S.html [Coy02] F. P. Coyle: XML, Web Services, and the Data Revolution, 2002, Indianapolis (USA), Addison-Wesley-Verlag, pp. 13-21 [DF03] M. J. Duftler, P. Fremantle: Java™APIs for WSDL (JWSDL), 2003, IBM, verfügbar im World Wide Web: [DFLS02] A. Diaz, P. Fischer, C. Leue, T. Schäck: Web Services for Remote Portals (WSRP) WhitePaper, 2002, IBM, verfügbar im World Wide Web: http://www.ibm.com/developerworks/library/ws-wsrp/ [DLW02] A. Diaz, J. Lucassen, C. F. Wiecha: Web Services Experience Language Version 2.Spezifikation , 2002, IBM, verfügbar im World Wide Web: http://www106.ibm.com/developerworks/library/ws-wsxl/ [EDI04] Homepage von UNECE (United Nations Economic Commission for Europe, Themengebiet EDI: http://www.unece.org/trade/untdid/welcome.htm [FBF+01] W. Ford, P. Hallam-Baker, B. Fox, B. Dillaway, B. LaMacchia, J. Epstein, J. Lapp: XML Key Management Specification (XKMS), W3C Note 30 March 2001, 2001, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/xkms/ [FW04] D. C. Fallside, P. Walmsley: XML Schema Part0: Primer Second Edition, W3C Proposed Edited Recommendation 18 March 2004, 2004, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2004/PER-xmlschema-0-20040318/ [GHM+03] M. Gudgin, M. Hadley, N. Mendelsohn, J,-J. Moreau, N. F. Nielsen: SOAP Version 1.2. Part 1: Messaging Framework, W3C Recommendation 24 June 2003, 2003, W3C verfügbar im World Wide Web: http://www.w3.org/TR/2003/REC-soap12-part120030624/ Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. [HHP+01] 147 I. Horrocks, F. van Harmelen, P Patel-Schneider, T. Berners-Lee, D. Brickley, D. Connolly, M. Dean, S. Decker, D. Fensel, R. Fikes, P. Hayes, J. Heflin, J. Hendler, O. Lassila, D. McGuinness, L. A. Stein: DAML+OIL(March 2001), 2001, verfügbar im World Wide Web: http://www.daml.org/2001/03/daml+oil-index.html [KLT03] A. Kropp, C. Leue, R. Thompson: Web Services for Remote Portals Specification, 2003, OASIS, verfügbar im World Wide Web: http://www.oasisopen.org/committees/download.php/3343/oasis-200304-wsrp-specification-1.0.pdf [KW02] M. Kuschke, L. Wölfel: Web Services kompakt, 2002, Heidelberg, Berlin, Spektrum Akademischer Verlag GmbH, 1. Auflage, p. 4 [Ley01] F. Leymann: Web Service Flow Language (WSFL 1.0), 2001, IBM, verfügbar im World Wide Web: http://www306.ibm.com/software/solutions/webservices/pdf/WSFL.pdf [Ma04] B. Marchal: Tip: Passing files to a Web service, SOAP and binary data, 2004, IBM, verfügbar im World Wide Web: http://www-106.ibm.com/developerworks/library/xtippass.html [Mit03] N. Mitra: SOAP Version 1.2. Part 0: Primer, W3C Recommendation 24 June 2003, 2003, W3C, verfügbar im World Wide Web: http://www.w3.org/TR/2003/RECsoap12-part0-20030624/ [MPM04] P. Mishra, R.Philpott, E. Maler: Conformance Requirements for the OASIS Security Assertion Markup Language (SAML) V2.0 Committee Draft 02, 2004, OASIS, verfügbar im World Wide Web: http://www.oasisopen.org/committees/download.php/9452/sstc-saml-conformance-2.0-cd-02.pdf [New02a] E. Newcomer: Understanding Web Services. XML, WSDL, SOAP, and UDDI, 2002, o. O, Addison Wesley, pp. 219-253 [New02b] E. Newcomer: Understanding Web Services. XML, WSDL, SOAP, and UDDI, 2002, o. O, Addison Wesley, pp. 159-168 [OMG04] OMG (ohne Autor): Common Object Request Broker Architecture: Core Specification, 03. 2004, OMG, verfügbar im World Wide Web: http://www.omg.org/technology/documents/formal/corba_iiop.htm [OMM02] E. Ort, R. Mandava, B. Mehta: Java™ Web Services Developer Pack. Part2: RPCCalls, Messaging and the JAX-RPC and JAXM-API, 2002, Sun Microsystems, verfügbar im World Wide Web: http://java.sun.com/webservices/tutorial.html [RFC821] J. B. Postel: Simple Mail Transfer Protocol, 1982, Information Sciences Institute University of Southern California, verfügbar im World Wide Web: http://www.ietf.org/rfc/rfc821.txt 148 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. [RFC959] R. Braden: Requirements for Internet Hosts – Application and Support, 1989, Internet Engineering Task Force, verfügbar im World Wide Web: http://www.ietf.org/rfc/rfc1123.txt [RFC2045] N. Freed, N. Borenstein: Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies, 1996, verfügbar im World Wide Web: http://www.ietf.org/rfc/rfc2045.txt [RFC2396] T. Berners-Lee, R. Fielding, U. C. Irvine, L. Masinter: Uniform Resource Identifiers (URI) Gneric Syntax, 1998, verfügbar im World Wide Web: http://www.ietf.org/rfc/rfc2396.txt [RFC2616] R. Fielding, J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach, T. Berners-Lee: Hypertext Transfer Protocol – HTTP/1.1, 1999, verfügbar im World Wide Web: http://www.ietf.org/rfc/rfc2616.txt [RFC2818] E. Rescorla: HTTP Over TLS, 2000, RFTM Inc, verfügbar im World Wide Web: http://www.ietf.org/rfc/rfc2818.txt [RFC3080] M. Rose: The Blocks Extensible Exchange Protocol Core, 2001, Invisible Worlds Inc, verfügbar im World Wide Web: ftp://ftp.isi.edu/in-notes/rfc3080.txt [RMI03] Sun (ohne Autor): Java RMI Specification, 2003, Sun Microcsystems, verfügbar im World Wide Web: http://java.sun.com/j2se/1.4.2/docs/guide/rmi/spec/rmiTOC.html [STK02] J. Snell, D. Tidwell, P. Kulchenko: Webservice-Programmierung mit SOAP, 2002, o.O, O´Reilly Verlag & Co. KG (deutsche Ausgabe, übersetzt von G.Selke) pp. 179181 [SUN04] Sun (ohne Autor): The Java Tutorial, 2004, Sun, verfügbar im World Wide Web: http://java.sun.com/docs/books/tutorial. [Tha01] S. Thatte: XLANG Web Services for Business Process Design, 2001, Microsoft, verfügbar im World Wide Web: http://www.gotdotnet.com/team/xml_wsspecs/xlangc/default.htm Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 149 Abbildungsverzeichnis Abbildung 1: Übersicht des Protokoll-Stacks eines Web-Service nach [Cer02] .................................. 16 Abbildung 2: Service-orientierte Architektur mit Web-Service-Technologien .................................... 19 Abbildung 3: vereinfachter Aufbau eines WSDL-Dokumentes ............................................................ 24 Abbildung 4: WSDL-Dokument des Taschenrechner-Web-Service .................................................... 26 Abbildung 5: direktes und transitives Importieren ................................................................................ 34 Abbildung 6: transitiver Zugriff auf XSD in WSDL 2.0 ...................................................................... 36 Abbildung 7: Sonderfall beim Importieren in WSDL 2.0 ..................................................................... 37 Abbildung 8: Übersicht der Datenstrukturen in Beziehung zur abstrakten Sicht auf UDDI ............... 38 Abbildung 9: Aufbau einer SOAP-Nachricht ....................................................................................... 40 Abbildung 10: Client-Architektur der AXIS-Engine [Axis04] ............................................................. 46 Abbildung 11: WSDL-Fragment mit Porttyp- und Nachrichten-Element ............................................ 48 Abbildung 12: Beziehung zwischen den generierten Klassen von WSDL2Java .................................. 49 Abbildung 13: tabellarischer Vergleich von WSDL2Java und wscompile ........................................... 51 Abbildung 14: Code des Stub-Client .................................................................................................... 54 Abbildung 15: Code des Dynamic-Proxy-Client .................................................................................. 55 Abbildung 16: Code des DII-Client ...................................................................................................... 57 Abbildung 17: Daten-orientierter Web-Service [DFLS02] ................................................................... 58 Abbildung 18: WSRP-Erweiterung für Web-Services [DFLS02] ........................................................ 58 Abbildung 19: UML-Anwendungsfälle zwischen Anwender und Gesamtsystem ................................ 62 Abbildung 20: allgemeiner Aufbau der GUI......................................................................................... 71 Abbildung 21: Komplexitätsentstehung durch Ports mit korrespondierenden Operationen ................. 73 Abbildung 22: Übersicht der XSD-Datentyp-Hierarchie (nach Quelle [BM04b]) ............................... 76 Abbildung 23: UML-Paketdiagramm des Prototypen........................................................................... 96 Abbildung 24: UML-Klassendiagramm des Prototypen ....................................................................... 97 Abbildung 25: Aufbau der grafischen Komponenten ........................................................................... 99 Abbildung 26: Anordnung der GUI-Komponenten ............................................................................ 101 Abbildung 27: Aufbau der GUI .......................................................................................................... 106 Abbildung 28: Aufbau des Menüs und Toolbar .................................................................................. 109 Abbildung 29: grafische Komponenten für einfache Datentypen ....................................................... 111 Abbildung 30: grafische Darstellung eines benutzerdefinierten, komplexen Datentyps .................... 113 Abbildung 31: grafische Darstellung eines Feldes mit komplexem Inhalt ......................................... 116 Abbildung 32: grafische Darstellung eines doppelten Feldes ............................................................. 117 150 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. Abbildung 33: Einbinden von Dokumentationen für Parameter ......................................................... 118 Abbildung 34: Einbinden von Dokumentationen für Operationen...................................................... 119 Abbildung 35: Einbinden von Dokumentationen für Ports ................................................................. 120 Abbildung 36: Hilfefunktion für den Datentyp Float .......................................................................... 122 Abbildung 37: Screenshot des JCalendar zum Anzeigen eines Datums ............................................. 126 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 151 Glossar B2B, B-to-B Business-to-Business: Geschäftliche Beziehungen und E-Commerce zwischen verschiedenen Unternehmen. BEEP Blocks Extensible Exchange Protocol: Das asynchrone Protokoll basiert auf TCP/IP und wurde als Alternative zu HTTP für den XML-Datenaustausch von Peer-to-Peer entwickelt. BTP Business Transaction Protocol: Koordinierung mehrerer Prozesse und Zuordnung einer choreografischen Sequenz. Das XML-basierte Protokoll verwaltet komplexe Transaktionen durch ein MultilevelTransaktionsmodell, wobei allerdings keine Rücksetzmaßnahmen (Recovery) im Fehlerfall eingeleitet werden. CORBA Common Object Request Broker Architecture: Architektur und Infrastruktur der Object Management Group (OMG). CORBAProgramme können unabhängig von Plattform und Programmiersprache miteinander kommunizieren und Objekte austauschen, wobei beide Teilnehmer allerdings eine CORBA-Implementierung und Bibliotheken benötigen. DAML DARPA Agent Markup Language: DAML ist eine Erweiterung von XML und RDF, um Ontologien zu erstellen und Informationen maschinell zu verarbeiten und interpretieren. DCOM Das Component Object Model (COM) sind von Microsoft entworfene Objekte, deren Funktionalität über eine Schnittstellenbeschreibung definiert wird. Innerhalb einer Distributed COM Architektur (DCOM) können diese auf Windows-Plattformen verteilt vorliegen und angesprochen werden. DTD Document Type Definition: DTD ist eine textuelle Deklaration, um in SGML- und XML-Dokumenten die Struktur festzulegen. FTP File Transfer Protokoll: Auf TCP-basiertes Protokoll zum Transfer von Daten zwischen verteilten Systemen. HTTP Hyper Text Transfer Protocol: Protokoll zum verteilten Austausch von Hyermedia-Informationen übers Internet. Standardprotokoll zum Datenaustausch im Internet seit 1990. HTTPR Reliable HTTP: Das zustandslose HTTP soll um zuverlässige Aspekte erweitert werden im Bezug auf Transaktionsschutz und QoS bei der Datenübertragung zwischen Systemen, um Nachrichten und Daten zuverlässig über HTTP zu verschicken. (Vorschlag von IBM) 152 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. HTTPS HTTP over Secure Socket Layer: Protokoll zur Authentfikation und Autorisation von Netzwerk-Teilnehmern. MIME Multipurpose Internet Mail Extension: Kodierstandard zur Strukturierung und Aufbau von E-Mails und Nachrichten bei der Datenübertragung übers Internet. Namensraum Objekte können identische Namen besitzen. Eindeutigkeit kann erreicht werden, wenn Objekten neben dem lokalen Namen noch Namensräume (Kontextinformation) zur eindeutigen Identifizierung zugeordnet werden. Dadurch können Namenskollisionen verhindert werden. OASIS Organization for the Advancement of Structured Information Standards: 1993 unter dem Namen „SGML Open“ gegründete Standardisierungkommision zur Entwicklung von E-Business-Lösungen und Standards, Homepage: http://www.oasisopen.org OMG Object Management Group: 1989 gegründetes herstellerunabhängiges Industriekonsortium, das die Object Management Architecture (OMA) und CORBA-Implementierungen entwirft und weiter entwickelt. QName qualifizierter Name: Ein Tupel, bestehend aus lokalem Namen und einem Namensraum. Objekte können über einen QName eindeutig referenziert werden. RDF Ressource Description Framework: Austausch und Verwenden von Metadaten im Internet. Die Metadaten geben Auskunft über Inhalte von beschriebenen Dokumenten. RFC Requests for Comments: RFC sind Diskussionspapiere mit einer fortlaufenden Nummerierung, die sich mit technischen Konzepten des Internets befassen. Themen wie u. a. Netzwerk-Protokolle, Programme, Prozeduren, Konzepte rund um das Internet sind in diesen Dokumenten enthalten. Jeder Standard ist in einem RFC-Dokument festgehalten, aber nicht alle RFC´s sind Standards. Weitere Informationen findet man unter: http://www.ietf.org/rfc RMI Remote Method Invocation: RMI ist eine Java-API zur Kommunikation zwischen entfernten, verteilten JavaObjekten in heterogenen Systemen. SAML Security Assertions Markup Language: Authentifizierungssystem von der OASIS-Initiative entwickelt zur gesicherten Kommunikation von Netzwerk-Teilnehmern. SGML Standard Generalized Markup Language: Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. 153 SGML ist eine Metasprache, mit deren Hilfe man verschiedene Auszeichnungssprachen (markup languages) für Dokumente definiert. XML wurde aus SGML abgeleitet. SMTP Simple Mail Transfer Protocol: Protokoll zum zuverlässigen Liefern von Mails über das Internet. SOAP XML-basiertes Protokoll zum Datenaustausch in dezentralen, verteilten Umgebungen. Zum Austausch der Informationen wird dabei auf vorhandene Internetprotokolle zurückgegriffen, wie z.B. HTTP. UDDI Universal Description, Discovery and Integration: Protokoll zum Beschreiben, Veröffentlichen und Suchen von Web-ServiceKomponenten in einem Register (Analogie zu den gelben Telefonbuchseiten besteht). URI Unified Resource Identifier: Generischer Ausdruck um Namen und Adressen von Objekten im Internet eindeutig zu beschreiben. (URL ist Untermenge) URL Unified Resource Locator: Eine URL legt eine globale Adresse von Ressourcen im Internet fest. W3C World Wide Web Consortium: 1994 gegründete Organisation zum Definieren von Standards und Spezifizieren von Technologien fürs Internet zur Erhöhung der Interoperabilität (z.B.: XML, HTML, DOM, CSS). Homepage: http://www.w3.org/ W3C Note Das vom W3C veröffentlichte Dokument hat einen formellen Zustimmungsprozess durchlaufen und wird veröffentlicht. Von Seiten des W3C gibt es keine Garantie der Weiterbearbeitung. W3C Recommendation Spezifikation nach Konsensbildung der W3C-Mitglieder, ähnlich zu einem Standard von anderen Organisationen (z.B.: ISO). W3C Working Draft Ein vom W3C veröffentlichtes Dokument zur Einsicht und Diskussion durch die Öffentlichkeit, Veränderungen werden vorbehalten. W3C Working Group Note Eine von einer Arbeitsgruppe erstellte Spezifikation, die den aktuellen Arbeitsstand der Öffentlichkeit zur Diskussion stellt. Web-Service Ein selbstbeschreibender, Plattform-, Netzwerk- und Programmiersprachen- unabhängiger Service, der auf XML-basierten Nachrichten und Technologien beruht, um in heterogenen, verteilten Umgebungen Dienste auszuführen und Daten auszutauschen. WSDL Web Service Description Language: 154 Error! Use the Home tab to apply Überschrift 1 to the text that you want to appear here. XML-basierte Beschreibungssprache zum Definieren des Interface, Implementierungsdetails und Verbindungsinformationen eines Web-Service. WSFL Web Service Flow Language: WSFL beschreibt den Prozess-Fluss innerhalb eines Unternehmens zwischen internen Web-Services und den externen Austausch von Nachrichten zwischen Web-ServiceNutzern XForms W3C-Recommendation seit 2003. XML-basierte Technologie, die Daten von der Präsentation kapselt. XForms stellen erweiterte Funktionalitäten als HTML-basierte Eingabemasken zur Verfügung. XKMS XML Key Management Services: XKMS ist eine Kollektion von Sicherheits- und Vertrauensdiensten. XKMS bietet ein Verschlüsselungsverfahren für die gesendeten Daten an. XLANG Eine von Microsoft entwickelte Nachrichten-zentrierte Flusssprache, um einzelne Nachrichten innerhalb eines WSDL-Dokumentes in einen Geschäfts-Prozess-Fluss zu binden. XML Extensible Markup Language: Universelles Format zum Strukturieren von Daten und Dokumenten durch Tags, die selbst gebildet werden können. XML ist eine Spezifikation des W3C und stellt eine Untermenge von SGML (Standard Generalized Markup Language) dar. XSD XML Schema Definition: W3C-Recommendation seit Mai 2001 zum Beschreiben der Struktur und Grammatik von XML-Dokumenten.