Universität Hannover Fakultät für Elektrotechnik und Informatik Institut für Praktische Informatik Fachgebiet Software Engineering Entwurf und Implementierung eines XForms-Interpreters für Java Swing Bachelorarbeit im Studiengang Informatik von Lukas Klejnowski Prüfer: Prof. Dr. Kurt Schneider Zweitprüfer: Prof. Dr. Nicola Henze Betreuer: Dipl.-Wirt.-Inform. Daniel Lübke Hannover, 20. Februar 2006 Zusammenfassung Die Arbeit mit Web Services erfreut sich heutzutage einer immer größeren Beliebtheit. Diese sind für die Verwendung innerhalb von Anwendungen vorgesehen, verfügen jedoch über keine eigene Schnittstelle um mit einem menschlichen Benutzer zu kommunizieren. XForms ist eine relativ neue XML basierte Sprache und dient vor allem der Beschreibung von XML Formularen, kann jedoch auch den Zugriff auf Web Services erleichtern. In dieser Arbeit wird eine Java Bibliothek entwickelt und vorgestellt, die es ermöglicht XForms-Oberflächen durch Interpretation in einer Java Anwendung zu integrieren. Dabei wird neben der Analyse der Anforderungen an eine solche Bibliothek, ihre Architektur und Verwendbarkeit diskutiert. Inhaltsverzeichnis 1.Einleitung......................................................................................................................................... 1 1.1 Motivation.................................................................................................................................. 1 1.2 Problemstellung.......................................................................................................................... 1 1.3 Struktur der Arbeit......................................................................................................................2 2.Anforderungen der Aufgabestellung............................................................................................. 3 2.1 Einführung................................................................................................................................. 3 2.2 Interpretation............................................................................................................................. 3 2.3 Zugriff auf Webservices............................................................................................................ 4 2.4 Architekturform Bibliothek....................................................................................................... 4 3.XForms............................................................................................................................................. 5 3.1 Einführung.................................................................................................................................. 5 3.2 Einleitung....................................................................................................................................5 3.3 Struktur....................................................................................................................................... 5 3.4 In XForms verwendete Technologien....................................................................................... 8 3.4.1 XML.................................................................................................................................... 8 3.4.2 XML Schema.......................................................................................................................9 3.4.3 XPath................................................................................................................................. 10 3.4.4 Weitere Technologien....................................................................................................... 10 3.5 Detailsicht auf XForms-Konzepte........................................................................................... 10 4.Realisierungskonzept.................................................................................................................... 14 4.1 Einführung................................................................................................................................ 14 4.2 Realisierungsaspekte................................................................................................................ 14 4.3 Vergleich von Java Swing- und XForms-User Interfaces........................................................ 16 5.Realisierung....................................................................................................................................20 5.1 Einführung................................................................................................................................ 20 5.2 Anforderungen..........................................................................................................................20 5.3 Grobentwurf..............................................................................................................................21 5.3.1 Komponenten.................................................................................................................... 22 5.3.2 Verwendete Bibliotheken.................................................................................................. 25 5.3.3 Packages............................................................................................................................ 26 5.3.4 Rationale für Grobentwurf................................................................................................ 27 5.4 Feinentwurf...............................................................................................................................30 5.4.1 Einführung......................................................................................................................... 30 5.4.2 Architektur.........................................................................................................................31 5.4.3 Rationale für Feinentwurf..................................................................................................38 5.4.4 Ablaufplan der Initialisierung............................................................................................40 5.5 Umsetzung in Java....................................................................................................................42 5.5.1 Processing Cycle............................................................................................................... 42 5.5.2 Events................................................................................................................................ 47 5.5.3 Actions ..............................................................................................................................49 5.5.4 Submission........................................................................................................................ 49 6.Betriebsinformationen.................................................................................................................. 51 6.1 Versionen..................................................................................................................................51 6.2 Lizenzen....................................................................................................................................51 6.3 Verwendung der Bibliothek in Anwendungen......................................................................... 51 6.4 Einschränkungen der Implementierung....................................................................................52 6.4.1 Einleitung.......................................................................................................................... 52 6.4.2 Funktionelle Einschränkungen.......................................................................................... 52 6.4.3 Syntaktische Einschränkungen ......................................................................................... 53 6.5 Erweiterbarkeit......................................................................................................................... 56 6.5.1 Einführung......................................................................................................................... 56 6.5.2 Implementierungskonzept................................................................................................. 56 6.5.3 Auswahl der wichtigsten Elemente................................................................................... 57 6.5.4 Erweiterung um Grundelemente........................................................................................57 6.5.5 Erweiterung um neue Elemente.........................................................................................58 6.5.6 Änderung der Komponenten............................................................................................. 58 7.Zusammenfassung und Ausblick................................................................................................. 60 8.Literaturverzeichnis...................................................................................................................... 61 A. Anhang.........................................................................................................................................62 A.1. Beispiele für die Intepretation und Anwendung...................................................................62 A.2. Erklärung.............................................................................................................................. 68 1. Einleitung 1.1 Motivation Web Services sind seit ihrer Einführung vor einigen Jahren immer beliebter geworden. Obwohl eine einheitliche Definition für Web Services nicht existiert, lässt sich die Idee, die hinter diesem Konzept steckt folgendermaßen zusammenfassen: Service Provider bieten (gegen Gebühr oder auf kostenloser Basis) Dienste an, die selbstbeschreibend sind und über spezielle Protokolle gesucht und von Client-Software in Anspruch genommen werden können. Dies können einfache Dienste wie eine maschinenerzeugte und -verarbeitbare Google-Suche [4] sein, aber auch komplexe Dienste wie die Berechnungen von optimalen Lieferketten. Dabei dienen Web Services vor allem dem Einsatz in Business-to-Business Anwendungen mit Service orientierten Architekturen (SOA), die modular aus mehreren Web Services zusammengebaut werden. Das Ziel ist, neben der Nutzung der Dienste, die Interoperabilität zwischen Applikationen, die Daten austauschen müssen, herzustellen. Die technische Grundlage für Web Services bildet eine Reihe von XML-Technologien. Diese dienen dem Verfügbarmachen, Finden und Nutzen von Web Services, bieten jedoch keine User Interfaces für die Interaktion mit einem menschlichen Benutzer. Hier genau liegt die Stärke von XForms [1]: Es ist ein XML-Dialekt für die Beschreibung von graphischen Benutzeroberflächen, verwendet also XML-Daten als Grundlage und bietet die Funktionalität von komplexen User Interfaces. Um zwischen dem Endanwender und dem Web Service zu kommunizieren, stellt XForms das Bindeglied zwischen diesen beiden Sichten dar, bietet also die endanwenderorientierte Sicht auf Web Services. Hätte man eine XForms-Implementierung für Java, so wäre es möglich XForms-basierte Oberflächen in Java Swing-basierten Anwendungen zu integrieren. Mit einer solchen Bibliothek als Baustein könnten Applikationen erstellt werden, die es dem Nutzer erlauben, komfortabel auf Web Services zuzugreifen, ohne dass die Entwickler sich mit der XFormsTechnologie ausführlich beschäftigen müssen. Zudem könnten diese dann in einer einheitlichen Art bearbeitet werden und über die Anwendung Informationen miteinander teilen. 1.2 Problemstellung Das Ziel dieser Arbeit ist es, einen XForms-Interpreter für Java Swing zu entwickeln und zu implementieren. Bei der hierbei zu erstellenden Bibliothek soll besonderer Wert auf die Wartbarkeit sowie einfache Verwendbarkeit gelegt werden. Sie soll zudem so aufgebaut sein, dass fehlende Funktionalität leicht nachgerüstet werden kann. Die Bibliothek soll sich gut ins Web Service Umfeld einfügen und eine Basis für dynamisch generierte Oberflächen sein. Hierzu sind die Basisfunktionalitäten von XForms-User Interfaces zu ermitteln und zu implementieren. -1- 1.3 Struktur der Arbeit Die Arbeit beginnt mit der Erläuterung der Anforderungen die sich aus Aufgabenstellung ergeben. Darauf folgend wird die Sprache XForms vor dem Hintergrund der Intepretation vorgestellt. In Kapitel 4 wird das Konzept erläutert nach dem die Realisierung einer XFormsInterpreter-Bibliothek für Java durchgeführt wurde. In Kapitel 5 wird der Realisierung dieses Konzeptes nachgegangen. Das nächste Kapitel hat die Implementierung der Bibliothek sowie ihre Benutzung und Einschränkungen zum Inhalt. In Kapitel 7 schließlich sind die Ergebnisse der Arbeit zusammengefasst. -2- 2. Anforderungen der Aufgabestellung 2.1 Einführung Eine Interpretation im Sinne der Informatik ist die Analyse und Ausführung des Quellcodes eines Programmes ohne eine direkte Umwandlung in Maschinensprache (vgl. Kompilieren). Ein Interpreter ist in diesem Sinne ein Programm, dass einen Code liest, untersucht und schließlich zur Ausführung bringt. Die vorliegende Arbeit beschäftigt sich also mit der Aufgabe, XForms-Programmcodes zu lesen, zu analysieren und in Java Swing auszuführen Dies soll im Kontext des Zugriffs auf Webservices und in Form einer Bibliothek realisiert werden. Aus diesen Vorgaben ergeben sich unterschiedliche Anforderungen, die festgestellt und umgesetzt werden müssen. 2.2 Interpretation Die Interpretation des XForms-Programmcodes bedarf zunächst seiner Analyse. Dabei ist zu beachten, dass die reine Quellcode-Anaylse nur die Syntax des vorliegenden Dokumentes erfassen kann. Diese kann nur vor einem semantischen Hintergrund wie intendiert behandelt werden. Der Programmcode eines XForms-Dokumentes ist so geschrieben, dass eine Implementierung des W3C XForms-Standards, z.B ein XForms-fähiger Browser, nach dessen Beschreibung eine XForms-Benutzeroberfläche darstellt und benutzbar macht. Die Informationen, die der Browser dazu braucht, liegen dabei allerdings nicht nur im Code, sondern sind in der Implementierung definierte Regeln, nach denen das Auftreten bestimmter lokaler Konstrukte in einem globalen Zusammenhang gedeutet wird. Diese Regeln, deren Gesamtheit als Semantik bezeichnet werden kann, sind in dem W3C Standard für XForms definiert. Konkret bedeutet dies, dass der Interpreter, als ein Programm, das eine XForms-Benutzeroberfläche darstellen will, diese Regeln bei der Codeanalyse anwenden muss. Die sich daraus ergebende Anforderung ist, dass zunächst ein Verständnis für die GUIBeschreibungssprache XForms entstehen muss, das die zugrundeliegenden Möglichkeiten, Konzepte und semantische Regeln enthält. Weiterhin muss die Umgebung, in der der Code ausgeführt werden soll, in diesem Fall Java Swing, darauf untersucht werden, welche Abbildungsverhältnisse zwischen diesen beiden Formaten bestehen. Dazu gehört eine Analyse der in XForms verwendbaren GUI-Elemente und der Möglichkeit ihrer Darstellung in Java Swing. Zudem ist es erforderlich, zu prüfen, durch welche Strukturen und Abläufe in Java Swing, die Konzepte der Verarbeitung in XForms abgebildet werden können. Kapitel 3 beschäftigt sich in diesem Sinne mit der Beschreibung der XForms-Sprache. Die darauf folgenden Kapitel schließlich beschreiben, ausgehend von der Verwendung von Hilfstechnologien, die Architektur und Arbeitsweise des Interpreters, die erforderlich sind, um die gewünschte Funktionalität in Bezug auf XForms zu bieten. -3- 2.3 Zugriff auf Webservices Der Kontext vor dem der Entwurf des Interpreters steht, ist der, dass er als Werkzeug verwendet werden soll, um die Arbeit mit denjenigen Webservices zu erleichtern, die XForms-GUIs als Zugriffsmethode verwenden. Dazu soll er als Komponente in Anwendungen benutzbar sein. Es gilt also diesen Kontext auf seine Beschränkung und Erweiterung in Bezug auf eine Architektur, die die reine Interpretation der XForms-GUIs durchführt, zu prüfen. Die konkreten Anforderungen, die sich aus diesem Szenario ergeben, sind architektonischer Art und im Entwurfsteil dokumentiert. 2.4 Architekturform Bibliothek Die Vorgabe, den Interpreter als Bibliothek zu realisieren, hat direkte Auswirkungen auf die Architektur. Es gibt grundsätzliche Unterschiede zwischen der Konzeption eines Programmes als Anwendung und als Bibliothek. Die Anforderungen, die sich aus dieser Vorgabe ergeben, sind im Entwurf, siehe Kapitel 5, beschrieben. -4- 3. XForms 3.1 Einführung Dieses Kapitel dient dazu, die zu interpretierende Quellsprache, also XForms vorzustellen. Dabei werden im Sinne einer Analyse die Struktur und die Eigenschaften dieser Sprache kurz erläutert. Diese Erläuterung ist keine komplette Einführung in XForms, insbesondere nicht in die verwendete Syntax, sondern vielmehr eine Einordnung der im folgenden Verlauf der Arbeit verwendeten Begriffe und Konzepte. 3.2 Einleitung Die W3C-Technologie XForms [1] kann als Nachfolger der HTML Forms von 1993 betrachtet werden. Zu der Zeit waren diese eine sehr bedeutende Entwicklung und führten zu vielen neuen Anwendungen, vor allem im Bereich des E-Commerce. Heutzutage sind EShops wie beispielsweise Amazon.com aus dem Internet nicht wegzudenken, dies alles verdanken sie der Möglichkeit, über Formulare Daten des Benutzers entgegenzunehmen [2]. Jedoch sind seit der Einführung der HTML Forms viele Jahre vergangen und der Anspruch der Benutzer sowie die technischen Anforderungen sind höher geworden. Da die HTML Forms in ihrer Funktionalität sehr eingeschränkt sind, entstehen sehr komplexe Strukturen, um die Lücken zu schließen. So ist es üblich, viel mit Skripten und Duplizierungen zu arbeiten, was jedoch die Wartbarkeit der Dokumente maßgeblich verringert. Es lässt sich feststellen, dass HTML Forms heute an ihre Grenzen stoßen und XForms entwickelt worden ist, um sie zu ersetzen. XForms ist aktuell in der Version XForms 1.0 (Second Edition) eine W3C Proposed Edited Recommendation. Das Veröffentlichungsdatum ist der 6. Oktober 2005. Seit seiner Einführung gab es reges Interesse an dieser Technologie, was zu einer großen Anzahl von Implementierungen führte, die häufig jedoch noch im Betastadium sind. XForms wurde so entworfen, dass es durch zeitgemäße Technologien und Konzepte Autoren ermöglicht, die häufigsten Aufgaben auf möglichst einfache und wiederverwertbare Weise zu erledigen. Die technologische Basis bildet dabei XML, dass heutzutage kritisch für viele Anwendungen ist, und eine Reihe von weiteren W3C-Technologien (siehe Kapitel 2.7). 3.3 Struktur XForms-Dokumente werden nicht in einem eigenen Dateiformat gespeichert, sondern eingebettet. Die Einbettung kann z.B. in einer XHTML- oder SVG-Datei (Scalable Vector Graphics) erfolgen. In dieser Arbeit wird dabei in Anlehnung an [2] stets das XHTML-Format verwendet. Da XForms ein XML-Vokabular mit eigenem Namespace ist, müssen Tags, die zu XForms gehören, mit einem frei definierbaren Prefix, üblicherweise xf, versehen werden. Dies muss zunächst in der Namespace-Definition der Dateien vorgenommen werden. Weitere Schritte zur Einbettung sind nicht nötig. Tags der Trägerformate werden in XForms je nach -5- Implementierung und Kontext entweder ignoriert oder berücksichtigt. Es bietet sich z.B. an, HTML-Tags zur Formatierung, wie <br />, bei der Darstellung der Oberfläche zu berücksichtigen. Die Struktur des reinen XForms-Dokumentes, also ohne Beachtung der Informationen aus dem Trägerformat, ist so beschaffen, dass Daten- und GUI-Elemente (In XForms-Controls genannt) in zwei getrennten Blöcken deklariert werden. Der erste Block besteht aus einem oder mehreren Model genannten Datenblöcken und wird üblicherweise im Head-Teil des Trägerformats abgelegt. Dieser Block ist in sich geschlossen, d.h. innerhalb der einzelnen Modelkonstrukte werden keine Fremd-Tags verarbeitet. Der zweite hingegen kann mit Tags aus dem Trägerformat vermischt werden. Er wird üblicherweise im Body-Teil des Trägerdokumentes gespeichert. Komposition eines XForms-Models In XForms werden Daten und Präsentation strikt getrennt. Die Daten werden im Model verwaltet. Ein XForms-Dokument kann dabei mehrere Models haben. Ein Model besteht hauptsächlich aus einer oder mehreren sogenannten Instanzen. Dies sind die eigentlichen Träger der Daten. Sie umschließen ein gültiges XML-Dokument, also die Daten, mit denen die GUI schließlich arbeitet. Alternativ kann eine Instanz statt eines Inhaltes auch einen Verweis auf ein solches XML-Dokument über eine URL enthalten. Die Implementierung muss dann dieses Dokument erst von der angegeben Quelle laden. Neben den eigentlichen Daten kann ein Model noch sogenannte Bindings enthalten. Diese beziehen sich auf die Instanzdaten und belegen diese zusätzlich mit Einschränkungen, ausgedrückt durch die sogenannten Model Item Properties. Diese Informationen schränken die Daten ein und bestimmen so letztendlich die Darstellung, da sich die XForms-Controls auf solche Bindings beziehen können, um an Instanzdaten gebunden zu werden. Zudem kann ein Model noch Submission-Elemente definieren. Diese legen fest, welche Daten, wie und wo übertragen werden sollen, wenn die Arbeit mit der Benutzeroberfläche beendet ist. Als letzte Art von Information kann innerhalb der Modelelemente auf eine externe XMLSchema-Datei verwiesen werden. Der Code für den Datenteil einer rudimentären XForms-GUI könnte damit folgendermaßen aussehen: -6- <?xml version="1.0" encoding="ISO-8859-1"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms"> <head> <xf:model> <xf:instance xmlns=""> <person> <fname/> <lname/> <age>18</age> </person> </xf:instance> <xf:submission action="http://www.example.com" method="put" id="s0"/> <xf:bind id=“mybind“ ref=“/person/lname“ required=“true()“ /> </xf:model> </head> <body> . . . </body> </html> Komposition der XForms-Control Definitionen Im zweiten Block dürfen neben Elementen des Trägerformates in beliebiger Reihenfolge XForms-Controls beschrieben werden. Neben diesen reinen GUI-Elementen können zusätzlich vordefinierte Strukturen, wie eine Elementgruppe, ausgezeichnet werden. Eine Control wird über einen XML-Knoten mit XForms-Namespace und Namen eingeleitet und kann über zusätzliche Attribute und Kindelemente verfügen. Die wichtigsten Attribute sind die, die das GUI-Element an Daten aus den Instanzen binden. Mit wenigen Ausnahmen muss jedes Element über diese Datenbindung verfügen. Es gibt Attribute, die die Bindung über einen XPath-Ausdruck (siehe Kapitel 3.4.3) erstellen, und solche, die Daten anhand ihrer ID identifizieren. Diese ID stammt aus den oben erwähnten Bindings. Zusätzlich kann ein Element noch über Attribute verfügen, die es in Bezug auf seine Navigation, sein Aussehen oder sein Verhalten weiter beschreiben. Weiterhin können in einem Element auch Kindelemente vorhanden sein. Diese Kindelemente können Metainformationen (Beschriftung, Tooltip etc.) über das Element enthalten, sein Verhalten spezifizieren (Events und Actionhandler) oder controlspezifische Eigenschaften definieren (z.B. Trennlinien innerhalb von Drop-down-Listen). Folgendes Beispiel bezieht sich auf den oben angegebenen Datenteil und zeigt die Definition einiger XForms-Control Elemente: -7- <?xml version="1.0" encoding="ISO-8859-1"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms"> <head> <xf:model> . . . </xf:model> </head> <body> <xf:input ref="/person/fname"> <xf:label>First Name</xf:label> </xf:input> <xf:input ref="/person/lname"> <xf:label ref="/person/label"/> </xf:input> <xf:submit submission="s0"> <xf:label>Submit</xf:label> </xf:submit> </body> </html> 3.4 In XForms verwendete Technologien XForms ist ein vom W3C standardisierter XML-Dialekt zur Beschreibung und Speicherung von Formularen und graphischen Benutzeroberflächen. Neben XML baut XForms auf weiteren W3C Technologien auf. Da zu diesen einzelnen Technologien teilweise sehr umfangreiche Literatur erhältlich ist, wird an dieser Stelle kein Anspruch auf Vollständigkeit erhoben. Vielmehr dient dieses Kapitel der kurzen Erläuterung einiger der wichtigsten verwendeten Technologien und ihrer funktionellen Einordnung in Bezug auf XForms. 3.4.1 XML XML weist in der Informatikwelt eine ungwöhnliche Erfolgsgeschichte auf. Seit der Einführung der eXtensible Markup Language (erweiterbare Auszeichnungssprache) wurde ihr sehr viel Beachtung geschenkt. Ein Grund für diesen Siegeszug war sicherlich, dass XML offene Standards bietet und so viele Open Source Projekte entstanden sind, die zur Verbreitung beigetragen haben [11]. Heutzutage, rund 8 Jahre nach der Standardisierung durch das W3C im Februar 1998, ist XML aufgrund seines allgegenwärtigen Einsatzes kaum mehr wegzudenken. -8- XML ist eine sogenannte Metasprache, d.h. eine Sprache, um andere Sprachen zu definieren. Dabei können beliebige Informationen hierarchisch dargestellt und definiert werden. In XML werden Daten von Metadaten, also Informationen über die Daten ebenso getrennt wie Inhalt und Darstellung. Hierbei lassen sich zwei Teile unterscheiden: Der Header eines XML-Dokumentes enthält Informationen zur Behandlung des Dokumentes durch einen Prozessor/Parser, sowie verwendete Versionen, Namensräume etc. Der Inhalt enthält die eigentlichen XML Daten in einer Baumstruktur. XML-Dokumente sind aufgrund ihrer textbasierten Struktur einfach portierbar und maschinenlesbar, dadurch vereinfacht XML die Interoperabilität von Anwendungen. XML ist heutzutage eine ganze Familie von Technologien, wie XHTML, XLink, XPointer, XPath, XForms und vielen mehr. Die aktuelle Version ist XML 1.0. XForms sind ein XML-Vokabular. Für die Integration bedeutet dies, dass in XFormsDokument Strukturen mit XML codiert werden. Weiterhin wird XML in XForms verwendet, um Daten zu sammeln, zu modellieren sowie zu übertragen. XForms bieten dabei gewissermaßen die Möglichkeit über ein Browser-Interface XML-Daten zu editieren. Die offizielle XML Spezifikation sowie weitere Informationen finden sich unter [3] 3.4.2 XML Schema Um XML-Dokumenten eine Struktur zu geben, versieht man sie mit Beschränkungen. Dabei kann z.B. festgelegt werden, welche Datentypen enthalten sein dürfen oder von welcher Kardinalität Elemente sind. Mit diesen zusätzlichen Informationen können XML-Dokumente von Parsern validiert, also auf die Einhaltung der Beschränkungen überprüft, werden. Es gibt zwei unterschiedliche Verfahren zur Strukturierung: Erstens die Document Type Definition (DTD), die mit dem XML Standard eingeführt wurde, und zweitens die XML Schema Definition Language (XML Schema), die im Mai 2001 vom W3C standardisiert wurde. XML Schema wurde als Nachfolger der DTDs konzipiert und erweitert diese, um fehlende Funktionalitäten wie z.B. Namespace support. DTDs haben gegenüber XML Schema viele Nachteile. Die vorliegende Arbeit beschränkt sich deshalb auf die Validierung durch letzteres. XML Schemata definieren die Struktur eines XML-Dokumentes. Dabei kann auf ein Set von Standard-Datentypen zurückgegriffen oder es können eigene Datentypen benutzt werden. XML Schemata sind selbst in XML definiert, was z.B. kontextsensitive Editierung erlaubt. Sie können entweder im Arbeitspeicher einer Applikation abgelegt sein oder in separaten Dateien mit der Endung xsd (XML Schema Definition) gespeichert werden. In XForms können XML Schemata verwendet werden, um während des Parsens das Datenmodel zu validieren. Dies kann eine serverseitige Validierung ersparen. Schemata können für jedes Model-Element einzeln angegeben werden. Das normative Dokument für den Einsatz von XML Schema ist unter [8] zu finden. -9- 3.4.3 XPath XPath ist eine sogenannte Path Language, eine Sprache, die das Navigieren in geparsten XML-Dokumenten (DOM-Dokumente) erlaubt. Dazu verwendet es Pfadausdrücke, um in dessen Hierarchien einzelne oder auch mehrere Knoten auszuwählen. Zusätzlich ist XPath eine leichtgewichtige Skriptsprache, die mit Hilfe von bereitgestellten Datentypen und Funktionen Operationen auf die so ausgewählten Knoten erlaubt. Beispielsweise kann ein XPath-Ausdruck die Inhalte zweier Knoten addieren. XPath ist dabei um Funktionen und Datentypen erweiterbar. In XForms wird XPath sehr häufig verwendet. Zum einen basiert der gesamte Datenbindungsmechanismus, also die Bindung von GUI-Elementen an Daten, auf XPath Referenzen. Weiterhin können XPath-Standardfunktionen und andere in der XFormsSpezifikation definierte XPath Funktionen verwendet werden, um beispielsweise den Zustand eines Elementes zu berechnen. Besondere Bedeutung liegt dabei auf der durch XForms definierten Zusatzfunktion „instance“, die die Dateninstanz addressiert. Absolute Pfade sind damit in XForms abhängig von der Instanz zu deuten und beziehen sich nicht wie üblich auf das gesamte Dokument. Die aktuelle Version von XPath ist Version 1.0, die vom 16. November 1999 stammt. Weitere Informationen sind unter [9] zu finden. 3.4.4 Weitere Technologien Zusätzlich zu den oben genannte Kerntechnologien, gibt es noch eine Reihe weiterer Technologien, die zusammen mit XForms benutzt werden können. So bietet XForms, obwohl es den Bedarf an eigenen Skripten durch Einführung der Actionhandler gesenkt hat, die Möglichkeit, einen Code in Skriptsprachen wie Javascript zu integrieren. Zudem wird es ermöglicht XForms-GUIs mit Hilfe der CSS (Cascading Style Sheets) Technologie, die vor allem für Layouts von HTML Seiten genutzt wird, zu formatieren. 3.5 Detailsicht auf XForms-Konzepte Die XForms-Technologie zeichnet sich durch einige besondere Merkmale und Konzepte aus, die hier kurz dargestellt werden sollen. Dabei wird keine detallierten Funktionsübersicht geboten, sondern vielmehr eine kurze Einführung in die Begriffe durchgeführt. Auf die Funktionen wird dann in weiteren Kapiteln genauer eingegangen. Ablauf und Submission XForms-Benutzeroberflächen sind für den Einsatz als Formulare konzipiert. Daraus resultierend ergibt sich ein Ablauf, der mit dem Aufbau der GUI durch den XForms-Prozessor - 10 - beginnt, anschließend eine Arbeitsphase des Benutzers mit der GUI vorsieht, diese dann durch Übertragen der eingebenenen Daten, der Submission beendet und schließlich die Auswirkungen der Submission auf die GUI behandelt. Die Art der Submission wird vom Autor des XForms-Dokumentes spezifiziert. Dabei ist es möglich, sich der HTTP Standard Protokolle wie PUT und GET zu bedienen. Nach einer Submission muss die Arbeit mit der GUI nicht zwangsläufig beendet sein. Es ist vielmehr möglich, Zwischenergebnisse zu übertragen und diese vom Web Server auswerten zu lassen. Der Web Server kann die so verarbeiteten Daten zurücksenden. Diese können dann die weitere Arbeit mit der GUI beeinflussen, indem sie beispielsweise Teile der bestehenden Daten ersetzen und damit Zustände von Controls ändern. Zudem besitzt XForms durch diesen Mechanismus eine Suspend und Resume Unterstützung. Das bedeutet, dass einmal eingegebene und per Submit übertragene Daten nach einer Unterbrechung der Arbeit mit der GUI wieder verfügbar sind, der Benutzer muss diese nicht erneut eingeben. Diese Funktion ist eine der größten Verbesserungen gegenüber den HTML Forms. Trennung von Funktion und Aussehen XForms ist so konzipiert, dass Daten und das Aussehen voneinander entkoppelt sind. Nicht nur sind die Daten, wie oben beschrieben, innerhalb des XForms-Dokumentes von der Beschreibung der GUI getrennt, sondern auch die Definition von Controls von ihrem tatsächlichen Erscheinungsbild. Es geht daher nicht darum zu definieren, wie ein GUIElement genau aussieht, sondern welche Funktionalität es erfüllt. Die XFormsImplementierungen müssen also eine eigene Darstellungsweise für die Elemente umsetzen. XForms liefert dabei eine Reihe von Standardelementen, die ohne weiteren Aufwand benutzt werden können. Diese werden in Kapitel 4.3 näher beschrieben. Die funktionsorientierte Sichtweise bezieht sich auf die Beschaffenheit einzelner Elemente. Grundsätzlich ist aber auch ihre Anordnung auf der Benutzeroberfläche vom jeweiligen XForms-Prozessor abhängig. Beides kann jedoch durch den Einsatz der CSS-Technologie beeinflusst werden. Datenbindung Da Daten, Aussehen und Logik voneinander getrennt sind, muss es einen Mechanismus geben, diese miteinander in Verbindung zu bringen. Dazu gibt es in XForms zwei Möglichkeiten, entweder die Verwendung von IDREFs, also Referenzen auf IDs von BindElementen in den Models, und absoluten oder relativen XPath Pfaden. Die Verwendung von IDREFs soll dabei favorisiert werden, da sie im Bezug auf die Wartbarkeit eines XFormsDokumentes Vorteile bietet [5]. Bindings verknüpfen Daten mit Einschränkungen, die Model Item Properties genannt werden. Den einzelnen Knoten darf jeweils nur ein Binding zugeordnet werden. Die übrigen werden ignoriert. Model Item Properties dienen dazu, einzelne Datenknoten der Models zu verfeinern. So kann z.B. mit der Eigenschaft „required“ festgelegt werden, dass die Eingabe einer bestimmten Information für die Gültigkeit einer XForm notwendig ist. Felder, die mit „required“ markiert sind, müssen dann ausgefüllt werden, da sonst das Abschicken der Ergebnisdaten nicht erfolgen kann und stattdessen mit einer Fehlermeldung reagiert werden muss. Im Folgenden werden die dynamischen und statischen Model Item Properties in den Tabellen 1 und 2 vorgestellt: - 11 - Dynamische Model Item Property Kurze Beschreibung readonly Klassifizierung als veränderbare /nicht veränderbare Daten required Klassizifierung als optionale / für die Weiterverarbeitung notwendige Daten relevant Klassizifierung als für die Darstellung relevante / nicht relevante Daten calculate Berechnung der Daten durch Angabe von Umformungsvorschiften auf Eingabedaten constraint Einschränkung der Daten durch zusätzliche Bedingungen Tabelle 1: Dynamische Model Item Properties Statische Model Item Property Kurze Beschreibung type Einschränkung der Daten durch Angabe eines Datentyps p3ptype Datenformat für personenbezogene, also sicherheitsrelevante Informationen Tabelle 2: Statische Model Item Properties Processing Cycle Die Verarbeitung von eingegebenen Daten hat in XForms zwei Auslöser. Einerseits kann der Benutzer explizit deutlich machen, dass er die Eingabe übernehmen will, indem er eine Taste drückt. Andererseits wird die Navigation zum nächsten GUI-Element implizit als solch ein Wunsch gewertet. Tritt eines dieser Ereignisse ein, wird die Verarbeitung gestartet. Dabei muss der XFormsProzessor vier Phasen durchlaufen, die in ihrer Gesamtheit den Processing Cycle bilden. Diese Phasen haben zur Aufgabe die Änderung und die damit verbundenen Konsequenzen auf die Daten zu übertragen, also die Knoten des betreffenden Instanzdokumentes zu aktualisieren. Die einzelnen Phasen des Processing Cycles sind im Detail in Kapitel 5.5.1 beschrieben. Events und Eventhandler Einer der Hauptgründe für den Bedarf nach einem Nachfolger der HTML Forms war, dass der Scriptingbedarf zu groß geworden ist. Dies schränkte die Wartbarkeit und Übertragbarkeit von so konstruierten Formularen sehr ein. Bei XForms hat man sich daher zum Ziel gesetzt, diejenigen Funktionen, die in der Praxis am häufigsten durch Skripte implementiert wurden, zu standardisieren und dem XForms-Autor zur Verfügung zu stellen. Diese Funktionen sind in einem Event-Modell verankert und stellen die Eventhandler oder XForms-Actions dar. - 12 - Die Spezifikation sieht vor, dass sowohl die Models als auch die einzelnen Controls auf das Eintreten von Events warten und diese durch eine oder mehere Actions behandelt können. Es existieren verschiedene Arten von Events, die unterschiedliche Auslöser haben. Diese können vom XForms-Prozessor selbst (z.B. Benachrichtigung über die Fertigstellung der Modelinitialisierung), von Controls (z.B. Benachrichtigung darüber, dass ein GUI-Element ausgewählt wurde) oder vom Autor durch Definition an bestimmten Stellen ausgelöst werden. Hierbei ist besonders wichtig, dass ein XForms-Prozessor die Aufgabe hat, einige Events unabhängig vom darzustellenden Dokument zu behandeln. So wird beispielsweise der Processing Cycle automatisch durchlaufen, wenn entsprechende Events aufttreten. Die Eventhandler die der Autor verwendet, sind also nur zusätzliche Informationen zur Arbeit mit der GUI und stellen nicht die komplette Logik dar. Geräteunabhängigkeit XForms ist so konzipiert, dass ein XForms-Dokument ohne Anpassungen auf einer Vielzahl von Geräten dargestellt werden kann. Dazu gehören neben dem PC, Handhelds und Mobiltelefone. Die Darstellung wird dabei der jeweiligen XForms Implementierung überlassen. So kann z.B. auf kleinen Geräten ein GUI-Element kompakter dargestellt werden als auf einem PC. Die Art der gewünschten Darstellung lässt sich jedoch zusätzlich über einige Attribute innerhalb der Control-Deklarationen beeinflussen. Clientseitige Validierung Einer der großen Vorteile von XForms gegenüber seinem Vorgänger HTML Forms ist die Möglichkeit der clientseitigen Validierung. Dies bedeutet, dass ein XForms Client die eingegebenen Daten selbst auf definierte Datentypen und Integritätsbedingungen überprüfen kann. Dadurch entfallen die sogenannten Server Roundtrips, also das Senden der Daten an den Server zur Validierung, das Warten auf eine Antwort und das erneute Senden von neuen Daten, solange bis die Arbeit mit der GUI beendet ist. Datentypen können auf zwei verschiedene Weisen vom Autor festgelegt werden. Neben der weiter oben beschriebenen Model Item Property type innerhalb von Bindings, kann auch ein XML Schema diese Informationen enthalten. Diese statische Definition von Datentypen und Integritätsbedingungen mittels XML Schema wird üblicherweise in einer externen Datei deklariert. Die Validierung ist als eigene Phase, Teil des oben beschriebenen Processing Cycle. Sie wird also nach jeder Datenänderung durchgeführt. - 13 - 4. Realisierungskonzept 4.1 Einführung Die Realisierung der Interpreter-Bibliothek muss sich an den im vergangenen Kapitel erwähnten Eigenschaften von XForms orientieren. Dabei ist abzuwägen, welche Funktionalität im Rahmen des Zugriffs auf Web Services benötigt wird. Das Ziel ist also nicht, eine vollständige XForms-Implementierung im Sinne der W3C Recommandation zu machen. Dies ist im Rahmen einer Bachelorarbeit aufgrund des Umfangs nicht möglich. Vielmehr muss ein Konzept erarbeitet werden, dass die Grundfunktionalität der bearbeiteten XForms-GUIs nach dem Interpretieren garantiert und zudem auf die Eigenschaften der Zielsprache Java Swing eingeht. Das folgende Kapitel beschäftigt sich mit einem solchen Konzept. 4.2 Realisierungsaspekte Die Aufgabe in der vorliegenden Arbeit beschränkt sich nicht darauf eine Repräsentation der im XForms-Dokument definierten Benutzeroberfläche in Java Swing zu erstellen, sondern soll auch die zugrundeliegende Arbeit eines XForms-Prozessors simulieren. Konkret bedeutet dies, dass die erstellte GUI, wie in XForms, als ein Formular behandelt werden muss, das Daten sammelt und nach der Bearbeitung abschickt. Ohne dieses Konzept wäre eine Kommunikation mit dem Web Service nicht möglich. Hierbei ist der Vorgang der Submission von Bedeutung. Für den Vorgang der Interpretation bedeutet dies, dass die Arbeit des Interpreters aus zwei Hauptphasen besteht, einerseits der Transformation des XForms-Dokumentes in eine JavaGUI und andererseits die Arbeit mit der GUI. Die erste Phase sollte aus dem Parsing, der Analyse und der Synthese des XForms-Codes bestehen. Die zweite aus der Arbeit mit der GUI und der Submisson. Weiterhin muss das Eventing in XForms implementiert werden, da viele Möglichkeiten auf dem Einsatz von Events basieren. Dabei ist es vorteilhaft, dass auch in Java Swing das Konzept von Events vorhanden ist und so nicht alle Arten von Events modelliert werden müssen. Gleichzeitig lassen sich nicht alle exakt durch die gegebenen Java Swing Events abbilden, so dass es eines weiteren Mechanismus bedarf, der sich nicht direkt auf die vorhandenen Java Strukturen stützt. Zudem ist das Konzept der Eventhandler, der XFormsActions, nachzubilden. Die Geräteunabhängigkeit der XForms-Dokumente braucht hingegen nicht beachtet zu werden, da der Einsatz auf einem PC fest vorgegeben ist. Insbesondere können deshalb Attribute, die sich auf den Einsatz auf anderen Geräten beziehen, ignoriert werden. Vielmehr gilt es, jeder XForms-Control ein festes Äquivalent in Java Swing zuzuweisen. Der Processing Cycle ist ein mächtiges Konzept, um Datenänderungen zu verfolgen und ihre Auswirkungen zu erfassen. Innerhalb der Abarbeitung wird zudem die Validierung vorgenommen, eine Funktionalität, die XForms deutlich von seinem Vorgänger unterscheidet. Dieser Mechanismus muss wegen seiner Wichtigkeit in die Implementierung eingehen. Dabei - 14 - ist es von Vorteil, ihn möglichst nah an die vorgesehene Art anzugleichen, da ein XFormsDokument sich direkt auf diese Art der Verarbeitung beziehen kann. Aufgrund des Umfangs der Funktionen, Elemente und Attribute der XForms-Sprache muss bei der Implementierung die Priorität auf Basisfunktionen und -elemente gelegt werden. Definitionen in XForms-Dokumenten, die sich auf den Komfort der Benutzung der Benutzeroberfläche beziehen (beispielsweise das Attribut navindex, welches die Reihenfolge der Navigation festlegt), werden dabei als unwesentlich klassifiziert, da sie keinen Einfluss auf die Funktionalität nehmen. Die Usability einer Benutzeroberfläche hat jedoch großen Einfluss auf die Qualität der Arbeit mit ihr und darf deshalb nicht komplett vernachlässigt werden. Vielmehr sollte der Entwurf den Einsatz dieser Funktionen vorsehen und ein Grundgerüst für deren Verarbeitung bieten. Der Fokus ist dabei auf eine einfache Erweiterung der Implementierung zu legen. Bei der Interpretation einer Sprache spielen Fehlererkennung und -korrektur eine große Rolle. Es ist abzuwägen welche Arten der Kontrolle nötig sind. Die zu interpretierenden XForms-Dokumente kommen von Web Services, die sie für die Kommunikation verwenden. Es ist also für die Implementierung anzunehmen, dass sie, was die Syntax anbetrifft, fehlerfrei sind. Dies hat große Auswirkungen auf die Art der Fehlererkennung innerhalb der Bibliothek. Sind trotz des Szenarios Fehler im Dokument enthalten, führen sie zu einem Fehlverhalten oder Abbruch der Bearbeitung. Diese Fehler können nicht von der Applikation aufgefangen werden. Ein möglicher Fehler dieser Kategorie ist ein falscher XPath-Ausdruck bei der Datenbindung, aus dem eine Java Exception resultiert. Es wird dabei insbesondere keine dafür vorgesehene XForms-Meldung gemacht (xforms-binding-exception), da diese lediglich den Prozessor über den Abbruch informieren soll. Hingegen sollten Fehler, die aus der Verarbeitung durch den Interpreter resultieren können, eindeutige Erkennung bieten. So gilt es also eigene Exceptions zu definieren, die beispielsweise das Vorkommen von nicht erkannten Elementen anzeigen und von der Applikation behandelt werden können. Die Trennung der Funktionsweise von XForms-Controls von ihrem Aussehen hat zur Folge, dass die Anordnung der GUI-Elemente der Implementierung überlassen werden. Es ist jedoch möglich innerhalb des XForms-Dokumentes dieses Aussehen durch den Einsatz von CSS zu definieren. Die Anordnung der Elemente auf einer Benutzeroberfläche hat Einfluss auf die Usability und sollte daher berücksichtigt werden. Die Verwendung von CSS ist jedoch eine Hürde für die Implementierung dieser graphischen Eigenschaften, da der Umgang von CSS in Java nicht natürlich unterstützt wird. Eine Möglichkeit wäre, einen CSS-Parser zu verwenden. Dabei bliebe jedoch nichtsdestotrotz die Aufgabe, die analysierten Eigenschaften auf eine Java Swing GUI zu übertragen. Im Rahmen dieser Arbeit ist daher der Ansatz gewählt worden, CSS nicht zu unterstützen, jedoch einen Rahmen zu schaffen, der es ermöglicht, die Bibliothek um diese Funktionalität nachträglich zu erweitern. Der Mechanismus der Anordnung von Elementen auf der GUI muss dann allerdings so beschaffen sein, dass Änderungen leicht implementiert werden können. Die Verwendung von Elementen des Host-Formats in XForms-Dokumenten erhöht die Komplexität des Codes, da es sich um Sprachen mit unterschiedlichen Rahmenbedingungen handelt. Die Unterstützung von solchen Formaten kann im vorgegeben Rahmen nicht - 15 - vorgesehen werden, sollte jedoch so im Entwurf verankert sein, dass sie nachimplementiert werden kann. 4.3 Vergleich von Java Swing- und XForms-User Interfaces Die in dieser Arbeit entwickelte Bibliothek konvertiert gewissermaßen eine Art von Benutzeroberflächen in eine andere. Dabei stellt sich natürlich die Frage, inwiefern die einzelnen Benutzeroberflächen aufeinander abbildbar sind. XForms, als Nachfolger der HTML Forms, kommen aus der Domäne des Internets und sind auf diese abgestimmt. Vorrangig dienen sie dazu, Formulare darzustellen. Die Auswahl an verschiedenen GUI-Elementen ist also auf dieses Einsatzfeld beschränkt. Nichtsdestotrotz sind auch einige Standardelemente enthalten, die es ermöglichen, Benutzeroberflächen für andere Zwecke zu konstruieren. Zusätzlich besteht die Möglichkeit, XForms-GUIs mit HTML-Tags zu formatieren, da sie in solchen Dateien eingebunden sein können. Das für die vorliegende Arbeit interessante Anwendungsgebiet von XForms ist die Benutzeroberfläche als Schnittstelle für die menschliche Interaktion mit einem Web Service. Java Swing hingegen ist eine Java API für die allgemeine Erstellung von Benutzeroberflächen jedweder Art - es gibt hinsichtlich der Elemente keine Beschränkungen, da neben sehr vielen vorhandenen Elementen auch eigene GUI-Elemente definiert werden können. Java Swing ist daher ein sehr mächtiges Konzept, das bei der Darstellung weit über die Möglichkeiten von XForms hinausgeht. Die in XForms definierte Menge an Elementen ist somit eine Teilmenge der Elemente in Java Swing. Da jedoch XForms einige spezifische Mechanismen aufweist, lässt sich nicht jedes Element einer XForms-GUI einfach auf ein Java Swing Element abbilden. So werden beispielsweise Container für Elemente in XForms automatisch vorgegeben, in Java Swing müssen diese durch den Programmierer explizit angegeben werden. Ein weiteres Beispiel ist die funktionsorientierte Sicht von XForms auf die GUI: Die Angabe von GUI-Elementen dient dem Zweck, eine bestimmte Funktion auf die darauf gebundenen Daten auszuführen und nicht der Darstellung des GUI-Elementes. Dies wird dem XForms-Prozessor überlassen, so dass je nach Implementierung beispielsweise eine Selektion standardmäßig als Drop-Down-Liste oder aber als Gruppe von Radio-Buttons gerendert wird. Die Art des Renderings kann zudem über Attribute beeinflusst werden. Dieses Konzept ist für XForms sehr wichtig, da die Portierbarkeit darauf beruht, dass verschiedene Implementierungen für verschiedene Geräte (PDA, Handy, PC etc.) eine angepasste Sicht erzeugen, ohne dass an der Beschreibung der GUI etwas verändert werden muss. Um nun eine XForms-GUI in diesem Kontext in eine Java Swing GUI umzuwandeln, muss neben dem einfachen Mapping der Elemente an einigen Stellen das Konzept angepasst bzw. abgeschwächt werden. Es geht also nicht darum, die mit XForms erstellten Benutzeroberflächen in ihrer vollen Funktionalität zu replizieren, sondern sie für die Anforderungen der verwendenden Applikation aufzubereiten. Die folgenden Tabellen 3, 4 und 5 listen alle in XForms verwendeten GUI-Elemente mit ihrem Java Swing Äquivalent auf und erläutern die Konvertierung an Stellen, wo das Konzept der XForms nicht direkt übernommen werden kann. - 16 - Element XForms-tag PasswortEingabefeld Textfeld Ausgabefeld Schieberegler Knopf Multiple Auswahl <secret> Java SwingKlasse1 JPasswordField <textarea> <output> <range> <trigger> <select> JTextarea JLabel JSlider JButton JList Anmerkungen Es muss MULTIPLE_INTERVAL_SELECTION als Wert gesetzt sein (Default) Tabelle 3: XForms und Java Swing Elemente: Eindeutiges Mapping -1- Alle hier genannten Klassen befinden sich im Java Paket: javax.swing - 17 - Element Einzelne Auswahl XForms-tag <select1> Java Swing-Klasse1 Anmerkungen [12] und [13] rendern JList oder dieses Element als dropJRadioButton Eingabefeld <input> JTextField bzw. Nicht-Standard Implementierung Datei-Upload <upload> JFileChooser Submit <submit> JButton Verzweigungen <switch>..<case> JPanel Gruppierungen <group> JPanel zur Gruppierung Wiederholungen <repeat> JPanel Tabelle 4: XForms und Java Swing Elemente:Komplexes Mapping - 18 - down-Liste, darauf Bezug nehmend wird es als JList implementiert. Dabei muss SINGLE_SELECTION als Wert gesetzt sein. Ein Eingabefeld wird meist als solches gerendert, kann jedoch in einigen Implementierungen vom Typ der daran gebundenen Daten abhängen. (siehe 6.4.2) Über das angegebene Element kann eine Datei ausgewählt werden. Den tatsächlichen Upload muss jedoch die Applikation vornehmen Dem Submit Button wird eine besondere Bedeutung beigemessen, die reine Darstellung ist jedoch vom Typ JButton Darstellung als einzelne JPanel, die jeweils nur für einen Case angezeigt werden. Darstellung mit JPanel als Container für mehrere Elemente Darstellung der einzelnen Elemente ist in einem JPanel gespeichert. Das Besondere ist eher die wechselnde Datenbindung der Elemente. Zusätzlich existieren noch folgende Markups, die innerhalb von Elementen zwecks deren näherer Beschreibung eingesetzt werden. Element Beschriftung XForms-tag <label> Tooltip, Quickinfo <hint> Warnung <alert> Eingabehilfe <help> Tabelle 5: XForms-Markups und Java Swing Elemente:Mapping - 19 - Anmerkung Durch ein JLabel in Swing darstellbar In Swing wird ein tooltip durch das Attribut toolTipText der Elementklassen repräsentiert In XForms ermöglicht dieses Element, Warnungen auszugeben, wenn die Validierung ergeben hat, dass ein Datensatz nicht gültig ist. Dies kann durch einen Dialog angezeigt werden. Durch Drücken eines helpButtons (falls vorhanden) bzw. beim Drücken der Standard-Hilfe-Taste „F1“ erscheint bei XForms ein Fenster, das dazu dient dem Benutzer, Informationen über die erwarteten Eingaben eines Elementes anzuzeigen. Dies kann durch die Benutzung von ActionMap und InputMap in Java nachgebildet werden 5. Realisierung 5.1 Einführung Das folgenden Kapitel behandelt die Realisierung des vorgestellten Konzeptes. Dazu werden der Grob- und Feinentwurf erläutert. Dabei ist zu beachten, dass die Arbeit kein reines Entwurfsdokument ist und nicht alle dafür üblichen Bestandteile in Gänze ausgeführt sind. Statt der Begründung jeder einzelnen Designentscheidung sollen an dieser Stelle vielmehr die Kernzusammenhänge und Bezüge zur XForms-Technologie erklärt werden. Zunächst werden die Anforderungen an den Entwurf aufgeführt. Der darauf folgende Grobentwurf stellt den Grundaufbau der Interpreter-Bibliothek vor. Die einzelnen Komponenten entsprechen dabei logischen Einheiten und sind teils durch Klassen, teils durch eine Gruppe von miteinander arbeitenden Klassen realisiert. Neben der Erläuterung der einzelnen Komponenten findet sich das Rationale, eine Begründung der getroffenen Architekturenscheidungen. Die Details des Enwurfes werden anschließend im Feinentwurf vorgestellt. Dieser behandelt die Klassen, die nötig sind, um die Komponenten und die wichtigsten Abläufe zu realisieren. Der Feinentwurf wird wiederum mit einem Rationale abgeschlossen. Zuletzt wird im Detail auf die Realisierung der einzelnen XForms-Konzepte eingegangen. 5.2 Anforderungen Die Anforderung. den Interpreter als Bibliothek zu realisieren, hat natürlich Einfluss auf den Entwurf. So muss der Interpreter keinen eigenen Mechanismus zur Anzeige der GUI bereitstellen. Ebenso kann er Aufgaben an die ihn verwendende Applikation delegieren, muss dafür jedoch Informationen über diese besitzen. Auf der anderen Seite muss die Bibliothek so beschaffen sein, dass sie leicht zu verwenden ist. Dafür müssen entsprechende Strukturen in der Architektur sorgen. Da die Bibliothek für den Einsatz im Web Service Kontext verwendet werden soll, ergeben sich weiterhin einige Besonderheiten. Die Steuerung von Web Services aus einer Anwendung heraus impliziert die Benutzung über einen PC. Damit wird es unnötig XForms-Features zu interpretieren, die sich auf die Geräteunabhängigkeit beziehen. Dazu gehören beispielsweise Attribute zum bedingungsgesteuerten Layout von Controls. Aufgrund des potentiellen Einsatzes in Service orientierten Architekturen (SOAs) ist es notwendig die Bibliothek so zu konzipieren, dass ein Betreiben von mehreren InterpreterInstanzen problemlos funktioniert. Andernfalls wäre es nicht möglich, die einzelnen Module einer solchen Architektur zu repräsentieren. Dem muss im Entwurf entsprochen werden. - 20 - 5.3 Grobentwurf Abbildung 1: Komponentenentwurf - 21 - 5.3.1 Komponenten Die in Abbildung 1 gezeigte Grafik stellt den Grobentwurf der Bibliothek dar. Die verwendete Notation gruppiert logische Teile des Entwurfs. Die hellrot markierten Komponenten symbolisieren Fremdkomponenten, die der Bibliothek zur Verfügung gestellt werden. Die blauen hingegen stellen die Kernfunktionalität dar (durchgezogene Linien), während die grünen Komponenten die Benutzeroberfläche darstellen und entweder komplett von den blauen erzeugt oder aber bearbeitet werden (gestrichelte Linien). Der Interpreter besteht aus mehreren, nach Funktionen getrennten Einheiten. Die Gesamtfunktionalität des Interpretierens entsteht durch ein Zusammenspiel dieser Komponenten. Sie sind dabei voneinander gekapselt und so implementiert, dass sie durch andere Implementierungen ausgetauscht werden können. Das folgende Kapitel beschreibt die Aufgaben der einzelnen Komponenten im Detail. Application Die Application-Komponente bezeichnet die Anwendung, die die XForms-InterpreterBibliothek verwendet. Diese muss einige Funktionalität bieten, die durch eine Schnittstelle definiert wird. Diese Funktionalität sichert die Kommunikation mit dem Director. Director Der Director ist die Komponente, die die gesamte Verwendung des Interpreters koordiniert. Dazu muss er verschiedene Aufgaben erfüllen. Zum einen bietet er der Anwendung einen Zugang (Input), um XForms-Dokumente zu verarbeiten. Weiterhin legt er fest, welche Implementierungen die Komponenten verwenden, indem er ihnen entsprechende Instanzen zuweist. Dabei handelt es sich sowohl um die verwendete Parsing Bilbliothek als auch um die benötigten anderen Komponenten. Zudem leitet er die Anforderungen nach extern gespeicherten Informationen an die Applikation weiter. Schließlich ist er dafür verantwortlich, den Vorgang der Intepretation als Ganzes durchführen zu lassen und das Ergebnis, also die graphische Benutzeroberfläche, der Anwendung zu übergeben. Der Directorklasse ist die einzige Klasse, die die Instanzierung der anderen Komponenten vornimmt und die einzige Klasse, die die Anwendung kennt. Sie verfügt über keinen eigenen Verbindungsmechanismus, kann also keine Dokumente selbstständig über ein Netzwerk beschaffen, sondern delegiert Anforderungen an diese Funktionalität an die Anwendung. Separator Das Separator-Modul hat die Aufgabe, den Prozess des Interpretierens, also der Analyse und anschließenden Synthese, zu koordinieren. Nachdem der Separator vom Director ein zu verarbeitendes XForms-Dokument empfangen hat, muss er es zunächst in ein DOM-Dokument parsen. Anschließend trennt es das Dokument nach seinen logischen Bestandteilen auf und erzeugt für jeden Teil ein neues - 22 - Doukument. Dabei wird das ursprüngliche Dokument als Backup beibehalten, um den Anfangszustand wiederherstellen zu können. Im Standardfall von XHTML als Hostformat werden Dokumente nach den mit head und body bezeichneten Teilen getrennt. Die Hauptaufgabe besteht nun darin, die erhaltenen Teile sequentiell zur Weiterverarbeitung an die entsprechenden Module zu geben. Im Falle des head-Dokumentes ist dies die Model Processing-Komponente, im Falle des body-Dokumentes die Analyse-Komponente. Dabei iteriert der Separator durch die einzelnen Elemente der Dokumente und gibt sie zur Analyse frei. Nach der Analyse verwendet der Separator die Ergebnisse, um sie wieder sequentiell zur Verarbeitung der Synthese-Komponente zu übergeben. Zudem hat der Separator die Aufgabe, zusätzliche globale Dokumentinformationen (Titel etc.), die vom Hostformat kommen, zu erkennen und Methoden zur Verarbeitung oder Delegation bereitzustellen. Die Separatorkomponente ist so gekapselt, dass sie weder die Implementierungsdetails der einzelnen Komponenten noch des Parsers kennt. Alle Komponente werden ihr vom Director zugewiesen. Der Separator ist lediglich für die Koordination der Komponenten zuständig. Model Processing Die Model Processing-Komponente hat die Aufgabe, das Datengerüst des XFormsDokumentes zu analysieren und in eine Form zu bringen, die sich besser für die Weiterverarbeitung eignet. Die Model Processing-Komponente arbeitet auf einzelnen Model-DOM-Knoten, die sie vom Separator zugewiesen bekommt. Diese Knoten werden nach ihren logischen Bestandteilen analysiert. Ein Model in XForms besteht, wie in Kapitel 2.2 beschrieben, aus Dateninstanzen, Bindinginformationen, Actionhandlern und Submission-Elemente. Für diese verschiedenen Arten von Informationen stellt die Model Processing-Komponente jeweils spezialisierte Methoden zur Verfügung, die die Daten analysieren, in Verbindung zueinander bringen und in besonderen Klassen speichern. Die so enstandenen einzelnen Modelinstanzen bilden das Gesamtdatenmodell, welches der weiter unten beschriebene Model-Komponente entspricht. Die Model Processing-Komponente ist so gekapselt, dass sie auf DOM-Dokumenten arbeitet, jedoch die Implementierungsdetails nicht kennt, sondern die benötigten Klassen, indirekt über den Separator, vom Director zugewiesen bekommt. Analysis Die Analysis-Komponente hat die Aufgabe, in XForms kodierte GUI-Elemente zu analysieren und die Informationen in Containern abzulegen, die alle Informationen über diese Elemente speichern. Diese dienen dann als Grundlage für die Erzeugung der View- und ControllerKomponenten durch die Synthese-Komponente. Die Analyse bekommt vom Separator jeweils einzelne DOM-Knoten übergeben, die einem GUI-Element, einer GUI-Struktur (siehe Kapitel 4.3) oder einem Element des Host-Formats entsprechen. Sie nimmt zunächst eine Klassifizierung des Elementes vor und analysiert dann das Element über eine passende Methode. - 23 - Im Verlauf der Analyse werden Informationen über die einzelnen GUI-Elemente in Containern zusammengetragen. Die Kernaufgabe der Analyse besteht dabei darin, die GUIElemente mit den durch das Model-Processing entstandenen Daten zu binden und getrennt definierte Eigenschaften in jeweils einer Klasse zu bündeln. Die so enstandenen Container sind eine abstrakte Repräsentation der in XForms definierten Elemente und dienen neben der Weiterverarbeitung durch die Syntese-Komponente auch der Zustandsmodellierung während des Betriebes der Benutzeroberfläche. Die Analyse speichert die erzeugten Container in einer Datenstruktur, die am Ende der Gesamtanalyse vom Separator abgerufen und sequentiell zur Synthese freigegeben wird. Die Analyse-Komponente arbeitet mit den in DOM-Struktur vorliegenden Daten und wandelt sie in ein leichter zu verarbeitendes Format um. Alle folgenden Komponenten benutzen statt der DOM-Repräsentation das Container-Format. Damit ist die Analyse eine wichtige Verbindung zwischen den zwei Abstraktionsebenen XForms/XML und Java. Synthesis Die Synthesis-Komponente dient der Erzeugung von Java GUI-Elementen, die den durch die Analyse erzeugten Containern entsprechen. Zudem nimmt sie ihre Registrierung bei den verbliebenen Bestandteilen der GUI, der View und dem Controller, vor. Die Synthese wird sequentiell mit den Ergebnissen der vorangegangenen Analyse aufgerufen, behandelt also jeweils einen Container. Zunächst wird das abstrakte GUI-Element klassifiziert und die zugehörige Methode aufgerufen. Die Methoden haben die Aufgabe, die benötigten Java-Elemente zu erzeugen. Diese werden dem Container zugeordnet und anschließend der View zur Darstellung übergeben. Die weitere Behandlung geht auf das spezifierte Verhalten der Container ein, also die Logik, die in der Benutzeroberfläche erforderlich ist. Dazu wird der Container auf entsprechende Weise bei dem Controller registriert. Die Synthese ist so aufgebaut, dass sie Assoziationen zur View und dem Controller besitzt. Dabei handelt es sich wiederum um Interfaces, so dass die Synthese selbst die genaue Implementierung der benötigten Bestandteile nicht kennt. Stattdesssen werden ihr die konkreten Klassen über den Separator vom Director zugewiesen. Models Die Komponente Models besteht aus den einzelnen Modelinstanzen, die durch die Model Processing-Komponente erzeugt werden. Sie ist Teil der interpretierten Benutzeroberfläche. Die Model-Komponente ist die Datenbasis der GUI. Änderungen, die der Benutzer durch seine Aktionen auslöst, schlagen sich hier nieder. Dabei implementieren die einzelnen Models die Funktionaliät, die vom Controller und der View benötigt werden. Da die Models alle eingegeben Daten verwalten spielen sie eine zentrale Rolle bei der Submission. Sie repräsentieren dabei die Ergebnisse der Arbeit mit der erzeugten Benutzeroberfläche. - 24 - Der Komponente Models ist keine eigene Klasse zugeordnet, vielmehr besteht sie aus einer Datenstruktur mit mehreren Modelinstanzen, die von den einzelnen Komponenten verwendet wird. View Die View-Komponente enthält die sichtbaren Bestandteile der erzeugten Benutzeroberfläche. Sie bietet zudem Methoden, um neue Komponenten einzufügen und visuell zu spezifizieren. Dazu setzt sie zuvor analysierte Layout-Eigenschaften um und erzeugt die Benutzeroberfläche, die dann in der Anwendung integriert werden kann. Controller Der Controller ist die zentrale Komponente bei der Ereignisverarbeitung. Er übernimmt zwei Aufgaben: Die erste Aufgabe besteht darin, Events die XFControls betreffen, zu registrieren (Rolle des Observers) und für jedes Element die entsprechende Aktion auszulösen. Hierbei ist zu erwähnen, dass es sich um eine abstrakte Event-Verarbeitung handelt, die sich auf das Behandeln von Events in XForms bezieht und sich von der reinen Listener-Tätigkeit im Model-View-Controller Paradigma abgrenzt. Auf diese Aufgabe wird in Kapitel 5.5.2 eingegangen. Die zweite Aufgabe ist es, diese Funktion des Controllers auszuführen, wenn auch in einem sehr begrenzten Kontext. Dies lässt sich am besten als verzögerte Benachrichtigung beschreiben und ergibt sich wie folgt: Die Änderung des Zustandes einer XForms-Control erfordert eine Reihe von Aktionen, die in ihrer Gesamtheit als Processing Cycle bezeichnet werden. Diese Aktionen ermitteln die Auswirkungen der Änderungen auf Daten, auf andere Elemente und auf den Zustand der GUI und setzen sie um. Dieses zweite Aufgabe des Controllers wird in Kapitel 5.5.1 detailliert beschrieben. 5.3.2 Verwendete Bibliotheken Xerces Bei Xerces [10] handelt es sich um eine XML Parsing Bibliothek, die Teil des Apache Projektes ist. Die hier verwendete Version ist: Xerces2 Java Parser 2.7.1. Xerces zeichnet sich dadurch aus, dass es ein Open Source Projekt ist und eine große Fülle von Standards implementiert. So bietet er die für den Interpreter zwingend benötigte Unterstützung für das Document Object Model (DOM) inklusive der Traversal Implementierung und der XML Schema Validierung. Weiterhin bietet er die Unterstützung von Namespaces und die Fähigkeit der Serialisierung. - 25 - Die Bibliothek wird nur innerhalb der Director-Komponente importiert. Der Director hat also als einzige Klasse den Zugriff auf die konkreten Klassen des Parsers. Alle anderen Klassen benutzen intern nur die im Java Package „org.w3c.dom“ definierten Interfaces, denen durch den Director die benötigten Parser-Klassen zugeordnet werden. Jaxen Jaxen [15] ist eine Bibliothek, die eine XPath Engine zur Verfügung stellt und unter anderem auf dem hier verwendeten DOM arbeitet. Jaxen steht dabei wie Xerces unter Open Source Lizenz. Da in XForms beispielsweise das gesamte Binding der GUI-Elemente zu den Daten über Xpath-Binding-Expressions realisiert ist, ist der Einsatz einer solchen Bibliothek dringend angeraten. Im Gegensatz zu der Xerces Bibliothek ist der Einsatz von Jaxen in jeder Komponente direkt gegeben. Jede Komponente die Zugriff auf XPath-Funktionalitäten benötigt, verwendet die Implementierung der Bibliothek selbst. 5.3.3 Packages Die verschiedenen Komponenten und ihre zugehörigen Klassen sind in mehrere Packages aufgeteilt. Packages kapseln Klassen mit gleichem Kontext. Der in der vorliegenden Arbeit entwickelte XForms-Interpreter ist dabei in folgende Packages aufgeteilt: xfInterpreter.core: Die Interfaces der Komponenten Separator, Model Processing, Analysis und Synthesis und ihre jeweiligen Standardimplementierungen. Außerdem noch die Director-Komponente und das Interface der Application. xfInterpreter.behaviour.actions: Container für XForms-Actions xfInterpreter.behaviour.events: Container für XForms-Events xfInterpreter.controls: Container für die GUI-Elemente xfInterpreter.gui: Die GUI-Komponenten Model, View und Controller xfInterpreter.util: Verschiedene Klassen, die häufig verwendet werden. Dazu zählen unter anderem die DatenContainer, aber auch die Exception-Klassen. - 26 - 5.3.4 Rationale für Grobentwurf Der Grobentwurf in seiner jetzigen Form ist ein Resultat aus der Abwägung einzelner Designentscheidungen zur Erreichung der verlangten Merkmale. Beim Softwareentwurf ist es oftmals so, dass es keinen idealen Weg gibt, etwas zu realisieren. Die Betonung eines Qualtätsaspektes kann negative Auswirkungen auf die Erreichung eines anderen haben. An dieser Stelle werden die Kernentscheidungen, die schließlich zu dem oben dargestellten Entwurf geführt haben, mit ihren Vor- und Nachteilen diskutiert. Wahl der zusätzlichen Bibliotheken Die Tatsache, dass XForms ein XML-Dialekt ist, der viele XML-Techniken verwendet, legt nahe, ein XForms-Dokument durch einen XML-Parser [7] verarbeiten zu lassen. Dies hat den großen Vorteil, dass sowohl die lexikale Analsye (Erkennung einzelner Token) als auch die syntaktische Analyse, die man auch als Parsing bezeichnet (Überprüfung der Syntax der aufgetretenen Token), automatisch durchgeführt wird. Durch den Einsatz einer solchen Komponente entfällt sehr viel Arbeit. Zudem treten beim Parsing von XForms durch einen XML-Parser keine unerwarteten Ergebnisse auf, da es ein gültiges XML Vokabular ist. Die Benutzung der zweiten Fremd-Komponente, der XPath-Bibliothek Jaxen, hat das gleiche Ziel, nämlich eine Funktionalität auszuführen, die bereits durch etablierte Projekte implementiert ist und keinen großen Aufwand erzeugt. Da in XForms sehr viel mit XPath Ausdrücken gearbeitet wird, zudem an Stellen, die kritische für die Benutzeroberfläche sind (z.B. Bindung von GUI-Elementen an Daten), ist es angeraten eine solche Bibliothek zu verwenden. Parserwahl Die Entscheidung, einen XML-Parser in Java zu verwenden, impliziert die Auswahl einer solchen Komponente, da Java selbst nur ein Framework definiert. Es gibt dabei eine Vielzahl an unterschiedlichen Implementierungen, die zusätzliche Funktionen haben oder in besonderer Weise optimiert sind. Ebenso gibt es von Sun eine JAXP (Java API for XML Processing) genannte Schnittstelle, die unter anderem den Parserwechsel erheblich vereinfacht. Obwohl diese ganzen Funktionen und Möglichkeiten der Parser für sich genommen beeindruckend sind, sind die Anforderungen des hier entwickelten Interpreters an einen XML-Parser viel zu gering, als dass eine allzu differenzierte Wahl nach funktionellen und qualitativen Eigenschaften berechtigt wäre. Der Einsatz des Parsers innerhalb des Interpreters beschränkt sich im Grunde darauf, ein bereitgestelltes XForms-Dokument bei der Beachtung von XML Schemata und Namespaces zu parsen. Anschließend müssen noch einige wenige Operationen auf dem erzeugten Datenmodel durchgeführt werden und die Ergebnisse nach Abschluss der Arbeit mit der interpretierten GUI in XML-Dateien serialisiert werden. Diese Funktionen bringt fast jeder verfügbare XML-Parser mit sich. Letztlich ist die Entscheidung gefallen, Xerces als Parser zu wählen. Erstens ist er Teil eines renommierten Projektes, des Apache Projects, was zur Folge hat, dass er qualitativ hochwertig ist und beständig weiter entwickelt und verbessert wird. Zweitens steht er unter einer wenig restriktiven Open Source Lizenz, die es ermöglicht, den Parser für persönliche, firmeninterne und sogar kommerzielle Projekte zu nutzen. Drittens bietet er die gewünschte Funktionalität und kann gleichzeitig eine Fülle von anderen XML verwandten Technologien verarbeiten, - 27 - was zwar bei dem derzeitigen Zustand des Interpreters keinerlei Vorteile bringt, jedoch in Bezug auf Erweiterungen der Bibliothek und der zukünftigen Entwicklung des XML Standards nützlich sein kann. Die Idee der Verwendung des JAXP Frameworks im Zusammenhang mit dem Parser wurde für diese Arbeit nach reichlicher Überlegung verworfen. Dies hat den Grund, dass zwar generell der Parserwechsel durch den Einsatz von JAXP vereinfacht werden kann, dies aber in diesem Kontext aufgrund des Code-Overheads mehr Nachteile als Vorteile mit sich bringt. Stattdessen wurde das Prinzip des Information Hiding verwendet, indem die Referenz auf die tatsächliche Parser-Implementierung nur innerhalb der Director-Komponente existiert, andere Klassen dagegen nur mit Interfaces arbeiten. Dies bewirkt gleichsam den einfachen Parserwechsel ohne jedoch wie bei vorigem Ansatz die Komplexität der Parserverwendung zu erhöhen. Parserverwendung und Datenmodel Bei der Verwendung des Parsers muss darauf geachtet werden, dass die ParserImplementierung gekapselt verwendet wird, also nicht viele Klassen direkten Zugriff auf die Parserklassen haben. Dies hat den Grund, dass sich Implementierungsdetails ändern können und die Gültigkeit der benutzten Methoden nicht garantiert werden kann. So empfiehlt die API-Dokumentation des Xerces-Parsers die Verwendung der in Java definierten W3C Standard-Interfaces, wo immer dies möglich ist, da die Verwendung einzelner Klassen offiziell nicht unterstützt wird*. Zudem kann bei Erweiterungen der Bibliothek der Bedarf nach einer anderen Implementierung auftreten. Ein Wechsel sollte deshalb so leicht wie möglich durchführbar sein. Bei Beachtung dieser Kriterien empfiehlt es sich, die Kenntnis der Implementierungen nur in der Director-Klasse zu programmieren und die anderen Klassen mit Interfaces arbeiten zu lassen. Im Falle der Notwendigkeit eines Parser-Wechsels, muss dann lediglich die DirectorKlasse angepasst werden. Es ensteht also eine sehr schwache Implementierungsabhängigkeit, vor allem, weil durch Benutzung der Standard-Interfaces ausgeschlossen werden kann, dass individuelle, vom Parser abhängige und in anderen Implementierungen nicht vorhandene Funktionen, in Anspruch genommen werden. Beim Parsen ist weiterhin das verwendete Datenmodell von großer Bedeutung. XML definiert zwei standardisierte APIs zur Verarbeitung von Daten. Dies sind SAX (Simple API dor XML) und DOM (Document Object Model). Für die Verwendung von XML in der vorliegenden Arbeit kommt dabei nur die DOM-API in Betracht, da SAX lediglich eine sequentielle Verarbeitung auf Basis von Ereignissen gestattet. Dies wird der Analyse des XForms-Codes nicht gerecht. DOM hingegen erzeugt ein Modell des Dokumentes im Speicher, auf das im Anschluss bequem zugegriffen werden kann. Verwendung der XPath Library Jaxen Im Gegensatz zu der Parser Bibliothek haben alle Komponenten direkten Zugriff auf die XPath-Library, es wird also nicht mit Interfaces gearbeitet. Der Vorteil ist, dass alle Klassen ledglich die entsprechenden Implementierungs-Klassen importieren müssen, um sie zu verwenden. Es muss also nichts vom Director übergeben werden, was den Code weniger komplex macht. Ein Nachteil an dieser Art der Architektur ist, dass eine Änderung der * „Usage of this class is not supported. It may be altered or removed at any time.“ Siehe z.B. http://xerces.apache.org/xerces2-j/javadocs/xerces2/index.html - 28 - Bibliothek (z.B. Upgrade auf neue Version) zur Folge haben kann, dass die Klassen in allen verwendeten Komponenten ausgetauscht werden müssen, statt wie beim Parser lediglich im Director. Der Grund für die Entscheidung trotzdem diese Art des Designs zu wählen, liegt darin, dass es keine Interfaces für eine XPath-Factory in der Java-Spezifikation gibt. Eine Factory wäre aber nötig, um neue Instanzen für die Erstellung von XPath-Ausdrücken zu erhalten. Die Implementierung einer solchen XPath-Factory wäre also abhängig von der verwendeten Bibliothek. Da der Bedarf an einem Wechsel der XPath-Bibliothek, auch aus Mangel an Alternativen, als gering eingeschätzt wird, sind die Konsequenzen dieser Enscheidung hinnehmbar. Zentralismus Der zentrale Einsatz der Director-Komponente ist eine Architekturentscheidung, die kontrovers bewertet werden kann. Der Grobentwurf beschreibt den Director als eine Komponente, die alle Informationen über die anderen Komponente in sich bündelt und zusätzlich mit der Anwendung kommuniziert. Dieses Design hat den Zweck, die in der Aufgeabenstellung geforderte einfache Benutzbarkeit und Wartbarkeit der Bibliothek zu gewährleisten. Die Director-Komponente sorgt für leichte Verwendbarkeit, indem sie sicherstellt, dass für einen reibungslosen Betrieb tatsächlich nur eine Instanz dieser Klasse benötigt wird. Sie sorgt selbst für die Initialisierung aller anderen Komponenten und die Koordination der Phasen des Interpretationsprozesses und -betriebes der erzeugten GUI. Zudem ist die derart gestaltete Verwendung leicht skalierbar, da mehrere Director-Komponenten nebeneinander arbeiten können und so Zugriff auf mehrere Web Services gleichzeitig bieten können. Durch die Verwendung des Directors entfällt also die Verantwortung des Benutzers und der einbindenden Applikation, für das Zusammenspiel der Komponenten zu sorgen. Nachteilig ist, dass der Zugriff auf die Funktionalität für die Benutzung der Director-Klasse optimiert ist. Die separate Verwendung einzelner Klassen erfordert das Beachten von Implementierungsdetails und wird erschwert. Applikation als Schnittstelle Die Anforderungen der Aufgabenstellung den Interpreter als Bibliothek zu realisieren, hat Konsequenzen für andere Designentscheidungen. Im Gegensatz zu einer Stand-alone Anwendung ist eine Bibliothek auf externe Resultate angewiesen. Der Entwurf ist so konzipiert, dass für die Benutzung der Bibliothek eine Anwendung benötigt wird, die auf Web Server und Ressourcen zugreifen kann. Dies hat den Grund, dass eine Anwendung, die den Zugriff auf Web Services bündeln und koordinieren will und zu diesem Zweck die Interpreter Bibliothek einbindet, ohnehin einen Kommunikationsmechanismus implementieren muss, um z.B. Web Services ausfinding zu machen und zu validieren, ob die verwendete Zugriffstechnologie tatsächlich XForms ist. Eine solche Funktionalität über die Bibliothek bereitzustellen, wäre also überflüssig. Wäre die Bibliothek auf die Anwendung dieses hypothetischen eigenen Mechanismus angewiesen, wäre es in diesem Fall für die Anwendung sogar kontraproduktiv. - 29 - Der Director wurde daher so konzipiert, dass er Netzwerkaufgaben an die Applikation delegiert. Sie ist deshalb als Schnittstelle modelliert, die Methoden definiert, auf die der Director sich beziehen kann. Ein Anwendungsszenario ist z.B. dadurch gegeben, dass die Model Processing-Komponente bei der Analyse einer Dateninstanz anstelle eines XMLDokumentes eine URL vorfindet, an der sich dieses Dokument befindet. In diesem Fall schickt sie einen Request an den Director, der diesen an die Applikation weiterleitet. Nun wird natürlich eine XML-Datei oder eine Speicherrepräsentation von der Model ProcessingKomponente erwartet. Diese muss sich beim Aufruf des Requests auf einen Rückgabewert beziehen. Dies wäre ohne eine Schnittstelle, die die Applikation anweist, im Falle eines Requests auch einen solchen Rückgabewert zu liefern, nur schwer realisierbar. 5.4 Feinentwurf 5.4.1 Einführung Der Feinentwurf hat die Aufgabe, die im Grobentwurf vorgestellte Architektur im Detail zu erklären. Die Abstraktionsebene verschiebt sich von der Sicht auf Komponenten zu der Sicht auf einzelne Klassen, Variablen und Methoden. Der Feinentwurf dient dabei einerseits als Anleitung für die Programmierung und andererseits als Referenzdokument für die Sicht auf die Bibliothek im Detail. Die Tiefe der Darstellung des Entwurfes wurde so gewählt, dass das Verständnis für die dem Interpreter zugrundeliegende Architektur vereinfacht wird. Dafür werden einige Teile des Entwurfes nur unvollständig oder vereinfacht dargestellt. Dies betrifft sowohl die Gesamtstruktur als auch die Komposition der einzelnen Diagramme. - 30 - 5.4.2 Architektur 5.4.2.1 Kern Der Kern des Feinentwurfes wie in Diagramm 1 dargestellt, ist der Teil, der dem Grobentwurf am nächsten kommt. Er gibt eine Übersicht über die Realisierung über die einzelnen Komponenten in den Klassen und zeigt die benötigten Methoden und Variablen. Diagramm 1: Kern Den Kern der Implementierung bilden die im Grobentwurf vorgestellten Komponenten. Dabei spielt die Director-Klasse eine zentrale Rolle. Sie kommuniziert mit allen anderen Klassen und der Applikation. Jede Komponente wird durch eine Schnittstelle und eine Implementierung repräsentiert. Die Schnittstellen beschreiben lediglich, welche Funktionen die einzelne Komponente anbieten müssen, damit die jeweils anderen arbeiten können. Die implementierten Klassen erfüllen - 31 - diese Funktionalität in spezifischer Weise. Dieses Prinzip wird „Program to an Interface“ genannt und im Rationale erläutert. Zu den im Grobentwurf vorgestellten Komponenten sind hier zwei weitere Klassen beschrieben. Die erste, XFormsConstants, orientiert sich an der Klasse XMLConstants aus dem Java Standard Package „javax.xml“. Wie in dieser Klasse für XML sind in XFormsConstants Basiswerte zur Erkennung von XForms-Elementen, URLs und Namensräumen festgelegt. Diese Werte sind statisch, so dass die Klasse nicht instanziiert werden muss. Konstanten dieser Art werden von allen Analyse-Komponenten gebraucht, um sicherzustellen, dass ein namentlich erkanntes Element auch tatsächlich zum XForms-Namensraum gehört. Die zweite Klasse ist BehaviourAnalysis. Sie ist aus der Sicht des Grobentwurfes betrachtet, Teil der Komponenten ModelProcessing und Analysis. Dennoch ist sie als externe Klasse realsisiert, da erstens beide Klassen auf ihre Funktionalität angewiesen sind, eine Codeduplizierung aber vermieden werden sollte. Zweitens, ist der Zeitpunkt der Verhaltensanalyse von großer Relevanz. Wird beispielsweise die Action eines XFControlElementes untersucht und festgestellt, dass sie sich auf eine andere XFControl als Ziel bezieht, ist eine Zuweisung während der Control Analyse ggf. nicht möglich. Dies ist der Fall, wenn die Ziel-Control noch nicht analysiert wurde. Im Folgenden soll auf einzelne Aspekte des Entwurfes genauer eingegangen werden. - 32 - 5.4.2.2 Daten Container In XForms werden Daten, wie in Kapitel 3.3 beschrieben, als XML-Dokumente innerhalb von sogenannten Models gespeichert. Um die Hierarchie dieser Struktur nachzubilden und die Arbeit mit den Daten zu vereinfachen, wurden die in Diagramm 2 dargestellten Daten Container entworfen. Diagramm 2: Daten Container - 33 - Das Interface ModelProcessingUnit beschreibt die Methoden, derer es bedarf, um die im XForms-Dokument definierten Daten für die Bibliothek aufzubereiten. Diese Klasse erzeugt während der Verarbeitung Container, die die Models im XForms-Dokument repräsentieren. Diese bestehen aus der Modelklasse und den Objekten, die diese Klasse referenziert, wie im Diagramm dargestellt. Die Modelklasse speichert Informationen über das Model selbst. Die Daten Instanzen werden nicht umgewandelt, sondern als XML-Dokument innerhalb der Models gespeichert. Dabei ist zu bemerken, dass die ModelProcessingUnit nicht die Implementierung der Document-Klasse kennt, sondern mit der Document Builder Factory arbeitet, die ihr vom Director übergeben wurde. Die unveränderte Speicherung der Instanzen hat den Grund, dass die Bindings sich über XPath Ausdrücke auf die DOM-Knoten beziehen und daher das XML-Dokument als Kontext zur Navigation benötigen. Die Zuweisung von XPath-Ausdruck zu DOM-Knoten wird von der XPath-Klasse, Bestandteil der Jaxen Bibliothek, vorgenommen. Die Bindings selbst werden nicht zu eigenen Containern umgewandelt. Sie versehen lediglich die Daten mit Beschränkungen, deshalb wurde der Ansatz gewählt, diese Informationen innerhalb des Daten Containers DataNode zu speichern, auf den sie sich beziehen. Das Verhalten der Models wird in der Klasse BehaviourUnit gesammelt. BehaviourUnits werden, wie im letzten Kapitel beschrieben, von der externen Klasse BehaviourAnalysis erzeugt, die dafür von der ModelProcessingUnit referenziert wird. Die Submission Elemente werden in einem eigenen Container gespeichert. Eine Modelklasse kann mehrere solcher Submission Instanzen besitzen. Der Container DataNode schließlich ist die wichtigste Klasse. Sie bündelt alle Informationen über einen Datenknoten. Diese Informationen kommen sowohl aus den Instanz-Daten (Initialwerte) als auch aus den Bindings (Model Item Properties). Ein Netz von DataNodes, der Dependency-Graph, repräsentiert die Abhängigkeiten der Daten innerhalb eines Models. Ein DataNode Objekt übernimmt dafür sowohl die Rolle des Observers als auch des Observable (Observer Pattern [6]). Dadurch können Änderungen des Zustands einfach propagiert werden. Details zu dieser Verarbeitung sind in Kapitel 5.4.1 zu finden. - 34 - 5.4.2.3 Control Container Eine XFControl ist ein Model für ein GUI-Element aus XForms. Diagramm 3 zeigt die verwendete Klassenstruktur. Diagramm 3: Control Container Informationen über die XForms-Controls liegen zu Beginn des Interpretationsvorganges in XML Form vor. Zudem sind die Daten und Beschreibung der Controls getrennt gespeichert und werden nur durch Bindings verknüpft. Für die Verwaltung der Informationen innerhalb des Interpreters, vor allem während der Phase der Arbeit mit der Benutzeroberfläche, eignet sich dieses Format deshalb nur schlecht. Die XForms-Controls werden in einem XFControl genannten Container verwaltet. Dieser hat den Zweck, alle Informationen, die der Interpreter zur Arbeit mit dem GUI-Element benötigt, zentral zu speichern. Eine XFControl setzt sich aus vier Teilen zusammen, die jeweils eine Kategorie von Informationen repräsentieren. - 35 - XFControl-Objekte selbst speichern neben den zugehörigen Markups zusätzliche Informationen zu der Beschaffenheit des GUI-Elementes, die beispielsweise durch die Attribute navindex und accesskey ausgedrückt werden. Die zugrundeliegenden Daten für die XForms-Control, also die Daten, die durch sie angezeigt und/oder verändert werden, werden über eine Referenz zum zugehörigen DataNode Objekt erstellt. Üblicherweise verfügen Controls über solche Daten. In Ausnahmefällen kann jedoch davon abgewichen werden. Dies ist z.B. für die Output und Trigger Controls möglich. Der sichtbare Teil des GUI-Elementes wird in einer JComponent aus dem Java Swing Package realisiert. Schließlich wird das Verhalten der Control im Sinne des Eventing durch BehaviourUnit Container ermöglicht. Diese speichern die Eventhandler der Control. Während der Arbeit mit der GUI werden diese gesammelten Informationen verwendet, um die Java Swing-Komponente an die geforderten Bedingungen anzupassen. Wird beispielsweise der Wert der Model Item Property readonly der zugeordneten DataNode durch eine Interaktion des Benutzers von unwahr auf wahr geändert, muss die Methode setEnabled(false) der JComponent aufgerufen werden. Durch die Klasse XFControl, die das Verhalten, die Daten und das Aussehen eines XForms-GUI-Elementes bündelt, wird eine solche Reflektion der Änderungen erst möglich. - 36 - 5.4.2.4 Registrierung von Controls Damit XFControl-Elemente ihren Zweck erfüllen, müssen sie bei der View und ControllerKlasse registriert werden. Diese Registrierung wird im Rahmen der Synthese durchgeführt. Diagramm 4 zeigt die darunterliegenden Struktur. Diagramm 4: Registrierung XFControl-Elemente sind Bestandteil der GUI und müssen als solches bei ihr registriert werden. Dazu wird der XFControl während der Synthese eine JComponent aus dem Java Swing Package zugeordnet. Anschließend werden die Eigenschaften der JComponent dem Status der XFControl entsprechend gesetzt, d.h. Daten, Markups und Model Item Properties werden auf Swing-Komponenten übertragen. Die JComponent wird dann der View hinzugefügt. Diese legt die Darstellung des Elementes fest, z.B. seine Größe oder Position auf - 37 - der Benutzeroberfläche. Im Rahmen einer Erweiterung könnte hier auch die Behandlung von CSS Layout Eigenschaften stattfinden. Nach der Anmeldung bei der View wird das XFControl-Objekt beim Controller registriert. Dazu wird es auf seine Interaktionsfähigkeit (siehe Kapitel 5.4.1) und seine BehaviourUnits untersucht und innerhalb des Controllers in der entsprechenden Struktur abgelegt. Weiterhin wird der Controller bei der View als Listener für die entsprechenden Java Events eingetragen. Nach Abschluss des Interpretationsvorganges wird das Objekt View, das die sichtbare Komponente der Benutzeroberfläche repräsentiert, an die Application übergeben. Da es sich bei dem Objekt um eine Erweiterung der Klasse Java.Swing.JPanel handelt, kann die Anwendung sie dann problemlos in einem Fenster darstellen. 5.4.3 Rationale für Feinentwurf Das Rationale für den Feinentwurf ist, bezogen auf den gesamten Entwurf, als Ergänzung zum Rationale des Grobentwurfes zu betrachten. Der Prozess des Entwurfes auf dieser Ebene kennzeichnet sich durch eine Reihe von Entscheidungen, die sich im Feinentwurf niederschlagen. Die wichtigsten sollen hier mit ihren Konsequenzen erläutert werden. Information Hiding und Program to an Interface Durch Einführung der Directorklasse findet eine Entkopplung der Komponenten von den verwendeten Implementierungen statt, da die Director-Komponente als einizige die genauen Klassen kennt. Die anderen Klassen arbeiten lediglich mit Schnittstellenbeschreibungen. So entsteht eine logische Trennung nach Funktionalität und Vorgehensweise. Diese Art des Designs folgt einem anerkannten Prinzip, dem sogenannten Program to an Interface. Diese Architektur hat vor allem Einfluss auf die Wartbarkeit und Erweiterbarkeit des Interpreters, da Änderungen an den Komponenten über ihre Schnittstelle durchgeführt werden können und so neue Implementierungen wesentlich leichter eingebunden werden können. Auch das Testen einzelner Klassen oder die Ersetzung durch neue Implementierungen werden erleichtert. Zudem genügt für ein Grundverständnis der Arbeitsweise des Interpreters die Betrachtung der Interfaces, die grob vorgeben, was die einzelnen Klassen leisten müssen. Zudem ensteht durch die vielen Zuweisungen und die damit verbundenen Intialisierungen der Klassen im Vergleich zu der direkte Referenzierung ein Overhead an Code. Zusätzlich bedarf es für die Erzeugung einiger Objekte Factories (Factory Design Pattern [6]), da die dafür benötigten Informationen schrittweise eintreffen. Dies ist z.B. der Fall beim Erzeugen von neuen Document-Objekten innerhalb des Separators, die abhängig vom verwendeten Parser sind. Der Director muss hier die Document Builder Factory bereitstellen. - 38 - Erweiterbarkeit Eine komplette Implementierung des XForms-Standards ist im Rahmen dieser Arbeit nicht möglich. Damit eine einfache Erweiterbarkeit gewährleistet werden kann, müssen Strukturänderungen klein gehalten werden. Um dies zu erreichen, wurde die Nachimplementierung von vornherein vorgesehen. Dies zeichnet sich z.B. dadurch aus, dass alle Attribute und Elemente innerhalb der Container definiert sind, auch wenn sie in der tatsächlichen Implementierung der Bibliothek nicht unbedingt behandelt werden. Die Werte dieser Attribute, die zusätzliche Eigenschaften wie das Styling durch CSS Stylesheets oder den komfortablen Zugriff auf Controls spezifizieren, werden während der Analyse gesammelt, eine Weiterverarbeitung durch die Synthese findet aber nicht notwendigerweise statt. Eine Erweiterung zur Unterstützung dieser Attribute braucht sich dann nur mit dem Auswerten der entsprechenden Daten zu befassen. Nachteilig an dieser Designentscheidung ist, dass Daten analysiert werden, die für den jetzigen Stand der Implementierung nicht benötigt werden, was einen Overhead darstellt, der sich auf die Performanz der Anwendung niederschlägt. Allerdings ist zu bermerken, dass es sich hierbei um die Auswertung von einigen wenigen zusätzlichen DOM-Knoten und Attributen handelt, die Dimension des in diesem Sinne überflüssigen Aufwandes also klein ist, und nur vernachlässigbaren Einfluss auf die Gesamtperformance hat. View als JPanel Die Entscheidung, die sichtbare Komponente der GUI, die View, als Erweiterung der Java Swing-Klasse JPanel zu realisieren, ist in der Einbindung durch die Applikation und dem Einsatz im Kontext von Web Services begründet. Ein JPanel lässt sich leicht in ein Fenster eingliedern. Zudem hat die Anwendung die Möglichkeit in einem Fenster mehrere intepretierte Views darzustellen und sie nach Belieben zu gruppieren. Weiterhin können einem JPanel Eigenschaften zugewiesen werden, die somit die gesamte GUI betreffen. Beispielsweise kann so in einer Anwendung mit mehreren GUIs selektiv jeweils nur eine zur Bearbeitung freigegeben werden, indem bei den anderen die Methode setEnabled(false) aufgerufen wird. Ein anderer Anwendungsfall ist das Hinzufügen von zusätzlichen Listener-Klassen zu der GUI im Gesamten oder zu den einzelnen Elementen, um ereignisgesteuerte Verarbeitung durch die Anwendung zu ermöglichen. Zusätzlich ist dabei das Prinzip des Information Hinding angewandt, da die Anwendung nicht wissen muss, dass es sich um eine Instanz der Klasse View handelt, um sie darzustellen. Stattdessen kann sie sich darauf verlassen, dass es sich um ein Instanz der Klasse JPanel handelt, ohne auf die Erweiterungsdetails eingehen zu müssen. Zusammengefasst lässt sich sagen, dass durch die Verwendung der JPanel-Klasse sowohl die Verwaltung, als auch der Zugriff auf die Funktionalität der interpretierten Benutzeroberfläche für die Applikation verbessert werden. Design Patterns Der Einsatz von Design Patterns erlaubt es, eine Struktur schnell zu durchschauen, wenn man die eingesetzten Pattern kennt. Der entstehende Code wird flexibler, leichter zu lesen und leichter modifizierbar [6]. Für die Anwendung bedeutet dies eine erhöhte Wart- und Erweiterbarkeit. Da die Aufgabenstellung besonderen Wert auf die Erfüllung dieser beiden - 39 - Qualitätsmerkmale legt, ist der Einsatz von Design Patterns also verstärkt zu erwägen. Dabei darf es jedoch nicht zu einer zwanghaften Verwendung kommen, also nicht zu der Anwendung bei Aufgaben, für die sie nicht konzipiert sind. In der Architektur des Interpreters werden mehrere Pattern verwendet. Informationen zu den einzelnen Pattern sind unter [6] zu finden. Die Director-Klasse implementiert das Facade Pattern. Sie bietet eine Selektion der Schnittstellen ihrer referenziert Komponenten. So kann die Anwendung beispielsweise über den Director auf Methode der Synthese-Klasse zugreifen. Ebenso können die einzelnen Komponenten über den Director eine Quelldatei anfordern. Diese Anforderung wird von ihm an die Applikation weitergeleitet. Für das Propagieren von Änderungsbenachrichtigungen im Sinne des Processing Cycle implementiert die Klasse DataNode das Observer-Pattern. Sie übernimmt dabei sowohl die Rolle des Observers als auch des Obeservable. Einzelheiten zu dem Zweck dieser Verwendung finden sich in Kapitel 5.4.1. Des weiteren wird das Observer-Pattern für die Realisierung des Eventings verwendet. Siehe hierzu Kapitel 5.4.2 Die XForms-Actions werden mit Hilfe des Command-Patterns umgesetzt. Dieses Pattern besagt, dass an Stelle einer Methode einem Befehl eine eigene Klasse zugeordnet wird. Dieses Pattern wurden hier verwendet, um den Actions spezifische Informationen gekapselt zur Verfügung zu stellen und neue Actions einfacher einfügen zu können. Weiterhin werden Pattern der Java Bibliotheken (z.B. Model View Controller-Pattern in Swing) und Parser-Bibliotheken implizit verwendet (Factory- und Builder-Pattern für das Erhalten neuer Dokumentinstanzen). Sonstiges Eine gute Architektur kann in einigen Fällen als Muster für einen eigenen Entwurf dienen. In der vorliegende Arbeit orientiert sich der Entwurf teilweise an den Klassen der Java XMLund W3C-Packages. Insbesondere die Klasse XFormsConstants ist direkt abgeleitet. Die Exception-Klassen sind ebefalls Äquivalente zu den XML-Exceptions. Des weiteren werden dort, wo es möglich ist die Standardklassen bzw. -Interfaces verwendet. Dies erleichtert den Umstieg auf andere Hilfsbibliotheken wie z.B. XML-Parser Bibliotheken. 5.4.4 Ablaufplan der Initialisierung Die Entwürfe stellen die Bibliothek vor, sagen jedoch nur wenig über den Ablauf des Interpretierens aus. Dieses Kapitel erläutert als Ergänzung zu den Entwürfe, den Vorgang der Transformation der XForms-GUI zu einer Java Swing-GUI, in Form der dafür benötigten Anweisungen. Sie sind in der Reihenfolge ihres Auftretens gelistet und mit aufrufender Klasse genannt. - 40 - Director: ✗ Weise allen Einheiten die benötigten Komponenten zu ✗ Übergebe das von der Applikation enthaltene Dokument an die SeperatorUnit Separator: ✗ Parse das XML-Dokument in das DOM-Format ✗ Trenne <head> und <body> des Dokumentes ✗ Übergebe einzelne Knoten des <head> - Dokumentes sequentiell an die Model Processing Unit und verarbeite alle Knoten, die nicht zum XForms-Namespace gehören (Hostformat-Tags) Model Processing Unit: ✗ Teile <head> - Dokument in einzelne Models und ihre zugehörigen Informationen (Instances,Bindings, Actions und Submissions) ✗ Erstelle dafür Dokumente für die einzelnen Instances und speichere sie innerhalb der Models ✗ Schicke bei Bedarf eine Source Anfrage auf den Output des Directors (Dieser leitet sie an die Applikation weiter) ✗ Registriere Actions auf Models bzw. Listener für Events, die das Model betreffen ✗ Analysiere Daten und Bindings und erzeuge für jedes Model die DataNodes ✗ Baue den Dependeny-Graphen und beachte dabei Selbstreferenzen und zirkuläre Abhängigkeiten ✗ Führe Anfangsvalidierung durch ✗ Analysiere und speichere Submissions in eigenen Objekten Separator: ✗ Übergebe Model-Objekte an Analysis Unit ✗ Übergebe einzelne Knoten des <body> - Dokumentes sequentiell an Analysis Unit (unabhängig von ihrem Namespace) Analysis: ✗ Analysiere Knoten und erzeuge entsprechend eine XFControl, XFStructure, einen unterstützten HTML-Formatierungsbefehl oder gebe aus, dass das Element nicht unterstützt wird ✗ Weise der XFControl abhängig von iihrem Bindungsattribut eine DataNode, eine Submission oder einen Wert zu. Separator: ✗ Übergebe die Ergebnisse der BehaviourAnalysis, die das Verhalten von Models und Controls analysiert, in BehaviourUnit Objekten speichert und diese in den Containern referenziert ✗ Übergebe die Ergebnisse der Analysis Unit. Diese erweitert den Dependency-Graphen um die Control-Referenzen ✗ Übergebe die Controls sequentiell der Synthesis Unit Synthesis: ✗ Füge Information über die Control der DataNode hinzu (sowohl für die Control selbst auch als für ihre Markups falls vorhanden) ✗ Erstelle zu der XFControl eine passende JComponent und weise sie der XFControl zu ✗ Registriere die JComponent unter Beachtung des Layouts (CSS, HTMLFormatierung) bei der View - 41 - ✗ ✗ ✗ Registriere XFControl bei Controller und weise ihr bei Bedarf den Status eines Interaction-Objektes zu (siehe Kapitel 5.4.1) Registriere XFControl bei Controller für Events Trage Controller als Listener bei der JComponent ein Die Initialisierung ist an dieser Stelle beendet. Das Rückgabe-Objekt der Interpret-Methode ist die View, d.h. die Applikation, die diese Methode des Directors aufgerufen hatte, erhält die transformierte GUI. Sie kann diese anschließend durch Integration in ein Fenster in Betrieb nehmen. 5.5 Umsetzung in Java Im Anschluss an die Initialisierung und Übergabe der GUI an die Applikation kann diese in Betrieb genommen werden. Die hier genannten Prozesse spielen sich in der Phase des Betriebs der GUI, also der Interaktion mit dem Benutzer, ab. Die Realisierung des Entwurfes und des in Kaptel 4.2 vorgestellten Konzeptes wird hier detalliert beschrieben. Dabei wird auf einzelne Klassen und Strukturen des Entwurfes eingegangen. 5.5.1 Processing Cycle In XForms ist die Interaktion des Benutzers mit der graphischen Benutzeroberfläche so umgesetzt, dass nach der Eingabe oder der Auswahl von Daten über ein GUI-Element die gemachten Änderungen nicht sofort übernommen und angezeigt werden. Stattdessen ist es üblich, eine Änderung aktiv zu übernehmen, indem man eine bestimmte Taste drückt (Bei PCs standardmäßig ENTER), also den DOMActivate-Event auslöst, oder aber von dem Element wegnavigiert, um anzuzeigen, dass die Werte übernommen werden können. Dieser Prozess unterscheidet sich grundsätzlich von dem in Java Swing üblichen Prozess. Dort gibt es einen Mechanismus, der vorsieht, Änderungen im Zustand eines GUI-Elementes durch Listener zu beobachten und sofort zu behandeln. Es wird also abgegrenzt, zwischen dem Aktivieren oder Verlassen eines Elementes in XForms, bei dem nachträglich auf gemachte Änderungen eingegangen wird, und dem direkten Beobachten des Zustandes eines Elementes in Java Swing, bei dem die Absicht des Benutzers, die Änderungen zu übernehmen, keine Rolle spielt. Um das XForms-„Look and Feel“ zu simulieren, bedarf es also einiger Anpassungen an der Ereignisbehandlung. Die beiden Java Events „ActionEvent“ und „FocusEvent“ entsprechen - 42 - dabei abstrakt gesehen dem Wunsch des Benutzers, gemachte Änderungen zu übernehmen. Konkret bedeutet dies, dass der Controller primär diese beiden Java Events beobachten muss. Die Quellen der Events sind JComponents, die einer aktiven XFControl angehängt sind. Mit „aktiv“ sind in diesem Kontext Controls gemeint, die Änderungen der Daten durch den Benutzer direkt ermöglichen, also nicht über das Verhalten der XFControl. Dies trifft auf folgende XFControls zu: XFInput XFSecret XFSelect, XFSelect1 XFRange XFTextArea XFUpload Alle XFControls dieser Art werden von der Synthese in der Initialisierungsphase der GUI beim Controller für diese Events registriert. Weiterhin gibt es GUI-Elemente, die in ihrer Funktionalität auch in Java ein explizites Aktivieren erfordern. Dies sind die XForms-Controls Trigger und Submit, einer Unterklasse von Trigger. Diese Elemente werden wie in Tabelle 3 bzw. 4 beschrieben durch ein JButton ausgedrückt. Für diese Klassen ist der Controller der ActionListener, nicht jedoch der FocusListener, wie es bei den oben erwähnten aktiven XForms-Controls der Fall ist. Eine Navigation vom GUI-Element weg, hat hier keine Einfluss. Andere hier nicht genannte Elemente bieten keine Möglichkeiten zur Interaktion mit dem Benutzer und müssen deshalb nicht auf Aktivitäten überwacht werden. Während der Interaktionsphase des Benutzers mit der GUI werden die Events ausgelöst und vom Controller abgefangen. Ein Auslösen der Events bewirkt das Durchlaufen des Processing Cycles. Dazu ruft des Controller nacheinander die nötigen Methoden wie in Abbildung 2 gezeigt auf und übergibt die XFControl, die den Event ausgelöst hat, als Parameter. Die folgenden Methoden beziehen sich jeweils auf das Model, in dem die Änderung stattgefunden hat. Zu Beginn der Ausführung der Methoden werden jeweils die entsprechenden Events abgefeuert. Abbildung 2: Processing Cycle - 43 - Rebuild Der als Rebuild bezeichnete Vorgang hat das Ziel, einen Abhängigkeitsgraphen der im angegebenen Model enthaltenen Daten zu erstellen, um die Auswirkungen von Datenänderungen zu koordinieren. Der Abhängigkeitsgraph muss mindest einmal in der Initialisierungsphase der GUI erstellt werden. Weitere Aufrufe der Methode Rebuild sind nur nötig, wenn sich etwas an der Struktur der Daten ändert, d.h. wenn ein Lösch- oder Einfügevorgang auf dem zugrundeliegenden DOM-Baum stattgefunden hat. Der Abhängigkeitsgraph ist durch eine Verkettung von DataNodes realisiert. Die Abhängigkeiten werden dadurch ausgedrückt, dass eine DataNode zwei Arten von Datenstrukturen besitzt – eine, die Referenzen auf alle von ihr abhängigen DataNodes speichert, und eine weitere, die Verweise auf alle sie referenzierenden XFControls enthält. Ein Abhängigkeitsgraph wird in drei Phasen erstellt. In der ersten Phase werden von der Model Processing Unit lediglich alle DataNodes eingefügt, sie verfügen dabei noch über keine Verweise. Die zweite Phase ist dadurch gekennzeichnet, dass Verweise auf andere DataNodes hergestellt werden. Verweise von einer DataNode auf eine andere können immer dort auftreten, wo ein Attribut mit Hilfe einer XPath Funktion berechnet wird und der Verweis auf Daten ein Parameter der Funktion ist. Beispielsweise kann ein Model folgendes Binding enthalten: <xf:bind id="myBind" ref="/person/smokes" relevant="/person/age > 16" /> Der Wert des Elementes smokes wird also nur abgefragt, wenn der Wert eines anderen Elementes (age) eine bestimmte Bedingung erfüllt. Damit ergibt sich eine Abhängigkeit der DataNode des Elementes smokes von der DataNode des Elementes age. Tabelle 6 Zeigt die weiteren Stellen, an denen Berechnungen von Werten stattfinden, die eine Abhängigkeit zur Folge haben können: Klassifizierung Element Attribut Bindings bind readonly bind required bind relevant bind constraint bind calculate setvalue value insert at delete at output value Actions Controls Tabelle 6: Berechenbare Attribute, angelehnt an [5] - 44 - Während dieser Analyse ist zu beachten, dass sie sowohl von der Model Processing Unit (verantwortlich für Bindings und Actions innerhalb von Models) als auch von der Analysis Unit (verantwortlich für Controls und Actions innerhalb von Controls) durchgeführt werden muss, um alle Abhängigkeiten abzudecken. Die dritte Phase schließlich dient der Verknüpfung der Daten mit den XFControls, die sie referenzieren. Diese Verbindungen sind erforderlich, um im Falle einer Datenänderung auch die graphische Oberfläche entsprechend anzupassen. Diese Verarbeitung wird von der AnalysisUnit durchgeführt. Nach der Erzeugung besitzt der Graph einen Zustand, der angibt, ob er aktuell ist. Wenn der Zustand den Graphen als nicht aktuell deklariert, wird ein Rebuild, d.h. eine Neustrukturierung des Graphen, durchgeführt. Ist der Graph hingegen aktuell, braucht diese Phase des Processing Cycles nicht durchlaufen zu werden. Eine Änderung der Datenstruktur kann dabei an den in Tabelle 7 gezeigten Stellen stattfinden. XForms-Tag Kontext copy In Select und Select1-Strukturen insert In Repeat-Strukturen delete In Repeat-Strukturen Tabelle 7: Xforms-Tags, durch die die Datenstruktur geändert wird Jede dieser Aktionen hat zur Folge, dass der Zustand des betroffenen Abhängigkeitsgraphen auf veraltet gesetzt wird. Dadurch wird ein Rebuild nötig und bei der nächsten Änderung durchgeführt. Recalculate Diese Phase des Processing Cycles dient dazu, die dynamischen Werte und Zustände von den zugrundeliegenden Daten neu zu berechnen. Berechnungen werden in XForms über XPath Funktionen durchgeführt, die an den Tabelle 6 in genannten Stellen vorkommen können. Durch die Aktualisierung von Daten müssen sich die angezeigten GUI-Elemente anpassen. So kann beispielsweise eine Benutzereingabe dazu führen, dass ein Texteingabefeld überhaupt angezeigt wird. Dies ist der Fall, wenn die Daten, auf die das Eingabefeld referenziert, eine Model Item Property relevant haben, die über einen XPath-Ausdruck den Inhalt eines anderen Datenknotens benutzt und dessen Zustand von false auf true setzen. Das wichtigste Werkzeug für die Methode recalculate ist daher der durch Rebuild erzeugte Abhängigkeitsgraph. Er dient dazu, die Auswirkungen der vorgenommene Datenänderung zu ermitteln. Im Detail funktioniert dies so, dass eine DataNode durch von ihr abhängige DataNodes und auf sie verweisende XFControls beobachtet wird. Beide Arten von Elementen übernehmen hier die Rolle des Observers. Die DataNodes sind also gleichzeitig Observer und Observable. Das zugrundeliegende Konzept ist, dass die durch Benutzereingaben oder Actions beeinflussten DataNodes dafür verantwortlich sind, die Änderungen weiterzugeben. Wird eine DataNode verändert, informiert sie sukzessiv ihre alle von ihr abhängigen DataNodes. Diese erhalten den Status changed im Sinne des Observer Patterns. Die Phase Refresh untersucht die DataNodes schließlich auf diesen Zustand und benachrichtigt ggf. die abhängigen Elemente. So wandert eine Änderung schließlich zu allen betroffenen - 45 - XFControls. Diese wiederum setzen die betroffenen Eigenschaften ihrer JComponents, was schließlich (Refresh-Phase) zu einem Update der View führt: Die Änderungen an den Daten haben die GUI erreicht. Hierbei ist zu bemerken, dass das Element, das die Änderung vorgenommen hat, selbst nicht aktualisiert wird (wohl aber die Daten, auf die es verweist). Dies hat den Grund, dass sonst im Zusammenhang mit der „calculate“ Property eine Abhängigkeit entstehen könnte, die dazu führen würde, dass man einen Wert nicht sicher setzen könnte. Man könnte sich beispielsweise ein Texteingabefeld für eine Zahl vorstellen, das die Eingabe des Benutzers mit einer Konstante multipliziert. Gibt der Benutzer einen Wert ein und bestätigt ihn durch Drücken der ENTER Taste, werden die Daten, auf die das Texteingabefeld verweist aktualisiert. Würden nun Änderungen auch für dieses GUI-Element angezeigt werden, so würde das Texteingabefeld das Produkt aus der gemachten Eingabe und der Konstante anzeigen. Wenn nun von diesem Element wegnavigiert werden würde, würde der aktuelle Zustand der Eingabe, also das Produkt als Eingabe betrachtet werden und erneut mit einer Konstante multipliziert werden. Dies entpräche nicht der Intention des Benutzers. Obwohl dieses Problem durch eine differenzierte Implementierung abgefangen werden könnte, ist der Stellenwert der vernachlässigten Funktionalität zu gering, um eine solche zu rechtfertigen. Die Implementierung des XSmiles Browsers ist in dieser Hinsicht ebenso beschaffen. Insbesondere gilt es die Property calculate so zu verarbeiten, dass das Resultat der gewünschten Semantik gerecht wird. Daten die mit einer Calculate Property gebunden sind werden abhängig von dieser Property aktualisiert. Ein einfacher Anwendungfall ist wie bereits beschrieben die Multiplikation des eingegebenen Wertes mit einer Konstante. In diesem Fall handelt es sich um eine Selbstreferenz, da die Daten von ihrem vorherigen (die Eingabe wird sofort gesetzt) Wert abhängen. Es ist jedoch auch möglich Daten von anderen Knoten an eine Datenknoten über calculate zu binden. So kann z.B. ein Eingabefeld die Summe der Werte zweier Datenknoten anzeigen. In diesem Fall hat der damit gebundene Datenknoten keine Referenz auf sich selbst, d.h. Interaktionen des Benutzers mit diese Eingabefeld haben keinen Einfluss auf die darunterliegenden Daten. Änderungen die eine DataNode ohne Selbstreferenz betreffen müssen daher ignoriert werden. Revalidate Die Möglichkeit, eine clientseitige Validierung durchzuführen, ist eine der großen Stärken von XForms. Dabei wird, wie in Kapitel 3.4.2 beschrieben, XML Schema verwendet. Die Methode Revalidate hat die Aufgabe, veränderte Daten gegen statische (in einem XML Schema definierte) und dynamische (Verwendung des Attributes type) Constraints zu prüfen. Wird die Methode während des Processing Cycles aufgerufen, durchläuft sie alle betroffenen DataNodes und prüft diese auf ihre Validität. Ist eine der DataNodes nicht valide, wird das gesamte Model auf invalid gesetzt. Dies ist für die Submission von Bedeutung, da diese nur bei gültigen XML-Dokumente durchgeführt werden darf. Eine erneute Prüfung nach Eingabe von neuen Werten kann die Gültigkeit der DataNode wieder herstellen. - 46 - Zusätzlich wird der Zustand der DataNode auf changed verändert. In der Refresh-Phase kann dann die entsprechende grafische Auszeichnung veranlasst werden. Refresh In XForms bezeichnet Refresh das Update der graphischen Benutzeroberfläche. Dieser Schritt ist in Java Swing Komponenten durch die einzelnen Methoden zum Setzen von Attributen gekapselt. Sobald der Wert einer JComponent verändert wird, wird sie automatisch aktualisiert. Da dies in der Refresh Phase passieren soll, werden während des Recalculates und Revalidates DataNodes die zu ändernde XFControls enthalten, nur markiert (Zustand changed). Die Markierung wird dann in der Refresh Phase aufgelöst und die Attribute der JComponents den zugrundeliegenden Daten angepasst. Das visuelle Update wird dabei implizit von Java Mechanismen vorgenommen. Bemerkungen zum Auslösen des Processing Cycles: Im Falle des Elementes XFTextArea führt ein Betätigen der ENTER-Taste zu einem Zeilenumbruch und kann nicht als ein Signal für die Aktivierung gewertet werden. Klassen dieses Elementes sind infolgedessen nur der Focus Überwachung ausgesetzt. 5.5.2 Events Events treten in XForms häufig auf. Es gibt Events, die sich auf den Zustand der XFormsEngine beziehen (Lifecycle), Events, die Hinweise auf besondere Ereignisse geben (Notification), solche die aus der Interaktion des Benutzers mit der GUI entstehen, (Interaction) und Events, die auf Fehler aufmerksam machen (Error Handling). Zudem lassen sich über die Action „dispatch“ auch eigene Events auslösen. Ein Event in XForms bezieht sich entweder auf ein Model, eine (Daten-) Instanz, eine XForms-Control, einen Bestandteil einer XForms-Struktur, eine Submission oder ein Binding. In der Bibliothek ergibt sich folgende Zuordnung: Die Quellen für die Events sind GUIElemente (JComponents), an der Verarbeitung beteiligte Komponenten (ModelProcessing, Analyse, Synthese) oder Models. Ziele für Events, also Orte, an denen eine Verarbeitung von Events möglich ist, sind XFormsControls und Models. Die Implementierung des Eventing-Mechanismus ist dabei vom Ziel abhängig. - 47 - Events die sich auf XForms-Controls beziehen: Der Controller hat die Aufgabe, die XForms-Controls zu benachrichtigen, falls ein Event aufgetreten ist. Hierfür enthält er für jede Art von Event eine Datenstruktur, die speichert, welche Elemente von diesem Event betroffen sind. Handelt es sich um ein Standard Java Event, wie beispielsweise „java.awt.event.FocusEvent“, so muss die Datenstruktur lediglich das Verhalten der XFControl speichern. Wenn hingegen ein Event beobachtet werden soll, dass XForms-spezifisch (bzw. XML-spezifisch) ist, so speichert die Datenstruktur zusätzlich die genaue Klasse des Events. Gleiches gilt für eigene Events, die vom Autor angegeben wurden. Die Interpretation des Events ist dabei teilweise von der verwendeten JComponent abhängig. Tabelle 8 und 9 zeigen die so klassifizierten Datenstrukturen: Datenstruktur Java Swing Event* In XForms verwendeter Event ActionObjects ActionEvent DOMActivate FocusObjects FocusEvent xforms-focus DOMFocusIN DOMFocusOUT ChangeObjects ChangeEvent xforms-out-of-range xforms-in-range xforms-value-changed JSlider ListSelectionObjects ListSelectionEvent xforms-select xforms-deselect JList TextObjects TextEvent JComponent xforms-value-changed Solche, bei denen die „Incremental“ Property gesetzt ist Tabelle 8: Datenstrukturen für Events, die durch Standard Java Swing Events abgebildet werden können Datenstruktur Eventklassen In XForms verwendeter Event XFObjects (Werden bei Zustandsänderung innerhalb von recalculate() und revalidate() ausgelöst, siehe Kapitel 4.4.4) XFValidEvent XFInvalidEvent XFReadOnlyEvent XFReadWriteEvent XFRequiredEvent XFOptionalEvent XFEnabledEvent XFDisabledEvent Xforms-valid xforms-invalid xforms-readonly xforms-readwrite xforms-required xforms-optional xforms-enabled xforms-disabled CustomObjects CustomEvent Vom XForms-Autor spezifizierte eigene Events Tabelle 9: Andere Datenstrukturen Die Datenstrukturen werden während der Erzeugung der Java Swing-GUI von der SyntheseKomponente gefüllt. Dabei wird für jede XFControl, die von der Analyse an die Synthese * Alle genannten Klassen beziehen sich auf das Package: java.awt.event - 48 - übergeben wurde, ihr Verhalten beim Controller registriert. Die Informationen über das Verhalten einer XFControl, also bei welchen Events sie welche Aktionen auf welche Ziele ausführen soll, wird in einer Klasse namens BehaviourUnit gespeichert. Dabei kann eine XFUnit mehrere BehaviourUnits besitzen. Im Zuge der Registrierung werden nun alle BehaviourUnits einer XFControl in die entsprechende Datenstruktur abgelegt. Der Controller ist so aufgebaut, dass er alle oben genannten Events beobachtet. Dafür implementiert er im Falle der Standard Java Events die entsprechenden Listener-Interfaces und das Observer-Interface für alle anderen Events. Tritt nun während der Arbeit des Nutzers mit der GUI ein Event auf, wird der Controller darüber benachrichtigt, indem die entsprechende Methode aufgerufen wird. Innerhalb der Methoden wird dann geprüft, welche BehaviourUnits für dieses speziellen Event registriert sind, und für jede BehaviourUnit ihre zugehörige Action ausgeführt. Im Falle eines XFEvents oder eines CustomEvents muss zuvor noch die Art des Events ermittelt werden. Events die sich auf Models beziehen: In XForms lösen Models Events aus. Dies passiert z.B. wenn ein Model erzeugt worden ist oder ein Rebuild stattgefunden hat. Anders als bei Events, die sich auf Controls beziehen, kann hier jedoch auf eine komplexe Benachrichtigung verzichtet werden. Dies hat den Grund, dass Models ihre Events selbst behandeln. Hat ein Model ein Verhalten spezifiziert, z.B. die Ausgabe einer Nachricht nach der Initialisierung, ist dieses Verhalten in einer BehaviourUnit innerhalb des Model-Objektes gespeichert. Tritt während der Erzeugung des Models durch die Model Processing Unit die entsprechende Stelle auf, kann diese Komponente das Vorhandensein einer passenden BehaviourUnit prüfen und ggf. die angehängte Behandlung durchführen. 5.5.3 Actions XForms Actions werden in Klassen gespeichert, die von der Klasse XFAction erben. Die Actions sind als Commands im Sinne des Command-Patterns realisiert, verfügen also über eine Execute-Methode. Der Aufruf dieser Methode entspricht dem Druchführen der gewünschten Aktion. Wird eine Control über das Auftreten eines für sie interessanten Events informiert, teilt sie dem in ihren BehaviourUnits gespeicherten XFAction-Objekten mit, dass sie ausgelöst wurden. Die Aktionen werden durchgeführt. 5.5.4 Submission Der Phase der Arbeit mit der GUI folgt das Abschicken der eingegebenen Daten. Das Ende dieser Phase wird durch die Betätigung eines Submit-Buttons oder der Action „send“ - 49 - eingeleitet. Der Auftreten dieses Falles wird dem Director von der Controller-Komponente mitgeteilt. Der Director überprüft das Dokument auf seine Validität und serialisiert es durch Verwendung des XML-Parsers. Anschließend übergibt er das Ergebnis und die zugehörigen Submission-Information an die Applikation. Die Übergabe erfolgt über die im ApplicationInterface definierte Methode receiveSubmission. Diese kann sich dann um das Weiterleiten an die entsprechende Quelle kümmern, oder eine eigene Verarbeitung durchführen. - 50 - 6. Betriebsinformationen Das folgende Kapitel hat den Betrieb der Bibliothek zum Inhalt. Es werden sowohl Systemanforderungen, als auch konkrete Informationen zur Einbettung in eine Anwendung gegeben. Zudem werden die Einschränkungen der Implementierung und ihre Erweiterbarkeit diskutiert. 6.1 Versionen Es wurden jeweils die neusten Versionen der eingesetzten Software verwendet. Die Abwärtskompatibilität wurde nicht getestet und kann nicht garantiert werden. Java wurde in der Version 1.5.0 (Build 1.5.0_04-b05) verwendet. Die XML Parsing Bibiliothek ist in der Version Xerces2 Java Parser 2.7.1 Release, die XPath Bibliothek Jaxen in der aktuellen Version 1.1 beta 8. 6.2 Lizenzen Die verwendeten Bibliotheken stehen unter verschiedenen Open Source Lizenzen. Diese Lizenzen erlauben die Verwendung des Codes im Rahmen der Arbeit ohne Einschränkungen, solange auf die Lizenzen verwiesen wird. Eine Modifikation der Interpreter-Bibliothek und das Nutzen zu wissenschaftlichen Zwecken sind ebenso gestattet. Details zu den Lizenzen sind den beigefügten Dateien zu entnehmen. 6.3 Verwendung der Bibliothek in Anwendungen Der Einsatz der Bibliothek im Zusammenhang mit der Anwendung ist in Kapitel 5.3 bereits angedeutet worden. Grundsätzlich muss eine Anwendung, die den Interpreter verwenden soll, die Interpreter-Bibliothek importieren. Zusätzlich müssen die Dateien der beiden verwendeten Bibliotheken Xerces und Jaxen bereitgestellt werden. Sie befinden sich auf der enthaltenen CD, können aber auch von den in [10] und [15] genannten Quellen bezogen werden. Nachdem die Infrastruktur so gelegt ist, muss eine Anwendung das in der InterpreterBibliothek integrierte Application Interface implementieren, also Implementierungen für die darin vorkommenden Methoden liefern. Eine so beschaffene Anwendung braucht nun lediglich eine Instanz der Director-Klasse zu bilden, um die Basisfunktionalität, also das Interpretieren eines XForms-Dokumentes, zu nutzen. Der Interpreter ist auf die Verwendung der Directorklasse ausgelegt, es kann jedoch von dieser Art der Verwendung abgesehen werden, um die einzelnen Komponenten bewusst getrennt zu verwenden. Da die Directorklasse jedoch eine Fassade für die Funktionalität der darunterliegenden Komponenten bietet, ist von diesem Ansatz jedoch abzusehen, zumal die Implementierungsdetails der Komponenten zu beachten sind. - 51 - Der Interpreter ist weiterhin auf Skalierbarkeit angelegt, d.h. die gleichzeitige Verwendung von mehreren Instanzen der Directorklasse wird unterstützt. So können in einer einzigen Anwendung mehrere XForms-Dokumente interpretiert und somit mehrere Benutzeroberflächen gleichzeitig dargestellt werden, bzw. auf mehrere Web Services koordiniert werden. Hier ist jedoch zu beachten, dass die Directorkomponente auch nach der Erzeugung der GUI noch mit ihr verknüpft ist, da sie Änderungen am Datenmodell koordiniert etc. Dies bedeutet, dass eine Instanz des Directors nicht für die Interpretation von mehreren XForms-Dokumenten verwendbar ist. Da das Ergebnis der Interpretation, die GUI, in Forms eines JPanels realisiert ist, kann eine Anwendung eine flexible Anordnung von mehreren solcher GUIs durchführen, bzw. mit weiteren logischen Merkmalen (eingeschränkte Anzeige, gegenseitige Beeinflussung etc.) verknüpfen. Für eine komplexere Anwendung mit solcher Funktionalität genügt es, die Directorklasse mehrmals zu instanziieren, eine Instanz füt jedes XForms-Dokument. Den Abschluss der Arbeit mit der GUI zeigt für gewöhnlich die Submission an. Die Anwendung wird bei ihrem Auftreten vom Director über eine Methode benachrichtigt und erhält das serialisierte Ergebnisdokument, sowie Informationen zu den verlangten Übertragungmodalitäten (URI etc.) Sie kann anschließend eine Zerstörung der GUI veranlassen. Zu beachten ist, dass, wie in Kapitel 4.2 angeführt, die zu interpretierenden XFormsDokumente nicht auf Fehler überprüft werden, so dass die Ergebnisse der Bibliotheksausgabe von der Korrektheit der Dokumentes abhängen. Zu Testzwecken sollte deshalb ein XFormsDokument, dass nicht einem realen Einsatzumfeld entnommen worden ist, erst mit einer XForms-Implementierung wie XSmiles [12] geprüft werden. Ein Beispiel für die Einbettung in einer Anwendung ist im Anhang aufgeführt. 6.4 Einschränkungen der Implementierung 6.4.1 Einleitung Die vorliegende Arbeit beschäftigt sich mit der Interpretation von XForms-Dokumenten mit dem Ziel, sie in einer Java Anwendung zu integrieren. Das Einsatzgebiet ist dabei im Web Service Kontext zu sehen. Diese Vorgaben haben Konsequenzen auf den Umfang der Implementierung. Die umzusetzenden Eigenschaften, Konzepte und Funktionen wurde danach ausgewählt, von welcher Relevanz sie für den vorgesehenen Zweck sind. Die Einschränkungen sind nach funktionale und syntaktische Aspekten gegliedert. Der XFormsCode, der sich auf die erwähnten nicht unterstützten Funktionen bezieht, wird als fehlerhaft mit genauen Exceptions der Applikation gemeldet. Diese kann dann je nach gewünschtem Modus diese ignorieren, um ein Intepretieren nicht zu unterbrechen, oder mit einer eigenen Fehlermeldung darauf eingehen. Diese Art der Fehlerbehandlung ermöglicht es, das Interpretieren unabhängig von einzelnen nicht unterstützten Elementen druchzuführen und so Teilergebnisse zu liefern. - 52 - 6.4.2 Funktionelle Einschränkungen Die XForms-Control Input kann mit einem Datentyp als Beschränkung versehen werden und sollte dann laut Sepzifikation in einer auf diesen Datentyp spezialisierten Weise dargestellt werden. Wenn das <input> Element z.B. vom Typ xsd:date ist, sollte es als eine sogenannte „date picker control“ angezeigt werden. In Java Swing gibt es standardmäßig kein solches Element. In der Arbeit wird daher ein Eingabefeld ohne Ausnahme als einfaches Texteingabefeld (JTextField) dargestellt. Eine mögliche (kommerzielle) Implementierung einer „date picker control“ für Java ist unter [14] zu finden. Die Verarbeitung von CSS Stylesheets wird wie in Kapitel 4.2 erwähnt nicht unterstützt, kann aber im Rahmen einer Erweiterung hinzugefügt werden. Die Verwendung von DTDs (Document Type Definitions) zur Beschränkung der Instanzdaten wird nicht unterstützt, da es sich um eine im Grunde veraltete Technologie handelt, die durch XML Schema ersetzt worden ist. Die Definition von Eventhandlern mittlels Skriptsprachen wie Javascript wird nicht unterstützt, da die Komplexität der Bibliothek dadurch unproportional steigen würde. Generell werden Skripte nicht interpretiert, da ihr funktionelle Umfang unbegrenzt ist. Die XForms-Control Upload ermöglicht es, Dateien vom Client auf den Server zu übertragen, wo diese in der instance data gespeichert werden. Die Quellen für den Upload dürfen dabei von einer Vielzahl von Formaten sein, so z.B. einfache Dateien, Bilder, Video, Audio etc. Dabei beziehen sich die meisten dieser unterstützten Formate auf die Benutzung auf anderen Geräten als einem Desktop-PC. Man kann so beispielsweise über die Quelle „scribble“ mit einem handheld pen gezeichnete Bilder hochladen. Diese Funktionalität von XForms wird für die hier gestellte Aufgabe nicht benötigt, da sie nicht in den Kontext passt. Insofern wird die XForms-Control Upload nur rudimentär unterstützt. Das Attribut Appearance dient dazu, das Rendering einer XForms-Control festzulegen, um z.B. auf kleinen Geräten (PDA, Handy etc.) eine kompakte Darstellung anzufordern. Im Rahmen dieser Arbeit spielt diese Funktion jedoch keine Rolle, da bei der Bibliothek lediglich die Lauffähigkeit auf einem PC verlangt wird. Die Angabe von Renderings via Attribut appearance wird daher nicht unterstützt. Insbesondere wird die Vorgabe von eigene Renderings per Angabe einer URL ignoriert, da die zugrundeliegenden Swing Formate zur Darstellung verwendet werden müssen. Als Konsequenz wird stets das Java Swing Äquivalent zur XForms-Control gewählt, wie in Kapitel 3.7. angeführt. 6.4.3 Syntaktische Einschränkungen Wie in jeder Auszeichnungssprache gibt es auch in XForms viele syntaktische Freiheiten. Formell entsteht dabei fehlerfreier Code, jedoch ist die Semantik nicht klar. Mit der Möglichkeit, die beabsichtigte Wirkung auf verschiedene Arten zu erzielen, erhöht sich zudem die Komplexität des Codes, was eine automatische Codeanalyse erschwert. In dieser Arbeit wurde der Ansatz gewählt, konventionelle syntaktische Methoden der XFormsCodierung zu unterstützen und in Fällen von „unsauberem“ Code eine vereinfachte Syntax - 53 - anzunehmen. Dies hat zum Vorteil, dass die Analyse an sich weniger komplex und somit wartbarer ist. Dabei wurde Wert darauf gelegt, dass die Funktionalität, die durch die Vereinfachungen entfiel, auf konventionellem Wege implementiert werden kann, d.h. keine Einschränkungen der Funktionalität bestehen, sondern lediglich deren Beschreibung. Es wurde dabei darauf geachtet, die konventionelle Methode für eine solche Beschreibung mit anzugeben. Die Beschränkungen beziehen sich auf die im folgenden genannten Aspekte Einbettung von Text in Elemente ohne Auszeichnung: Es besteht die Möglichkeit, Text als Inhalt eines Elementes anzugeben, ohne ihn z.B. als Label zu deklarieren. Dieser Text wird dann je nach XForms-Prozessor als Beschreibungstext vor der jeweiligen XForms-Control oder aber abhängig von der hierarchischen Positionierung des Textes dahinter dargestellt. Da die Semantik einer solchen Beschreibung nur visuell durch den User erschlossen werden kann, führt dies dazu, dass der Code sehr unübersichtlich werden kann und zudem die intendierte Position und Funktion des Textes bei der CodeAnalyse nicht nachvollziehbar ist. Konventionelle Methode: Soll die Darstellung des Textes der Beschreibung des GUIElementes dienen, so sollte der Text als Label des Elementes deklariert werden. Soll hingegen der Text einem anderen Zwecke dienen, so sollte er als output GUI-Element ausgelagert werden. Beispiel: Falsch <xf:output ref=“/example/text“> Überflüssiger Text </xf:output> Richtig <xf:output ref=“/example/text“> <xf:label>RichtigerText</xf:label> </xf:output> Verschachtelung von Elementen XForms als XML-Vokabular bietet die Möglichkeit, Elemente hierarchisch zu verschachteln, was beispielsweise unabdingbar für die Definition von Markup Elemente als Kindknoten ist. Gleichzeitig kann man dadurch, XForms-Control Elemente ineinander zu verschachteln, was zwar syntaktisch korrekt, jedoch semantisch nicht eindeutig ist. In Abgrenzung zu der XForms-Implementierung XSmiles (Darstellung als nacheinander definierte Controls) wird in der Interpreter-Bibliothek eine solche Hierarchie so ignoriert, dass nur das erste Element beachtet wird. Konventionelle Methode: Die Definition von mehreren GUI-Controls sollte hintereinander erfolgen. Soll hingegen durch die Verschachtelung eine Gruppierung ausgedrückt werden, muss die Control Group zur Definition verwendet werden. - 54 - Beispiel: Falsch Richtig <xf:output ref=“/example/text“> <xf:label>Output Label</xf:label> <xf:input ref=“/example/data“> <xf:label>Input Label</xf:label> </xf:input> </xf:output> <xf:output ref=“/example/text“> <xf:label>Output Label</xf:label> </xf:output> <xf:input ref=“/example/data“> <xf:label>Input Label</xf:label> </xf:input> Mehrere Namespaces Die Zuweisung eines Namespace für ein Element kann auf zwei verschiedene Arten geschehen: Erstens durch die Angabe eines entsprechenden Prefixes und zweitens durch die Verwendung des „xmlns“-Attributes. Da ein Element nur zu einem Namespace zugehörig sein kann, wird bei der Verwendung beider Möglichkeiten die Angabe über das Attribut gegenüber dem Prefix vernachlässigt. Konventionelle Methode: Die Angabe des Namespace sollte nur über das Prefix geschehen, dies macht den Code lesbarer und eindeutig. Beispiel: Falsch Richtig <html xmlns:xf= "http://www.w3.org/2002/xforms"> <html xmlns:xf= "http://www.w3.org/2002/xforms"> <xf:input xmlns=“http://www.example.de“> <xf:label>Label</xf:label> </xf:input> <xf:input> <xf:label>Label</xf:label> </xf:input> Angaben von mehreren Bindings Die im Model definierten Bindings (siehe Kapitel 3.3) beziehen sich jeweils auf einen Knoten der Instanzendaten. Dabei darf jedem Knoten nur ein Binding zugeordnet werden. Alle nachfolgenden werden in der vorliegende Implementierung ignoriert. Der maßgebliche Grund für diese Art der Verarbeitung ist die Tatsache, dass sonst widersprüchliche Aussagen über die Daten getroffen werden könnten. Konventionelle Methode: Defnition von jeweils einem Binding pro Element. Sollen mehrere Model Item Properties (siehe Kapitel 3.5) gesetzt werden, können sie jeweils als Attribute dieses einen Bindingelementes deklariert werden.Auf diese Weise ist es möglich, alle sieben Properties für einen Datenknoten zu setzen. - 55 - Beispiel: Falsch <xf:bind id=“b1“ ref=“/example/element“ required=“false“/> Richtig <xf:bind id=“b“ ref=“/example/element“ required=“false“ readonly=“true“/> <xf:bind id=“b2“ ref=“/example/element“ readonly=“true“/> 6.5 Erweiterbarkeit 6.5.1 Einführung Aufgrund des großen Umfangs des XForms-Standards war es nicht möglich, alle spezifizierten Elemente auch in der Interpreter-Bibliothek zu implementieren. Aufgrund dessen war es nötig, ein Konzept zu erstellen, dass die einzelnen Aufgaben einer Priorisierungen unterzieht und so eine schrittweise wachsende Implementierung ermöglicht. Aufgrund des auf Wart- und Erweiterbarkeit ausgelegten Entwurfs ist es möglich, die so entstehende Bibliothek um einzelne Funktionsaspekte und Elemente zu ergänzen. Die Bibliothek kann anschließend mit Hilfe der angefügten Testklassen auf ihre Funktionalität überprüft werden. Die in der Implementierung der Bibliothek fehlenden Aspekte sind dabei grundsätzlichen von den in Kapitel 6.5 genannten zu unterscheiden, da diese bewusst nicht implementiert worden sind und eine Erweiterung nicht vorgesehen ist. Ebenso sind sie von den Erweiterungen des Funktionsumfanges in Kapitel 6.6.5 und den Änderungen der Komponenten im nachfolgenden Kapitel abzugrenzen. 6.5.2 Implementierungskonzept Das Ziel der Implementierung muss sein, eine Bibliothek zu erstellen, die eine Grundfunktionalität in Bezug auf die Interpretation von XForms-Dokumenten bietet. Eine solche Funktionalität zeichnet sich dadurch aus, dass sie einfache Benutzeroberflächen fehlerfrei umsetzen kann. Neben der Analyse und reinen Synthese der GUI ist insbesondere von Bedeutung, die zugrundeliegenden Abläufe, also Processing Cycle und Eventing mit Eventhandlern zur Verfügung zur stellen. Diese Mechanismen sind von höchster Priorität, da eine Nachimplementierung aufgrund der strukturellen Verflechtung der benötigten Klassen und Methoden nur schwer zu bewältigen wäre. - 56 - Von mittlerer Priorität ist dagegen, dass funktionelle Gruppen (Actions, Events, Controls) jeweils durch typische Elemente vertreten sind, um die Einbettung in die Architektur zu zeigen und damit ein Muster für die Nachimplementierung zu bieten. Von geringer Priorität sind Aspekte, die den Komfort der Arbeit mit einer Benutzeroberfläche betreffen. Diese können ohne Funktionseinbußen außer Acht gelassen werden. Auch Elemente des Hostformates werden aus gleichem Grund vernachlässigt. 6.5.3 Durchgeführte Implementierung Die Umsetztung des Implementierungskonzeptes ist detalliert in einem gleichnamigen Dokument auf der beigefügten CD dokumentiert. 6.5.4 Erweiterung um Grundelemente Die fehlenden in XForms spezifizierten Elemente können nachimplementiert werden, um den Funktionsumfang des Interpreters zu erweitern. Die betreffenden Elemente sind in der Implementierung vorgesehen, d.h. es existieren Klassen- und Methodenrümpfe, die helfen, die benötigten Informationen über ein Element zusammenzutragen. Im Gegensatz zu der Erweiterung um neue Elemente ist eine Veränderung der aktuellen Methoden grundsätzlich nicht nötig. Für die Implementierung eines Elementes aus einer der drei Gruppen sind die jeweilig vorhandenen Elemente zu beachten. Diese geben Anhaltspunkte für die entsprechende Erweiterung. 6.5.5 Erweiterung um neue Elemente Die Möglichkeit, eigene XForms-Elemente zu definieren, und die Weiterentwicklung des XForms-Standards können es unter Umständen nötig machen, die Bibliothek um neue Elemente zu erweitern. Diese Erweiterung kann sich an den vorhandenen Elementen orientieren, erfordert jedoch die Einführung neuer Klassen. Im Folgenden soll beispielhaft die Ergänzung um eine neue XFControl erklärt werden. Dies geschieht vor dem Hintergrund des Feinentwurfes und bezieht sich auf Implementierungsdetails. - 57 - Eine neue Control erfordert zu allererst eine Klasse, die die Klasse XFControl im Package controls erweitert. Die Klasse kann dann durch spezifische Attribute und Elemente ausgebaut werden. Damit ist der Container für das Element gegeben. Nun muss die Verankerung in der Analyse und Synthese druchgeführt werden. Zunächst muss dazu die Analysisklasse modifiziert werden. Die Methode analyseXFUnit ist so anzupassen, dass das Element am Namen erkannt wird. Als nächstes muss eine neue Methode vom Stil der anderen analyseXFControl Methoden implementiert werden, die die genaue Analyse in Bezug auf die spezifischen Attribute und Kindelemente vornimmt. Schließlich ist die Synthese des Elementes zu definieren. Dazu wird die Methode buildControls der Synthesis-Klasse um die Verarbeitung des Containers ergänzt. Als letztes muss nun einen neue Methode vom Typ buildXFControl bereitgestellt werden. Diese hat die Aufgabe, dem Element ein Java Swing Äquivalent zuzuweisen und die Eigenschaften des Elementes darauf zu übertragen. 6.5.6 Änderung der Komponenten Änderungen an den kompletten Komponenten können zu Testzwecken und Erweiterungen des Funtionsumfanges notwendig werden. Dabei lassen sich zwei Gruppen unterscheiden, einerseits die implementierten Komponenten, wie im Grobentwurf beschrieben, und andererseits die beiden Fremdbibliotheken. Die Kernkomponenten aus dem Package core sind jeweils in Interfaces definiert. Der Director verwendet als einzige Klasse die konkreten Implementierungen. Eine neue Klasse, die eine core-Komponente ersetzen soll, muss also lediglich das jeweilige Interface implementieren. Um für die Interpretation verwendet zu werden, hat der Director weiterhin die Aufgabe, sie zu assoziieren. Weitere manuelle Änderungen der abhängigen Komponenten sind aufgrund des Designs nicht erforderlich. Der komplette Wechsel der XPath Bibliothek ist, wie in Kapitel 5.2.4 erläutert, nicht vorgesehen. Muss dennoch ein Wechsel stattfinden, ist es nötig, alle Referenzen auf JaxenKlassen manuell zu ändern. Der Wechsel des Parsers hingegen ist leicht möglich, es müssen lediglich die Referenzen in der Directorklasse angepasst werden. Ein Wechsel des Parsers kann vorteilhaft sein, da ein Parser eine sogenannte Whitespaceunterstützung besitzen kann. Diese Funktion erlaubt es, leere Textknoten von Elementen automatisch entfernen zu lassen. Ist diese Funktion nicht vorhanden, werden leere Textknoten als Kinder der Elemente angehängt und erschweren so die Navigation in einem DOM-Dokument. Die verwendete Bibliothek Xerces bietet diese Funktion leider nicht, so dass an einigen Stellen des Codes diese Whitespace-Knoten extra behandelt werden mussten. Im Falle der Benutzung einer neuen Parserimplementierung können diese Stellen vereinfacht werden, falls der Parser diese Funktion bietet. Die Stellen sind dazu mit einem speziellen Kommentar versehen worden, um zu kennzeichnen, dass ein Parserwechsel an diesen Stellen Vorteile hätte. Die verwendete Markierung ist: Whitespace (WS). - 58 - 7. Zusammenfassung und Ausblick Das Ziel der Arbeit war es, eine Java Swing Interpreter Bibliothek für XForms zu entwerfen und zu implementieren. In der Aufgabenstellung wurde die Interpreter Bibliothek als eine Komponente definiert, die verwendet wird, um eine Anwendung um eine Schnittstelle zu Web Services zu erweitern. Diese Schnittstelle sollte durch die Interpretation von in XForms beschriebenen Benutzeroberflächen in Java Swing realisiert werden. Dabei war anzunehmen, dass in diesem Szenario der gleichzeitige Zugriff auf mehrere solcher Web Services stattfinden kann (SOAs), die Bibliothek also die entsprechende Funktionalität bieten muss. In der Arbeit wurde diskutiert, wie eine so beschriebene Bibliothek beschaffen sein kann. Angefangen bei der Untersuchung der XForms-Technologie und dem Vergleich zwischen den dort beschreibbaren Benutzeroberflächen mit solchen aus Java Swing wurde ein Konzept zur Realisierung erläutert. Es wurde ein Entwurf vorgestellt, erläutert und begründet, der dieses Konzept erfüllt und als Anleitung für die Implementierung der Bibliothek diente. Weiterhin wurden Informationen zum Betrieb der Bibliothek dargelegt. Schließlich wurden die Art der möglichen Erweiterungen, ihre Durchführung und der Funktionsumfang der vorliegenden Implementierungen dargelegt. Die aus diesem Entwurf hervorgegangene Implementierung der Bibliothek erlaubt die Arbeit mit grundlegenen Benutzeroberflächen und bietet der einbindenden Applikation die Möglichkeit, diese zu koordinieren und unabhängig vom Interpretationsvorgang flexibel zu erweitern. Um die Interpretation von komplexeren in XForms beschreibbaren Benutzeroberflächen zu gewährleisten, bedarf die Bibliothek der Erweiterung. Erweiterungen sind aufgrund der Architektur verhältnismäßig einfach durchführbar. Das Potential von XForms ist aufgrund seiner Leistungsfähigkeit und der Nachteile seines Vorgängers enorm hoch. Auch Web Services sind aufgrund der breiten Akzeptanz bereits sehr beliebt. Der Ansatz, diese beiden Bereiche zu verbinden und mit XForms Web ServiceSchnittstellen zu erzeugen, wird durch die XML-Technologie ermöglicht. Eine Anwendung, die diese Schnittstellen durch Einsatz einer Bibliothek nutzen kann, ist in der Lage, einen großen Funktionsumfang zu bieten. Als Basis für eine solche Bibliothek leistet die hier vorgenommene Implementierung gute Dienste. - 59 - 8. Literaturverzeichnis [1] W3C XForms 1.0 (Second Edition): http://www.w3.org/TR/2005/PER-xforms-20051006/ [2] XForms Essentials, Micah Dubinko, O’Reilly, 2003 [3] W3C XML 1.0 (Zweite Auflage, deutsche Übersetzung): http://www.edition-w3c.de/TR/2000/REC-xml-20001006/ [4] Google Web API: http://www.google.com/apis/ [5] XForms – XML Powered Web Forms, T.V. Raman, Addison-Wesley, 2004 [6] Design Patterns – Java Workbook, Steven John Metsker, Addison-Wesley, 2002 [7] Java und XML, 2. Auflage, Brett Laughlin, O’Reilly, 2002 [8] XML Schema Part 0: Primer Second Edition: http://www.w3.org/TR/xmlschema-0/ [9] XML Path Language (XPath) Version 1.0: http://www.w3.org/TR/1999/REC-xpath-19991116 [10] Xerces2 Java XML-Parser homepage: http://xerces.apache.org/xerces2-j/ [11] XML kompakt: Die wichtigsten Standards, Thilo Rottach / Sascha Groß, Spektrum akademischer Verlag GmbH, 2002 [12] XSmiles Browser homepage: http://www.xsmiles.org/ [13] XForms Extension für den Firefox Browser: http://www.mozilla.org/projects/xforms/ [14] Java Swing Kalender-Komponente, homepage: http://www.java-calendar.com/ [15] Jaxen, universal Java XPath engine: http://jaxen.codehaus.org/index.html - 60 - A. Anhang A.1. Beispiele für die Intepretation und Anwendung Um die Leistungsfähigkeit des Interpreters zu demonstrieren und Anwendungsfälle zu zeigen, führt dieses Kapitel die Anwendung der Bibliothek an zwei Beispielen vor. Beispiel 1: Interaktive GUI Dieses Beispiel zeigt die Fähigkeit der Bibliothek, ein XForms Dokument mit einer DirectorInstanz zu interpetieren und dabei Bezug auf die Model Item Properties zu nehmen. Zudem wird die Arbeit mit der GUI erläutert. Folgendes Dokument repräsentiert eine GUI mit voneinander abhängigen Elementen und bedingungsgesteuerter Anzeige: <?xml version="1.0" encoding="ISO-8859-1"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms"> <head> <xf:model> <xf:instance xmlns=""> <math> <number1>12</number1> <number2/> <result/> <info>Pretty large number</info> </math> </xf:instance> <xf:bind id="b" ref="/math/result" calculate="/math/number1 +/math/number2"/> <xf:bind id="b1" ref="/math/info" relevant="/math/result > 1000"/> <xf:submission action="http://www.example.com" method="put" id="s0"/> </xf:model> </head> <body> <xf:input ref="/math/number1"> <xf:label>Number 1</xf:label> </xf:input> <xf:input ref="/math/number2"> <xf:label>Number 1</xf:label> </xf:input> <xf:output bind="b1"> <xf:label>Sum</xf:label> </xf:output> <xf:output bind="b2"> <xf:label>Info</xf:label> </xf:output> <xf:submit submission="s0"> <xf:label>Submit</xf:label> </xf:submit> </body> </html> - 61 - Die Bilder zeigen wie die GUI in einer Anwendung dargestellt wird. Das Bild zeigt die GUI direkt nach der Interpretation. Hier kann man sehen, dass der Initialwert übernommen worden ist. Zudem wird bereits die calculate property ausgewertet, liefert jedoch noch keine Zahl (NaN = Not a number). Bei Eingabe der zweiten Zahl wird die Summe berechnet und im Output-Feld angezeigt. Dabei wird der richtige Datentyp unterstützt Die nun eingegebene Zahl macht die Summe größer als 1000, die Bedingung für die Darstellung des Infofeldes wird erfüllt und das entsprechende Element angezeigt. - 62 - Nach der Betätigung des Submitbuttons wird das XML-Dokument mit den eingegebenen Daten an die Anwendung übergeben. Diese kann es dann zum Server weiterleiten, oder eine andere in der Submission definierte Aktion ausführen. Das enstandene Dokument ist das folgende. <?xml version="1.0" encoding="UTF-16"?> <math> <number1>12</number1> <number2>997</number2> <result>1009</result> <info>Pretty large number</info> </math> - 63 - Beispiel 2: Verwaltung von GUIs Das folgende Beispiel zeigt die Einbettung von mehreren interpretierten Benutzeroberflächen in einem Fenster der Anwendung. Folgende Dokumente wurde dafür interpretiert. Folgendes Dokument spezifiziert eine Login Benutzeroberfläche: <?xml version="1.0" encoding="ISO-8859-1"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms"> <head> <xf:model> <xf:instance xmlns=""> <login> <info>Login</info> <username/> <password/> </login> </xf:instance> <xf:submission action="http://www.example.com" method="put" id="s0"/> </xf:model> </head> <body> <xf:input ref="/login/username"> <xf:label>Username</xf:label> </xf:input> <xf:secret ref="/login/password"> <xf:label>Password</xf:label> </xf:secret> <xf:submit submission="s0"> <xf:label>Submit</xf:label> </xf:submit> </body> </html> - 64 - Weiterhin wird von einer zweiten Director-Instanz nachfolgendes XForms Dokument interpretiert. Es beschreibt eine einfache GUI zur Umrechnung der Einheit PS in KW. <?xml version="1.0" encoding="ISO-8859-1"?> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:xf="http://www.w3.org/2002/xforms"> <head> <xf:model> <xf:instance xmlns=""> <Leistung> <PS>1</PS> <KW/> </Leistung> </xf:instance> <xf:bind id="b" ref="/Leistung/KW" calculate="/Leistung/PS * 0.7356" /> </xf:model> </head> <body> <xf:input ref="/Leistung/PS"> <xf:label>PS</xf:label> </xf:input> <xf:output bind="b"> <xf:label>KW</xf:label> </xf:output> </body> </html> Die Anwendung lässt beide XForms-Dokumente von der Bibliothek interpretieren und kann dann ihre Anordnung verwalten. In diesem Beispiel wurde die Anwendung so konfiguriert, dass zunächst die Ergebnisse der ersten GUI abgeschickt und validiert werden müssen, damit die zweite aktiviert wird. Die folgenden Bilder illustrieren dies: Auf der linken Seite befindet sich die erste interpretierte GUI, auf der rechten die zweite. Letzere kann noch nicht benutzt werden, da die Useridentifikation über die erste noch nicht erfolgt ist. - 65 - Die Useridentifikation hat stattgefunden, ein Server hat dies validiert und die zweite GUI kann deshalb verwendet werden. Die erste wird nicht mehr benötigt und deaktiviert. - 66 - A.2. Erklärung Hiermit versichere ich, dass ich die vorliegende Bachelorarbeit selbständig und ohne fremde Hilfe verfasst und keine anderen als die in der Arbeit angegebenen Quellen und Hilfsmittel verwendet habe. Die Arbeit hat in gleicher oder ähnlicher Form noch keinem anderen Prüfungsamt vorgelegen. Hannover, den 20. Februar 2006 ____________________ Lukas Klejnowski - 67 -