Architektur und Design eines PHP4
Transcrição
Architektur und Design eines PHP4
Architektur und Design eines PHP4-basierten Frameworks für Webapplikationen Andreas Langegger DIPLOMARBEIT eingereicht am Fachhochschul-Diplomstudiengang Medientechnik und -design in Hagenberg im August 2003 © Copyright 2003 Andreas Langegger Alle Rechte vorbehalten ii Erklärung Hiermit erkläre ich an Eides statt, dass ich die vorliegende Arbeit selbstständig und ohne fremde Hilfe verfasst, andere als die angegebenen Quellen und Hilfsmittel nicht benutzt und die aus anderen Quellen entnommenen Stellen als solche gekennzeichnet habe. Hagenberg, am 3. September 2003 Andreas Langegger iii Inhaltsverzeichnis Erklärung iii Vorwort vii Kurzfassung viii Abstract ix 1 Einleitung und Motivation 1.1 Das dynamische World Wide Web 1.2 Einsatz von Webapplikationen . . . 1.3 Frameworks für Webapplikationen 1.4 Warum PHP? . . . . . . . . . . . . 1.4.1 PHP ist erwachsen . . . . . 1.4.2 PHP im Web-tier . . . . . . 1.4.3 Kosten . . . . . . . . . . . . 1.4.4 PHP Version . . . . . . . . 1.5 Kapitelbeschreibung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 3 3 4 5 6 6 7 8 2 Problemstellung 2.1 Begriffsdefinition: Framework . . . . . . . . . . . . . 2.2 Anforderungen an ein Framework . . . . . . . . . . . 2.2.1 Handhabung und Effizienz . . . . . . . . . . . 2.2.2 Erweiterungs- und Integrationsmöglichkeiten 2.2.3 Sicherheitsaspekte . . . . . . . . . . . . . . . 2.3 Bestehende Frameworks für Webappikationen . . . . 2.3.1 Frameworks für PHP . . . . . . . . . . . . . . 2.3.2 Frameworks für Java . . . . . . . . . . . . . . 2.3.3 Ergebnis der Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 9 10 10 11 11 11 12 16 17 3 Entwicklung von Webapplikationen 3.1 Web Engineering . . . . . . . . . . . . . 3.2 Architektur von Webapplikationen . . . 3.2.1 Client/Server-Kommunikation . . 3.2.2 Zustandslose Verbindung . . . . 3.2.3 Mehrschichtige Architektur . . . 3.2.4 Website und Webapplikation . . 3.2.5 Skript-basierte Webapplikationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 20 21 22 22 23 24 25 iv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INHALTSVERZEICHNIS 3.3 3.4 v Modellierungskonzepte . . . . . . . . . . . . . . . . . . . 3.3.1 Dimensionen und Ebenen im Web Engineering . 3.3.2 Historischer Überblick . . . . . . . . . . . . . . . 3.3.3 Das OOHDM-Konzept . . . . . . . . . . . . . . . 3.3.4 Das Konzept von J. Conallen . . . . . . . . . . . Modellierung auf Basis der Architektur von DaVinci . . 3.4.1 Vereinfachung der Architektur . . . . . . . . . . . 3.4.2 Überwindung des Hyper-Paradigmas . . . . . . . 3.4.3 Model-View-Controller Pattern . . . . . . . . . . 3.4.4 Modellierung auf Basis des DaVinci Frameworks 4 Framework für Webapplikationen 4.1 Architektur im Überblick . . . . . . . . . . . . 4.1.1 Komponenten . . . . . . . . . . . . . . . 4.2 Benutzerinteraktion . . . . . . . . . . . . . . . . 4.2.1 FrontController . . . . . . . . . . . . . . 4.2.2 Abbildung von URLs auf Aktionsklassen 4.2.3 Die Klasse ActionManager . . . . . . . . 4.2.4 DaVinci Aktionsklassen . . . . . . . . . 4.2.5 Rechteverwaltung . . . . . . . . . . . . . 4.3 Applikationslogik . . . . . . . . . . . . . . . . . 4.3.1 DaVinci Model-Klassen . . . . . . . . . 4.4 Darstellung von Inhalten . . . . . . . . . . . . . 4.4.1 Szenegraph-Modell und View-Bäume . . 4.4.2 Daten für Views . . . . . . . . . . . . . 4.4.3 View-Skripts . . . . . . . . . . . . . . . 4.4.4 Der View-Generator . . . . . . . . . . . 4.4.5 Unterschiedliche Ausgabeformate . . . . 4.5 Datenhaltung . . . . . . . . . . . . . . . . . . . 4.5.1 Repositories . . . . . . . . . . . . . . . . 4.5.2 Die Klasse StorageBridge . . . . . . . . 4.5.3 Verwaltung der Datenbankverbindungen 4.5.4 Datenbankabstraktion . . . . . . . . . . 5 DaVinci in der Praxis 5.1 Anforderung . . . . . . . . . . . . . . . . . . . . 5.2 Modellierung einer Webapplikation mit DaVinci 5.2.1 Die Benutzeroberfläche . . . . . . . . . . 5.2.2 Erforderliche Aktionen . . . . . . . . . . 5.2.3 Repositories zur Datenhaltung . . . . . 5.2.4 Applikationslogik . . . . . . . . . . . . . 5.3 Implementierung . . . . . . . . . . . . . . . . . 5.3.1 Konfiguration und Benutzeroberfläche . 5.3.2 Aktionsklassen . . . . . . . . . . . . . . 5.3.3 Repositories . . . . . . . . . . . . . . . . 5.3.4 Implementierung der Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 26 28 31 35 38 39 41 44 47 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 49 50 51 51 53 54 54 57 57 59 60 60 63 64 64 65 65 65 67 68 68 . . . . . . . . . . . 69 69 69 70 72 73 74 74 74 76 76 76 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . INHALTSVERZEICHNIS vi 6 Evaluierung 6.1 Qualitative Beurteilung anhand der definierten Anforderungen . 6.1.1 Handhabung und Effizienz . . . . . . . . . . . . . . . . . 6.1.2 Erweiterungs- und Integrationsmöglichkeiten . . . . . . 6.2 Stärken und Schwächen . . . . . . . . . . . . . . . . . . . . . . 6.2.1 Stärken . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.2.2 Schwächen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 77 77 78 78 78 79 7 Ausblick 7.1 Erweiterungsmöglichkeiten . . . . . . . . . . 7.1.1 Framework Architektur . . . . . . . 7.1.2 Unterschiedliche Ausgabeformate . . 7.1.3 Verwaltung und Werkzeuge über eine 7.1.4 Integration eines Applikationsservers 7.1.5 Webservices . . . . . . . . . . . . . . 7.2 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 81 81 82 82 82 83 83 A Details zum DaVinci Framework A.1 Verzeichnisstruktur der DaVinci Distribution . . . . . . A.1.1 Mehrere Webapplikationen auf einem Server . . . A.1.2 DaVinci bei einem Webspace-Provider betreiben A.2 Umgebungsvariablen . . . . . . . . . . . . . . . . . . . . A.3 Konfiguration . . . . . . . . . . . . . . . . . . . . . . . . A.3.1 Konfiguration des Servers: davinci.xml . . . . . . A.3.2 Konfiguration der Webapplikation . . . . . . . . A.4 DaVinci Datentypen . . . . . . . . . . . . . . . . . . . . A.4.1 Typenkonvertierung von Request-Parametern . . A.4.2 Typenkonvertierung von und zu Datenbanken . . A.5 Repository API . . . . . . . . . . . . . . . . . . . . . . . A.5.1 Erstellen von repositories . . . . . . . . . . . . . A.5.2 Offline-Manipulation von Einträgen . . . . . . . . A.5.3 DB-Manipulation von Einträgen . . . . . . . . . A.5.4 Die Klasse RepositoryManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 85 85 86 86 87 87 88 90 90 90 91 91 92 93 94 B Quellcode B.1 Hilfsaktion zum Erstellen der repositories . . . . . . . . . . . . . . . B.2 SetModule als beispielhafte Aktionsklasse . . . . . . . . . . . . . . . B.3 Links model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 97 98 99 . . . . . . . . . . . . . . . Konsole . . . . . . . . . . . . . . . . . . . . . . Inhalt der CD-ROM 102 Literaturverzeichnis 103 Vorwort Die Philosophie des World Wide Webs im Allgemeinen, die Architektur, die Möglichkeiten im weltweiten Netzwerk und seine Zukunft beschäftigen mich bereits über mehrere Jahre. Ich bin überzeugt, dass Web-basierten Applikationen und den sogenannten Webservices in nächster Zukunft noch eine größere Bedeutung zukommen wird. Das WWW ist die weltgrößte Internet-Applikation welche auf einem einheitlichen Standard beruht. Der Browser dient als einheitliche Benutzerschnittstelle und HTTP als uniformes Kommunikationsprotokoll. Webapplikationen ermöglichen im Vergleich zu anderen Client/Server-Anwendungen eine viel kostengünstigere und schnellere Implementierung von kollaborativen und ubiquitären Anwendungen. Durch die wachsende Bandbreite des Internets und durch Erweiterungen der Browserfunktionalität werden in Zukunft die zur Zeit noch existierenden Nachteile beseitigt werden. Ich hoffe dass das DaVinci Framework weiterlebt und sich einige Open Source Entwickler finden, die sich am Projekt beteiligen möchten. Abschließend möchte ich vor allem meinen Eltern für die Geduld, Liebe und moralische Unterstützung während meines gesamten Studiums danken. Großer Dank gilt meinem Vater, für das Korrekturlesen der Arbeit und meinem Freund Gerald für den genialen Projektnamen DaVinci. Außerdem möchte ich auch meinem Professor Dipl. -Ing. Rimbert Rudisch für die große Unterstützung während meiner Arbeit danken. Ich bedanke mich bei all meinen Freunden, welche mich während den arbeitsreichen Monaten immer wieder für Freizeitaktivitäten zum Ausgleich begeistern konnten. vii Kurzfassung Aktuelle Technologien und Entwicklungen im World Wide Web eröffnen zahlreiche neue Möglichkeiten für ubiquitäre Client/Server-Anwendungen. So machen sich bereits viele vernetzte Anwendungen das standardisierte Internetprotokoll HTTP zu Nutze und verwenden den Webbrowser als uniforme Benutzerschnittstelle. Kollaborationstools, Warenwirtschaftssysteme, business-to-business Anwendungen, Portale und Web-basierte Informationsdienste seien als Beispiele für derartige Webapplikationen genannt. Die vorliegende Diplomarbeit befasst sich mit der Entwicklung eines sogenannten Frameworks als Entwicklungsumgebung für Webapplikationen. Ein Schwerpunkt wird unter anderem auf die Modellierung und den Engineering-Prozess von Webapplikationen im Allgemeinen gelegt. Dazu werden auch einige vorliegende Konzepte diskutiert und bewertet. Was die Architektur des Frameworks betrifft, wird auf das aus der Computergrafik bewährte Szenengraphen-Modell zurückgegriffen. Es wird für die Verwaltung der Benutzeroberfläche eingesetzt. Die Interaktion zwischen Browser und Webapplikation erfolgt nach einem speziellen Schema. Web-Adressen verweisen nicht wie gewohnt auf einzelne Seiten oder Dateien, sondern spezifizieren Interaktionen. Eine Interaktion kann beispielsweise eine Änderung der Navigation sein, wobei in diesem Fall die Benutzeroberfläche durch eine Modifikation des Szenegraphen geändert wird. Eine Interaktion kann aber auch Daten zum Server übertragen. Interessant ist auch, dass eine Interaktion durch ein Webservice implementiert werden kann. Das Framework wurde für Skript-basierte Sprachen entwickelt und im Konkreten für PHP4 implementiert. Es wurde im April 2003 unter dem Namen DaVinci als Open Source Projekt gestartet. Es wird beabsichtigt das Projekt auch in Zukunft weiter zu entwickeln. Dazu wurde unter http://phpdavinci.sf.net eine eigene Homepage eingerichtet. viii Abstract Recent developments in the area of web technology are opening new opportunities for the deployment of ubiquitous client/server applications. Today many networked applications make use of the standardized Hypertext Transfer Protocol and web browsers for the user interface since these technologies are accessible from all around the world. The World Wide Web was originally developed to display web pages and share information. Different strategies are currently evolving to expand the possibilities of the WWW. Collaborative tools, business-to-business applications, portals and Web-based information services are considered to be examples for such Web applications. This diploma thesis deals with the development of a so-called framework as a development environment for Web applications. Since the modelling and engineering process is a very important aspect, some different modelling concepts are analysed and evaluated. The architecture of the framework also plays an important role. Concerning this, various concepts are being derived, in some cases from other fields of research. For instance, the scenegraph-model, which is used in computer graphics, has been adapted for the user interface displayed by the Web browser. For the interaction between browser and Web server Java’s extended Model-View-Controller Model 2 concept is being used. Internet addresses no longer refer to file-based document resources, rather they define a specific action which can be performed in the system. This can be an action modifying application state (for example the scenegraph) or an action which sends data to the server. More sophisticated actions could implement XML-based Web Services. The framework is designed for script-based server-side programming languages and has been implemented for PHP4 in particular. The project started in April, 2003 under the name DaVinci at SourceForge.net and is licensed as Open Source software under the GPL. Since further development of the framework is intended, there is also a website accessible at http://phpdavinci.sf.net. ix Kapitel 1 Einleitung und Motivation War das World Wide Web (WWW oder auch Web genannt) anfangs für kooperative Arbeit und den Austausch von Textdokumenten, Bildern und Datei-Downloads entworfen worden, so hat es sich bis heute soweit entwickelt, dass vollständige Anwendungen per Browser weltweit erreichbar sind. Die Entwicklung derartiger Webapplikationen unterscheidet sich heute kaum mehr vom traditionellen Software Engineering, und es lassen sich auch sämtliche Werkzeuge und bewährte Design- und Entwicklungstechniken, in einer für das Web Engineering1 adaptierten Form, anwenden. Die Entwicklung einer Programmierumgebung für Webapplikationen soll Thema dieser Diplomarbeit sein. Im Rahmen der Arbeit wurde die Entwicklung des DaVinci Frameworks begonnen. Es wurde als Open Source Projekt unter der GNU General Public Licence2 zur Verfügung gestellt. Die Projekt-Homepage ist auf SourceForge.net3 unter der URL http://phpdavinci.sf.net erreichbar. 1.1 Das dynamische World Wide Web Durch die Entwicklung von Server-seitigen Skript- und Programmiersprachen hat sich das World Wide Web vom statischen Informationsmedium, welches vorwiegend aus HTML-Seiten bestand, zu einem interaktiven Informationsnetzwerk weiterentwicklet (siehe dazu [LCC+ 03, KRP+ 02]). Zahlreiche Skript- und Programmiersprachen ermöglichen die Bereitstellung von dynamischen und in hohem Maße interaktiven Webseiten [Zol01]. Abbildung 1.1 zeigt verschiedene Technologien der Webserver-Programmierung und Datenbankanbindung. HTTP4 als weltweit verwendetes Internetprotokoll und der Webbrowser als plattformunabhängige Clientsoftware werden heute häufig für Applikationen mit unterschiedlicher Komplexität verwendet. Im heutigen World Wide Web wird Information nicht nur mehr bloß dargestellt, sondern dynamisch generiert und verarbeitet. 1 Der aus dem Englischen übernommene Begriff engineering verdeutlicht den Entwicklungsprozess hinter der Erstellung von Webapplikationen, ähnlich wie im Software Engineering. 2 Siehe http://www.opensource.org/licenses/gpl-license.php. 3 SourceForge.net ist die weltgrößte Plattform für Open Source Entwicklung im Internet. Von den Betreibern werden für Open Source Projekte neben einem Webspace zahlreiche nützliche Werkzeuge gratis zur Verfügung gestellt. 4 Hypertext Transfer Protocol, Spezifikation in RFC2616 [FGM+ 99]. 1 KAPITEL 1. EINLEITUNG UND MOTIVATION 2 Abbildung 1.1: Webserver-Programmierung. Aus [Con03]. firewall EJB Container enterprise bean client client enterprise bean enterprise bean Enterprise Information Systems (RDBMS, ERP, Legacy Applications) Web Container (Servlets, JSP Pages, HTML, XML) JNDI, JMS, JavaMail client Client Tier Middle Tier EIS Tier Abbildung 1.2: Java-basierte Multi-tier Umgebung. Aus [SSJ02, S. 6]. Webserver stellen nicht nur statische Dateien wie etwa HTML-Texte und Bilder bereit, sondern ermöglichen die Einbindung von Skripten und (kompilierten) Programmen. Neuere Technologien, wie etwa Java-Servlets, welche in einem sogenannten Servlet Container (siehe [SSJ02, Kap. 4]) persistent laufen, sprengen die Grenzen der einfachen, zustandslosen HTTP-Verbindung und ermöglichen die Implementierung von aufwändigen Webapplikationen. In Abbildung 1.1 ist eine Java-basierte Architektur für Webapplikationen dargestellt. Die Grafik zeigt eine mehrschichtige Umgebung mit Client Tier, Web- und Applikationsserver (Middle Tier) und einer Datenbank-/Integrationsschicht (EIS Tier 5 ). Integrationstechnologien (vgl. CORBA6 , DCOM7 , SOAP8 ) verschmelzen unterschiedliche Plattformen und ermöglichen die Integration verschiedenster, auch veral5 Enterprise Information Systems: das IT-System eines Unternehmens. Common Object Request Broker Architecture der Object Management Group (OMG), siehe http://www.omg.org. 7 Distributed Component Object Model von Microsoft, siehe http://www.microsoft.com/com/ tech/DCOM.asp. 8 Simple Object Access Protocol, siehe http://www.w3.org/TR/SOAP. 6 KAPITEL 1. EINLEITUNG UND MOTIVATION 3 teter Ressourcen in die Applikation. Die Idee von sogenannten selbstorganisierenden Web Services [Cer02, Pre02] verdeutlicht eine Entwicklung des WWW zu einem dynamischen Applikationsnetzwerk. Natürlich wird es auch in Zukunft weiterhin statische Informationsseiten geben. Diese sind jedoch häufig bereits selbst Produkt von dynamischen Prozeduren in Web-basierten Applikationen (man denke etwa an Web Content Management Systeme oder auch an kleinere, Datenbank-gestützte Websites). 1.2 Einsatz von Webapplikationen Das World Wide Web eignet sich hervorragend als Netzwerk für verteilte, gemeinsam genutzte Anwendungen. So ist die Software über den Webbrowser weltweit und auf vielen verschiedenen Plattformen verfügbar [St02]. Da dieselben Technologien zumeist auch auf mobilen Geräten (PDAs, Mobiltelefonen) verfügbar sind, können die Anwendungen realtiv leicht auch für diese Clients angepasst werden. Vor allem im Intra- und Extranet hat sich die Verwendung von Webapplikationen stark verbreitet. Die Palette reicht von Web-basierten E-Mail Clients und Projektmanagement-Tools bis zu aufwändigen Warenwirtschaftssystemen im B2B-Bereich9 . Tabelle 1.1 zeigt einige klassische Szenarien für Webapplikationen, in verschiedenen Kategorien gegliedert. 1.3 Frameworks für Webapplikationen Da Webapplikationen immer komplexer werden und damit deren Einsatz für geschäftliche Zwecke kritischer wird, ist auch die Planung und Modellierung solcher Applikationen wichtiger denn je [GM01, Ude02, PSRO02]. Design- und Entwicklungsmethoden des traditionellen Software Engineerings können, kombiniert mit HypermediaModellierungsmethoden für die Entwicklung von Webapplikationen herangezogen werden. Eine weitere Notwendigkeit ist, dass der Implementierungsaufwand derartiger Projekte möglichst niedrig bleibt. Einmal entwickelte Komponenten sollten auch für weitere Projekte adaptiert und wieder verwendet werden können [CFM02]. Im ITMarkt ist eine just-in-time Produktion bei möglichst geringen Kosten die Grundvorraussetung für den Erfolg eines Produktes. Mehrfach benötigte Softwarekomponenten müssen wiederverwendet werden können und Architekturen sollten nicht ständig neu erfunden werden müssen. Entwicklungsumgebungen unterstützen den Engineeringprozess und bieten zahlreiche Werkzeuge und APIs10 für die Implementierung neuer Applikationen. Solche Umgebungen bauen auf einer bewährten Architektur auf und ermöglichen in Folge die adaptive Entwicklung verschiedenster Anwendungen. Im Zusammenhang mit dieser Arbeit sei als Framework eine derartige Entwicklungsumgebung für Webapplikationen gemeint. Der Entwurf und die Implementierung eines Frameworks für Webapplikationen mit PHP4 ist Teil dieser Diplomarbeit. Das entwickelte Framework trägt den Namen DaVinci und wurde als Open Source 9 Business-to-business (B2B) steht im Gegensatz zu B2C (business-to-consumer) für Geschäfte zwischen Unternehmen. 10 API steht für application programming interface und stellt eine Bibliothek an Funktionen dar, welche die Einbindung einer Softwarekomponente ermöglichen. KAPITEL 1. EINLEITUNG UND MOTIVATION Content Management Kommunikation, Communities Marketing, Promotion Online-Handel, Online Versandhäuser Support und Kundenbetreuung Projektmanagement, Intranets Frontends zu verschiedener Software im Unternehmen 4 klassische Homepage, Internet-Präsenz Nachrichten, Magazine Dokumentenverwaltung, Mediendatenbanken Suchmaschinen, Verzeichnisdienste Chat, Foren, Web-basiertes E-Mail, etc. Newsletter E-Cards Web-basierte Support Center, Customer Relationship Online Werbung, Bannerdienste Gewinnspiele, Aktionen Produktpromotions, Ankündigungen Anmeldesysteme für Veranstaltungen, Kongresse klassisches E-Commerce Auktionsplattformen (wie z.B. ebay) E-Procurement (Anschaffung von Sekundärgütern) Business-to-business Handel Internet Banking, Electronic Cash Call-Centers, Support-Centers Software Download-Centers Informationsdienste Öffentliche Dienste, Bürgerservice Kollaborationstools, Intra-/Extranets Messaging Server Bugtracking Systeme Zeit- und Ressourcenplanung Termine, Kalender Community Tools (vgl. auch Kategorie Kommunikation) Warenwirtschaft, Logistik, Supply-Chain Management Kundendatenbanken, Produktdatenbanken Marketing und Vertrieb (vgl. Kategorie Marketing Lohnverrechnung, Urlaubsplanung Projektmanagement vgl. auch Software von SAP (http://www.sap.de) Tabelle 1.1: Szenarien verschiedener Webapplikationen Projekt unter der GNU General Public License auf SourceForge.net veröffentlicht. Es wird damit beabsichtigt, interessierte Entwickler anzusprechen, die sich an der Weiterentwicklung des Frameworks beteiligen wollen. Die Homepage des Projekts ist unter http://phpdavinci.sf.net erreichbar. 1.4 Warum PHP? PHP bietet als Skriptsprache zur Erzeugung von dynamischen Webseiten sehr viele Vorteile und hat bereits einen beachtlichen Funktionsumfang, welcher mit neuen KAPITEL 1. EINLEITUNG UND MOTIVATION 5 Abbildung 1.3: Integration von Java. Aus [Sun02a]. Erweiterungen (Extensions11 ) auch selbst erweitert werden kann. Als Skriptsprache für Webapplikationen ist PHP bestens geeignet und die Geschwindigkeit von PHP ist ein weiterer Pluspunkt. Yahoo! startete beispielsweise im September 2002 mit dem Einsatz von PHP für die von 1,4 Millionen Usern pro Tag besuchte Plattform [Rad02]. PHP eignet sich durch seine Stärken in der dynamischen Generierung von Content und durch die vielseitigen Integrationsmöglichkeiten vor allem für den Einsatz im Frontend-Bereich (Web-tier, siehe auch Abschnitt 1.4.2) und 3.2.3). 1.4.1 PHP ist erwachsen Viele der gegen PHP gerichteten Argumente sind sehr oft unrichtig und resultieren aus einer unzureichenden Kenntnis und einem falschen Eindruck der Sprache. PHP hinterlässt bei Außenstehenden oft den Eindruck als „Kindersprache“. Dies rührt vor allem daher, dass sich PHP durch die einfache Erlernbarkeit sehr rasch an großer Beliebtheit erfreute und somit auch viele Amateur-Programmierer angezogen hat. Die professionellen Möglichkeiten von PHP bleiben dabei oft unbeachtet. Björn Schotte, Gründer der deutschen Firma ThinkPHP (http://www.thinkphp.de) und seit 1998 Mitglied der PHP Community, hat in einer Präsentation über PHP im E-Business [Sch03] auf der CeBit 2003 viele dieser falschen Argumente widerlegen können. Auch er ist der Meinung, dass die Bedeutung von PHP (v.a. ab der neuen Version 5) in den nächsten Jahren stark zunehmen wird. Durch die Möglichkeit der Integration von Java12 kann auch ein Java-basierter Applikationsserver angebunden werden. Abbildung 1.3 zeigt ein solches Szenario. Die Applikationslogik befindet sich hier auf einem J2EE-Applikationsserver. Über 11 PHP Extensions erweitern als C-basierte Funktionsbibliotheken den Befehlssatz. Dank Sam Ruby gibt es eine PHP Extension, die es erlaubt Java-Objekte einzubinden. Die Erweiterung ist im PHP-Quellcode enthalten und muss beim Kompillieren aktiviert werden. 12 KAPITEL 1. EINLEITUNG UND MOTIVATION 6 die Java Extension kann PHP Java-Objekte ansprechen. Die Ausgabeseiten werden dann beispielsweise mit PHP generiert. Es ist auch möglich PHP als Servlet in einem Servlet-fähigen Webserver zu verwenden [The03a, Abschnitt XLVII.]. Sogar die Integration von SAP/R3 Systemen ist mit PHP möglich13 . Externe Komponenten können auch über diverse Integrationstechnologien wie z. B. XML/RPC oder SOAP angebunden werden. 1.4.2 PHP im Web-tier Da PHP eine Skriptsprache ist und jedes PHP-Skript nach dem Ausführen zur Gänze aus dem Hauptspeicher gelöscht wird, ergeben sich allerdings einige Probleme bei der Implementierung eines rein auf PHP basierten Applikationsservers. Der gesamte Applikationsstatus und alle Daten, die während einer Sitzung fortwährend benötigt werden, müssen bei jeder HTTP-Anfrage neu initialisiert und in den Hauptspeicher zurückgeholt werden. Diese Daten müssen vorübergehend im Dateisystem oder etwa in einer Datenbank zwischengespeichert werden. Die Verwendung von Shared Memory Funktionen [SS02] bietet im Übrigen nicht ausreichend Stabilität und kann jenes Manko nicht ersetzen. Aufgrund dieser Nachteile ist der Einsatz von PHP auf einem reinen Applikationsserver weniger geeignet. Da der business state (der „Status“ der Applikation zu einem bestimmten Zeitpunkt) über längere Zeit erhalten bleiben muss – auch außerhalb einzelner HTTP-Anfragen – ist ein PHP-basierter Applikationsserver prinzipiell tabu. Im Allgemeinen sind alle Skriptsprachen für Applikationen mit aufwändiger business logic ungeeignet, da die Laufzeit zur Ausführung des Skripts begrenzt ist. PHP ist hingegen für den Einsatz im Frontend (Web-tier) bestens geeignet. Die größte Stärke von PHP liegt in der Generierung von dynamischen Webseiten. Skriptsprachen und vor allem jene, die Skriptlet-Elemente unterstützen (damit ist die Einbettung von Code-Elementen innerhalb einer HTML-Datei gemeint, wie sie auch bei JSP-Seiten möglich ist) bieten im Web-Einsatz einige Vorteile. Zudem müssen Skriptdateien nicht ständig neu kompiliert werden. Jenes Ausmaß an Applikationslogik, welches im Web-tier benötigt wird, kann auch sehr gut mit PHP realisiert werden. Durch die zahlreichen Integrationsmöglichkeiten können verschiedenste externe Ressourcen angebunden werden. 1.4.3 Kosten Der große Vorteil von PHP (meist in Verbindung mit dem Open Source Datenbanksystem MySQL14 ) ist immer noch der weitverbreitete Einsatz auf Servern von Webspace-Providern (siehe Abbildung 1.4). Heute findet sich kaum noch ein Webspace ohne PHP/MySQL-Unterstützung. Die PHP/MySQL-Kombination ist momentan die kostengünstigste Lösung für dynamische Websites mittlerer Größe. Viele Webapplikationen mittlerer Komplexität können auch ohne kostenintensivem Applikationsserver in einer zusätzlichen Mittelschicht (Middle-tier), implementiert werden. Vor allem in Zeiten stagnierender Konjunktur, welche insbesondere im IT-Sektor momentan sehr stark zu spüren ist, spielen die Entwicklungskosten 13 Hartmut Holzgraefe begann 2001 die Entwicklung einer Extension für die Anbindung an SAP/R3-Systeme. Das Projekt ist unter http://saprfc.sourceforge.net zu finden. 14 Siehe http://www.mysql.com. KAPITEL 1. EINLEITUNG UND MOTIVATION 7 Abbildung 1.4: Anzahl an Hosts mit Unterstützung von PHP. Aus [The03b]. derartiger Anwendungen eine entscheidende Rolle. Die Kosten von PHP-Lösungen sind für den Endkunden in der Regel niedriger als beispielsweise für Java-Lösungen, da viele PHP Extensions und Bibliotheken gratis zur Verfügung stehen [Sch03]. Ist eine aufwändige business logic gefordert, kann diese auch integriert werden. Eine derartige Lösung würde beispielsweise den Anforderungen vieler Klein- und Mittelunternehmen genügen. Um die Vorteile von PHP nocheinmal zu summieren: • PHP ist plattformunabhängig und unterstützt zahlreiche Webserver. • PHP hat eine sehr gute Performance. • Die Implementierung ist kostengünstig. • PHP bietet umfangreiche Funktionalität und ist erweiterbar. • PHP ist auf Servern von Webspace-Providern sehr weit verbreitet. • PHP wird sich vorraussichtlich noch weiter verbreiten. 1.4.4 PHP Version Die Implementierung des DaVinci Frameworks erfolgte in der Version 4.3.x. Mit Version 4 werden grundlegende Funktionen der objektorientierten Programmierung unterstützt. Ab der Version 4.3 wird der PEAR-Installer, mit dem sich Pakete des PEAR Projektes15 bequem per Kommandozeile verwalten lassen, mitgeliefert. Da das DaVinci Framework einige dieser Pakete bzw. diverse Befehle die erst ab Version 4.3 zur Verfügung stehen, verwendet, fiel die Entscheidung auf die Version 4.3.x. Frühere Versionen werden nicht mehr unterstützt. Natürlich wäre eine Implementierung mit PHP5 und der neuen Zend Engine 2 [Zen01] (siehe auch http://www.zend.com/zend/future.php und http://www.php. 15 Das PEAR Projekt bietet eine umfangreiche Bibliothek an Erweiterungen und Klassen und gibt unter anderem auch Notations- und Dokumentationrichtlinien vor. Siehe dazu http://pear.php.net. KAPITEL 1. EINLEITUNG UND MOTIVATION 8 net/zend-engine-2.php) wünschenswert. Da die Entwicklung eines stabilen PHP5 Release noch einige Monate in Anspruch nehmen wird, und eine Implementierung mit nicht getestetem Code zu viel Zeit in Anspruch nehmen würde, wurde von dieser Möglichkeit jedoch abgesehen. Außerdem wird es nach der Veröffentlichung mindestens noch ein Jahr dauern, bis sich PHP5 auch bei Webservice Providern durchgesetzt hat. Es wurde aber dennoch versucht, die Klassen bereits im Hinblick auf die neuen Fähigkeiten von PHP5 zu erstellen um zu einem späteren Zeitpunkt das Framework leichter portieren zu können. 1.5 Kapitelbeschreibung Die vorliegende Arbeit unterteilt sich in sieben Kapitel. Das erste Kapitel dient zur Motivation und führt in das Thema der Arbeit ein. Im zweiten Kapitel wird die eigentliche Problemstellung erörtert. Zu Beginn wird der Begriff Framework im gegebenen Kontext definiert. Anschließend werden Anforderungen an ein solches Framework für Webapplikationen besprochen. Schließlich werden einige existierende Projekte für Java und PHP erwähnt. Der Inhalt des dritten Kapitels beschreibt Modellierungskonzepte welche die Entwicklung von Webapplikationen unterstützen. Solche Konzepte sind als Grundlage für ein Framework von entscheidender Bedeutung. Es wird unter anderem auf die Wichtigkeit der Modellierung und des gesamten Entwicklungsprozesses, welcher neuerdings auch mit dem Begriff Web Engineering bezeichnet wird, hingewiesen. Zwei Modellierungskonzepte werden näher beleuchtet: OOHDM (Object-oriented Hypermedia Design Method) [RSG99] als Repräsentant eines aus der Hypermedia-Domäne stammenden Konzepts und das Konzept nach Jim Conallen [Con03], welches eher der Software Engineering Domäne entspringt. Abschließend wird versucht ein einfaches Modellierungskonzept zu finden, welches auf Basis von UML für das Framework eingesetzt werden kann. In Kapitel vier wird das DaVinci Framework entworfen. Ausgehend von den Erkenntnissen aus Kapitel vier wird die Architektur mit ihren Komponenten spezifiziert. Die einzelnen Komponenten zur Benutzerinteraktion, Applikationslogik, Darstellung von Inhalten und Datenhaltung werden in einzelnen Abschnitten erläutert. Die Demonstration des Frameworks anhand einer kleinen Webapplikation ist Inhalt des fünften Kapitels. Es wird eine Art „persönliche Startseite“ entwickelt, welche als Startseite im Browser eingerichtet werden kann und neben einer definierbaren „Homepage“ ein Adressbuch und eine Link-Datenbank zur Verfügung stellt. Im sechsten Kapitel wird das Framework anhand der im zweiten Kapitel definierten Anforderungen evaluiert. Es werden außerdem einzelne Stärken und Schwächen aufgezeigt. Das letzte Kapitel schließt die Arbeit mit einem Ausblick ab. Da beabsichtigt wird das Framework als Open Source Projekt weiterzuentwickelen wurden einige Erweiterungsmöglichkeiten beschrieben, welche in Zukunft implementiert werden sollen. Die Zusammenfassung bietet einen abschließenden Überblick über die vorliegende Diplomarbeit. Kapitel 2 Problemstellung Ein Framework für Webapplikationen soll die Implementierung eines möglichst breiten Spektrums an Szenarien ermöglichen. Es muss eine grundlegende Softwarearchitektur auf Basis von bewährten Entwurfsmodellen geschaffen werden. Unter Verwendung des Frameworks soll der Entwickler nicht mehr mit alltäglichen Aufgaben wie Entgegennahme von HTTP-Anfragen, Session-Behandlung, Datenbankverbindung, etc. konfrontiert werden, sondern er soll Webapplikationen auf einer höheren Ebene modellieren können. Einmal implementierte Komponenten sollten außerdem für weitere Projekte adaptiert werden können. 2.1 Begriffsdefinition: Framework Das Oxford Quick Reference Dictionary [Tho96] übersetzt das Wort Framework kurz als „Essential supporting structure, basis system“ (zu Deutsch: essentielles, unterstützendes Gerüst, Basissystem). Diese einfache Übersetzung ist eigentlich schon sehr aussagekräftig, denn ein Framework ist im Allgemeinen nichts anderes, als ein Grundgerüst. Das Grundgerüst einer Baustelle, das Skelett eines Menschen oder aber auch die einer Applikation zugrundeliegende Architektur werden im Englischen als Frameworks bezeichnet. IBM versteht unter einem Applikationsframework folgendes [FV01]: „An application framework describes a set of interacting components and services available to an application, describes the responsibilities of components and services, and describes the interactions between the components and services. A developer creates an application by composing and extending the components and services available in the application framework.“ Demnach besteht ein Framework aus verschiedenen Softwarekomponenten, die interagieren und voneinander abhängig sind und vom Entwickler je nach Bedarf zusammengesetzt und erweitert werden können. Die folgende Beschreibung eines Framework (hier konkret: Web-tier application framework) ist noch eine Spur restriktiver und erhebt denn zusätzlichen Anspruch, einer der Applikation zugrundliegenden Softwarearchitektur [SSJ02, Seite 92]. Die Definition ist in diesem Kontext zwar speziell auf Java ausgerichtet, sie ist jedoch generell von Bedeutung: 9 KAPITEL 2. PROBLEMSTELLUNG 10 „A Web-tier application framework sits on top of the J2EE platform, providing common application functionality such as dispatching requests, invoking model methods, and selecting and assembling views. Framework classes and interfaces are structural; they are like the load-bearing elements of a building, forming the application’s underpinnings. Application developers extend, use, or implement framework classes and interfaces to perform application-specific functions. For example, a framework may offer an abstract class that a developer may extend to execute business logic in response to application events. A Web-tier application framework makes Web-tier technologies easier to use, helping application developers to concentrate on business logic.“ Ins Deutsche übersetzt, ist ein Web-tier application framework hier jene Schicht, welche auf einem (hier: Java-basiertern) Applikationsserver aufsetzt und von dort aus grundlegende Funkionalität für die Interaktion zwischen dem Browser und dem Applikationsserver bereitstellt. Dazu gehören unter anderem die Behandlung eingehender HTTP-Anfragen, das Ausführen von Funktionen in den richtigen Komponenten und schließlich die Auswahl der entsprechenden Ansicht (HTML-Seite), welche dem Benutzer nach der Interaktion zur Verfügung gestellt wird. Alle Klassen des Frameworks sind strukturell aufgebaut und können vom Entwickler je nach Anforderung erweitert und adaptiert werden. 2.2 Anforderungen an ein Framework für Webapplikationen Ein Framework für Webapplikationen muss eine rasche und kostengünstige Implementierung von Webapplikationen ermöglichen, sollte in der Praxis leicht anzuwenden sein und muss für eine Vielzahl an möglichen Applikationsszenarien tauglich sein. Das Framework sollte zudem nicht nur eine Bibliothek an Klassen und Komponenten bereitstellen, sondern auch eine grundlegende Architektur vorgeben. Die Architektur muss auf bewährte Modelle des Hypermedia- und Software Engineerings zurückgreifen. Die Modellierung neuer Anwendungen auf Basis des Frameworks soll in Folge auf einer höheren Ebene möglich sein. 2.2.1 Handhabung und Effizienz Um auch für den praktischen Einsatz tauglich zu sein, darf das Framework nicht bloß in der Theorie funktionieren. Gefordert wird nicht nur eine einfache Handhabung, sondern auch eine möglichst hohe Effizienz bei der Implementierung neuer Anwendungen auf Basis des Frameworks. Es kann allerdings keine Umgebung geben, die für alle nur denkbaren Problemstellungen Lösungen bietet. Es muss daher ein Kompromiss zwischen den Möglichkeiten des Frameworks und seiner Praxistauglichkeit und Handhabung gefunden werden. Das Framework soll vor allem auch den Modellierungsprozess neuer Applikationen unterstützen, da mit dem Framework als Basis nicht mehr jedesmal ganz von vorne begonnen werden muss. Die Modellierung muss auf einer höheren Ebene stattfinden können, wodurch sich in Folge Zeit und Kosten einsparen lassen. Für das DaVinci Framework wird ein Vorschlag für ein solches Konzept auf Basis von UML entwickelt. KAPITEL 2. PROBLEMSTELLUNG 2.2.2 11 Erweiterungs- und Integrationsmöglichkeiten Vor allem bei einem Einsatz einer eigenen Web-tier Schicht, müssen verschiedene externe Ressourcen, wie Datenbanksysteme oder (Java-basierte) Applikationsserver integriert werden können. Insbesondere B2B-Applikationen erfordern oft die Integration fremder Ressourcen. Um die Integrationsmöglichkeiten zu gewährleisten, sollten wenn möglich stets offene Standards verwendet werden. Dadurch werden Kompatibilität, eine gute Akzeptanz und Zukunftssicherheit erreicht. Die Umgebung soll des Weiteren Möglichkeiten für zukünftige, zusätzliche Erweiterungen anbieten. Die Architektur muss daher so entworfen werden, dass zusätzliche Komponenten zu einem späteren Zeitpunkt integriert werden können. 2.2.3 Sicherheitsaspekte Der Einsatz von Webapplikationen erfordert, vor allem auch für geschäftliche Anwendungen, die Einbeziehung bestimmter Sicherheitsrichtlinien1 . Sicherheitsaspekte sind unter anderem Zugriffsbeschränkungen für bestimmte Interaktionen, Authentifizierung des Benutzers und die Verschlüsselung von sensiblen Daten bei der Übertragung zwischen Client und Server. Für die Authentifizierung kann sich eine Webapplikation das im HTTP-Protokoll bereits vorgesehene Authentifizierungskonzept, welches z.B. von Apache unterstüzt wird, zu Nutze machen [Cym00]. Die Zugriffsbeschränkung muss durch eine geeignete Benutzer- und Rechteverwaltung realisiert werden. Sinnvoll scheint hier auch die Integration von offenen Standards wie etwa LDAP2 . Die Verschlüsselung zwischen Client und Server kann beispielsweise über das SSL-Protokoll stattfinden. 2.3 Bestehende Frameworks für Webappikationen Für die Recherche wurden PHP- und Java-basierte Projekte betrachtet. Man erkennt nach kurzer Zeit, dass es unter Entwicklern unterschiedliche Vorstellungen gibt was ein Framework im Detail nun ausmacht. So beschränken sich vor allem viele PHPbasierte Frameworks lediglich auf eine Ansammlung von Klassen, die wiederverwendbare Utilites enthalten. Wo manche Entwickler derartige Klassenbibliotheken bereits als Framework bezeichnen, ist für andere ein Framework eine grundlegende Applikationsarchitektur, nach der HTTP-Anfragen abgearbeitet und Seiten dargestellt werden. Es fällt auf, dass viele Java-Lösungen eher den zweiten Anspruch erheben. Viele Java Frameworks basieren bereits auf dem Model-View-Controller Pattern3 (kurz MVC) [SSJ02, Kap. 11.1.1] und sind modular aufgebaut. Dieser MVC Pattern gliedert Applikationen in drei Schichten: das model beschreibt und verwaltetet Daten, views repräsentieren Daten und stellen Benutzerschnittstellen zur Verfügung, und der controller übernimmt Benutzeranfragen und steuert die Interaktion und Manipulation der Daten (siehe dazu Abschnitt 3.4.3). 1 Siehe The Open Web Application Security Project: http://www.owasp.org. Mit dem Lightweight Directory Access Protocol (LDAP) ist die Verwendung eines standardisierten, öffentlichen, gemeinsamen Adressbuches (Verzeichnisdienst) möglich. Siehe http://www. openldap.org bzw. [WHK97]. 3 Sogenannte Software design patterns dienen als Lösungsmuster für immer wiederkehrende Problemstellungen bei der Softwareentwicklung. 2 KAPITEL 2. PROBLEMSTELLUNG Projekt Ampoliros Ariadne BinaryCloud Blueshoes eXtreme PHP Horde Liquid Bytes Netautor 12 Internetadresse http://www.ampoliros.com http://freshmeat.net/projects/ariadne http://www.binarycloud.com http://www.blueshoes.org http://www.extremephp.org http://www.horde.org/horde http://www.liquidbytes.net http://www.netautor.com Tabelle 2.1: PHP-basierte Frameworks für Webapplikationen. Da Java von Grund auf objektorientiert ist, ist man von vornherein an eine ordentliche Klassenstruktur gebunden. Doch es gibt auch einige PHP Projekte, die zur Gänze objektorientiert programmiert sind und zumindest teilweise auch auf Basis des MVC Patterns entworfen wurden. 2.3.1 Frameworks für PHP Es verwundert nicht, dass gerade für PHP sehr viele Projekte zu finden sind. PHP kann leicht erlernt werden und hat dadurch auch sehr viele Hobbyprogrammierer angezogen. Aber noch weniger überrascht, dass wirklich gute Lösungen für PHP kaum vorhanden sind. In Tabelle 2.1 sind einige Projekte von PHP-basierten Frameworks aufgelistet. Eine Auswahl davon wird im Folgenden kurz näher betrachtet. BinaryCloud Dennoch gibt es einige professionelle PHP-Lösungen, welche auch im E-Business erfolgreich eingesetzt werden. Ein Beispiel dafür ist das Open Source Framework BinaryCloud, welches im April 2000 von der kalifornischen Firma Touring Studio4 initiert wurde. Mittlerweile beteiligen sich an dem Projekt mehrere IT-Firmen. Die Idee von BinaryCloud entspringt einer relativ abstrakten Analyse von dynamischen Websites. Der Inhalt einer Website wird hier in mehrere nodes zerlegt, welche in Summe eine hierarchische application pipeline bilden. Es gibt application nodes, widgets und entities. Application nodes sind kompakte Teile der Website, wie zum Beispiel die Navigation, ein Container mit News oder Formulare. Widgets stellen Interaktionselemente, wie z. B. Formularelemente dar. Entities repräsentieren Objekte der Applikationslogik (business objects) und werden mehr oder weniger durch eine Datenbank-Relation und einigen Funktionen implementiert. Für alle drei nodes gibt es vordefinierte Komponenten, die adaptiert und erweitert werden können. Das Framework verwendet für jegliche Definitionen XML als Beschreibungssprache. Als Template Engine wird Smarty5 verwendet. Es ist aber laut Dokumentation auch die Ausgabe über eine XSL-Transformation möglich. Die Klassen sind zur 4 5 Die Homepage der Firma ist unter http://www.turingstudio.com erreichbar. Smarty ist die bekannteste Template Engine für PHP. Siehe http://smarty.php.net. KAPITEL 2. PROBLEMSTELLUNG Name Sprache Beschreibung Projekt-URL Lizenz Charakteristik Features Besonderheit Schwächen Anwendungen 13 BinaryCloud PHP4 Das Projekt wurde 2000 gestartet. Es wird nun von mehreren vorwiegend kalifornischen IT-Unternehmen weiterentwickelt. Es hat bei der Recherche den besten Eindruck unter den PHP Projekten hinterlassen. http://www.binarycloud.com GNU Lesser General Public License Das Framework ist von Grund auf objektorientiert. Websites werden in mehrere funktionelle Komponenten (nodes) hierarchisch unterteilt. Nodes sind beispielsweise Unterbereiche auf einer Seite (application nodes), Interaktionselemente (widgets) oder entities welche in Datenbanken gespeichert werden. Das Framework ist sehr komplex und unvollständig dokumentiert. Metabase als Datenbank-Abstraktionsschicht (siehe http:// freshmeat.net/projects/metabase) Lokalisation vordefinierte Widgets Template Engine: Smarty, XSLT Authorisierungskonzept Caching der Ausgabe Exception Handling BinaryCloud ist eines der wenigen Frameworks, deren Architektur sich auch um die Entgegennahme der HTTP-Anfragen und die Strukturierung der Webapplikation kümmert. Es wird somit der Bezeichnung Framework am Besten gerecht. Als Schwäche lässt sich bloß die wirklich hohe Komplexität anführen und die schlechte Dokumentation. Die beteiligten Firmen verwenden das Framework selbst intensiv für ihre eigenen Produkte. Tabelle 2.2: BinaryCloud Steckbrief. Gänze mit PHPDoc6 dokumentiert und bereits so programmiert, dass der bevorstehende Umstieg auf PHP5 möglich ist. Tabelle 2.2 enthält eine Auflistung der Funktionen von BinaryCloud. Da das Framework relativ komplex und die öffentliche Dokumentation unvollständig ist, ist die Adaption des Projektes äußerst schwierig. Ohne Mailingliste und Kontakt zu den Entwicklern ist die Verwendung des Frameworks beinahe unmöglich. Das Framework und vor allem der Programmierstil hinterließen aber insgesamt einen sehr guten Eindruck. 6 PHPDoc ist ein Port der Javadoc Dokumentations-API für PHP. Die Homepage des Projekts ist unter http://www.phpdoc.de zu finden. KAPITEL 2. PROBLEMSTELLUNG 14 Horde Das Horde Projekt wurde hauptsächlich durch den relativ weit verbreiteten Webbasierten E-Mail Client Horde IMP bekannt. Das Projektteam bezeichnet die Basisklassen des Projekts selbst als Horde Application Framework. Dieses Framework stellt Basisfunktionen und Werkzeuge für alle weiteren Applikationen zur Verfügung. Eine Applikationsarchitektur wird vom Framework nicht vorgegeben. Das Projekt umfasst bereits zahlreiche Webapplikationen. Es gibt unter anderem einen E-Mail Client, einen CVS-Browser und einen Terminplaner. Die Homepage des Projekts ist unter der Adresse http://www.horde.org erreichbar. Blueshoes Das Blueshoes Framework bietet umfangreiche Funktionen und einige Applikationen welche des Framework verwenden. Darunter befinden sich ein Content Management System, eine Shop-Lösung, ein Bildarchiv und ein Web-basierter Dateimanager. Das Projekt wird von zwei Schweizer Firmen betrieben und wird unter einer Open Source und einer kommerziellen Lizenz angeboten. Im Vergleich zu BinaryCloud is das Framework eine reine Klassenbibliothek und es erscheint auch etwas veraltet. Es sind keine XML-Standards wie XSLT, WDDX oder SOAP implementiert. Es gibt bloß einen einfachen XML-Parser, der jedoch von keiner Komponente verwendet wird. Es wird auch keine generelle Applikationsarchitektur definiert, nach der die Interaktion abläuft. Vielmehr handelt es sich ähnlich wie bei Horde um eine Ansammlung von zur Verfügung stehenden Komponenten. Auffallend ist beim Blueshoes Framework die übertriebene Anlehnung an Java. So wird jedes Objekt von der Basisklasse bs_Object abgeleitet, was sehr oft keinen Sinn macht. Das Framework wurde mit dem PHP Debugger 7 unter die Lupe genommen und hat eine relativ schlechte Performance. Grund dafür ist die große Anzahl von Klassen, wobei jede Klasse als eigenes Skript mit jeder HTTP-Anfrage neu geladen werden muss. Tabelle 2.3 zeigt einen Steckbrief des Frameworks. php.MVC Das php.MVC Projekt ist eine sehr interessante Adaption des Java Servlet Paradigmas für PHP und basiert auf dem MVC Model 2 Design Pattern (siehe Abschnitt 3.4.3). PHP-Skripte die für die Darstellung verantwortlich sind (vgl. JSP-Seiten) und alle statischen Daten wie etwa Grafiken, werden im Hauptordner einer Webapplikation platziert. Alle Klassen und Bibliotheken werden in einem Unterorder namens „WEB-INF/“ bereitgestellt. Und schließlich gibt es auch eine XML-Datei in diesem Unterordner, mit der die Webapplikation konfiguriert wird. Das Framework wurde im Juni 2002 auf SourceForge.net von John Wildenauer gestartet. Zur Zeit ist eine Anwendung für komplexe Webapplikationen noch eher unrealistisch. Doch die Projektaktivität nimmt laut Statistik, welche auf SourceForge.net zur Verfügung steht, stetig zu. Da das Framework von Grund auf durchdacht ist, lässt sich seine künfigte Bedeutung vermuten. Dem Projekt fehlen momentan hauptsächlich noch Möglichkeiten zur komplexen Darstellung und Verschachtelung von Ansichten. Ohne diese ist beispielsweise die Realisierung eines Content 7 Dieser Debugger wird als Extension in den PHP-Interpreter kompiliert und kann anschließend fürs Debugging und Profiling von PHP-Skripts verwendet werden. Siehe http://dd.cron.ru/dbg. KAPITEL 2. PROBLEMSTELLUNG Framework Sprache Beschreibung Projekt-URL Lizenz Charakteristik Features Besonderheit Schwächen Anwendungen BlueShoes PHP4 Dieses Framework ist eine Co-Produktion der beiden Schweizer Firmen Optimaize GmbH und Infeer GmbH. Es besteht aus einer umfangreichen Klassenbibliothek und gibt der Webapplikation keine generelle Architektur vor. http://www.blueshoes.org Open Source, Commercial Die Klassen wurden sehr in Anlehnung an Java implementiert und bieten eine umfangreiche Bibliothek an Funktionen. Eine PHPDoc Dokumentation ist, wenn auch nicht ganz vollständig, vorhanden. eigene Datenbank-Abstraktionsschicht Dateisystem-Funktionen Microsoft Excel-Konverter Chart-Grafiken und Text-Renderer Formular Funktionen mit komplexen Formular-Objekten Netzwerkfunktionen E-Mail Funktionen (inkl. MIME Unterstützung) Exception Handling Im Großen und Ganzen sticht keine besondere Funktion hervor, die das Framework als einzigartig kennzeichnen könnte. Bemerkenswert ist allerdings wohl der von Java übernommene Stil, indem alle PHP-Klassen implementiert wurden. Teilweise übertriebene Adaption von Java. So werden zum Beispiel alle (auch die einfachen) Objekttypen in Klassen gekapselt, die von der Basisklasse Bs_Object (vgl. java.lang.Object) abgeleitet werden, wodurch ein relativ großer, unnötiger Overhead entsteht. Außerdem besteht das Framework auch nur aus einigen Paketen und Klassen, ohne jedoch eine grundlegende Architektur zu definieren. Eine weitere Schwäche ist die unsaubere und unvollständige PHPDoc Dokumentation. Blueshoes bietet auf seiner Webseite selbst Anwendungen auf Basis des Frameworks zum Kauf an. So gibt es laut Webseite u.a. ein Content Management System, einen Web-basierten Datenbank-Editor, ein Shop, einen Dateimanager und ein Bildarchiv. Tabelle 2.3: BlueShoes Framework Steckbrief. 15 KAPITEL 2. PROBLEMSTELLUNG Framework Sprache Beschreibung Projekt-URL Lizenz Charakteristik Features Besonderheit Schwächen Anwendungen 16 php.MVC PHP4 Das Projekt ist dem Apache Struts Framework für Java relativ ähnlich. Es basiert auf dem MVC Model 2 Design Pattern. http://phpmvc.sourceforge.net GNU General Public License Das Framework ist sehr stark an das Java Servlet Paradigma angelehnt. Für komplexe Webapplikationen erscheint das Projekt momentan noch nicht genug ausgereift. Es existieren auch noch keine brauchbaren Applikationen die auf dem Framework aufsetzen. Aufgrund des durchdachten Konzepts, lässt sich seine zukünfigte Bedeutung neben anderen Projekten vermuten. Trennung von Funktionalität und Darstellung Formbeans Datenobjekte und Datenbank-Unterstützung Konfiguration über eine XML-Datei Werkzeuge für Datumsfunktionen, Dateisystem, etc. Das Framework adaptiert das Java Servlet Paradigma. Die vollständige MVC Implementierung ermöglicht eine effektive Trennung von Daten, Funktionalität und Ansichten. Alle HTTP-Anfragen werden über einen sogenannten FrontController an die zuständige Aktion weitergeleitet. Das Projekt ist zum jetzigen Zeitpunkt noch zu wenig ausgereift um für komplexe Anwendungen herhalten zu können. Es gibt auf der Projekt-Homepage drei kleine beispielhafte Applikationen. Diese dienen bloß zur Demonstration des Framework. Tabelle 2.4: php.MVC Framework Steckbrief. Management Systems unmöglich. Weitere Informationen sind im Steckbrief in Tabelle 2.4 zu finden. 2.3.2 Frameworks für Java Für Java sind ebenfalls Frameworks mit jeweils sehr unterschiedlicher Ausrichtung und Funktionsumfang verfügbar. In Tabelle 2.5 sind einige Java Frameworks für Webapplikationen aufgelistet. Das Projekt Tapestry 8 (ein Unterprojekt von Apache’s Jakarta-Entwicklung9 ) ermöglicht die Programmierung von Webapplikationen mit Hilfe von wiederverwendbaren Objekten, Methoden und Eigenschaften, anstatt einzelne HTML-Seiten, Servlets und JSP-Seiten manuell verknüpfen zu müssen. Auch das Struts Projekt10 der Apa8 Siehe http://jakarta.apache.org/proposals/tapestry. Siehe http://jakarte.apache.org. 10 Siehe http://jakarta.apache.org/struts. 9 KAPITEL 2. PROBLEMSTELLUNG Projekt ActionServlet Apache Cocoon Apache Struts Apache Turbine Barracuda Expresso IBM Sash JOT JPublish JWIG KONA Maverick OpenSymphony Sun JATO Wafer Project 17 Internetadresse http://www.actionframework.org http://xml.apache.org/cocoon http://jakarta.apache.org/struts http://jakarta.apache.org/turbine http://barracuda.enhydra.org http://www.jcorporate.com/html/products/expresso.html http://sash.alphaworks.ibm.com http://www.jotobjects.com http://www.jpublish.org http://www.brics.dk/JWIG http://www.aki.com/kona http://mav.sourceforge.net http://www.opensymphony.com/webwork http://developer.iplanet.com/tech/appserver/framework http://www.waferproject.org Tabelle 2.5: Java Frameworks für Webapplikationen. che Foundation verfolgt ein ähnliches Ziel. Beiden Projekten liegt der MVC Design Pattern zugrunde. Die beiden Projekte sind steckbriefartig in den Tabellen 2.6 und 2.7 beschrieben. 2.3.3 Ergebnis der Analyse Es läßt sich feststellen, dass es für PHP kein professionelles, objektorientiertes lowlevel Framework gibt. Die vorhandenen Projekte beschränken sich großteils auf Klassenbibliotheken. Das BinaryCloud und das php.MVC Projekt sind die einzigen beiden Frameworks welche auch eine grundlegende Architektur definieren. Die wenigsten PHP-basierten Frameworks sind objektorientiert und php.MVC ist vermutlich das einzige Projekt, welches auf dem MVC-Pattern basiert. Das Projekt ist aber zur Zeit in der Praxis noch keineswegs einsatzfähig. Diese Feststellung dient zusätzlich als Motivation zur Entwicklung eines objektorientierten low-level Frameworks für PHP. KAPITEL 2. PROBLEMSTELLUNG Framework Sprache Beschreibung Projekt-URL Lizenz Charakteristik Features Besonderheit Schwächen Anwendung Anmerkungen Struts Java Framework auf Basis von MVC Model 2 http://jakarta.apache.org/struts Apache Software License 1.1 Struts besteht aus drei Hauptkomponenten: einem Servlet Controller, JSP Seiten (views) und der business logic (model). Alle HTTP-Anfragen werden über den Servlet Controller abgesetzt, welcher anschließend entsprechende Aktionen in der business logic ausführt und zu JSP-Seiten weiterleitet. Implementierung durch abgeleitete JavaBeans, ActionKlassen und JSP-Seiten Errorhandling (inkl. Anzeigen) JSP-Form Beans und Custom Tags Internationalisierung (Java built-in) zahlreiche Extensions sind verfügbar (v.a. Taglibs) Struts verwendet den MVC-Pattern von Grund auf und ist dadurch sehr universell einsetzbar. Außerdem wird Struts, wie man aus einigen Foren und Artikeln im Internet erfährt, relativ gut von Entwicklern aufgenommen, was für die Zukunft breite Akzeptanz, Integration und Weiterentwicklung bedeutet. Es gibt keine höhere Entwicklungsunterstützung (Wizards, etc.). Alle Objekte, Klassen und Views müssen durch Ableitung von abstrakten Klassen erst implementiert werden. Da Struts als leightweight Framework bloß grundlegende Funktionalitäten erfüllt bzw. nur die Architektur der Webapplikation vorgibt und für bestimmte Anwendungen erst erweitert werden muß, können mit Struts so gut wie alle nur denkbaren Applikationen geschaffen werden. Sinnvoll ist der Einsatz vor allem dann, wenn bereits ein J2EE-Server im Einsatz ist. Das Projekt Expresso von Jcorporate (http://www.jcorporate. com/html/products/expresso.html) erweitert Struts um wichtige Features für Sicherheit, Logging, Backgroundjobs, Datenbank-Verbindungspools, E-Mail, Caching, Internationalisierung, Workflow Management, etc. Tabelle 2.6: Struts Framework Steckbrief 18 KAPITEL 2. PROBLEMSTELLUNG Framework Sprache Beschreibung Projekt-URL Lizenz Charakteristik Features Besonderheit Schwächen Anwendungen Tapestry Java Framework auf Basis des MVC Patterns, ähnlich wie Struts. Tapestry wurde im Jänner 2003 ins Apache Jakarta Projekt aufgenommen und genießt zur Zeit noch die Proposal-Phase. http://jakarta.apache.org/proposals/tapestry Apache Software License 1.1 Bei Tapestry werden wie bei Struts alle HTTP-Anfragen über ein zentrales ApplicationServlet ausgeführt, welches die nötigen Action-Klassen ausführt. Zur Anzeige werden HTML-Dateien, welche Tapestry Template-Scripts enthalten verarbeitet und an den Browser zurückgesendet. Die Implementierung erfolgt in Form von wiederverwendbaren Objekten, Methoden und Parametern (Ableitung von BaseComponents, BasePages, etc.) Alle Komponenten werden mittels XML-Datein, HTMLTemplates und abgeleiteten Klassen erstellt. Die URL-Generierung und der page-flow erfolgen im Hintergrund transparent. Internationalisierung Java Script/DHTML Support: es gibt eine umfangreiche Auswahl an dynamischen HTML-Komponenten (FormulareElemente wie z.B. eine Mehrfachauswahl mit zwei Listboxen). Die nötigen JavaScripts und Formular-tags werden automatisch zusammengestellt. Proprietäre Skriptsprache in den HTML-Templates anstelle von Custom Tags Durch die umfangreichen Template-Funktionen und der DHTML-Unterstützung eignet sich Tapestry hervorragend für komplexe GUI-Frontends von Applikationen. Außerdem macht sich auch die Verwendung wiederverwendbarer Komponenten langfristig bezahlt und man behält bei größeren Projekten leichter die Übersicht. Der Einsatz von Tapestry lohnt sich v.a. dann, wenn die restliche Applikationslogik bereits auf einem J2EE-Server läuft. Tabelle 2.7: Tapestry Framework Steckbrief 19 Kapitel 3 Entwicklung von Webapplikationen Dieses Kapitel behandelt Entwicklungskonzepte und Entwurfsmethoden des Web Engineerings. Es wird vorerst auf die Wichtigkeit der Planung und Modellierung von Webapplikationen hingewiesen und anschließend konkret auf Konzepte eingegangen. Handelt es sich um komplexe Webapplikationen (im Gegensatz zu einfacheren Websites), werden Lösungsmuster des Software Engineerings immer wichtiger. Neuere Konzepte stützen sich deshalb auf das aus Smalltalk bekannte MVC-Paradigma. Das im Rahmen der Arbeit entwickelte DaVinci Framework basiert im Übrigen auch auf diesem Konzept. Am Ende des Kapitels wird versucht, die Komplexität der Modellierung und Implementierung durch Eliminierung des Hyper-Paradigmas (der Verknüpfung von Ressourcen jeglicher Form in einem weltweiten Netz aus Hyperlinks) zu vereinfachen. So wird für die Darstellung das aus der Computergrafik bekannte SzenengraphenModell adaptiert. Die Modellierung der Hypertext-Ebene (der netzartigen Navigationsstruktur) wird durch die Verlagerung der Navigation in die Applikationslogik mit Methoden des traditionellen Software Engineerings ermöglicht. Zuletzt werden einige Ideen für ein UML-basiertes Modellierungskonzpet für DaVinci-basierte Webapplikationen vorgestellt. 3.1 Web Engineering Web-basierte Applikationen erfuhren in den letzten Jahren einen starken Zuwachs, sowohl im Gebrauch als auch in ihrer Akzeptanz. Doch die Entwicklung solcher Systeme erfolgte bislang eher planlos, was sich meist später in der Qualität der Produkte bemerkbar machte [Ude02]. Ein ingenieursmäßiger Ansatz, wie er an sich in jeder Branche gefordert wird, fehlte bislang in diesem Bereich. Durch die einerseits noch relativ junge Technologie und dem raschen Marktwachstum, wurde in kurzer Zeit viel entwickelt, produziert und verkauft, ohne dieses komplexe System überhaupt richtig verstanden zu haben [PSRO02]. Es gibt im Übrigen einige Begriffe in der Branche, die nicht ganz klar definiert sind. Dazu gehören etwa Webdesign, Web-Entwicklung oder das Web Engineering. Ohne nun eine Begriffsdefinition im Detail anzustellen, sei angemerkt, dass sich letztere Bezeichnung auf das Ingenieurwesen, welches hinter der Entwicklung von Web20 KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 21 basierten Anwendungen steckt, bezieht. Wie auch im Software Engineering sind Techniken zur Entwicklung von Webapplikationen und einheitliche Qualitätsstandards gefordert. Es bedarf einerseits Modellen und Techniken, die zum Verständnis der Komplexität einer vorhandenen Problemstellung dienen und andererseits Techniken, die den Prozess der Entwicklung unterstützen [Ude02]. Einige wichtige Aspekte des Web Engineerings, welche sehr oft unterschätzt wurden sind: Der Engineering Prozess: Um die Entwicklung planen und organisieren zu können, bedarf es eines Prozesses, der alle Phasen, Schritte und Aktivitäten der Entwicklung festlegt [GM01, S. 22]. Dieser Aspekt wurde noch am ehesten beachtet, da er vom traditionellen Projektmanagement ausgeht. Trotz allem gibt es zumeist in der zeitlichen Planung noch Schwierigkeiten. Diese Tatsache lässt sich vermutlich auch auf unzureichende technische Planung und Modellierung der Applikation zurückführen. Projektmanagement alleine ist kein Patentrezept. Die Modellierung: Dieser Aspekt ist Teil des Engineering Prozesses. Um die Komplexität einer Webapplikation verstehen zu können, ist der Entwurf und die Modellierung des Systems vor der eigentlichen Implementierung von entscheidender Bedeutung. Die Wichtigkeit dieses Aspekts wurde im Entwicklungsprozess bislang am meisten unterschätzt. Sehr oft wurde bereits nach der Anforderungsanalyse direkt bei der Implementierungsphase fortgesetzt. Ad-hoc Methoden werden sich aber auf Dauer nicht halten können [REL01]. Die Qualitätssicherung: Die Qualitätssicherung von Prozessen und Produkten in Organisationen ist heute alltäglich geworden und gilt daher auch fürs Web Engineering [PSRO02, Kap. 4] bzw. [RO02]. Die Qualitätssicherung begleitet den Gesamtprozess und vergleicht zuvor definierte Qualitätskriterien mit dem aktuellen Status des Produkts bzw. des gesamten Prozesses. Es wird einerseits der Prozess und andererseits das Produkt selbst kontrolliert. Webapplikationen können außerdem auf verschiedenste Arten evaluliert werden, z. B. mittels Usability Tests oder auch mit heuristischen Methoden [Nie99]. Das Prozess- und Qualitätsmanagement wird in diesem Kontext nicht weiter behandelt. Die Modellierung von Webapplikationen, als Basis der Spezifikation eines generischen Frameworks, sei im Folgenden das Thema. Die Architektur von Webapplikationen spielt bei der Modellierung eine entscheidende Rolle. Deshalb werden im Anschluss das Wesen einer Webapplikation und die zugrundeliegende Architektur erörtert. 3.2 Architektur von Webapplikationen Das Verständnis der einer Webapplikation zugrundeliegenden Architektur, ist Vorraussetzung für die Entwicklung derartiger Anwendungen. Webapplikationen sind durch ihren Ursprung in der Hypertext- bzw. Hypermedia-Domäne ein relativ komplexes System. Hyperlinks bewegen den Benutzer durch ein interaktives Netz mit exponentieller Größe. Das Zusammenwachsen von traditionellen Websites und Applikationen, welche aufwändige Applikationslogik (business logic) erfordern, machen KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 22 mobile Clients WWW HTTP Webserver PC Client Abbildung 3.1: Einfache Client/Server-Architektur einer Webapplikation. den Entwurf und die Modellierung äußerst schwierig. Die Architektur einer Webapplikation soll im Folgenden betrachtet werden. 3.2.1 Client/Server-Kommunikation Die Grundstruktur einer Webapplikation ist jene einer klassischen Client-Server Anwendung (Abb. 3.1) mit ein paar Ausnahmen [Con99]. Ein großer Unterschied liegt beispielsweise in der Art der Einrichtung und Implementierung. Bei klassischen Client/Server-Anwendungen müssen beide Seiten aufgesetzt werden. Das Einrichten einer Webapplikation erfordert hingegen bloß das Aufsetzen der Server-seitigen Komponenten. Da der Browser eine universelle Schnittstelle ist, ist keine weitere Konfiguration auf der Client-Seite erforderlich [Con99]. Allerdings ist es notwendig auf Browser-spezifische Eigenschaften Rücksicht zu nehmen. Ein weiterer Unterschied liegt in der Natur dieser Browser/Server-Verbindung. Das zugrunde liegende Kommunikationsprotokoll ist HTTP – ein zustandloses Protokoll, welches ursprünglich für Robustheit und Fehlertoleranz entwickelt wurde und nicht für maximalen Datendurchsatz und dauerhafte Verbindungen [Con99]. Die Kommunikation erfolgt daher typischerweise durch Navigieren zwischen Hyperlinks und nicht über eine permanente Client/Server-Verbindung. 3.2.2 Zustandslose Verbindung Jede Benutzerinteraktion muss über einen eigenen HTTP-Request1 erfolgen. Es gibt keine für Client und Server gemeinsam erreichbaren Ressourcen oder Objekte wie beispielsweise bei Java RMI2 oder DCOM3 . Die Möglichkeit der Verwendung von Client-seitigen Java Applets oder ActiveX Komponenten, welche eine parellele Socketverbindung zum Server aufbauen können, sei hier erstmal dahingestellt. Roy Thomas Fielding hat in seiner Dissertation über netzwerkbasierte Softwarearchitekturen [Fie00] die Funktionsweise der Interaktion über HTTP und ähnliche 1 Die Anfrage des Browsers beim Webserver um eine HTTP-Ressource; Es wird in dieser Arbeit fallweise auch der englische Begriff verwendet. 2 Remote Method Invocation ermöglicht den Zugriff auf entfernte Objekte und den Aufruf von Methoden dieser. Siehe http://java.sun.com/products/jdk/rmi. 3 Das Distributed Component Object Model wurde von Microsoft entwicklet und funktioniert ähnlich wie Java RMI. Siehe http://www.microsoft.com/com/tech/DCOM.asp. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 23 stateless Protokolle Representational State Transfer, kurz REST genannt. Stateless bedeutet, dass die einzelnen Requests aus Sicht des Servers nichts gemein haben. Dem Server ist es prinzipiell egal, wer die Seite angefordert hat. Er führt bloß die Anfrage aus und gibt die gewünschte Seite zurück, ohne zu wissen, dass ein bestimmter Request wieder vom selben Benutzer stammte. Ohne den Benutzer eindeutig wiedererkennen zu können, wären Webapplikationen jedoch nicht realisierbar. Die Anwendung aus Sicht des Benutzers beginnt daher immer mit der Initialisierung einer sogenannten Session (Sitzung). Dabei wird für den Benutzer eine eindeutige Kennung generiert (Session-ID), mit der alle nachfolgenden Requests identifiziert werden können. Diese Kennung wird dann bei jeder neuen Anfrage vom Browser mitgesendet [Kra00, Kap. 4]. Die Tatsache, dass für jede Interaktion ein neuer Request erforderlich ist, bringt für den Benutzer der Web-Anwendung Nachteile mit sich. So kann es bei einer schlechten Netzwerkverbindung mitunter mehrere Sekunden dauern, bis der Request beim Server angekommen ist und die Antwort als neue HTML-Seite beim Benutzer erscheint. Die Verwendung von Programmcode auf Seite des Clients (vgl. Java Script, Java Applets oder ActiveX-Komponenten) ermöglicht es, Applikationslogik auf den Client zu verlagern. Dadurch können Requests eingespart werden [Con03, Kap. 3]. Durch Verlagerung von Applikationslogik auf eine andere Schicht, wird allerdings die Modellierung der Applikation wieder um eine Dimension komplexer. Der Entwickler ist im Übrigen gefordert, die Benutzerinteraktion so sinnvoll wie möglich zu gestalten, um trotzdem ein komfortables Arbeiten zu ermöglichen. Generell ist die Gestaltung von Benutzeroberflächen für Webapplikationen um einiges schwieriger, zumal man auch bei der Auswahl der GUI-Elemente (hier in Form von HTML-Elementen) sehr eingeschränkt ist (funktionell sowie visuell). Es muss auch stets ein Kompromiss zwischen Verwendung von Client-seitigen Erweiterungen und Kompatibilität zu den verschiedenen existierenden Browsern gemacht werden. 3.2.3 Mehrschichtige Architektur Im einfachsten Fall teilt sich eine Webapplikation also in die beiden Schichten Webserver und Client. Viele Webapplikationen dienen allerdings bloß als Schnittstelle zu einem eigenen Applikationsserver. Man spricht in diesem Fall auch vom Web-tier der eigentlichen Applikation (vgl. [SSJ02, Kap. 4]). Vor allem für Java gibt es von führenden Unternehmen Applikationsserver-Software mit integriertem Web-tier (vgl. IBM WebSphere, BEA WebLogic, Sun ONE Servers4 ). Es existieren jedoch auch einige Open Source Projekte, wie etwa der Applikationsserver JBoss5 in Kombination mit Tomcat6 oder Jetty7 als Webserver. In den meisten Fällen wird auch die Datenbankschicht auf einen anderen Rechner ausgelagert. Abbildung 3.2 zeigt eine Multi-tier Architektur mit Client, Webserver, Applikationsserver, Dateisystem, Datenbank und externen Ressourcen als logische Schichten. Diese Schichten können physikalisch auch auf dem gleichen Rechner un4 siehe http://www.ibm.com/websphere, http://www.bea.com/products/weblogic/platform/index. shtml, bzw. http://wwws.sun.com/software. 5 Siehe http://www.jboss.org. 6 Siehe http://jakarta.apache.org/tomcat. 7 Siehe http://jetty.mortbay.com. Mit JBoss Version 3.0 wird Jetty als Standardsoftware im Webtier mitgeliefert (siehe auch http://www.coredevelopers.net/technology/jetty/jetty-jboss-faq.jsp. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 24 Abbildung 3.2: Multi-tier Architektur. Aus [Boo01]. tergebracht sein (etwa Webserver und Dateisystem). Je nach Einsatzgebiet und Anforderungen werden auch Datenbankcluster und mehrere Webserver-Instanzen verwendet [SW00, Li03]. Eine solche skalierbare Architektur ist allerdings nur bei wirklich großen Anwendungen vonnöten (z. B. bei Portalen internationaler Konzerne). Zwischen den Schichten sind in der Regel Firewalls platziert. 3.2.4 Website und Webapplikation Die Unterscheidung zwischen einer Website und einer Webapplikation ist nicht ganz einfach. Die zugrundeliegende Architektur ist im Prinzip die gleiche [LCC00]. Auf einer abstrakten Ebene kann die gesamte Kommunikation in einer Webapplikation als das Anfragen und Empfangen von einzelnen Webseiten angesehen werden. Es stellt sich daher die Frage, ab wann von einer Webapplikation gesprochen werden kann, bzw. was eine Webapplikation eigentlich ist. Eine einheitliche Begriffsdefinition für Webapplikation ist in der Literatur nicht zu finden. Die Definitionen variieren im Detail. Eine mögliche Definition wurde einem Buch über Java Servlet Programmierung entnommen [HC98]: „While a web page merely displays static content and lets the user navigate through that content, a web application provides a more interactive experience. A web application can be as simple as a keyword search on a document archieve or as complex as an electronic storefront.“ Diese Definition unterscheidet statische Websites von Webapplikationen im Grad der Interaktion. Webapplikationen erlauben neben dem Navigieren zwischen Hyperlinks eine zusätzliche Interaktion, durch die der Inhalt dynamisch zusammengestellt und verändert werden kann. Eine einfache Suchabfrage in einem Dokumentenbestand wäre also bereits eine Webapplikation. Die folgende Definition aus [FSK+ 02] geht einen Schritt weiter: „A Web application is an application, not just a set of Web pages. In particular, this implies that it enforces the notion of a session, which differentiates it from the ordinary request-response Web paradigm. In this context, even a Web service that dynamically generates pages may not be considered a Web application.“ KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 25 Eine Webapplikation erfordert laut dieser Definition die Existenz einer Session (Sitzung), die den Benutzer über mehrere Requests hinweg identifiziert. Andernfalls wird hier maximal von einem „Web-based service“ gesprochen. Eine Suchmaschine ist in diesem Zusammenhang also keine Webapplikation. Der entscheidende Faktor ist das Vorhandensein eines bestimmten business state, also eines Status in dem sich die Applikation zu einem bestimmten Zeitpunkt befindet [Con99, LCC00]. Und dieser Status kann durch Benutzerinteraktion geändert werden [Con99]: „[...] where user input (navigation and data input) affects the state of the business.“ 3.2.5 Skript-basierte Webapplikationen Es gibt einen schwerwiegenden Unterschied in der Laufzeit zwischen kompilierten und Skript-basierten Programmiersprachen. Bei einer kompilierten Webapplikation (vgl. ISAPI, NSAPI, Java Servlets bzw. Abb. 1.1, Seite 2) beginnt die Laufzeit mit Inbetriebnahme des Servers. Dieser wartet nun auf Anfragen von unterschiedlichen Clients. Die Applikation bleibt solange der Server läuft im Hauptspeicher. Skriptbasierte Programmiersprachen haben diesbezüglich einen entscheidenden Nachteil. Mit PHP können keine eigenständigen Applikationen mit einer Laufzeit ausserhalb von HTTP-Requests realisiert werden. Diese Tatsache erschwert die Implementierung, da bestimmte persistente Ressourcen, wie beispielsweise Objekte der Applikationslogik und Datenbankverbindungen, bei jedem Request neu initialisiert werden müssen. Script Running Magic Um für PHP-basierte Webapplikationen persistente Objekte zu ermöglichen, wurde im Herbst 2000 das Projekt Script Running Magic8 (kurz SRM) ins Leben gerufen. Die SRM läuft als eigenständiger Server, welcher in C implementiert wurde und erlaubt persistente Objekte, sogenannte Bananas in den SRM-Container zu laden. Diese Bananas sind nichts anderes als Instanzen von PHP-Klassen und können nach Installation der zugehörigen PHP Extension mit SRM-spezifischen PHP-Befehlen angesprochen werden. Die Wahl des Namens für solche persistenten Objekte soll die Verwandtschaft zu Java’s Beans verdeutlichen. Mit solchen Bananas könnten nun auf eine etwas professionellere Art persistente Sessions, Datenbankverbindungen und applikationsübergreifende Objekte (z. B. ein Chat) realisiert werden. Die SRM wurde im Rahmen der Diplomarbeit für ihre Tauglichkeit getestet. Da die Entwicklung jedoch sehr langsam fortschreitet, noch viele Bugs vorhanden sind und das Framework durch die Integration der SRM stark von diesem Projekt abhängig wäre, wurde von der Integration vorerst abgesehen. Ein weiterer Nachteil wäre, dass das Framework nicht mehr zu den üblichen Webserver-Setups von Providern kompatibel wäre. Session als Zwischenspeicher Um bestimmte Objekte und Ressourcen über mehrere Requests hinweg persistent zu halten, werden diese bei DaVinci innerhalb der Session gespeichert. Innerhalb einer Session können allerdings bloß Schlüssel/Wert-Paare gespeichert werden und 8 Die Projekt-Homepage ist unter http://www.vl-srm.net erreichbar. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 26 alle Parameter eines Objektes müssen als String serialisiert werden. Es ergeben sich dadurch einige Probleme. Man muss zwischen Objekten, welche sich tatsächlich im Hauptspeicher des Rechner befinden und über Speicherreferenzen andere Objekte referenzieren können und als Strings serialisierten Objekten unterschieden. So gehen bei DaVinci nach dem Request zwangsweise wieder alle Speicherreferenzen zwischen den Objekten verloren. Somit sind auch persistente Speicherressourcen sowie Datenbankverbindungen nicht möglich. Dies ist der Grund warum sich PHP und Skriptsprachen überhaupt für eigenständige Applikationsserver schlecht eignen (siehe Abschnitt 1.4.2). Bei DaVinci wird die Objekthierarchie im Speicher bei jedem Request neu aufgebaut. Die Applikationslogik im Web-tier ist somit realisierbar. Für komplexe Anwendungen sollte allerdings eine der SRM ähnliche Lösung angedacht werden oder ein Applikationsserver (z. B. Java) integriert werden. 3.3 Modellierungskonzepte Die Modellierung von Webapplikationen ist vielschichtig und komplex. Konzepte des Hypermedia Designs und des Software Engineerings werden versucht zu kombinieren um die Komplexität einer Webapplikation erfassen zu können. Die folgende abstrakte, jedoch relativ umfassende Veranschaulichung des Webengineering-Prozesses soll einen ersten Überblick geben. Im Anschluss werden einige Konzepte genauer besprochen. Konkret wird auf das OOHDM-Konzept (Object-oriented Hypermedia Design Method) [RSG99] und auf die Methoden von Conallen [Con99, Con03] eingegangen. OOHDM führt als eines der ersten Konzepte objektorientierte Methoden ein, die Methoden von Conallen sind ausschließlich auf UML basiert und bieten ein Konzept, mit dem sich auch Webapplikationen mit komplexer Applikationslogik modellieren lassen. 3.3.1 Dimensionen und Ebenen im Web Engineering Der Entwicklungsprozess von Webapplikationen kann aus einer abstrakten Sicht im Allgemeinen in drei orthogonale Dimensionen geteilt werden (vgl. dazu Abb. 3.3): Levels (Ebenen), Aspects (dynamische Aspekte) und Phases (Entwicklungsphasen). Die Einteilung wurde aus [RS00] übernommen. Die Entwicklungsphasen geben die zeitliche Dimension vor, also den gesamten Entwicklungsprozess im Zeitverlauf. In jeder Entwicklungsphase müssen verschiedene Aspekte der orthogonalen Ebenen beachtet werden. Diese sehr abstrakte, aber realtiv aufschlussreiche Visualisierung zeigt, wie komplex der Entwicklungsprozess in der Tat ist. Ebenen: Content, Hypertext und Präsentation Die erste Dimension der Modellierung besteht aus den Ebenen Content, Hypertext und Präsentation. Diese Dreiteilung erinnert an das MVC-Konzept aus der objektorientierten Programmierung (siehe Abschnitt 3.4.3). Die Modellierung in dieser Dimension erfolgt zuerst auf einer konzeptuellen, inhaltlichen Ebene (Content), welche alle Entitäten der Applikation erfasst (z. B. Bücher und Autoren in einer Literaturdatenbank). Im nächsten Schritt (Hypertext Level) werden die logische Komposition der einzelnen Seiten und die Navigation modelliert. Der letzte Schritt definiert die KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 27 Präsentation des Hypertext Levels, also alle Ansichten. Diese Ansichten sind jene Seiten, die der Benutzer am Ende im Browser sieht. Sie bestehen aus verschiedenen Inhalten und Interaktionselementen (z. B.. Formular-Elemente und Links). Es ist notwendig, dass alle drei Ebenen möglichst voneinander getrennt modelliert werden [RS00]. Es soll z. B. möglich sein, für ein und denselben Content unterschiedliche Hypertext-Modelle entwickeln zu können. Genauso soll es möglich sein, verschiedene Ansichten demselben Hypertext-Modell zuweisen zu können. Dadurch werden beispielsweise eine persönlich angepasste Navigation bzw. personalisierte Ansichten ermöglicht. Eine Kompatibilität zu verschiedenen Clients (z. B. PDAs und andere mobile Geräte) kann nur durch eine Entkoppelung der Hypertext-Ebene von der Präsentationsebene erreicht werden. Es bleibt anzumerken, dass neben einem top-down Design, welches von der Content Ebene ausgehen würde, natürlich auch ein buttom-up Design möglich ist. Je nach Anforderung bzw. Ausgangssituation, empfielt sich die eine oder andere Variante. Soll beispielsweise eine existierende Webseite in einer Datenbank erfasst werden, muss von den Ebenen Präsentation und Hypertext ausgehend, die entsprechende Content-Ebene modelliert werden. Dynamische Aspekte: Struktur und Verhalten Diese Dimension besteht aus den Aspekten Struktur und Verhalten (Behaviour) und ist orthogonal zu den drei Ebenden der ersten Dimension. Was den Content betrifft, muss für den strukturellen Aspekt ein statisches Modell, im Sinne von EntityRelationen und Klassendiagrammen (UML9 ), entwickelt werden. Mit Einbeziehung des Behaviour-Aspekts erhält die Anwendung erst ihren sogenannten business state. Das statische Modell [RJB99, S. 41] als strukturelle Basis der Applikationslogik wird durch den Behaviour-Aspekt um eine zeitliche Dimension, in der sich der Status der Applikation ändern kann, erweitert. Hier dienen ebenfalls UML-Diagramme zum Entwurf (etwa Statechart, sequence und collaboration Diagramme [RJB99, Kap. 6–8]). Die Vorschläge von Lowe et al. [LHSG02a] bzw. Knight und Dai [KD02] basieren auf dem MVC-Prinzip und bieten Konzeptentwürfe, welche die Struktur und das Verhalten aller Ebenen der ersten Dimension am Besten miteinbeziehen. Die Content-Ebene wurde von den ersten Hypermedia-Konzepten so gut wie gar nicht berücksichtigt. Bei aufwändigen Webapplikationen mit inhärenter business logic ist diese Ebene jedoch die Wichtigste überhaupt. Sie bildet quasi das Herz der Anwendung und ermöglicht die Veränderung des Zustands der Applikation (application oder business state). Die Hypertext-Ebene wird ähnlich für den strukturellen und dynamischen Aspekt modelliert. Das strukturelle Modell beschreibt die statische Zusammensetzung der Hypertext-Seiten und die dazwischenliegenden Referenzen (Hyperlinks). Das Verhaltensmodell der Hypertext-Ebene berücksichtigt beispielsweise dynamisch generierte Links. Durch Behaviour im Hypertext-Modell kann sich die Struktur und Zusammensetzung der einzelnen Seiten während dem Benutzen der Applikation verändern. Der Aspekt kommt z. B. zum Tragen, wenn sich der Benutzer durch ein Suchergebnis bewegt. Die Navigation wurde in diesem Fall dynamisch durch die vorausgehende Suchabfrage generiert. 9 Die Unified Modeling Language ist eine objektorientierte Modellierungssprache für Software Systeme [RJB99]. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 28 Das strukturelle Modell der Präsentation beschreibt die Ansicht der HypertextEbene (also Inhalte und Navigationselemente) im Browser. Die Ansicht kann im Sinne von Webapplikationen genauso auch als Benutzeroberfläche betrachtet werden, welche normalerweise in Form einer HTML-Seite vom Browser interpretiert wird. Der Behaviour-Aspekt bezieht sich hier auf dynamische Elemente der Benutzeroberfläche, welche beispielsweise mittels Client-seitigen Skripts möglich sind. Die Veränderung von HTML-Elementen (Dynamic HTML), z. B. von Menüleisten oder Formularen wird im Verhaltensmodell des Content modelliert. Da durch Verwendung von Clientseitigem Programmcode ein entprechender Teil der Applikationslogik auf den Client ausgelagert werden kann, sollte dies im Modell berücksichtigt werden können. Um die Struktur und das Verhalten von Content, Hypertext und Präsentation modellieren zu können bedarf es eines einheitlichen Formalismus. Viele Konzepte bedienen sich eines objektorientierten Ansatzes und verwenden als Grundlage UML. Durch die in UML bereits vorgesehenen Erweiterungskonzepte (stereotypes, tagged values und constraints [RJB99, Kap. 11]) können UML-Modelle auch für Webapplikationen verwendet werden [PSRO02]. Für die Navigation im Hypertext-Level ist die Verwendung von vordefinierten Hypermedia Design Patterns10 möglich [GC00]. Solche Design Patterns sind z. B. verschiedene Navigationstopologien (vgl. Buch, Baum, Netz, etc.). Entwicklungsphasen Auf dieser Achse ist der zeitliche Ablauf des gesamten Prozesses im Web Engineering von der Anforderungsanalyse bis zur Implementierung dargestellt. Für jeden Aspekt der anderen Ebenen muss der jeweilige Subprozess durchgeführt werden. So sind zum Beispiel für den strukturellen Entwurf des Content als Subprozesse eine Analysephase, mehrere Entwicklungsphasen und schließlich die Implementierung erforderlich. Der Gesamtprozess besteht im Allgemeinen nicht aus einem einzigen Durchlauf dieses Zyklus, sondern aus mehreren Iterationen, wobei jeder Durchlauf das Detail um eine Stufe erhöht [RS00]. Im Beispiel von [RS00] (Abb. 3.3) wurde der Gesamtprozess in einen groben, konzeptuellen Entwurf (Analyse), eine Technologie-unabhängige Modellierung (Logical Modeling), eine Technologie-spezifische Modellierung (Physical Modelling) und die Implementierung unterteilt. Da es keinen allgemeingültigen, standardisierten Entwicklungsprozess im Web-Enginieering gibt, findet man auch sehr verschiedene Lifecycle-Modelle für den gesamten Engineering-Prozess [GM01, Ude02, Con03]. 3.3.2 Historischer Überblick Die Historie von Entwicklungskonzepten und -modellen für Webseiten reicht laut vorliegender Literatur in die 90er-Jahre zurück. Abbildung 3.4 (aus [RS00]) zeigt die Evolution in drei Generationen. Die ersten Konzepte dienten der Modellierung von Hypermedia Anwendungen, also hauptsächlich Websites ohne Applikationslogik. Sie versuchten die Verknüpfung der Seiten darzustellen. Der Schwerpunkt lag im Modellieren der Navigation und der Präsentation (vgl. HDM – Hypermedia Design Method [GPS95]). Die nachfolgenden Konzepte, wie beispielsweise OOHDM 10 Software Design Patterns sind Musterlösungen für häufig vorkommende, ähnliche Problemstellungen. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 29 Levels Presentation Hypertext Content Structure Phases Implementation Conceptual Logical Physical Modeling Modeling Modeling Behavior Aspects Abbildung 3.3: Dimensionen der Modellierung von Webapplikationen. Aus [RS00]. Traditional Modeling Methods ER Dexter 1st Generation DataWeb Modeling Methods OMT Conallen HDM 2nd Generation DataWeb Modeling Methods RMM HDM lite 3rd Generation DataWeb Modeling Methods Araneus W3I3 UML OOHDM Baumeister et al. Abbildung 3.4: Modellierungskonzepte im evolutionären Überblick (aus [RS00]). Die meisten der Konzepte in dieser Abbildung werden im Text erwähnt. Weitere sind: HDM lite (Fraternali [Fra00]), Araneus (Atzeni et al. [AMM98]) und W3I3 (Web-based Intelligent Information Infrastructure, Ceri et al. [CFP99]). verfolgten bereits einen objektorientierten Ansatz. Neuere Modelle sind zumeist auf UML basiert (vgl. Baumeister et al. [BKM99], Conallen [Con99, Con03], Koch und Kraus [KK02] bzw. Lowe et al. [LHSG02a]). Hypermedia Modellierungskonzepte Die ersten Konzepte zur Entwicklung von Hypermedia Applikationen, wie etwa HDM boten kaum Modelle für die Content-Ebene der Levels-Dimension (Abb. 3.3, S. 29). Das Design beschränkt sich bei HDM bloß auf die Ebenen Hypertext und Presentation, also hauptsächlich auf die Darstellung und Modellierung der Verknüpfungen zwischen den einzelnen Ansichten. Die Modellierung von Datenbank-gestützten Websites ist dadurch nicht möglich. HDM baut auf dem Dexter Reference Model [HS94] auf und adaptiert das Konzept für die Modellierung von Hypermedia Anwendungen [RS00]. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 30 Die Modellierung der Content-Ebene als Basis aller Entitäten und Daten der Webapplikation wurde in einer ersten, einfachen Form in einer nächsten Generation z. B. von RMM unterstützt. RMM baut auf HDM und dem Entity-Relationship Model [Che76] auf und ermöglicht eine getrennte Modellierung der Content- und Hypertext-Ebene [RS00]. Die Content-Ebene kann bei RMM allerdings bloß statisch modelliert werden. Da für die Modellierung einer Applikationslogik mit business state allerdings der Behaviour-Aspekt entscheidend ist, reicht das Modell für richtige Webapplikationen noch nicht aus. Objektorientierte Konzepte Für eine Webapplikation, wie sie von [LCC00] (siehe Abschnitt 3.2.4) definiert wird, bieten reine Hypermedia-Entwurfskonzepte, die in erster Linie auf die Informationsarchitektur fokussiert sind, nicht genügend Detail [LHSG02a]. Mit Einzug des objektorientierten Paradigmas im Web Engineering enstanden auch Modellierungskonzepte für die Entwicklung von richtigen Webapplikationen mit gegebener business logic im Kern der Anwendung (vgl. OOHDM [RSG99], Conallen [Con99], Baumeister et al. [BKM99] und W2000 [BGP01]). Die Object-oriented Hypermedia Design Method (OOHDM) [RSG99] trennt alle Ebenen der Levels-Dimension (Abb. 3.3, S. 29). Auf Content-Ebene wird die Modellierungsmethode OMT11 verwendet, wobei neben der Structure auch das Behaviour berücksichtigt wird [RS00]. Im nächsten Abschnitt wird auf das OOHDM-Konzept etwas näher eingegangen. Einige weitere objektorientierte Ansätze bauen teilweise auf OOHDM auf, verwenden jedoch als Notation statt OMT die neuere UML-Notation und erweitern zumeist UML mit den vorgesehenen stereotypes. Einige Konzepte führten allerdings auch völlig neue Diagramm-Typen ein (vgl. [LHSG02a]), was durch die Vielseitigkeit von UML und dem bereits vorgesehenen Erweiterungskonzept (stereotypes, tagged-values und constraints) grundsätzlich unnötig und nicht zielführend ist (siehe [PSRO02, Abschnitt 2]). Durch die völlige Integration des MVC-Konzeptes in die Levels-Dimension (Abb. 3.3, S. 29) ist die getrennte Behandlung der Ebenen Content, Hypertext und Presentation am zielführendsten [LHSG02a,KD02]. Durch Verwendung des MVC-Konzepts wird neben der konzeptuellen Modellierung auch ein ordentliches Logical und Physical Modeling ermöglicht. Es kann also nicht nur das logische Konzept modelliert werden, sondern auch die resultierende Software-Architektur (meist bereits in Form von Klassendiagrammen und component- bzw. deployment-Diagrammen [RJB99, Kap. 9]. Dieser Aspekt ist vor allem für die Modellierung eines Frameworks, wie es in dieser Arbeit versucht wird, von entscheidender Notwendigkeit. Die Architektur, auf welcher eine mit dem Framework entwicklete Webapplikation aufbaut, muss bereits vordefiniert werden. Bei der Konzeption neuer Anwendungen auf Basis des Frameworks entfällt schließlich ein großer Teil an nötigen Aspekten der Modellierung, wodurch Zeit und Kosten eingespart werden. 11 Die von Rumbaugh et al. entwickelte Object-oriented Modeling Technique, war eine der ersten objektorientierten visuellen Modellierungssprachen für Software Systeme [RBP+ 91]. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 31 Conceptual Model Navigational Models another interface Interface (presentation) Model Abbildung 3.5: Überblick über die drei OOHDM-Modelle. Aus [SRB03]. 3.3.3 Das OOHDM-Konzept Da OOHDM die wichtigsten Aspekte berücksichtigt und bereits einen Objekt-orientierten Ansatz verfolgt, soll dieses Konzept in seinen Grundzügen kurz betrachtet werden. Das OOHDM-Konzept besteht aus drei grundlegenden Modellen: dem konzeptuellen Modell (conceptual model), dem Navigationsmodell (navigational model) und dem Interface-Modell (interface model). Für jedes Modell gibt es verschiedene vordefinierte Objekte, welche mittels OMT-Notation kombiniert und modelliert werden [RSG99]. Abbildung 3.5 gibt einen Überblick über die drei Modelle. Diese Dreiteilung des Entwurfs bei OOHDM ist auch in der Veranschaulichung von [RS00] (Abb. 3.3, S. 29) in der Levels -Dimension erkennbar. Die Bezeichnung conceptual model bei OOHDM entspricht hier allerdings nicht so sehr der konzeptuellen Entwurfsphase (auf der Phases -Achse), sondern dem Entwurf der Content -Ebene (Levels -Achse). Analog dazu entspricht das Navigationsmodell von OOHDM der Hypertext -Ebene und das Interface -Model der Presentation -Ebene. Die Phases - und Aspects -Dimensionen fallen bei OOHDM also mehr oder weniger zusammen. Konzeptuelles Modell In diesem Modell wird im Großen und Ganzen die Grundfunktionalität der Applikation festgelegt. Es werden funktionale Objekte als Einheiten (vgl. Entities im ERSchema) und ihre Relationen zueinander definiert. Die Modellierung erfolgt schwerpunktmässig über UML-ähnliche Klassendiagramme mit ähnlichen Methoden der Vererbung und Referenzierung (association, generalisation, etc. [RJB99, Kap. 4]). Abb. 3.6 zeigt ein konzeptuelles Modell als Beispiel. Das Beispiel wurde von [REL01] übernommen und bezieht sich auf eine einfache Webapplikation, welche Rezensionen zu Konferenzbeiträgen verwaltet. Es gibt unterschiedliche Rollen von Personen (PC chair, PC member und Reviewer). Eine Person kann einerseits Beiträge (Papers) verfassen und andererseits Rezensionen (Reviews) zu anderen Beiträgen erstellen. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 32 Expertise Degree: [High, Medium, Low] Topic IsAbout Name Description HasInterest Knows Interest Degree: [High, Medium, Low] Person Paper IsAuthorOf Name Address E-mail Password HasConflict Makes Reviews Title Type: [Full, Short, Poster] Status: [Accepted, Rejected, ToBeDiscussed] Content CameraReadyContent Review PC chair PC member Coordinates Reviewer Confidence: [High, Medium, Low] Technical quality Relevance CommentsPC CommentsAuthors Recommendation: [Accept, Weak Accept, Neutral, Weak Reject, Reject] Final?: [Yes, No] PC Program committee Abbildung 3.6: Konzeptuelles Modell einer Rezensionsverwaltung für Konferenzbeiträge. Aus [REL01]. Navigationsmodell Das Navigationsmodell beschreibt die Struktur der Website in Form von Sichten auf die Applikationslogik (Abb. 3.7) und definiert die Navigation. Es werden zuerst mit Hilfe von Klassendiagrammen Sichten auf die Datenebene (conceptual model) gelegt, für die genauere Darstellung der Navigation werden Kontext-Schemas (navigational context schemes) erstellt und schließlich wird mittels Navigationstransformation (navigational transformation) das Verhalten (Behaviour) der Applikation spezifiziert. Ein Klassendiagramm des Navigationsmodells besteht aus sogenannten nodeKlassen. Jede node-Klasse enthält Attribute aus verschiedenen Objekten des konzeptuellen Modells. Eine Person im Klassendiagramm des Navigationsmodells (Abb. 3.7) enthält beispielsweise Informationen zu der Person selbst, die Kategorie („PC member“, etc.), seine Sachverständigkeit (expertise degree) und alle Beiträge, an denen die Person interessiert ist. Die Klasse „Person“ im Navigationsmodell ist Beobachter (observer) der Klassen „Person“, „Expertise“ und „Topic“ des konzeptuellen Modells. Die Verbindungslinien (links) zwischen den node-Klassen stehen für semantische Verknüpfungen. Die Bedeutung des Navigationsmodells ist im Unterschied zum konzeptuellen Modell von semantischer Natur. Für die genauere Darstellung der gesamten Navigation werden Kontext-Schemas (navigational context schemes) verwendet. Abbildung 3.8 (S. 34) zeigt ein solches Kontext-Schema. Die grau hinterlegten Kästen zeigen node-Klassen aus dem Klassendiagramm und enthalten mehrere Kontext-Elemente (contexts). KontextElemente geben bestimmte Instanzen der jeweiligen Klasse wieder, wobei die Auswahl der Instanzen über bestimmte Kritierien, wie etwa „Person – alphabetisch“ KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN Person 33 Coordinates Name Address E-mail Password Category: [PC chair, PC member reviewer] Expertise: {<T: Topic, self Knows T, Knows.Expertise.Degrees>}* InterestedPapers: {<P: Paper, self HasInterest P, HasInterest.Interest.Degree>}* IsAuthorOf HasInterest Paper HasConflict Makes Reviews Review Title Abstract Type: [Full, Short, Poster] Topics: {T: Topic, self IsAbout T}* Status: [Accepted, Rejected, ToBeDiscussed] Content CameraReadyContent Reviewer: P.name, P:Person, P makes self Paper: P.id, P: Paper, self reviews P Confidence Technical quality Originality Relevance CommentsPC CommentsAuthors Recommendation: [Accept, Weak Accept, Neutral, Weak Reject, Reject] Final?: [Yes, No] Abbildung 3.7: Klassen des Navigationsmodells. Aus [REL01]. erfolgt. Ein bestimmter Kontext gibt also beispielsweise alle Personen alphabetisch aus. Kontext-Elemente werden üblicherweise in einer bestimmten Reihenfolge, durch eine Benutzeranfrage oder dynamisch (hier ändern sich die Instanzen während der Navigation, z. B. Elemente in einem Warenkorb) generiert. Strichlierte Kästen repräsentieren Indizes (indexes) oder Zugriffsstrukturen (control structures). Gemeint sind damit konkret „Sichten“, meist in Form einer Seite. Gestartet wird im Beispiel beim Index „Main menu“. Von dort aus gelangt man zu den Indizes „Persons“, „Review status“, „Topics“, „Paper IDs“ und „Review/acceptance status“. Die abgerundeten (oft auch zylindrischen) Symbole stehen für dynamische Kontext-Elemente (dynamic contexts). Diese erlauben das Erstellen neuer Instanzen der zugehörigen node-Klasse. So kann beispielsweise über den Pfad „Main menu“–„Paper Creation“ ein neuer Beitrag erfasst werden. Durch die Spezifikation mehrerer unterschiedlicher Navigationsmodelle können Rollen-basierte Applikationen erstellt werden. Je nach Berechtigung kann eine andere Navigationsstruktur angeboten werden. Ein beliebiger Gast, hat z. B. keinen Zugriff auf die dynamischen Kontext-Elemente und kann somit keine neue Einträge im System tätigen. Genausogut können adaptive, personalisierte Applikationen erstellt werden, wobei die Navigation dynamisch, aufgrund von Informationen über den Benutzer (welche im Übrigen in den nodes des konzeptuellen Modells erfasst werden), zusammengestellt wird. In einem dritten Modell (navigational transformations) kann das Verhalten der Applikation beschrieben werden. Navigationsobjekte können z. B. aktiviert und deaktiviert werden. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN Main menu 34 Review Creation Paper IDs By paper By reviewer Paper Creation Person Creation By ID Persons Alphabetical Topics By topic By topic By reviewer By paper By author Review status By review status By reviewer interest Persons By coordinator By review status Review/ acceptance status By acceptance status Abbildung 3.8: Kontext-Schema des Navigationsmodells. Aus [REL01]. Interface-Modell Das Interface-Modell definiert schließlich die Benutzerschnittstelle durch Zusammensetzen von verschiedenen vordefinierten Elementen (Abb. 3.9). Je nach Client-Gerät (PC, PDA, Mobiltelefon, etc.) kann ein anderes Interface verwendet werden. Die Elemente im Interface-Modell werden, ähnlich wie nodes im Klassendiagramm des Navigationsmodells, als „Beobachter“ jener nodes definiert, von denen sie Daten zur Anzeige erhalten (Abb. 3.10). Bewertung von OOHDM Die Trennung in ein konzeptuelles Modell, ein Navigationsmodell und ein InterfaceModell bei OOHDM errinnert an das MVC-Konzept: es wird die klare Trennung zwischen einem konzeptuellen Datenmodell (model, bzw. Content laut Abb. 3.3, S. 29), der Navigation (control bzw. Hypertext) und der Darstellung (view bzw. Präsentation) ermöglicht. Das MVC-Konzept wird bei OOHDM allerdings nur zur Modellierung adaptiert. Die zugrundeliegende Softwarearchitektur (Emfpang der Re- KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN <<text>> <<anchor>> <<button>> 35 <<Audio>> <<Video>> <<form>> <<collection>> <<anchored collection>> Abbildung 3.9: Stereotypen für das Interface-Modell. Aus [BM98]. <<navigational class>> <<ADV>> ADV Book <<text>> ... Book title: String price: Number /publisher: String /genre: String ... Abbildung 3.10: Einfache Verknüpfung eines Interfaces mit der entsprechenden Navigationsklasse. Aus [BM98]. quests, Session-Behandlung, Deployment 12 u.ä.) der endgültigen Anwendung wird nicht ausreichend definiert. Das Konzept eignet sich am Besten für die Entwicklung von Dokument-zentrischen Webapplikationen mit Datenbank-gestütztem Inhalt. Ein Nachteil ist allerdings, dass die Notation relativ komplex wird (was sich jedoch durch die gegebene Komplexität einer Webapplikation grundsätzlich kaum vermeiden lässt). Bei aufwändigen Webapplikationen scheitert jedoch auch OOHDM [LHSG02a]. Des Weiteren ist kaum Literatur über OOHDM zu finden und die Formalismen und Notationen ändern sich ständig durch neue Anpassungen, Erweiterungen und Ideen anderer Leute. 3.3.4 Das Konzept von J. Conallen Jim Conallen, Software-Architekt bei der nun zu IBM gehörenden Rational Software Corporation13 , hat bereits 1998 mit der Entwicklung von UML-basierten Modellen für Webapplikationen begonnen [Con03, Vorwort]. Durch seine Arbeit bei Rational und den richtigen Leuten im Umfeld (u. a. Grady Booch – einer der Three Amigos, welche seit Beginn der 90er Jahre UML entwickelten), konnte er sein UML-basiertes Modell zur Modellierung von Web-spezifischen Anwendungen entwicklen. Von Conallen gibt es u. a. auch das einzige Buch über Web Engineering mit UML, welches bereits in einer zweiten Auflage erschienen ist [Con03]. Conallen verwendet UML von Grund auf und erweitert den Formalismus mit sterotypes und tagged values14 . Nach Abb. 3.3 (S. 29) werden bis auf den Behaviour12 Unter to deploy versteht man das Aufsetzen der gesamten Software mit all ihren Komponenten [Con03, S. 128]. 13 Siehe http://www.rational.com. 14 Mit stereotypes lassen sich neue Modellelemente, durch die Zuweisung eines zusätzlichen, frei definierbaren Charakters an das Basiselement, bilden. Tagged values erlauben die Assoziation von KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 36 Aspekt so gut wie alle Ebenen und Aspekte gleichermaßen berücksichtigt. Die Analyse von [RS00] aus dem Jahre 2000 ist für den aktuellen Entwicklungsstand der Methode Conallens allerdings nicht mehr relevant. Laut [RS00] bietet Conallen keine Methode zur Modellierung des Behaviour-Aspekts außerhalb der vordefinierten Stereotypen (Abb. 3.3, S. 29). Das heißt der Behaviour-Aspekt in der Hypertext- und Präsentationsebene wäre bloß über die Verwendung von Stereotypen (z. B. für ClientScript Elemente) berücksichtigt. Was jedoch in der Navigationsstruktur bzw. in der Ansicht genau passiert, könne demnach nicht modelliert werden. Conallen’s Modell unterstützt die Modellierung des Behaviour-Aspekts aber nun mittels den passenden UML-Diagrammen: sequence und collaboration diagram. Sein Konzept unterscheidet sich grundlegend von OOHDM, RMM u.a. und verwendet vorrangig Methoden aus dem traditionellen Software-Engineering anstelle von Hypermedia-Konzepten. Er berücksichtigt vor allem auch die Möglichkeit von Applikationslogik am Client in Form von Scripts, ActiveX-Ojekten oder Applets [Con03, Kap. 3–4]. In der zweiten Auflage seines Buchs [Con03] liegt ein Schwerpunkt in der Definition des gesamten Web Engineering Prozesses, wobei auch hier durchgehend UMLNotationen verwendet werden [Con03, S. 112]. Der Gesamtprozess wird bei Conallen in verschiedene Pakete (artifact sets) gegliedert, welche im Übrigen in einem model management view [RJB99, Kap. 10] dargestellt sind. Jedes dieser artifact sets besteht bei Conallen aus mehreren passenden Werkzeugen, Modellen und Methoden. Er definiert auch Rollen (z. B. Software Architekten, Designer, Implementers, etc.) und weist jeder dieser Rollen in jedem Paket Aufgaben zu. Bei Conallen gibt es im Prozess keine sichtbare Trennung der Ebenen Content, Hypertext und Präsentation. Die Entwicklung erfolgt über die Pakete Analysis set, Design set und Implementation set. Analysis set Das Analysis set definiert unter anderem die Architektur der Applikation und teilt diese in kleinere Sub-Systeme. Kaum ein Kozept (einschließlich OOHDM) definiert die zugrundeliegende Architektur des Systems, welche für die Spezifikation eines Framework von entscheidender Bedeutung ist. Im Analysis set werden weiters beispielhafte Anwendungsfälle (use cases) analysiert und es wird bereits ein grober Ablauf (abstraktes Behaviour) mittels sequence-Diagramme definiert [Con03, S. 119]. Design set Die Hauptaufgabe in diesem Schritt ist, die in der Analyse erarbeiteten Modelle softwaretechnisch umzusetzen. Software-Architekten definieren in diesem Workflow eine Prozessansicht, die die Softwarearchitektur in Untersysteme teilt. Es wird auch festgelegt, welche Komponenten und Objekte sich in welcher Architektur-Schicht (Application tier, Data tier, etc. ) befinden. Diese Phase kann noch am ehesten mit der Content-Ebene aus Abb. 3.3 (S. 29) verglichen werden, ist jedoch viel genauer und berücksichtigt auch die Architektur und die Umgebung. Die Modellierung kann hier konsequent mit allen UML-Notationen erfolgen. Eine komplexe Applikationslogik ist damit modellierbar. Schlüssel/Wert-Paaren an ein Modellelement [RJB99, Kap. 10]. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 37 Abbildung 3.11: Einfache Verknüpfung von Seiten auf Basis der WAE für UML. Aus [Con03, Kap. 11]. Das Design-Team modelliert die einzelnen Untersysteme der Prozessansicht mittels Klassen. Diese Klassen (design-level classes [Con03, S. 120]) enthalten allerdings noch keine Details zur Implementierung. Die Aufgabe dieser Klassendiagramme ist das Verhalten der Applikation (business behaviour) auf einer höheren Abstraktionsstufe festzulegen. Anschließend erfolgt die Modellierung aller einzelnen Webseiten. Webseiten werden bei Conallen jeweils in einer Server-seitigen und in einer Clientseitigen Instanz modelliert. Er erweitert den Formalismus mit sterotypes und eigenen Icons (Abb. 3.11). Die Erweiterungen nennt Conallen WAE (Web Application Extension) für UML15 . Eine Client-Seite wird hier stets von ihrer zugehörigen Server-Seite generiert. Eine Server-Seite kann allerdings mehrere unterschiedliche Instanzen der Client-Seite erstellen. Als Assoziationen (Hyperlinks) zwischen den Seiten werden sterotypes wie etwa link, build (Erstellung einer Client-Seite), oder submit (bei Eingaben über Formulare) verwendet. Conallen’s Modell erlaubt auch die Verwendung von mehreren Fenster-Instanzen und Frames, was in der Praxis relativ häufig gefordert ist. Implementation set Schließlich können auf Basis der Design-Modelle alle Komponenten implementiert werden. Soweit dies möglich ist, können hier auch CASE tools 16 eingesetzt werden. Als wichtigen Teil des Implementierungsprozesses erwähnt Conallen auch das Testen, welches ein essentieller Bestandteil im eXtreme Programming17 Paradigma ist. Am Ende der Kette steht bei Conallen’s Model noch das Deployment set. In diesem Prozess wird die fertig entwickelte Anwendung in der zuvor definierten Umgebung aufgesetzt. 15 Dazu unterhält Jim Conallen auch eine Website unter der URL http://www.wae-uml.org. Computer-aided Software Engineering tools sind Werkzeuge, die die Erstellung von Quellcode anhand von Modellen ermöglichen. 17 XP ist eine Methode, bei der das Programmieren an sich im Vordergrund steht. Die Methode kann in gewisser Hinsicht als konträr zur Modell-untersützten Programmierung angesehen werden [HL02, Kap. 1]. 16 KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 38 Bewertung des Modells nach J. Conallen Conallen’s Modell ist relativ mächtig. Es behandelt alle Ebenen und Aspekte aus der Analyse von [RS00] und ermöglicht auch die Modellierung von Applikationen mit aufwändiger Applikationslogik. Das Konzept entstammt eher der Software-Engineering als der Hypermedia-Engineering Domäne (vgl. Abb. 3.13, S. 40). Die Modellierung der Hypermedia-Ebene erfolgt bei Conallen zum Teil innerhalb der Applikationslogik. Abbildung 3.12 zeigt einen Ausschnitt aus dem Design Modell einer Katalogsuche. Die Server-Seite „Listing“ (Server-Seiten werden mit einem Zahnrad als Icon notiert) enthält beispielsweise einen Parameter „index“, welcher die aktuelle Seite des Suchergebnisses speichert. Es gibt zwei Aktionen „next“ und „prev“ (als Links dargestellt), über welche die Seiten des Suchergebnisses durchgeblättert werden können. Die Server-Seite generiert nach der Aktion die jeweils aktuelle Client-Seite. Die Modellierung erfolgt ausschließlich mit UML. Conallen bietet durch zahlreiche Modelle und die durchgehende UML-Notation ein umfassendes Konzept zur Beschreibung von Webapplikation. Er geht auch auf die Umgebung und die Architektur als Basis der Applikation ein. Er ermöglicht die Modellierung von Client-seitiger Appliaktionslogik, sowie die Verwendung von mehreren Browser-Instanzen und Framesets. Ein Nachteil der Methode von Conallen ist ihre Komplexität. Vom Entwickler wird eine detaillierte Kenntnis von UML gefordert. Die Methode Conallens eignet sich auf Grund ihrer Komplexität und des damit verbundenen Modellierungsaufwandes auch nur für wirklich große Projekte. Da bei kleineren bis mittelgroßen Applikationen mit einem zu großen Overhead zu rechnen ist, wird die Methode bei solchen Projekten weniger nützlich sein. 3.4 Modellierung auf Basis der Architektur von DaVinci Viele Entwicklungskonzepte für Webapplikationen beruhen durch ihren Ursprung in der Hypertext- bzw. Hypermedia-Domäne traditionell auf der Navigation in einem Netz aus Hyperlinks. Diese Tatsache ist ein Grund, warum viele Versuche ein Konzept zu finden, welches alle Dimensionen aus Abb. 3.3 (Seite 29) berücksichtigt und dennoch einfach und überschaubar bleibt, scheitern. Webapplikationen sind durch die Kombination des Hyper-Paradigmas (der Verknüpfung von Ressourcen jeglicher Form in einem weltweiten Netz aus Hyperlinks), und der nötigen Applikationslogik äußerst schwierig zu planen und zu konzipieren. Anwendungen mit komplexer business logic sind mit Hypermedia-Techniken kaum konzipierbar. Auch OOHDM würde trotz der seperaten Modellierung der Content-Ebene (in ihrer Struktur, sowei im Verhalten) bei aufwändigen Webapplikationen scheitern [LHSG02b]. Techniken, die eher mit dem traditionellen Software-Engineering verwandt sind (vgl. Conallen), bieten eventuell ausreichend Komplexität, sind aber dadurch im praktischen Einsatz im Nachteil. Grundsätzlich können zwei Richtungen der Annäherung zur Webapplikation identifiziert werden. Die einen Konzepte wurzeln im Hypermedia-Bereich und näherten sich von ursprünglich statischen Hypertext-Anwendungen über dynamische Websites in Richtung Webapplikation. Der andere Ursprung liegt im traditionellen SoftwareEngineering, wo Applikationen auf die Web-Schiene verlagert wurden, da sich dadurch erhebliche Möglichkeiten auftun [LHSG02a]. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 39 Abbildung 3.12: Design-Modell einer Katalogsuche. Aus [Con03, S. 251]. Jene Applikationen, welche dem Hypermedia-Bereich entstammen sind von Natur aus Dokument-zentrisch und fokussieren die Informationsarchitektur. Webapplikationen welche aus dem Software-Engineering stammen, sind traditionell auf die funktionelle Architektur spezifiziert [LHSG02a, S. 105]. Abbildung 3.13 (aus [LHSG02b]) zeigt die Annäherung aus beiden Domänen grafisch. Die Autoren konnten keine Konzepte identifizieren, welche mächtig genug für die Erfüllung beider Anforderungen (die Berücksichtung der Informations-Architektur gleichsam wie die der funktionellen Architektur) erschienen. 3.4.1 Vereinfachung der Architektur Ein anderer Ansatz, welcher im Rahmen dieser Arbeit für das DaVinci Framework verfolgt wird, ist, anstatt neue, bessere Modelle für die vorliegende Architektur zu finden, die Architektur von Webapplikationen auf bestimmte Weise zu vereinfachen, KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 40 High Existing Modelling Approach Gap Analysis Modelling Language Support for Functional Architecture Target Zone Conallen [11] UML [10] W2000 [9] HDM-lite [8] Li [12] OOHDM [7] WebML [6] Koch [5] RMM [4] Low HDM [3] Low Modelling Language Support for Information Architecture High Abbildung 3.13: Analyse existierender Versuche für Modellierungskonzepte (aus [LHSG02a]). Auffallend ist, dass die Autoren keine Konzepte identifizieren konnten, welche die Informationsarchitektur sowie die funktionelle Architektur gleichermaßen berücksichtigen. dass einfachere Modelle möglich sind bzw. bei der Modellierung auf traditionelle Mechanismen aus dem Software-Engineering zurückgegriffen werden kann, ohne diese erweitern zu müssen. Jeder Versuch der Erweiterung der traditionellen Modelle für Hypermedia-Umgebungen wird zwangsweise äußerst komplex. Durch die Vielzahl an Versuchen, solche Konzepte zu finden (wobei nur eine kleine Auswahl auch wirklich von praktischem Nutzen ist), existieren nun zahlreiche halbfertige, nicht standardisierte Konzepte, welche teilweise wieder verändert und erweitert werden. Einige Konzepte erfinden neue Notationen und Diagramme (u. a. auch OOHDM), obwohl UML eigentlich genügend Erweiterungsmethoden des Basis-Konzepts zur Verfügung stellt [PSRO02, Kap. 2]. Die Akzeptanz der Konzepte läßt dadurch zu wünschen übrig. Die meisten der vorliegenden Konzepte geben kein klares Architekturkonzept vor, nach dem der technische Ablauf der Applikation stattfindet. Conallen geht zumindest auf die Architektur ein und behandelt in seinem Buch zahlreiche Aspekte der Architektur von Webapplikationen. Sein Modellierungskonzept ist jedoch völlig allgemein gehalten und ermöglicht die Modellierung von Applikationen in jeder Umgebung. Dadurch ist sein Konzept äusserst komplex. Fast alle anderen Konzepte (OOHDM, RMM, Baumeister et al. etc. – vgl. dazu Abb. 3.4, S. 29) legen den Schwerpunkt auf die Modellierung der Applikation. Will man ein Framework für Webapplikationen entwickeln, muss man sich neben der Modellierung auch intensiv mit der Architektur KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 41 von Webapplikationen auseinandersetzen (siehe Abschnitt 3.2. Eine Vereinfachung der Architektur muss allerdings nicht unbedingt auch eine Einschränkung an Möglichkeiten bedeuten. 3.4.2 Überwindung des Hyper-Paradigmas Die Kombination des Hyper-Paradigmas mit traditionellem Software-Engineering ist eine Herausforderung bei der Modellierung von Webapplikationen. Im Folgenden wird versucht, die Architektur des Frameworks so zu spezifizieren, dass die Modellierung mit etablierten Methoden des Software-Engineerings ermöglicht wird und das Hypermedia Paradigma mehr oder weniger entfällt. Die Berücksichtigung des Hypermedia-Charakters soll natürlich nicht ganz auf der Strecke bleiben, zumal sich eine Webapplikation im WWW befindet. Es wird jedoch versucht, die Hypermedia-Aspekte als Teil der Applikationslogik zu definieren. Die Navigation soll beispielsweise innerhalb der Applikationslogik modelliert werden. Typische Hypermedia Design Patterns (vgl. Buch-, Netz- oder hierarchische Navigation [GC00]) können dann von spezifischen Klassen mit traditionellen UML-Notationen modelliert werden. Auch die gesamte Benutzeroberfläche, also die Zusammensetzung einer Seite im Browser mit verschiedenen Unterelementen (z. B. Navigation, eigene TextContainer und -Boxen, etc.), soll als Teil der Applikationslogik entwickelt werden können. Die folgenden Überlegungen sollen dabei helfen: Interaktion über Hyperlinks Die Tatsache, dass die grundlegende Benutzerschnittstelle über HTTP gegeben ist und Interaktion meist nur unidirektional vom Client zum Browser erfolgt (die Möglichkeit von Server-Objekten über RMI oder ActiveX [Con03, Kap. 4] wird vorerst ausgeschlossen), provoziert folgende Überlegung: Bei Webapplikationen wird jede Interaktion durch eine URL spezifiziert. Diese URL kann für die Interaktion erforderliche Parameter enthalten und ist immer auf eine bestimmte Aktion ausgerichtet, welche den Applikationsstatus (business state) ändert. Als Beispiel sei die Suchabfrage in einer Mediendatenbank erwähnt. Ein HTTP-Request enthält hier beispielsweise als Parameter die Suchkriterien. Durch Senden des Requests wird in der Applikation das aktuelle Suchergebnis produziert und ausgegeben. Handelt es sich nun um eine richtige Webapplikation sollte das Suchergebnis nach weiterem Durchstöbern noch erhalten bleiben. Die Session-Behandlung sorgt für die Identifikation des Benutzers über mehrere Requests hinweg und speichert das Abfrageergebnis. Auf einer abstrakten Ebene kann die Interaktion bei Webapplikationen folgendermaßen definiert werden. Es gibt einerseits das System (die Webapplikation) und den Benutzer (als Akteur). Jede Interaktion (HTTP-Request) verändert den Status des Systems (siehe Abb. 3.14). Betrachtet man das Hypermedia-Modell einer Webapplikation als ein Netz aus verschiedenen Knotenpunkten, wobei jeder Knoten eine bestimmte Ansicht repräsentiert, so kann die Navigation auch durch den aktuellen Knotenpunkt, bei dem sich der Benutzer zu einer bestimmten Zeit aufhält, definiert werden. Somit ist sie Teil der Applikationslogik und kann mit ihr in Kombination modelliert werden, ohne dass eine komplexe Verschmelzung des Hyper-Paradigmas KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN Sicht des Benutzers 42 System-Sicht Darstellung von Daten und Interaktionselementen Datenbanken Benutzer oberfläche Daten Applikationslogik persistente Objekte Benutzer (ist evtl. Mitglied in Benutzergruppe) Rechte verwaltung führt Aktion aus Interaktion Benutzerschnittstelle Webapplikation Abbildung 3.14: Interaktion bei Webapplikationen. mit der Applikationslogik notwendig ist. Eine Klasse, welche z. B. für die Navigation in Form eines Baum-Patterns zuständig ist, implementiert Funktionen wie „next“, „previous“, „levelup“ oder „leveldown“ und speichert die jeweilige Position innerhalb des Baumes. Ein Hyperlink definiert demnach eine eindeutige Funktion mit zugehörigen Parametern welche etwa über die GET- oder POST-Methode mitgesendet werden. In Kombination mit dem MVC-Pattern wird ein zentraler Controller definiert, der alle Aktionen entgegennimmt und entsprechend ausführt. Eine Rollen-basierte Interaktion ist bei diesem Konzept äußerst einfach zu realisieren, da alle Requests an einer zentralen Stelle behandelt werden. Bestimmte Aktionen können beispielsweise nur für eine ausgewählte Benutzergruppe definiert werden. Szenegraph-Modell für Ansichten Da die Benutzeroberfläche einer Webapplikation in der Regel nicht aus einer einzigen Ansicht besteht, sondern aus verschiedenen Containern, Boxen und Rahmen, muss eine hierarchische Verschachtelung mehrerer Ansichten (views) möglich sein. Zusätzlich muss der aktuelle Status der gesamten Benutzeroberfläche ebenfalls innerhalb der Applikationslogik gespeichert werden können. Für diesen Zweck eignet sich ein sogenanntes Szenegraph-Modell, welches auch in der Computergrafik (VRML, Java3D, diverse OpenGL APIs 18 ) eingesetzt wird . Ein Szenegraph ist ein hierarchisches Modell in Form eines Baumes. An bestimmten Knotenpunkten können beispielsweise Ansichten angebunden werden, oder aber auch andere funktionale Elemente. Solche funktionalen Elemente sind beispielsweise Schalter, welche ganze Sub-Bäume aktivieren und deaktivieren können. 18 Siehe z. B. http://openscenegraph.sourceforge.net. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 43 Browser-Fenster Navigationsleiste Hauptnavigation Seitenkörper Fußleiste Sub-Navigation Content News-Box Schalter Content-Modul Produktinfo News-Artikel E-Mail Kontaktformular Abbildung 3.15: Beispiel für einen einfachen Szenengraphen für Web-Oberflächen Die Verwendung eines solchen Modells ist auch für Webapplikationen denkbar. Die Grundstruktur der Benutzeroberfläche kann beispielsweise als Szenegraph modelliert werden, wobei an bestimmten Stellen Schalter angebracht sind. Diese Schalter erlauben etwa das Aktivieren und Deaktivieren von Unterbäumen. Das Umschalten der Unterbäume geschieht durch Interaktion (also über URLs) und der aktuelle Status des Szenegraphen wird im Applikationsstatus gespeichert. Die Navigation funktioniert in diesem Fall anders als bei traditionellen Webseiten. Eine URL ist hier kein Verweis auf ein einzelnes Dokument, sondern auf eine Interaktion, welche die Anzeige verändert. Die Anzeige wird beispielsweise dahingehend verändert, dass in einem bestimmten Bereich der Benutzeroberfläche eine anderes Dokument dargestellt wird. In Abbildung 3.15 ist ein einfaches Szenengraph-Modell für eine Webapplikation dargestellt. Es repräsentiert die Oberfläche einer Website für Produktinfos, welche von einem Content Management System gespeist wird. Die Seite unterteilt sich in eine Navigation, einen Seitenkörper in der Mitte und eine Fußleiste. Der Content im Seitenkörper kann über einen Schalter je nach Bedarf gewechselt werden. Produktseiten werden beispielsweise von einem Content-Modul erstellt, andere Module sind etwa für die Anzeige von News-Artikeln, Kontaktformularen, etc. . verantwortlich. Außerdem werden die aktuellsten Neuigkeiten neben dem Seiteninhalt in einer kleinen Box (News-Box) angezeigt. Die im Baum als Knoten definierten Views können etwa als JSP-Seiten oder im Fall von PHP als ganz normale Skripts erstellt werden. Innerhalb dieser ViewSkripts sind bestimmte Daten (eventuell in Form von eigenen Objekten) aus der Applikation erforderlich. JSP-Seiten verwenden dafür häufig sogenannte Custom tags (benutzerdefinierte Markup-Elemente), welche die Kapselung von Java-Code in HTML-ähnliche Elemente ermöglicht. Dadurch soll es Designern, welche in der Praxis die Ansichten entwerfen, ermöglicht werden, ohne Programmierkenntnisse CodeElemente zu platzieren [Sun03]. Eine genauere Beschreibung des Modells ist anhand des DaVinci Konzepts in KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 44 Abschnitt 4.4.1 zu finden. Modellierung Durch Integration der Benutzerinteraktion und der Ansichten in die Applikationslogik, können alle drei Komponenten des MVC-Patterns mit klassischen Methoden und auch sehr gut mit UML modelliert werden. Die Strategie eignet sich im Übrigen hervorragend für Webapplikationen mit Schwerpunkt auf den Applikationsteil. Eine traditionelle, lokal ausgeführte Anwendung wie etwa Microsoft Word, besitzt genauso eine persistente Benutzeroberfläche mit verschiedenen Menüleisten und Unterfenstern usw., welche ein- und ausgeblendet werden können. Bei Java AWT19 wird auf ähnliche Weise eine hierarchische, grafische Benutzeroberfläche zusammengestellt. Applikationen mit vorwiegend unterschiedlichen und ständig wechselnden Ansichten, würden zwar ein relativ komplexes Szenegraph-Modell erfordern, solche Anwendungen können jedoch auch mit anderen Methoden nur mit viel Aufwand modelliert werden. 3.4.3 Model-View-Controller Pattern Das Model-View-Controller Konzept, meist einfach als MVC abgekürzt, stammt ursprünglich aus der Programmierumgebung Smalltalk und dient seit Smalltalk-80 zur Implementierung von grafischen Benutzeroberflächen (GUI) [Hun97, S. 266ff]. Die Grundidee ist die Trennung von Anwendung und Benutzerschnittstelle. Das Konzept besteht aus den folgenden Objekten, wobei jedes einen bestimmten Aufgabenbereich erfüllt: Model – das „Datenmodell“ der Anwendung. Es dient einerseits zur Datenhaltung und Speicherung und auch zur Datenverarbeitung. Es beinhaltet den Großteil des „Verhaltens“ (behaviour bzw.business state) der Applikation. View – dient zur Präsentation der Daten. Dieser Teil stellt die Ansichten der Benutzerschnittstelle dar, das was der Benutzer sieht. Controller – dieser Teil der Benutzerschnittstelle stellt Interaktionsmöglichkeiten zur Verfügung. Er kontrolliert das model. Das MVC-Konzept ist heute in der objektorientierten Programmierung allgegenwärtig und wird auch von den Sun Java Blueprints20 für die J2EE-Umgebung als Design Pattern vorgeschlagen [Sun02b]. In [SSJ02, Abschnitt 4.4] empfiehlt Sun (BluePrints) beispielsweise zur Implementierung des Web-tiers einer Geschäftsapplikation die Verwendung des MVC-Patterns. Alan Knight und Naci Dai, beide Smalltalk- und Java-Entwickler und Mitglieder der ACM21 , haben ebenfalls eine Architektur für Webapplikationen auf Basis des 19 Der Java Abstract Windowing Toolkit dient ähnlich wie Java Swing zur Erstellung von grafischen Benutzeroberflächen für Java-Anwendungen (siehe Java Dokumentation unter http://java.sun.com/ docs). 20 Die Java BluePrints bieten Best Practise-Lösungen für den Einsatz von Java Technologien. Siehe http://java.sun.com/blueprints. 21 Die Association for Computing Machinery wurde bereits 1947 gegründet und ist die älteste und größte Vereinigung für Forschung und Lehre der Informatik. Siehe http://www.acm.org. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN WAP 45 WAP input controller Input controller HTTP HTTP input controller Application controller Finds and executes Action XML view XML JavaServer Page view JavaServer Page View Abbildung 3.16: Web-tier Architektur auf Basis des MVC-Patterns nach [KD02, S. 54]. MVC-Patterns veröffentlicht [KD02]. Abbildung 3.16 zeigt die Architektur schematisch. Der controller teilt sich hier in einen input und application controller. Alle HTTP-Anfragen werden vom Input controller (bei Sun auch FrontController genannt [SSJ02, S. 97]) empfangen, welcher die Anfrage an den application controller weiterleitet. Dieser hat Zugriff zur Applikationslogik und dem model (welches in der Abbildung innerhalb des application controller gedacht werden muss) und führt die gewünschte Aktion aus. Views dienen am Ende des Requests zur Darstellung von Daten im Browser. Das Konzept von [KD02] verwendet für jeden Client-Typ einen eigenen input controller. Als Client-Typen sollen dadurch nicht nur unterschiedliche HTTP-Clients, sondern sogar auf anderen Protokollen basierende Clients tauglich sein. Durch die Trennung von Datenhaltung, Applikationslogik/Interaktion und Präsentation in drei Schichten kann – wie im Übrigen auch im OOHDM-Konzept erkannt wurde – jede Schicht durch eine andere ausgetauscht werden. Es kann beispielsweise eine Präsentationsschicht für unterschiedliche Clients definiert werden. MVC als Pattern zur Modellierung und in der Architektur Die Java BluePrints [SSJ02] und das Konzept von [KD02] verwenden den MVCPattern direkt in Bezug auf die Architektur einer Webapplikation. Bei OOHDM wird der Patterns hingegen für die Modellierung adaptiert. Es wird bei OOHDM zwar nicht direkt auf den MVC-Pattern verwiesen, es lassen sich allerdings Parallelen erkennen. Die Architektur wird bei OOHDM nicht spezifiziert. Ein anderes Konzept, von David Lowe et al. [LHSG02a], verwendet den MVC-Pattern bewusst als Basis eines erweiterten konzeptuellen Modells (extended conceptual model, siehe Abb. KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 46 Extended Conceptual Model Model Controlle r View Composition Presentation Information Architecture Navigation Operation Functional Architecture Abbildung 3.17: Erweitertes konzeptuelles Modell nach Lowe et al. Aus [LHSG02a]. 3.17). Für die Modelle wird allerdings UML um neue Diagramme ergänzt, was prinzipiell nicht nötig wäre, da UML genug Erweiterungsmethoden bietet [PSRO02]. Das Konzept stützt sich zwar deutlicher auf die Vorteile von MVC und legt einen Schwerpunkt auf die Applikationslogik, bietet aber auch keine konkrete Softwarearchitektur auf Basis des Patterns. Eine solche Architektur sollte beispeilsweise definieren, wie HTTP-Anfragen verarbeitet werden, wie und wo das model verwaltet wird und wie die Zusammenstellung und Auswahl der views erfolgt. Die Softwarearchitektur ist für die Implementierung eines Frameworks ausschlaggebend. Model 1 und Model 2 Architektur Im Vorschlag der Java BluePrints [SSJ02] wird die Softwarearchitektur einer Webapplikation spezifiziert. Es werden zwei unterschiedliche Anwendungskonzepte des MVC-Patterns für Webapplikationen vorgestellt, welche ursprünglich in der Spezifikation von JSP definiert wurden [Qus03]: Model 1: Hier werden für jede Webseite am Server JSP-Seiten verwendet (Abb. 3.18). JSP-Seiten enthalten (ähnlich wie ASP oder PHP) HTML-Code und spezielle Skript-Elemente. In einer Model 1 Architektur wird die Benutzerinteraktion über JSP-Seiten abgewickelt. Controller und view sind hier nicht ordentlich getrennt. Diese Methode eignet sich bei kleineren dynamischen Websites, wie etwa für ein Gästebuch oder ein E-Mailformular. Für größere Webapplikationen ist die Model 2 Architektur jedoch besser geeignet. Model 2: Bei dieser Architektur dient ein Servlet als controller (Front-Controller, Abb. 3.19). Es übernimmt alle HTTP-Anfragen und führt in der Applika- KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 47 Abbildung 3.18: Model 1 Architektur. Aus [Qus03]. Abbildung 3.19: Model 2 Architektur. Aus [Qus03]. tionslogik die entsprechenden Aktionen aus, bevor es am Ende an ein view weiterleitet. Views werden mittels JSP-Seiten realisiert. Zur Erstellung von Webapplikationen ist grundsätzlich nur Model 2 interessant, da eine strikte Trennung nach dem MVC-Konzept angestrebt werden muss. Das DaVinci Framework basiert auf dieser Model 2 Architektur. Auch das Java-basierte Struts Framework (siehe Abschnitt 2.3.2) verwendet dieses Konzept. 3.4.4 Modellierung auf Basis des DaVinci Frameworks Das DaVinci Framework nimmt einen Großteil der Modellierungstätigkeit ab, da die Architektur im Großen und Ganzen bereits vorgegeben ist. Die Benutzerinteraktion, die Darstellung und ein Teil der Applikationslogik sind von der Softwarearchitektur her bereits festgelegt. Die Modellierung neuer Webapplikationen auf Basis des Frameworks wird erheblich vereinfacht. Im Folgenden wird ein Konzept angedacht, nachdem die Modellierung für DaVinci -basierte Anwendungen auf Basis von UML erfolgen könnte. Es wird hier nicht der gesamte Entwicklungsprozess definiert, sondern bloß der Teil der DaVinci -spezifischen Modellierung. Der Gesamtprozess kann nach einer beliebigen Methode erfolgen. Nach der Anforderungsanalyse müssen folgende Schritte der Modellierung behandelt werden: Grober, funktioneller Entwurf: Ein grober Entwurf der nötigen Funktionalität hilft, einen Überblick über die erforderlichen Komponenten zu schaffen. Er KAPITEL 3. ENTWICKLUNG VON WEBAPPLIKATIONEN 48 soll die gesamte Applikationslogik auf einer überschaubaren Abstraktionsstufe spezifizieren. UML-Diagramme (vorwiegend use case- und einfache Klassendiagramme) können verwendet werden. Szenegraph: Conallen nennt in seinem Prozess den Anwender-zentrischen Entwurf UX model (User-Experience Model) [Con03, Kap. 9]. In diesem Schritt wird u. a. die gesamte view-Komponente modelliert, der wichtigste Teil der Benutzerschnittstelle. Ein schlechtes UX-Modell wirkt sich auf die Ergonomie und Benutzerfreundlichkeit der Anwendung aus. Auch für DaVinci -basierte Webapplikationen ist es ratsam, nach dem groben funktionellen Entwurf den Szenegraph zu entwerfen. Dafür eignet sich ein UML-Klassendiagramm mit definierten Stereotypen. View- und switch-Knoten werden als Klassen dargestellt. Die für ein view zur Anzeige von Daten benötigten Objekte können als Parameter definiert werden. Aktionen: Nach Konzeption der view-Hierarchie wird der Szenengraph um das Interaktionmodell erweitert. Da Aktionen immer über views angesprochen werden (also über in views enthaltene Hyperlinks oder HTML-Formulare), können Aktionen auch als Methoden der views angesehen werden. Für jede Aktion wird daher eine eigene Methode mit den erforderlichen Parametern der betroffenen view-Klasse definiert. Verhalten: Im DaVinci Framework wird für jede Aktion eine eigene Klasse verwendet. Eine solche Aktionsklasse enthält eine bestimmte Funktion (execute ()), welche beim Ausführen dieser Aktion vom Framework aufgerufen wird. Einfache Aktionen verändern beispielsweise bloß den Szenegraph durch Umschalten eines Unterbaumes und dienen somit nur zur Navigation. Aktionen welche mehr bewirken, können in diesem Schritt mittels activity-, statechart- oder sequence-Diagramm veranschaulicht werden. Auch der Rest der Applikationslogik wird nun mit dynamischen Ansichten modelliert. Für persistente Objekte steht bei DaVinci ein eigener model-Stereotyp zur Verfügung. Model-Klassen existieren über einzelne Requests hinaus und werden in der Session gespeichert. Für die Datenhaltung wird im DaVinci Framework auch noch ein repositoryStereotyp verwendet. Über ein solches repository können Daten nach einem relationalen Schema (vgl. Relationale Datenbank [Sau94]) temporär für die Dauer der Sitzung, oder in einer angebunden Datenbank gespeichert werden. Am Ende der Modellierung kann die Implementierung beginnen. In Kapitel 5 wird anhand eines Praxisbeispiels nochmals im Detail auf die Modellierung mit DaVinci eingegangen. Kapitel 4 Design und Architektur eines Frameworks für Webapplikationen Dieses Kapitel beschreibt das im Rahmen der Diplomarbeit konzipierte DaVinci Framework. Es werden die Architektur der Umgebung und die wichtigsten Komponenten und Klassen beschrieben. Eine detaillierte Beschreibung aller Klassen, deren Eigenschaften und Funktionen, würde den Rahmen der Arbeit sprengen. Das Framework ist bereits relativ umfangreich. Dieses Kapitel beschränkt sich daher bloß auf das grundlegende Konzept und die Architektur von DaVinci. Im ersten Abschnitt wird die Architektur im Überblick beschrieben. Die weiteren Abschnitte beschreiben die Komponenten zur Benutzerinteraktion, Applikationslogik, Darstellung und Datenhaltung genauer. 4.1 Architektur im Überblick Das DaVinci Framework basiert im Wesentlichen auf zwei spezifischen Eigenschaften. Zum einen ist die Verwendung des im vorigen Kapitel beschriebenen SzenegraphModells für die Darstellung der Benutzeroberfläche, also der jeweiligen Seite im Browser, wesentlich. Die zweite Besonderheit ist die Festlegung, dass jede Benutzerinteraktion durch eine eigene URL definiert wird. Das heißt auch, es muss für jede unterschiedliche Interaktion eine eigene URL und ihre zugehörige Aktionsklasse festgelegt werden. Für die Administration einer Kundendatenbank wären etwa die Aktionen „neuen Kunden anlegen“, „Kundendaten bearbeiten“, „geänderte Daten speichern“, „Kunde löschen“ von Nöten, wobei für jede dieser Aktionen jeweils eine eigene URL mit einer eingenen Aktionsklasse verwendet wird. Jede URL in der Webapplikation entspricht daher stets einer eigenen Aktion. Andere Webapplikationen verwenden für die jeweiligen Interaktionen zum Teil verschiedene Skripts bzw. Servlets (im Fall von Java). Die URL besteht meist aus dem Servlet-Mapping und einigen Parametern (vgl. Java, [SSJ02]). Bei DaVinci besteht die URL aus dem sogenannten Action-Mapping und den entsprechenden Parametern, welche in der Aktionsklasse zuvor definiert werden (siehe Abschnitt 4.2.2). Alle möglichen Parameter für eine Interaktion werden damit strikt vordefiniert. 49 KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN View Generator Model Manager generate view change scenegraph get model native conn 50 Storage Bridge create/update/delete load Applikationslogik execute action close Console Front Controller Repository Manager open execute command Administrator request action WWW-Benutzer Abbildung 4.1: Framework-Architektur, Komponenten. 4.1.1 Komponenten Die Architektur des Frameworks basiert auf den Überlegungen aus Abschnitt 3.4.2. Die Benutzerinteraktion kann auf einer abstrakten Ebene nach Abbildung 3.14 (Seite 42) veranschaulicht werden. Das System besteht aus folgenden Komponenten, welche auch in Abbildung 4.1 anhand eines UML-Komponentendiagramms dargestellt sind: Controller: Der controller ist die zentrale Schnittstelle der Benutzerinteraktion im MVC Model 2 (siehe Abschnitt 3.4.3). Hier werden alle HTTP-Anfragen platziert. Da der controller an vorderster Front der Anwendung sitzt, wird er in diesem Zusammenhang auch als FrontController bezeichnet. Er führt die entsprechende Aktion in der Applikationslogik aus und beauftragt anschließend den ViewGenerator mit der Generierung der aktuellen Benutzeroberfläche (zumeist eine HTML-Seite). Applikationslogik: Die Applikationslogik besteht aus den Objekten der Applikation (business objects) und diversen weiteren Klassen und Paketen. Sie ermöglicht durch die Verwendung von speziellen model-Klassen (siehe Abschnitt 4.3.1), welche persistent in der Session gespeichert werden, den für eine Webapplikation erforderlichen Applikationsstatus (business state). Models können vom ModelManager angefordert werden. Der View-Baum kann beispielsweise von Aktionen aber auch von anderen Objekten der Applikationslogik geändert werden. Es können außerdem native Datenbankverbindungen über die StorageBridge hergestellt werden. ModelManager: Der ModelManager verwaltet bei DaVinci alle persistenten modelObjekte. Diese werden zu Beginn der Session angelegt und bei jedem weiteren KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 51 Request automatisch re-initialisiert. Über eine öffentliche Funktion kann die Instanz eines bestimmten models retourniert werden. RepositoryManager: Dieser Manager verwaltet repositories, welche Daten nach einem relationalen Schema speichern können. Über die StorageBridge-Komponente als Datenbank-Abstraktionsschicht können an repositories relationale Datenbanken angebunden werden. Zur Zeit wird nur MySQL unterstützt. StorageBridge: Diese Komponente dient als Adapter zu verschiedenen Datenbanken. Sie verwendet intern einen Verbindungspool und stellt außerdem native Datenbankverbindungen zur Verfügung (siehe Abschnitt 4.5.2). ViewGenerator: Der ViewGenerator verwaltet den View-Baum (Szenegraphen, siehe Abschnitt 3.4.2) und generiert die Ausgabe am Ende eines Requests. Über öffentliche Methoden können Schalter geändert werden. Der ViewGenerator kann in bestimmten Fällen auch deaktiviert werden (beispielsweise wenn Inhalte eines anderen MIME-Typs als HTML ausgegeben werden sollen). Console: Es wäre auch möglich durch eine eigene Console als zusätzliche Benutzerschnittstelle zur Applikation diverse Aktionen auszuführen. Die Console ist in der momentanen Version noch nicht implementiert, wird jedoch in Zukunft von Bedeutung sein, um beispielsweise neue repositories erstellen zu können (siehe Erweiterungen, Abschnitt 7.1.3). In den folgenden Abschnitten werden diese Komponenten näher erklärt. Die Abschnitte wurden in die Aufgabengebiete Benutzerinteraktion, Applikationslogik, Darstellung und Datenhaltung gegliedert. Anhang A enthält zusätzliche Erklärungen des DaVinci Frameworks zum besseren Verständnis. Es werden die Verzeichnisstruktur der Distribution, die wichtigsten Umgebungsvariablen, die Konfiguration des Frameworks und neuer Webapplikationen und die DaVinci-eigenen Datentypen beschrieben. 4.2 Benutzerinteraktion Das Framework basiert auf dem MVC Model 2 Konzept. Alle Anfragen, die bei einer DaVinci -basierten Webapplikation eingehen, werden über ein zentrales Script, dem FrontController abgewickelt. Jede Interaktion wird durch eine eigene URL repräsentiert, wobei für jede URL eine Aktionsklasse existiert. 4.2.1 FrontController Der FrontController dient als Schnittstelle zum Browser. Eine HTTP-Anfrage stößt vorerst auf ein Skript (index.php) welches als einzige Datei globalen PHP-Code enthält. Dieser Code ist notwendig, da PHP nicht von Grund auf objektorientiert ist und es keine Hauptklasse gibt, mit der die Ausführung des Skript beginnt. Innerhalb des Index-Skripts wird der FrontController initialisiert und gestartet. Der FrontController wird von der Klasse DaVinci implementiert. Die Klasse dient nicht nur als FrontController, sondern enthält auch einige wichtige Funktionen, die das Framework KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 52 Abbildung 4.2: UML Klassendiagramm zur Benutzerinteraktion. Abbildung 4.3: UML Sequenzdiagramm zur Benutzerinteraktion. insgesamt betreffen. So beispielsweise Funktionen zur Initialisierung des Frameworks bei einer neuen Anfrage, zur Fehlerbehandlung und zum Debugging. Das Klassendiagramm in Abbildung 4.2 zeigt die an der Benutzerinteraktion beteiligten Klassen. Der zeitliche Ablauf einer Interaktion ist in Abbildung 4.3 als Sequenzdiagramm dargestellt. Bevor die gewünschte Interaktion stattfindet, wird das Framework für die Verarbeitung der neuen Anfrage re-initialisiert. Alle persistenten Objekte und die gesamte Applikationslogik werden in diesem Schritt neu aufgebaut. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 53 Initialisierung des Frameworks Die Funktion DaVinci:: init () bereitet zu Beginn eines neuen Requests alle benötigten Ressourcen für die Webapplikation vor. Der Ablauf sieht so aus, dass zuerst allgemeine Konfigurationswerte eingelesen werden. Anschließend werden alle benötigten Singleton-Klassen instanziert. Darunter fallen sämtliche Manager-Klassen, welche z. B. persistente Objekte verwalten, und die Klasse StorageBridge. Die StorageBridge dient als Brücke von den repositories zur jeweiligen Datenbank. Sie übernimmt die korrekte Übernahme aller Daten, legt Tabellen an und löscht diese (siehe Abschnitt 4.5.2). Wird nun erstmals mit dem Webbrowser auf den Applikationsserver zugegriffen, wird eine neue Session generiert. Ansonsten wird die aktuelle Session wiederverwendet. Nun können alle persistenten Objekte, welche der aktuellen Session angehören re-initialisiert werden. Ausführen des Requests Nach der Initialisierung wird mit dem Aufruf von DaVinci::service () (innerhalb des Skripts index.php) die eigentliche Requestbehandlung gestartet und die gewünschte Interaktion kann durchgeführt werden. Die Funktion besteht aus zwei Schritten. Im ersten Schritt wird, falls nötig, die im Request angegebene Aktion ausgeführt und im zweiten Schritt wird die Folgeseite generiert, welche an den Browser zurückgegeben wird (siehe Abschnitt 4.4). Aktionen werden durch jene HTTP-Requests angestoßen, welche in der URL nach dem Dateinamen des FrontController-Scripts eine Aktion spezifizieren (action mapping). Wird keine Aktion angegeben, wird bloß die Anzeige neu generiert. Die Abbildung von URLs auf Aktionen funktioniert im Detail wie folgt. 4.2.2 Abbildung von URLs auf Aktionsklassen Eine HTTP-URL hat laut RFC2616 [FGM+ 99, Abschnitt 3.2.2] die allgemeine Form: "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] Sie referenziert somit ein eindeutiges Hypertextdokument im World Wide Web. Da jedoch bei Verwendung der MVC Model 2 Strategie alle Requests zum selben Dokument zeigen, muss man die zusätzliche Information, welches Dokument angefordert werden soll, beispielsweise per Query-String (jener Teil der URL nach dem „?“) übergeben. Da jedoch viele Suchmaschinen den Query-String ignorieren, würde eine Indizierung der Website nicht möglich sein, weil der Robot der Suchmaschine nach dem Durchsuchen der Startseite (das FrontController-Script) abbrechen würde. Abbhilfe schafft hier die Verwendung der sogenannten Pfadinfo (eng. pathinfo). Wird nach dem Dokument in der URL noch ein weiterer Pfad angegeben, wird dieser von den meisten Webservern (u.a. von Apache) ausgelesen und als Umgebungsvariable zur Verfügung gestellt. Am Beispiel der URL http://phpdavinci.sf.net/davinci. php/show.Content ist die Pfadinfo durch die Zeichenkette „show.Content“ gegeben. Die allgemeine Notation der Zeichenkette abs_path aus obiger Definition wäre genauer ausgedrückt, folgende: abs_path = directory_path "/" file_name "/" path_info KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 54 Nun werden bei DaVinci anstatt einzelner Dokumente vielmehr Aktionen mit URLs referenziert. Das bedeutet etwa, dass eine bestimmte Webseite nicht über eine URL wie zum Beispiel http://phpdavinci.sf.net/showuserdetails.php?uid=34 sondern etwa über die URL http://phpdavinci.sf.net/davinci.php/users.ShowDetails/34 referenziert wird. Die Pfadinfo liefert in diesem Beispiel den Wert „users.ShowDetails/34“ und enthält vor dem „/“ den Verweis auf die auszuführende Aktion. Die URL verweist also auf die Aktion „users.ShowDetails“. Für diese Aktion muss eine zugehörige action-Klasse vorhanden sein. Anschließend sind alle für die Aktion benötigten Parameter mit weiteren Schrägstrichen getrennt zu finden. Der Wert „users.ShowDetails“ wird im DaVinci Framework auch als action mapping bezeichnet. Jede Aktion wird durch einen eindeutigen Pfad im System referenziert. Alle Parameter, welche auf das action mapping folgen, werden vorher in der Aktionsklasse definiert (siehe Abschnitt 4.2.4). Jede Aktion verlangt also, ähnlich wie eine PHP-Funktion, bestimmte Parameter. 4.2.3 Die Klasse ActionManager Jede Interaktion mit dem DaVinci Framework erfolgt über eine zugehörige Aktionsklasse. Jede Aktionsklasse besitzt eine Funktion namens execute (), welche den auszuführenden Code enthält. Die Aktionsklassen sind dabei in einer Verzeichnishierarchie ähnlich den packages bei Java organisiert (siehe Abschnitt 4.2.4). Die Klasse ActionManager verwaltet als statische Singleton-Klasse alle Aktionen. Sie erstellt bei Bedarf Instanzen von Aktionsklassen und führt außerdem alle Parameter, welche mit POST oder über die Pfadinfo mitgesendet wurden, in die Instanz der Aktionsklasse über. Bei DaVinci werden im Übrigen alle Klassen, die zur Verwaltung von anderen Instanzen dienen, als Manager-Klassen bezeichnet. Dazu gehören neben dem Action-Manager auch noch der Model-Manager, der Component-Manager und der Repository-Manager. 4.2.4 DaVinci Aktionsklassen Aktionsklassen werden vom Entwickler für jede einzelne Interaktion erstellt. Eine Aktionsklasse muss von der abstrakten Klasse AbstractAction abgeleitet werden. Im Konstruktor der Aktionsklasse können ihre erforderlichen Pfadinfo-Parameter definiert werden. Jede Aktionsklasse implementiert in der Funktion execute () den Programmcode, der ausgeführt werden soll. Am Ende dieser Funktion muss ein boolscher Wert, der den Erfolgsstatus angibt, zurückgegeben werden. Die Aktionsklasse erbt als Instanzvariable ein assoziatives Array namens $parameters, indem später bei der Ausführung der Aktion alle benötigten Pfadinfo- und POST-Parameter enthalten sind. Quellcode 4.1 zeigt eine beispielhafte Aktionsklasse. In dem Beispiel gibt es ein model, welches unter anderem die aktuelle Seite eines angebundenen Content-Moduls speichert. Die Aktion definiert im Konstruktor den Pfadinfo-Parameter page_id, welcher der ID der aktuellen Seite entspricht. Wird hier die URL http://intrante.mycompany.org/davinci.php/content.ShowPage/17 aufgerufen, so wird im Content-model die aktuelle Seiten-ID auf 17 gesetzt. Anschließend wird mittels ViewGenerator::setSwitch() jener View-Knoten, welcher den Content anzeigt aktiviert (siehe Abschnitt 4.4). KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 55 c l a s s ShowPage e x t e n d s A b s t r a c t A c t i o n { f u n c t i o n ShowPage ( ) { $ t h i s −>_addPathParamDef ( ' page_id ' , DATATYPE_INTEGER) ; } function execute () { i f ( $ t h i s −>p a r a m e t e r s [ ' h a n d l e ' ] ! = n u l l ) { $model =& ModelManager : : getModel ( ' c o n t e n t . Content ' ) ; $model−>changePage ( $ t h i s −>p a r a m e t e r s [ ' page_id ' ] ) ; } ViewGenerator : : s e t S w i t c h ( ' mainframe . page_body ' , ' c o n t e n t ' ) ; r e t u r n true ; } } Quellcode 4.1: Beispiel einer Aktionsklasse. Parameterdefinitionen im Konstruktor Um in einer Aktionsklasse Parameterdefinitionen anzugeben, stehen innerhalb der Klasse zwei private Funktionen zur Verfügung: „_addPathParamDef()“ und „_addParamDef()“. Mit der ersten Funktion werden Pfadinfo-Parameter definiert und mit der zweiten POST-Parameter. Die Besonderheit bei der Verwendung von PfadinfoParametern ist, dass in der Pfadinfo keine Variablenbezeichnung enthalten ist. Die Parameter werden in der Pfadinfo stets in jener Abfolge angenommen, wie sie im Konstruktor der Aktionsklasse definiert wurden. Ein Aufruf mit dem action mapping „show.Content/34/de/compact“ enthält in der Pfadinfo drei Parameter: „34“, „de“ und „compact“. Mit der zugehörigen Parameterdefinition ist die Bedeutung der Parameterfolge eindeutig: $ t h i s −>_addPathParamDef ( ' page_id ' , DATATYPE_INTEGER) ; $ t h i s −>_addPathParamDef ( ' l a n g u a g e ' , DATATYPE_VARCHAR, ' de ' ) ; $ t h i s −>_addPathParamDef ( ' l a y o u t ' , DATATYPE_VARCHAR, ' f u l l ' ) ; Die Definitionsfunktionen erfordern drei Funktionsparamter: einen Schlüssel, den Datentyp und wahlweise einen Standardwert für den Parameter. DaVinci verwendet eigene Datentypen, welche die korrekte Konvertierung von Werten aus HTMLFormularen und aus den verschiedenen Datenbanken sicherstellen (siehe Anhang A.4). In der execute ()-Funktion sind über das assoziative Array $parameters laut obigem Beispiel die Werte der Schlüssel page_id, language und layout verfügbar. Auch alle POST-Parameter, welche gleichermaßen mit der Funktion _addParamDef() definiert wurden sind im selben Array verfügbar. Die Zusammenführung aller Parameter, egal ob Pfadinfo oder POST-Parameter in ein und dasselbe Array hat den Vorteil, dass Doppeldefinitionen nicht möglich sind. Denn in der Regel sollte ein Wert entweder per Pfadinfo oder per POST-Parameter übergeben werden. Im Zweifelsfall wird der Wert des POST-Parameters in das Array geschrieben. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 56 Funktion execute() Die execute ()-Funktion enthält in den meisten Fällen den gesamten Quellcode der Aktionsklasse. Es können allerdings auch weitere private Hilfsfunktionen erstellt werden, welche in weiterer Folge von der execute ()-Funktion aufgerufen werden. Die execute ()-Funktion ist jedoch stets der Einstiegspunkt der Aktionsklasse, die diese Funktion innerhalb von DaVinci::executeAction() aufgerufen wird. Der Spielraum, den man in Aktionsklassen hat ist groß. So können etwa models und registrierte repositories angesprochen werden, neue repositories erstellt werden oder etwa der View-Baum (siehe Abschnitt 4.4.1) verändert werden. Grundsätzlich sollte aber die Applikationslogik innerhalb von models implementiert werden. Aktionsklassen dienen primär der Schnittstelle zwischen den MVC-Schichten controler und model. Content kann fallweise auch direkt, ohne Verwendung des View-Generators ausgegeben werden. Das Ausschalten des View-Generators ist vor allem bei der Generierung von Bildern und Ausgabeformaten mit einem anderen MIME-Typ als HTML, von Bedeutung. Möglichkeiten von Aktionsklassen Im Folgenden sollen einige Möglichkeiten die sich für Aktionsklassen anbieten, beispielhaft behandelt werden. All diese Möglichkeiten gelten prinzipiell für alle Klassen im Framework und sind im Speziellen auch für models von Bedeutung. Alle öffentlichen Manager-Funktionen wurden als statische (static) Funktionen implementiert und können von jeder Klasse aus aufgerufen werden (vgl. Operator „::“, [The03a, Kap. 14]). Anbindung von registrierten repositories: Der Repository-Manager stellt unter anderem Funktionen zum Öffnen und Schließen registrierter repositories zur Verfügung (siehe Abschnitt 4.5.1. Registrierte repositories sind dem Framework bekannt und können so über einen einfachen Bezeichner angesprochen werden. Die Funktion RepositoryManager::open() gibt zu einem bestimmten Bezeichner die Instanz des entsprechenden repositories zurück. Anschließend können alle öffentlichen Funktionen der repository-Klasse verwendet werden. temporäre repositories: Repositories können auch temporär verwendet werden. Sie können neu erstellt werden, in ein model abgelegt werden und zu einem späteren Zeitpunkt wieder gelöscht werden. Der Unterschied liegt darin, dass das repository nicht dauerhaft gespeichert wird. Der Warenkorb bei einem Shop-System wäre etwa ein Beispiel für ein solches repository. Eine API zum Arbeiten mit repositories ist im Anhang A.5 zu finden. Anbindung von models: Sehr ähnlich funktioniert die Anbindung von models. Mit der Funktion ModelManager::getModel() kann eine Referenz der zugehörigen model-Instanz geholt werden. Als Parameter muss die mapping des models angegeben werden. Verändern des View-Baums: Mit den öffentlichen Funktionen die der View-Generator bereitstellt, kann der Ausgabe-Baum verändert werden. Mittels ViewGenerator ::setSwitch() können Teilbäume umgeschaltet werden. Falls mehrere View- KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 57 Bäume definiert wurden, kann mit ViewGenerator::setViewTree() der aktuelle View-Baum gesetzt werden. Die Funktion ViewGenerator::disableOutput() schaltet, wie der Name bereits verrät, die Generierung von views gänzlich aus. Die Funktionen sind im Detail im Abschnitt 4.4.4 beschrieben. Ausgabe von Content: Normalerweise wird in einer Aktionsklasse kein Content ausgegeben. Der Content wird erst später vom View-Generator erzeugt. Zur Generierung von binärem Content (z.B. Bilder) oder XML-Dokumenten (z.B. SOAP) kann der View-Generator deaktiviert werden, und Content kann direkt in der Aktion ausgegeben werden. Mittels der PHP-Funktion header() sollte vor der Ausgabe jedoch der richtige MIMI-Typ festgelegt werden. Gliederung der Aktionsklassen Alle Aktionen, die im Framework zur Verfügung stehen, werden mit einem eindeutigen action mapping spezifiziert. Dieser String ist ähnlich wie die Klassenpakete bei Java aufgebaut. Die Gliederung aller Aktionsklassen in Unterverzeichnisse hat mehrere Vorteile. Zum einen erleichtert dies den Überblick und zum anderen kann sich später eine Rechteverwaltung an dieser hierarchischen Struktur orientieren. Das action mapping sieht im Allgemeinen Fall folgendermaßen aus: directory.sub-directory.[sub-sub...].ClassName Die zu diesem action mapping gehörende Aktionsklasse muss nun im Verzeichnis „directory/sub-directory/[sub-sub...]“ liegen. Der Dateiname muss gleich lauten wie die Klasse und auf „.class“ enden („ClassName.class“). 4.2.5 Rechteverwaltung In der Regel wird eine Webapplikation von mehreren Benutzern verwendet. Eine Rechteverwaltung ermöglicht für unterschiedliche Benutzergruppen, bestimmte Aktionen zu erlauben und andere zu sperren. Durch die Verwendung der MVC Model 2 Architektur mit einem zentralen FrontController ist die Rechteverwaltung relativ einfach zu implementieren. Der FrontController muss vor Ausführung einer Aktion die Authorisierung des Benutzers überprüfen. Ist der Benutzer nicht authorisiert, wird entweder eine Fehlermeldung ausgegeben oder der Benutzer kann sich authorisieren. Eine Rechteverwaltung wurde zur Zeit noch nicht implementiert. 4.3 Applikationslogik Die Applikationslogik besteht aus verschiedensten Klassen und besitzt als Schnittstelle zur Benutzerinteraktion auch einige Aktionsklassen. Abbildung 4.4 zeigt ein Klassendiagramm jenes Teils der Applikationslogik, der Aktionsklassen und models betrifft. In der Mitte ist eine Aktionsklasse dargestellt, welche in ihrer execute () -Funktion Zugriff auf sämtliche Komponenten hat. Die restliche Applikationslogik kann mit beliebigen eigenen Klassen realisiert werden. Für spezielle model- und action-Klassen wurden die Stereotypen action und model eingeführt: Model-Klassen sind persistent und werden vom ModelManager innerhalb der Session verwaltet. Sie besitzen bestimmte Parameter, implementieren in der KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 58 Abbildung 4.4: Aktionsklassen und models im Klassendiagramm. Regel eine interne Logik und stellen nach außen hin öffentliche Methoden zur Verfügung. Diese Methoden können beispielsweise von actions aufgerufen werden. Ein Warenkorb etwa bietet Funktionen an, wie addToCart() und removeFromCart(). Wie die interne Logik im model des Warenkorbs aussieht ist jedoch egal. Das model Warenkorb wird höchstwahrscheinlich intern ein repository verwalten, indem die Produkte gespeichert sind. Dieses repository ist aber letztlich nur für den Warenkorb relevant und nach außen hin nicht sichtbar. Aktionsklassen oder einfach actions dienen als Schnittstellen zwischen Browser und Server. Jede URL verweist auf eine eigene Aktionsklasse (siehe Abschnitt 4.2). Diese Klassen zählen u. a. auch zur Applikationslogik. Sie sollten jedoch möglichst wenig Code selbst implementieren. Typischer Code in Aktionsklassen betrifft die Modifizierung des View-Baumes, etwa für eine Interaktion zur Navigation. Der Großteil der Applikationslogik wird mittels models und beliebigen weiteren Klassen realisiert. Für alle Klassen der Applikationslogik gelten die im vorigen Abschnitt für Aktionen beschriebenen Möglichkeiten (Abschnitt 4.2.4). Es können also repositories verwendet werden, alle models angesprochen werden und der View-Baum verändert werden. Vorraussetzung für die Persistenz von models ist die Session-Behandlung. Die von PHP4 zur Verfügung stehenden Routinen zur Behandlung von Sessions wurden weitgehend verwendet und in eine eigene Klasse namens Session gekapselt. Diese statische Klasse dient zum Initialiseren und Wiederverwenden einer bereits vorhandenen Session. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 59 <?php c l a s s Content e x t e n d s AbstractModel { var $pageID ; f u n c t i o n Content ( ) { $ t h i s −>pageID = 1 ; } function r e q u e s t I n i t () {} f u n c t i o n changePage ( $pageID ) { $ t h i s −>pageID = $pageID ; } f u n c t i o n getViewData ( $ v i e w I d ) { $ r e p =& RepositoryManager : : open ( ' c o n t e n t ' ) ; $numRows = $rep−>loadWhere ( " h a n d l e ␣LIKE␣ ' $ t h i s −>pageID ' " ) ; i f ( $numRows == 0) trigger_error ( " Content ␣ model : ␣ page ␣ not ␣ found .", E_USER_ERROR) ; r e t u r n $rep−>getWhere ( ' h a n d l e ' , $ t h i s −>pageID ) ; } } ?> Quellcode 4.2: Beispiel einer model -Klasse. 4.3.1 DaVinci Model-Klassen Ein model wird durch eine Klasse, welche von der abstrakten Klasse AbstractModel abgeleitet werden muss, implementiert. Quellcode 4.2 definiert eine beispielhafte model-Klasse. Das Beispiel zeigt ein Content-model, welches ein repository anbindet, indem einfache Textseiten gespeichert sind. Die ID der aktuellen Seite ist im model als Parameter gespeichert und kann über die Funktion changePage() etwa von einer Aktion geändert werden. Persistenz von models Beim ersten Request, wird die Session initialisiert und alle definierten models werden instanziert. Für die Dauer der Session sind die model-Instanzen anschließend immer verfügbar. Eine Referenz kann stets über den ModelManager über die Funktion getModel() zurückgeholt werden. Models sollten stets einen Konstruktor definieren und müssen die Funktion requestInit () bereitstellen. Während der Re-initialisierung der Folge-Requests wird in allen models die Funktion requestInit () aufgerufen. In dieser Funktion können beispielsweise bestimmte, für den Request benötigte Ressourcen, neu aufgebaut werden. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 60 Bereitstellen von Daten für views Eine zusätzliche Aufgabe der models ist, Daten für die Generierung der Ausgabe bereitszustellen. Im View-Baum kann für jedes view-Objekt ein zugehöriges model definiert werden, welches die entsprechenden Daten liefert (siehe Abschnitt 4.4.2). Die abstrakte Funktion getViewData() wird vom Framework vor dem Parsen des jeweiligen view-Knoten aufgerufen und liefert die geforderten Daten für das aktuelle view-Script. Im view-Skript sind die Daten anschließend im Array $data verfügbar. Models können, aber müssen nicht unbedingt als Daten-Lieferant dienen. Andererseits können theoretisch auch models definiert werden, deren Aufgabe ausschließlich die Bereitstellung von Daten für views ist. Es kann auch ein und dasselbe model als Daten-Lieferant für mehrere unterschiedliche views verwendet werden. Oberserver Pattern Um den Status zwischen models synchronisieren zu können, wurde der Observer Pattern eingeführt [Gam94]. Jedes model erweitert die Klasse ObservableListener. Es ist somit observierbar und kann auch selbst andere models „beobachten“. Mit der Funktion notifyAll () kann eine Nachricht an alle registrierten Beobachter gesendet werden. Ein model kann die Referenz eines anderen models mittels ModelManager:: getModel() erhalten und sich anschließend mit der Funktion registerListener () dort als Listener registrieren. Es bleibt zu beachten, dass dieses model in Folge auch die Funktion receiveMessage() implementieren muss. Diese Funktion wird von der observierten Klasse beim Aufruf von notifyAll () aufgerufen und liefert die gesendete Nachricht. 4.4 Darstellung von Inhalten Der sogenannte View-Baum ist das Herzstück der Benutzeroberfläche. In einer Art Szenegraph werden alle Ansichten bereits vordefiniert, die im Verlauf der Applikation dargestellt werden können. Die Generierung der grafischen Oberfläche, also der Seite im Browser, erfolgt am Ende einer jeden HTTP-Anfrage. Inhalt und Applikationslogik sind völlig voneinander getrennt. Erst wenn die Aktion – falls überhaupt eine angegeben wurde (auch eine einfache Aktualisierung der Ansicht ist somit möglich) – ausgeführt worden ist, wird die Ansicht neu generiert und an den Browser zurückgegeben. Im Normalfall wird als Ausgabeformat HTML bzw. XHMTL verwendet. Es ist jedoch jedes XML-basierte Format ohne Weiteres möglich. In weiterer Zukunft soll das Framework die Verwendung von XSLT zur gleichzeitigen Generierung verschiedener Ausgabeformate ermöglichen. 4.4.1 Szenegraph-Modell und View-Bäume Das Szenegraphen-Modell wurde bei DaVinci in Form eines XML-basierten, sogenannten View-Baumes implementiert. Ein solcher View-Baum wird in der Konfigurationsdatei der Webapplikation definiert (usr/webapp/webapp.xml, siehe Anhang A.3.2). An den Knotenpunkten des Baumes (nodes) können entweder sogenannte View-Skripts, welche für die Darstellung verantwortlich sind (vgl. JSP-Seiten im KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 61 MVC Model 2), oder Schalter (switches) spezifiziert werden, welche das Umschalten zwischen mehreren Unterbäumen ermöglichen. Jeder Knoten erhält über seinen hierarchischen Pfad eine eindeutige ID, mit der er später angesprochen werden kann. Schalter dienen zum Umschalten ganzer Teilbäume. Es ist somit möglich, in einem bestimmten Bereich der Benutzeroberfläche Ansichten zu wechseln. Bei einer einfachen Homepage kann beispielsweise bei gleichbleibender Navigationsleiste im oberen Bereich der Seite, der Inhalt im mittleren Bereich gewechselt werden. Schalter können an jedem Knoten verwendet werden. Sie müssen mindestens ein weiteres view-Element enthalten. Auch Schalter können untereinander verschachtelt werden. Es können im Übrigen auch mehrere View-Bäume definiert werden. Der aktuelle Baum kann im Verlauf der Applikation gewechselt werden. Dieses Feature wird beispielsweise bei mehreren parallelen Browser-Fenstern und Framesets benötigt. Zum besseren Verständnis ist in Abbildung 4.5 ein Biespiel für einen View-Baum als UML-Klassendiagramm dargestellt. Quellcode 4.3 enthält die zugehörige XMLNotation. Abbildung 4.6 zeigt die entsprechende Benutzeroberfläche im Browser mit allen Ansichten in ihrem Initialstatus. Das Beispiel bezieht sich auf die DemoApplikation aus Kapitel 5. Die Applikation dient als persönliche Startseite und bietet neben einer Homepage, deren URL festgelegt werden kann, ein einfaches Adressbuch und eine Link-Datenbank. Es wurde insofern vereinfacht, als dass der Baum in seiner Tiefe etwas gekürzt wurde. Alle Knoten unterhalb von addressbook und links wurden nicht mehr dargestellt. Zur Darstellung des Baumes wurde auf das UMLKlassendiagramm zurückgegriffen. Für die Knoten wurden die Stereotypen view-tree, view und switch eingeführt. UML-Notation des View-Baumes Zur Notation von View-Bäumen können auch UML-Klassendiagramme verwendet werden. Somit müssen keine neuen Diagrammtypen erfunden werden. Die automatische Generierung von Sourcecode macht in diesem Fall freilich wenig Sinn. Die Klassen werden bei der Implementierung nicht zu konkreten PHP-Klassen. Es wäre allerdings möglich, einen Generator zu schreiben, der anhand des Diagramms automatisch alle zugehörigen Aktionsklassen, models und Konfigurationsdateien erstellt. Das Diagramm aus Abbildung 4.5 beinhaltet folgende Informationen: View-Baum Hierarchie: Das Diagramm definiert die gesamte Hierarchie eines View-Baumes. Da es durchaus Sinn macht, wenn alle Unterknoten die Eigenschaften ihrer Eltern erben, wurde die Notation für Vererbung (generalisation) verwendet. Knoten-Definitionen: Die privaten Parameter einer Klasse (z. B.file und model) geben Konfigurationsparameter des Knotens an, welche in der XML-Spezifikation definiert werden. Sie konfigurieren den Knoten und geben z. B. die zugehörige view-Script Datei oder ein model an, welches die Daten für das Skript liefert (siehe Abschnitt 4.4.2. Schalter haben einen öffentlichen Parameter currentView, welcher den aktuellen Unterbaum angibt. View-Daten: Alle anderen öffentlichen Parameter geben Daten an, welche vom jeweiligen View zur Anzeige benötigt werden. Das können beispielsweise ganze KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 62 Abbildung 4.5: Beispiel eines View-Baumes. Das Beispiel bezieht sich auf die Demo-Applikation aus Kapitel 5 und wurde etwas vereinfacht. Die Unterbäume der Knoten addressbook und links wurden entfernt. Die XML-Notation in Quellcode 4.3 abgedruckt. Datensätze von repositories oder auch einzelne Variable, wie etwa der Seitentitel im View header sein. Werden Daten im View benötigt, muss in der Definition des Knotens ein model angegeben werden, welches diese Daten liefert (siehe Abschnitt 4.3.1). Interaktionen: Interaktion findet bei DaVinci durch Aufruf von Aktionen über ein action mapping in der URL statt (siehe Abschnitt 4.2.2). Interaktionselemente wie beispielsweise Links und Formularelemente werden über ViewKnoten bereitgestellt. Das zugehörige View-Skript enthält den entsprechenden HTML-Code, welcher diese Elemente erzeugt. Die Interaktionselemente eines View-Knotens können im UML-Diagramm mit Hilfe von Methoden modelliert werden. Die Attribute definieren die für eine Aktion benötigten PfadinfoParameter. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 63 <viewTree i d="main_window" default=" t r u e "> <view i d=" mainframe " f i l e =" mainframe . php"> <view i d=" h e a d e r " f i l e =" h e a d e r . php" /> <view i d=" n a v i g a t i o n _ b a r " f i l e =" n a v i g a t i o n . php" /> <s w i t c h i d=" body " default=" homepage "> <view i d=" homepage " f i l e =" homepage . php" model=" L i n k s " /> <view i d=" a d d r e s s b o o k " f i l e =" s p l i t _ c a n v a s . php"> [...] </ view> <view i d=" l i n k s " f i l e =" s p l i t _ c a n v a s . php"> [...] </ view> </ s w i t c h> <view i d=" f o o t e r " f i l e =" f o o t e r . php" /> </ view> </ viewTree> Quellcode 4.3: XML-Notation zum View-Baum aus Abb. 4.5. <<view>> mainframe <<view>> header (unsichtbar) <<view>> navigation_bar <<switch>> body <<view>> homepage <<view>> adressbook <<view>> links <<view>> footer Abbildung 4.6: Benutzeroberfläche zum View-Baum aus Abb. 4.5. 4.4.2 Daten für Views Jedes View-Element kann bestimmte Daten der Applikation (mehr oder weniger formatiert) darstellen. So bestehen einzelne Einträge (Datensätze) in einem NewsModul, welches Neuigkeiten anzeigt, beispielsweise aus einer Überschrift, einem kurzen Text und etwa dem Datum der Publikation. Diese Daten müssen dem ViewSkript zur Verfügung stehen, damit sie beim Generieren der Oberfläche eingefügt werden können. Im UML-Diagramm aus Abbildung 4.5 wurden diese als öffentliche Variablen der Knoten-Klassen notiert. Im DaVinci-Framework werden derartige Daten von speziellen model-Objekten, welche Teil der Applikationslogik sind, bereitgestellt. Bei der Definition des View- KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 64 Baumes kann daher für einen View-Knoten ein zugehöriges model definiert werden, welches die Daten für das entsprechende View-Skript liefert. 4.4.3 View-Skripts Jeder View-Knoten des Baumes verweist auf ein View-Skript, welches in der XMLKonfiguration angegeben werden muss. Ein solches Skript ist eine PHP-Datei und enthält hauptsächlich (X)HTML-Code und einige PHP-Elemente. Eine grundsätzliche Festlegung bei der Entwicklung von DaVinci war, keine Templating- bzw. Metasprachen zu verwenden. Das heisst, dass jeglicher Code in View-Skripts (dazu zählen etwa Schleifen, Abfragen und die Ausgabe von PHP-Variablen) aus nativen PHP-Code besteht. PHP hat ohnehin eine einfache Syntax und ist leicht zu erlernen. Die im Baum definierten Sub-Knoten müssen im jeweiligen Skript positioniert werden. Das heißt im View-Skript selbst wird an der richtigen Stelle der nächste Knoten platziert, der an an dieser Position in der Oberfläche inkludiert wird. Dies geschieht über den Aufruf der Funktion ViewGenerator::includeViewNode(), wobei als Parameter die jeweilige ID des zu platzierenden Knotens angegeben wird. Es spielt dabei keine Rolle, ob es sich beim einzufügenden Knoten um einen View- oder um einen switch-Knoten handelt. Der Generator setzt die Traversierung des Baumes automatisch beim platzierten Sub-Knoten fort. 4.4.4 Der View-Generator Die Klasse ViewGenerator ist für die Generierung der Benutzeroberfläche verantwortlich. Der FrontController startet am Ende des Requests über den Aufruf von ViewGenerator::generateView() die Ausgabe des View-Baumes. In dieser Funktion wird der aktuell gewählte View-Baum traversiert. Stößt der Generator auf einen View-Knoten, wird das entsprechende View-Skript inkludiert. Falls ein model als Daten-Lieferant spezifiziert wurde, werden die Daten des models in eine spezielle Variable ($data) geschrieben, welche anschließend im Wertebereich des View-Skripts zur Verfügung steht. Die folgenden Funktionen der Klasse stehen zur Verfügung: setViewTree(): Die Funktion erfordert als Parameter die ID des View-Baumes und setzt den aktuellen Baum. Über einen zweiten optionalen Parameter kann angegeben werden, ob der Baum permanent oder nur für diesen Request umgeschaltet werden soll. setSwitch(): Diese Funktion setzt den aktuellen View-Knoten eines Schalters. Als Parameter werden der Pfad zum Schalter und die ID des Sub-Knotens benötigt. Über einen optionalen dritten Parameter kann die ID des View-Baums angegeben werden, dessen Schalter gemeint ist. Standardmässig wird der aktuelle Baum angenommen. getSwitchState(): Die Funktion gibt die ID des aktuell gewählten View-Knotens eines Schalters zurück. disableOutput(): Diese Funktion dient zum Deaktivieren des View-Generators. Wurde in der Aktion diese Funktion aufgerufen, wird keine Ausgabe erzeugt. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 4.4.5 65 Unterschiedliche Ausgabeformate Zur Zeit ist das Ausgabeformat auf XML-Formate begrenzt. Das Framework wurde zur Zeit nur für die Ausgabe von HTML/XHTML und ähnlichen XML-Formaten spezifiziert. Je nachdem, welcher Code von den View-Skripts generiert wird, können zur Zeit verschiedene XML-basierte Dokumente erzeugt werden. Für die Ausgabe von Bildern und binären Multimedia-Formaten kann in einer Aktion der Generator deaktiviert werden und die (binären) Daten können direkt ausgegeben werden. Eine Abstraktionsschicht über XSLT ist zur Zeit nicht implementiert. Durch die Vielseitigkeit der XSLT-Ausgabe ist jedoch in weiterer Zukunft die Implementierung eines XSL-Transformators für das DaVinci Framework angedacht. 4.5 Datenhaltung Daten, deren gemeinsame Struktur in Form einer Entität (vgl. [Sau94, Kap. 1]) identifiziert werden kann, können in dafür vorgesehene repositories gespeichert werden. Repositories können einerseits temporär für eine bestimmte Dauer während der Sitzung verwendet werden, die enthaltenen Daten können aber auch dauerhaft in einer angebunden Datenbank gespeichert werden. Artikel in einem Warenkorb können, da es sich um Einträge mit gleichartiger Datenstruktur handelt, beispielsweise als Entität definiert und in ein repository abgelegt werden. Der Warenkorb muss jedoch nicht in einer Datenbank abgespeichert werden, da er nur für die Dauer der Sitzung relevant ist. Die getätigte Bestellung würde schließlich dauerhaft in ein repository mit Datenbankanbindung gespeichert werden. 4.5.1 Repositories Repositories sind vergleichbar mit Relationen einer relationalen Datenbank. Zur Zeit gibt es allerdings noch keine Möglichkeit repositories bereits in ihrer Definition untereinander zu verknüpfen. Auch die Angabe von sogenannten Check-Constraints (siehe [Sau94, S. 76ff]) ist nicht möglich. Die referenzielle Integrität muss zur Zeit noch über Programmcode überprüft werden. Die Implementierung im Rahmen dieser Diplomarbeit hätte den zeitlichen Rahmen gesprengt. Das Klassendiagramm in Abbildung 4.7 zeigt die an der Datenhaltung beteiligten Klassen. Ausgegangen wird von einer beliebigen Aktion. Repositories können von Aktionen sowie von models verwendet werden. Ein repository wird im einfachsten Fall durch Instanzieren einer von AbstractRepository abgeleiteten Klasse erstellt. Die Felder von einem repository werden über ein spezielles RepositoryLayout-Objekt definiert. Soll das repository auch von anderen Komponenten verwendet werden können, kann es beim RepositoryManager registriert werden. Dieser Manager liefert dann auf Aufrage eine Referenz auf das gewünschte repository zurück. Es gibt zur Zeit zwei unterschiedliche Arten von repositories: Collections und SimpleTrees. Eine Collection ist eine einfache flache Tabelle. Bäume sind selbstreferenzierende Tabellen, mit denen sich hierarchische Strukturen bilden lassen, wie etwa eine Gliederung für Dokumente oder ein Navigationsbaum. Alle repository-Klassen sind von der abstrakten Klasse „AbstractRepository“ abgeleitet. Die Unterklassen erweitern die abstrakte Klasse durch spezifische Funktionen. So stellt die Klasse SimpleTree zum Beispiel Funktionen zum Traversieren des Baumes und zum Anknüpfen KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 66 Abbildung 4.7: Klassendiagramm zur Datenhaltung. von Teilbäumen bereit. Jedes repository erbt unter anderem folgende Parameter: handle: Der Bezeichner von dem repository ist eine eindeutige Kennung. Er muss beim Erstellen eines neuen repository im Konstruktur angegeben werden. DSN: Der DSN-Parameter (data source name) dient zur Anbindung einer beliebigen Datenbank im Hintergrund. Innerhalb einer Zeichenkette werden DBMS, Host, Port, Benutzername, Passwort und die Datenbank definiert. Die Syntax des DSN ist in Abschnitt A.5.1 spezifiziert. Der Wert kann über die öffentliche Funktion setDSN() gesetzt werden. layout: Dieser Parameter enthält eine Instanz der Klasse RepositoryLayout und definiert alle Felder von einem repository. Das Layout kann über die öffentliche Funktion setLayout() gesetzt werden. KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 67 Transparenter Primärschlüssel Alle Datensätze eines repository werden über eine eindeutige ID (vom Typ Integer) angesprochen, welche im Hintergrund auch als Primärschlüssel dient. Die Festlegung auf einen fix definierten Primärschlüssel erleichtert die Handhabung der Daten für das Framework. Es kann zur Zeit kein eigener Primärschlüssel definiert werden. Das ID-Attribut trägt im Übrigen stets den Namen id. Wird ein neuer Eintrag angelegt, wird vorerst vom Framework eine eindeutige Kennung vergeben. Wenn der Datensatz in einer Datenbank gespeichert wurde, wird dem Eintrag die ID, welche von der Datenbank vergeben wurde zugewiesen. Die automatische Durchnummerierung der ID muss von der jeweiligen Datenbankklasse erfüllt werden (siehe Abschnitt 4.5.4). MySQL stellt dieses feature beispielsweise bereits zur Verfügung. Bei Verwendung von anderen Datenbanksystemen muss ggf. die Datenbankklasse beim Initialisieren der Tabelle erforderliche Sequences und Triggers erstellen. Repositories bieten zahlreiche Funktionen an. Grundsätzlich könnte man die Funktionen in drei Kategorien einteilen. Es gibt Funktionen zur: Erstellung von repositories: Sie dienen zum Erstellen und zum Setzen der notwendigen Parameter (wie etwa Layout und DSN). Dazu gehört der Konstruktor und die Funktionen setLayout() und setDSN(). offline-Manipulation: Funktionen die zum Erstellen, Verändern und Löschen von Datensätzen dienen, wenn keine Datenbank angegeben wurde. Dazu gehören die Funktionen newRecord() und alle get -, walk - und delete -Funktionen. DB-Manipulation: Diese Funktionen greifen über die StorageBridge auf die angebundene Datenbank zu. Zu dieser Kategorie zählen alle load -, unload -, save und delete -Funktionen. Die delete -Funktionen gehören beiden Kategorien der Manipulationsfunktionen an. Sie entscheiden selbst, ob auch ein Datenbankeintrag gelöscht werden muss oder nicht. Außerdem gehören in diese Kategorie auch noch die beiden Funktionen initTable () und dropTable(). Eine genauere Beschreibung der API für repositories ist im Anhang A.5 zu finden. 4.5.2 Die Klasse StorageBridge Diese Klasse übernimmt alle Datenbank-Operationen für repositories. Die meisten ihrer Funktionen werden von den repository-Klassen (CollectionRepository, etc.) intern angesprochen und sind für den Entwickler einer Webapplikationen nicht relevant. Die Funktionen sind stets so aufgebaut, dass unter den erforderlichen Parametern auch eine Referenz auf die repository-Instanz mitgegeben wird. Die Klasse StorageBridge baut intern eine entsprechende Datenbankverbindung auf, führt die Abfragen und Operationen aus, gibt die Verbindung wieder frei und speichert oder löscht die Einträge im repository, je nach Ergebnis der SQL-Abfrage. Außerdem stellt die StorageBridge die beiden Funktionen getConnection() und returnConnection() zur Verfügung. Fallweise sind native SQL-Abfragen unablässig. In diesem Fall, kann über den Aufruf von StorageBridge::getConnection() eine Datenbankverbindung zu dem im Parameter als Referenz angegebenen repository hergestellt werden. Die Verbindung ist eine Instanz der jeweiligen Datenbank-Klasse, KAPITEL 4. FRAMEWORK FÜR WEBAPPLIKATIONEN 68 welche von der Klasse AbstractConnection abgeleitet wurde. Es ist notwendig, die Verbindung nach Verwendung über die Funktion returnConnection() wieder zurückzugeben, da sie ansonsten nicht neu vergeben werden kann. 4.5.3 Verwaltung der Datenbankverbindungen Da bei PHP alle Ressourcen bei jedem Request neu aufgebaut werden müssen, sind keine persistenten Datenbankverbindungen möglich. Die Verwendung von persistenten Verbindungen, wie sie beispeilsweise mit MySQL möglich sind1 , stellen keine professionelle Lösung für das Manko dar, da die Verbindungen nicht direkt kontrolliert werden. Außerdem gibt es für viele andere DBMS das feature garnicht. Es ist jedoch sinnvoll, auch während eines Requests Datenbankverbindungen wieder zu verwenden. Wird die Verbindung nach der Benützung stets wieder freigegeben und weiterverwendet, ist theoretisch pro Datenbank (DSN) nur ein Verbindungsaufbau notwendig. In der Regel stellt der Aufbau einer neuen Verbindung den größten Engpass dar. Somit kann man hier Zeit einsparen. Im DaVinci Framework werden alle Verbindungen über die Klasse ConnectionPool aufgebaut. Der Pool baut bei Bedarf transparent und dynamisch neue Verbindungen auf und gibt diese frei. Falls bereits eine Verbindung zur gleichen Datenbank (beziehungsweise zum gleichen data source name, DSN) besteht, wird diese wiederverwendet. Am Ende des Requests schließt der Pool alle offenen Datenbankverbindungen. Ein weiterer Vorteil des Pools ist, dass die maximale Anzahl an Verbindungen zu einer Datenbank bereits im Framework begrenzt werden kann. So kann es zu keinem Überlauf oder Absturz kommen, der durch zu viele Verbindungsanfragen verursacht wurde. Ein DBMS sollte jedoch ohnehin selbst Sicherheitsfunktionen bereitsstellen, die einen solchen Absturz verhindern. 4.5.4 Datenbankabstraktion Um mehrere unterschiedliche Datenbanken unterstützen zu können, muss für jedes DBMS eine eigene Datenbankklasse implementiert werden. Zur Zeit gibt es nur eine Klasse für MySQL (MysqlConnection). Alle Datenbankklassen werden von der abstrakten Klasse AbstractConnection abgeleitet. In dieser Klasse sind alle Funktionen vorgegeben, die implementiert werden müssen. Beim Anfordern einer Datenbankverbindung über die Klasse ConnectionPool, muss ein data source name (DSN) angegeben werden. Entsprechend des enthaltenen DBMS-Parameters, wird die korrekte Datenbankklasse instanziert und zurückgegeben. 1 Siehe mysql_pconnect(), [The03a, Abschnitt LXIII.]. Kapitel 5 DaVinci in der Praxis In diesem Kapitel wird das Framework anhand einer kleinen Webapplikation demonstriert. Die dargestellte Beispielapplikation ist auf der beiliegenden CD-ROM im Verzeichnis phpdavinci/usr/ zu finden. Als Beispiel wurde eine „persönliche Startseite“ mit Adressbuch und Link-Datenbank realisiert. Die realtiv einfache Applikation zeigt die Anwendung der wichtigsten Komponenten von DaVinci. 5.1 Anforderung Als Beispielapplikation soll eine „persönliche Startseite“ entwickelt werden. Die Applikation kann im Browser als Startseite konfiguriert werden und soll als persönliches Portal dienen. Die Applikation soll aus drei Modulen bestehen. Das erste Modul soll eine beliebig definierbare Startseite anzeigen (z.B. Google als Suchmaschine). Die beiden anderen Module sollen die Verwaltung persönlicher Links und Adressen erlauben. Wurde bei einem Adress-Eintrag eine E-Mailadresse angegeben, soll an die Person eine E-Mail gesendet werden können. Die Organisation aller Einträge soll in Form eines Baumes möglich sein. 5.2 Modellierung einer Webapplikation mit DaVinci Natürlich gibt es mehrere Wege, wie man Webapplikationen mit dem DaVinci Framework entwickeln kann. Die hier dargestellte Vorgehensweise sei eine Möglichkeit dafür und richtet sich nach dem Konzept aus Abschnitt 3.4.4. Auf den groben, funktionellen Entwurf wurde jedoch verzichtet, da die Anwendung relativ kompakt ist und die Anforderungen bereits im Detail definiert wurden. Ausgehend von der Benutzeroberfläche und den erforderlichen Ansichten, werden die nötigen Aktionen, repositories und models spezifiziert. Zum Schluss erfolgt die eigentliche Implementierung der Klassen und View-Skripts. Der Quellcode wurde in diesem Dokument nicht abgedruckt und ist auf der beiliegenden CD-ROM im Ordner phpdavinci/usr/ zu finden. Die Beschreibung in diesem Kapitel möge als untersützende Ergänzung zum Verständnis des vorliegenden Quellcodes dienen. 69 KAPITEL 5. DAVINCI IN DER PRAXIS 70 <viewTree i d="main_window" default=" t r u e "> <view i d=" mainframe " f i l e =" mainframe . php"> <view i d=" h e a d e r " f i l e =" h e a d e r . php" /> <view i d=" n a v i g a t i o n _ b a r " f i l e =" n a v i g a t i o n . php" /> <s w i t c h i d=" body " default=" homepage "> <view i d=" homepage " f i l e =" homepage . php" model=" L i n k s " model=" L i n k s " /> <view i d=" a d d r e s s b o o k " f i l e =" s p l i t _ c a n v a s . php"> <view i d=" t r e e " f i l e =" a d d r e s s b o o k / t r e e . php" model=" Addressbook " /> <s w i t c h i d=" r i g h t _ c a n v a s " default=" f o l d e r "> <view i d=" f o l d e r " f i l e =" a d d r e s s b o o k / f o l d e r . php" model=" Addressbook " /> <view i d=" r e c o r d " f i l e =" a d d r e s s b o o k / r e c o r d . php" model=" Addressbook " /> <view i d=" e d i t _ f o l d e r " f i l e =" a d d r e s s b o o k / e d i t _ f o l d e r . php" model=" Addressbook " /> <view i d=" e d i t _ r e c o r d " f i l e =" a d d r e s s b o o k / e d i t _ r e c o r d . php" model=" Addressbook " /> <view i d=" m a ilf o rm " f i l e =" a d d r e s s b o o k / m a ilf o rm . php" model=" Addressbook " /> </ s w i t c h> </ view> <view i d=" l i n k s " f i l e =" s p l i t _ c a n v a s . php"> <view i d=" t r e e " f i l e =" l i n k s / t r e e . php" model=" L i n k s " /> <s w i t c h i d=" r i g h t _ c a n v a s " default=" f o l d e r "> <view i d=" f o l d e r " f i l e =" l i n k s / f o l d e r . php" model=" L i n k s " /> <view i d=" e d i t _ f o l d e r " f i l e =" l i n k s / e d i t _ f o l d e r . php" model=" L i n k s " /> <view i d=" e d i t _ r e c o r d " f i l e =" l i n k s / e d i t _ r e c o r d . php" model=" L i n k s " /> </ s w i t c h> </ view> </ s w i t c h> <view i d=" f o o t e r " f i l e =" f o o t e r . php" /> </ view> </ viewTree> Quellcode 5.1: View-Baum der Demo-Applikation als XML-Notation. 5.2.1 Die Benutzeroberfläche Begonnen wird nun bei der Spezifikation des View-Baumes (siehe Abschnitt 4.4.1). Abbildung 5.1 zeigt den View-Baum der Webapplikation in einem UML-Klassendiagramm. Die Notation erfolgte wie in Abschnitt 4.4.1 beschrieben. Die XML-Definition des Baumes wird in der Konfigurationsdatei der Webapplikation festgelegt (zur Konfiguration einer Webapplikation siehe Anhang A.3.2). Die Definition ist im Quellcode 5.1 abgedruckt. Es wurden in der Definition bereits models als Daten-Lieferanten für View-Skripts angegeben. KAPITEL 5. DAVINCI IN DER PRAXIS Abbildung 5.1: View-Baum der Beispielapplikation als UML-Klassendiagramm. 71 KAPITEL 5. DAVINCI IN DER PRAXIS 72 Der View-Knoten mainframe.body enthält unter anderem einen Schalter mit den drei weiteren Knoten homepage, addressbook und links. Je nachdem welches Modul vom Benutzer gerade gewählt wurde, wird der Schalter auf das entsprechende Unterelement gesetzt. Der Unterknoten homepage enthält keine weiteren View-Elemente. Das Modul bindet ganz einfach eine externe Internet-Adresse als IFRAME 1 ein. Die beiden anderen Unterknoten binden das Adressbuch bezeihungsweise die LinkDatenbank ein. Da hier weitere Ansichten benötigt werden, gibt es weitere Unterknoten. Das View-Skript split_canvas.php teilt das Browserfenster mit Hilfe einer Tabelle in zwei Spalten. Auf der linken Seite werden in Form eines Baumes die jeweiligen Link- bzw. Adress-Kategorien mit Ordnern dargestellt. Auf der rechten Seite werden verschiedene weitere Ansichten über einen Schalter eingebunden. Dazu gehören im Fall des Adressbuch-Moduls die Ansichten für „alle Adressen im aktuellen Ordner auflisten“, „Adress-Eintrag anzeigen“, „Adress-Eintrag editieren“, „Ordner editieren“ und „E-Mail erstellen“. Die Unteransichten der Link-Datenbank auf rechter Seite sind ähnlich. 5.2.2 Erforderliche Aktionen Für jede Ansicht wurden in einem weiteren Schritt nun erforderliche Aktionen festgelegt. Die Aktionen wurden im UML-Klassendiagramm (Abb. 5.1, Seite 71) bereits als Methoden definiert. Folgende View-Knoten enthalten Interaktionselemente und somit Verweise auf Aktionen: mainframe.navigation_bar: Die an oberster Stelle liegende Navigationsleiste soll das Auswählen der Module ermöglichen Es werden drei Buttons benötigt, für die Auswahl von Homepage, Adressbuch und Link-Datenbank. Die Aktion heisst im Beispiel SetModule und erfordert als Pfadinfo-Parameter ein Kürzel, welches das gewünschte Modul referenziert. Die Aktionsklasse setzt je nach Auswahl den Schalter mainframe.body an die richtige Position. mainframe.body.addressbook.tree: In dieser Ansicht sind zum einen Buttons für die Anzeige des Inhalts eines Ordners erforderlich. Es wurde dafür die Aktion addressbook.ShowFolder definiert. Zum anderen können neue Ordner erstellt, geändert und gelöscht werden. Dafür wurden die Aktionen addressbook.CreateFolder, addressbook.EditFolder und addressbook.DeleteFolder festgelegt. mainframe.body.addressbook.folder: Diese Ansicht zeigt den Inhalt des aktuell gewählten Ordners. Mit Klick auf einen Eintrag kann dieser angzeigt werden oder es kann eine E-Mail an die Person verfasst werden. Dafür wurden die Aktionen addressbook.ShowRecord und addressbook.CreateEmail festgelegt. Außerdem sind hier Buttons für die Aktionen addressbook.CreateRecord, addressbook.EditRecord und addressbook.DeleteRecord vorhanden. mainframe.body.addressbook.edit_folder: In dieser Ansicht gibt es eine Aktion addressbook.SaveFolder die zum Speichern des geänderten Eintrages aufgerufen wird. 1 Mit sogenannten IFrames lassen sich in HTML andere Internet-Ressourcen im eigenen Fenster einbinden (siehe [W3C99, Abschnitt 16.5]). Seit HTML 4.0 gehören sie zum HTML-Standard. KAPITEL 5. DAVINCI IN DER PRAXIS 73 Abbildung 5.2: Repositories und Layouts. mainframe.body.addressbook.edit_record: Analog zum vorigen View-Knoten, gibt es hier die Aktion addressbook.SaveRecord. mainframe.body.addressbook.mailform: Nach Verfassen der E-Mail wird mit der Aktion addressbook.SendEmail die E-Mail versandt. mainframe.body.links.tree: Analog zur linken Fensterseite im Adressbuch sind hier die Aktionen links.ShowFolder, links.CreateFolder, links.EditFolder und links.DeleteFolder vorgesehen. mainframe.body.links.folder: Ähnlich wie beim Adressbuch gibt es in diesem View-Knoten die Aktionen links.ShowRecord zum Anzeigen eines Datensatzes und links.CreateRecord, links.EditRecord und links.DeleteRecord für die Verwaltung von Einträgen. mainframe.body.links.edit_folder: Die Aktion links.SaveFolder dient zum Speichern des Eintrages. mainframe.body.links.edit_record: Mit der Aktion links.SaveRecord wird ein Link-Eintrag gespeichert. Die Konzeption von DaVinci Applikationen ist relativ strikt. Jede zusätzliche Ansicht müsste nun im Baum eingetragen werden. 5.2.3 Repositories zur Datenhaltung Für die Speicherung der Links und Adressen werden zwei repositories benötigt. Da die Einträge in einer Baumstruktur organisiert werden sollen, sind repositories vom Typ SimpleTree erforderlich. Die beiden Repositories und ihre zugehörigen Layouts wurden als UML-Klassen in Abbildung 5.2 dargestellt. KAPITEL 5. DAVINCI IN DER PRAXIS 5.2.4 74 Applikationslogik Die Applikationslogik wird in diesem Beispiel von den beiden models Links und Addressbook realisiert. Es werden keine weiteren Klassen benötigt. Die entsprechende Modifikation des View-Baumes erfolgt zum Teil auch nur durch Aktionsklassen (z. B. durch die Aktionsklasse SetModule). Das model Addressbook verwaltet das Adressbuch. Es dient einerseits zum Laden der jeweils benötigten Daten aus dem Adressbuch-repository. Andererseits werden über dieses model auch neue Einträge erstellt, vorhandene geändert oder gelöscht. Das model Links ist ähnlich aufgebaut, und verwaltet alle Einträge der LinkDatenbank. Zusätzlich bietet das model eine Funktion, die die als Homepage definierte URL zurückgibt. Jener Eintrag im repository, dessen Feld is_homepage auf „true“ gesetzt ist, wird als Homepage verwendet. Die Funktion wird vom View-Skript des Homepage-Moduls (siehe Abb. 5.1, Seite 71) benötigt. Die Anzeige der Homepage (View-Knoten mainframe.body.homepage benötigt deshalb auch kein eigenes model. Die Applikationslogik für das Beispiel ist relativ einfach. Abbildung 5.3 zeigt ein Klassendiagramm der benötigten models mit den angebundenen repositories. Es sind darin u. a. die öffentlichen Funktionen der models definiert, welche von den jeweiligen Aktionsklassen aufgerufen werden. Diese Funktionen stellen sozusagen die Schnittstelle zwischen controller und model nach dem MVC-Prinzip dar. Um auch die zeitliche Ebene zu modellieren könnten für jede Interaktion Sequenzdiagramme erstellt werden. Das wäre vor allem bei aufwändigen Interaktionen unbedingt notwendig. In Abbildung 5.4 ist als Beispiel der Ablauf der Aktion links.CreateRecord als Sequenzdiagramm dargestellt. Auf weitere Diagramme wird nun verzichtet. Alle anderen Interaktionen finden auf ähnliche Weise statt. Zumeist holt sich die Aktionsklasse die entsprechende model-Instanz, führt eine der öffentlichen Funktionen aus und ändert anschließend den View-Baum, wenn dieser nicht bereits vom model geändert wurde. 5.3 Implementierung Nach der Modellierung kann mit der Implementierung der Applikation begonnen werden. Zuerst muss eine neue Webapplikation angelegt werden. Anschließend wird die Konfigurationsdatei der Webapplikation erstellt, in der auch alle View-Bäume (in diesem Beispiel wird nur einer benötigt) definiert werden. Es ist ratsam zuerst alle View-Skripts zu erstellen, welche keine Daten ausgeben bzw. deshalb kein model benötigen. Für alle anderen View-Skripts können bereits leere Dateien angelegt werden. Dies schafft bereits die Struktur der Benutzeroberfläche. Als nächsten Schritt werden die Aktionsklassen der Reihe nach erstellt. Begonnen wird am Besten mit der Klasse SetModule. Diese Vorgehensweise ermöglicht das Testen der Applikationslogik. Anschließend kann die Erstellung der repositories und die Implementierung der models und ggf. auch anderen Klassen erfolgen. 5.3.1 Konfiguration und Benutzeroberfläche Zu Beginn der Implementierung muss eine neue Webapplikation angelegt werden. Als Ausgangspunkt kann das Verzeichnis usr/ der Distribution herangezogen werden. KAPITEL 5. DAVINCI IN DER PRAXIS Abbildung 5.3: Klassendiagramm der models. Abbildung 5.4: Sequenzdiagramm der Aktion links.CreateRecord. 75 KAPITEL 5. DAVINCI IN DER PRAXIS 76 Nähere Details sind im Anhang A.1 und Abschnitt A.3.2 zu finden. Es muss die Konfigurationsdatei der Webapplikation angelegt werden. In dieser Datei wird neben diversen Einstellungen der View-Baum definiert. Anschließend können alle View-Skripts angelegt werden. Das Layout und das Design der Anwendung kann momentan noch vernachlässigt werden. Diese Aufgabe sollte von einem Designer erledigt werden. Der Designer entwirft die Layouts und schreibt die zugehörigen View-Skripts mit dem Wissen, welche Daten und Interaktionselemente wo eingebaut werden müssen. Leider gibt es für PHP noch keine ausgereiften Tag libraries, wie etwa für JSP-Seiten [Sun03]. Bei der Entwicklung des Frameworks wurde bewußt auf die Verwendung eigener Templating oder Makro-Befehle verzichtet. PHP ist relativ leicht zu erlernen. Ob der Designer nun zusätzliche HTML-ähnliche Tags erlernen muss oder einige PHPBefehle, ist gewissermaßen gleichgültig. Die Verwendung von höheren Metasprachen zur Erstellung von Vorlagen für Ansichten führt sehr oft zu Einschränkungen. 5.3.2 Aktionsklassen Als zweiten Schritt bietet sich die Erstellung aller Aktionsklassen an. Sie definieren nun alle Interaktionen aus Sicht des Benutzers (vgl. UX-Model [Con03]). Die Aktionsklassen sprechen die jeweils relevanten models und ihre öffentlichen Funktionen an und verändern anschließend den View-Baum. Der Quellcode der Aktionsklasse SetModule ist im Anhang B.2 als Beispiel abgedruckt. 5.3.3 Repositories Für die Erstellung der repositories wurde eine Hilfsaktion verwendet. Diese Aktionsklasse definiert über die zur Verfügung stehende API das Layout (also alle Felder), initialisiert die angebundenen Datenbanktabellen und registriert die repositories beim RepositoryManager. Der Quellcode der Aktionsklasse ist in Anhang B.1 abgedruckt. Die Aktionsklasse wurde über den Browser einmal aufgerufen und somit ausgeführt. In Zukunft soll das Erstellen und Verwalten von repositories über eine Administratorenkonsole möglich sein (siehe dazu Abschnitt 7.1.3). 5.3.4 Implementierung der Models Die Klassenrümpfe können anhand der Klassendiagramme aus Abb. 5.3 (Seite 75) bereits erstellt werden. Es gilt nun die nötigten Funktionen zu implementieren. Der Quellcode des models Links ist als Beispiel in Anhang B.3 zu finden. Die Applikation ist nun soweit fertig. Am Ende sollte im Übrigen durch Ausführen aller Aktionen die Applikation ausreichend getestet werden. Aufgrund der Wichtigkeit des Testens sei abschließend auf die Konzepte der Extreme ProgrammingGemeinde verwiesen [HL02]. Kapitel 6 Evaluierung Abschließend soll das DaVinci Framework evaluiert werden. Es wird einerseits eine qualitative Beurteilung anhand der zuvor definierten Anforderungen aus Abschnitt 2.2 angestrebt, andererseits werden einige Stärken und Schwächen des Frameworks gegenübergestellt. Da in der vorhandenen DaVinci Version noch keine Sicherheitsaspekte berücksichtigt wurden, wird hier nicht näher auf die Erfüllung von Sicherheitsrichtlinien eingegangen. 6.1 Qualitative Beurteilung anhand der definierten Anforderungen Die wahrscheinlich wichtigste Anforderung für ein Framework für Webapplikationen ist die Effizienz und Geschwindigkeit mit der neue Webapplikationen entwickelt werden können. Vorraussetzung für eine effiziente Entwicklung ist die möglichst detaillierte Modellierung der Applikation vor ihrer Implementierung (siehe Abschnitt 3.1). Die im vorigen Kapitel vorgestellten UML-basierten Konzepte unterstützen den Modellierungsprozess und erlauben die detaillierte Konzeption DaVinci -basierter Applikationen. 6.1.1 Handhabung und Effizienz Durch die bereits vorgegebene Architektur kann der Focus direkt auf die Anforderungen der Applikation gelegt werden, ohne dass sich der Entwickler um ein grundlegendes Architekturkonzept kümmern muss. Die Modellierung neuer Webapplikationen ist somit bereits auf einer höheren Ebene möglich. Es ist beispielsweise die Interaktion und die Behandlung von HTTP-Anfragen vorgegeben. Auch persistente Objekte werden als model Stereotypen automatisch vom Framework verwaltet und es muss keine Session-Behandlung implementiert werden. Für die Datenhaltung bieten die vorgestellten repositories vorerst ausreichend Flexibilität. In Zukunft sollen von DaVinci außerdem weitere Datenbanksysteme unterstützt werden und es sollen auch CHECK-Constraints (siehe [Sau94, S. 76ff]) und Beziehungen zwischen repositories möglich sein. 77 KAPITEL 6. EVALUIERUNG 6.1.2 78 Erweiterungs- und Integrationsmöglichkeiten Das Framework wurde im Hinblick auf spätere Erweiterbarkeit entworfen. Zu diesem Zweck wurden deshalb drei verschiedene Ebenen festgelegt, welche eine unterschiedliche Tiefe der Programmierung erlauben. Die unterste Schicht (der DaVinci Core Layer) wird von den Basiskomponenten gebildet und soll nur von einem kleinen, überschaubaren Team verwaltet und erweitert werden, damit das Projekt auch in der Zukunft überschaubar bleibt. Die eigentliche Entwicklungsschicht (Development Layer) ist jene Implementierungsebene, auf der Webapplikationen mit Hilfe von DaVinci aufgesetzt werden. In dieser Schicht werden z. B.models, actions, ViewSkripts und weitere benutzerdefinierte Klassen erstellt. Es wurde noch eine dritte Schicht (Distribution Layer) vorgesehen, welche die Distribution und den Austausch von gebündelten Modulen (packages) erlauben. Solche Pakete sollen später über die Projekt-Homepage publiziert und getauscht werden können. Durch die Integrationsmöglichkeiten von PHP ist auch das DaVinci Framework relativ gut für neue zukünftige Anforderungen vorbereitet. Durch Integration von Unternehmensressourcen über verschiedenste Datenbanken, Java-Schnittstellen oder XML-Technologien können eigenständige Applikationsserver angebunden werden. Die Webapplikation läuft dann im Web-tier und enthält nur die notwendigste Applikationslogik für den Frontend-Einsatz. Eine solche Lösung wäre eine kostengünstige Alternative zu kompletten Java-Umgebungen (siehe Abschnitt 1.4). Auch die Integration von Webservices [Cer02] wäre eine wichtige Erweiterung für das DaVinci Framework. Da es für XML und SOAP bereits PHP-Erweiterungen gibt, wäre diese Erweiterung relativ wenig Aufwand. Die Architektur von DaVinci eignet sich zudem hervorragend für die Integration von Webservices. Ein Webservice wird ähnlich wie eine Interaktion bei DaVinci durch eine eindeutige URL spezifiziert. Webservices können deshalb durch Aktionsklassen bereitgestellt werden. Mit dem MVC-Konzept als Basis ist von Haus aus eine relativ gute Erweiterbarkeit gegeben. Daten, Ansichten und Interaktion sind im Framework völlig voneinander getrennt. Durch den zentralen FrontController können verschiedene Clients (z. B. eine Unix Shell Console) integriert werden. Ein Benutzermanagement welches direkt beim FrontController ansetzt, ermöglicht benutzerdefinierte Rechte für bestimmte Interaktionen. Das Framework ist auch bereits für die Anbindung verschiedener Datenbanksysteme vorbereitet. Verschiedene Ausgabeformate über XSLT wären möglich. 6.2 Stärken und Schwächen In diesem Abschnitt werden einige Stärken und Schwächen des DaVinci Konzepts besprochen. 6.2.1 Stärken Die Stärken von DaVinci liegen auf alle Fälle in der Effizienz der Entwicklung neuer Anwendungen. Des Weiteren bietet DaVinci einige wichtige Features, wie etwa die Datenhaltung in Form von repositories, welche Entitäten als flache Tabellen oder in Form von Baum-Strukturen ermöglicht. KAPITEL 6. EVALUIERUNG 79 Modellierung und Implementierung Das vorgestellte Konzept zur Modellierung neuer Anwendungen (siehe Abschnitt 3.4.4 bzw. Kapitel 5) ermöglicht einen relativ effizienten Entwicklungsprozess. Die Trennung von Modellierung und Implementierung ist eine wichtige Vorraussetzung dafür. Bevor die eigentliche Programmierung stattfindet, kann die Applikation über UML-Diagramme entworfen werden. Die Entwicklung neuer Anwendungen erfolgt nicht mehr von Grund auf, sondern auf einer abstrakten Ebene. Durch das Szenegraphen-Konzept wird eine relativ strikte Modellierung der Benutzeroberfläche erreicht. Dies hat zur Folge, dass nicht willkürliche Masken und Fenster erstellt werden können, was in der Praxis oft zur Folge hat, dass schnell und schlampig (quick & dirty) neue Seiten und Formulare angefügt werden. Alle Ansichten werden bereits vordefiniert. Die möglichen Interaktionen können in einem weiteren Schritt pro Ansicht spezifiziert werden. Durch ein striktes Modell wird zumeist auch eine saubere Implementierung erreicht. Entwicklung auf Basis einer vorgegebenen Architektur Die Entwicklung neuer Webapplikationen erfolgt auf Basis einer vorgegebenen Architektur. Die Architektur gibt u. a. die Benutzerinteraktion vor, ermöglicht die Persistenz von Objekten innerhalb einer Session und auch die Datenhaltung in Form von repositories. Die Entwicklung von Basiskomponenten fällt deshalb aus. Der MVC-Pattern ist ein grundlegendes Konzept in der Architektur von DaVinci. Dadurch ergeben sich vielfältige Erweiterungsmöglichkeiten. Erweiterungsund Integrationsmöglichkeiten wurden bereits in Abschnitt 6.1.2 besprochen. Weitere Stärken Das Framework wurde im Allgemeinen im Hinblick auf spätere Erweiterungen konzipiert. Viele Stärken und Möglichkeiten sind in der vorliegenden Version noch nicht implementiert. Einige dieser Stärken, etwa die XSLT-Transformation für unterschiedliche Ausgabeformate, wurden bereits erwähnt. 6.2.2 Schwächen Da sich das Framework zur Zeit noch keineswegs in Produktreife befindet, ist ein Stärken/Schwächen-Profil grundsätzlich nicht einfach zu erstellen. In der vorliegenden Version wurde außerdem erst ein sehr geringer Funktionsumfang implementiert. Aufgrund des offenen Konzepts von DaVinci sind viele Erweiterungen möglich. Ein Mangel an Funktionalität kann deshalb wahrscheinlich durch eine Erweiterung behoben werden. Persistenz von Objekten im Speicher Die größte Schwäche des Frameworks ist allerdings das Fehlen der Laufzeit außerhalb von HTTP-Anfragen. Diese Tatsache beruht darauf, dass PHP eine Skriptsprache ist und daher keine Laufzeit und somit auch keine Persistenz von Objekten im Speicher außerhalb von Anfragen ermöglicht. Das Problem wurde ausführlich in Abschnitt 3.2.5 besprochen. KAPITEL 6. EVALUIERUNG 80 Nachteile von PHP4 Da bei DaVinci -basierten Webapplikationen sehr oft Objekte per Referenz übergeben werden müssen, gibt es mit PHP4 schwerwiegende Probleme. Bei PHP4 werden Objekte beim Übergeben an Funktionen bzw. als Rückgabewert von Funktionen standardmässig kopiert. Dies bedeutet, dass die Referenz auf das Objekt dabei verloren geht. Wird beispielsweise ein model-Objekt beim ModelManager angefordert, wird eine Referenz auf das Objekt zurückgegeben. Es ist wichtig, dass jede Komponente mit derselben Instanz arbeitet. Es kann daher vorkommen, dass durch Vergessen einer einzigen Pointer-Anweisung (mit &) schwerwiegende Folgefehler auftreten, die nicht sofort bemerkt werden. In der Version 5 wird dieses Problem nicht mehr existieren, da bei PHP5 standardmässig die Referenz eines Objekts übergeben wird. Einschränkung durch die vorgegebene Architektur Durch die bereits vordefinierte Architektur des Frameworks ist der Entwickler in manchen Fällen in seinem Spielraum eingeschränkt. Das Modellierungskonzept berücksichtigt zur Zeit auch noch keine Client-seitige Applikationslogik. Interaktionen finden momentan ausschließlich über die URL statt. Framesets und mehrere Browserfenster Grundsätzlich wurde die Möglichkeit der Verwendung mehrerer Browserfenster und somit auch Framesets und Popup-Fenster angestrebt. Es können deshalb mehrere View-Bäume definiert werden, wobei für jedes Fenster ein Baum benötigt wird. Durch die Verwendung von Cookies zur Session-Behandlung ist allerdings die Identifizierung des jeweiligen Browserfensters problematisch. Der Browser schickt, egal über welches Fenster Interaktion stattfindet, die im Cookie gespeicherte Session-Kennung mit zum Server. Das Framework kann deshalb nicht feststellen, von welchem Fenster die Anfrage gesendet wurde. Folglich ist dem ViewGenerator nicht bekannt, welchen View-Baum er nun für die Generierung der Benutzeroberfläche verwenden soll. Zur Zeit muss daher von der jeweiligen Aktionsklasse der View-Baum explizit gewählt werden, falls die Interaktion über ein anderes Fenster stattfinden sollte. Eine mögliche Lösung wäre, die Session-Kennung direkt über die URL (GETMethode) oder in einem versteckten Formularfeld (über die POST-Methode) mitzusenden. Die erste Variante würde allerdings keine schönen URLs produzieren. Die zweite Variante scheint am günstigsten zu sein. Kapitel 7 Ausblick Das im Rahmen dieser Diplomarbeit entwickelte Framework wurde im April 2003 als Open Source Projekt gestartet. Die Homepage des Projekts ist unter der URL http://phpdavinci.sf.net erreichbar. Es wird beabsichtigt das Projekt weiter zu entwickeln und andere interessierte Entwickler daran zu beteiligen. Zur Zeit ist das Framework allerdings als Prototypen zu betrachten. Wichtige Funktionen, wie etwa ein Benutzermanagement oder die Ausgabe über XSLT sind noch nicht realisiert worden. Die Softwarearchitektur von DaVinci wurde in drei Schichten unterteilt (siehe Abschnitt 6.1.2). Vor allem für die Weiterentwicklung des Core Layers soll ein überschaubares Entwicklerteam gefunden werden. Jene Entwickler, welche das Framework für ihre eigenen Projekte einsetzen (Entwicklung im Development Layer), sollen in Zukunft einzelne Komponenten als Erweiterungspakete über die ProjektHomepage anderen Entwicklern zur Verfügung stellen können. 7.1 Erweiterungsmöglichkeiten Wie bereits bei der Evaluierung im vorigen Kapitel erwähnt, gibt es zahlreiche Erweiterungsmöglichkeiten. Einige davon, vor allem jene welche in naher Zukunft entwickelt werden sollen, werden im Anschluss kurz beschrieben. 7.1.1 Framework Architektur Was die Architektur ganz allgemein betrifft, so sollten folgende Erweiterungen implementiert werden. Zur Zeit ist die Verwendung mehrerer Browserfenster, Pop-ups und Framesets nicht sinnvoll einsetzbar (siehe Abschnitt 6.2.2). Die Identifikation des aktiven Fensters, beispielsweise über ein verstecktes Formularelement in jeder Seite, muss möglich sein. Auch einige Erweiterungen in der API des ViewGenerators wären gegebenenfalls notwendig. Im Modell ist momentan auf der Client-Seite keine Applikationslogik, etwa über JavaScript, etc. modellierbar. Für bestimmte Interaktionen (z. B. eine BaumNavigation) wäre es sinnvoll den am Client erforderlichen JavaScript Code automatisch zu generieren. Für solche Anwendungsfälle sollte eine Erweiterung der Interaktionsschnittstelle ins Auge gefasst werden. 81 KAPITEL 7. AUSBLICK 7.1.2 82 Unterschiedliche Ausgabeformate Sehr nützlich wäre die Ausgabe der Inhalte in unterschiedlichen Formaten (XHTML, PDF, SVG, WML oder anderen spezifischen XML-Dokumenten) bzw.. in unterschiedlichen Vorlagen desselben Formats (z. B. für Browser auf verschiedenen Geräten). Dafür müsste der ViewGenerator um einen XSLT-Parser erweitert werden. Zusätzlich müssten für jeden View-Knoten eines View-Baumes mehrere AusgabeVorlagen erstellt werden, je nachdem in welchen Formaten die Ansicht zur Verfügung stehen soll. 7.1.3 Verwaltung und Werkzeuge über eine Konsole Bereits mehrmals angesprochen wurde auch die Integration einer eigenen Administratorenkonsole. Will man neue repositories anlegen, muss zur Zeit noch eine Hilfsaktion erstellt werden, welche mit Hilfe der API für repositories (Anhang A.5) die erforderlichen Layouts erstellt, die repositotires initialisiert und evtl. beim RepositoryManager registriert. Das ist nur ein Beispiel für Funktionen, die über eine Konsole zur Verfügung stehen sollten. Die Konsole soll eine schnelle und sichere Schnittstelle zur Applikation darstellen, welche für administrative Zwecke genutzt werden kann. Es wäre natürlich auch eine Administrationsapplikation über den Browser denkbar. Administrative Tätigkeiten sollten aber möglichst effizient und rasch erfolgen können. Die Ergonomie einer grafischen Oberfläche muss nicht immer gegeben sein. Sinnvoller erscheint deshalb die Integration einer Konsole (vgl. Komponentendiagramm aus Abb. 4.1, Seite 50). Über die Konsole können zumdem auch Shell-Skripts ausgeführt werden, welche in einer Linux-Umgebung etwa von Cron-Jobs angestoßen werden. Somit wären zeitlich gesteuerte und periodische Funktionsaufrufe möglich. 7.1.4 Integration eines Applikationsservers PHP ist als Skriptsprache für aufwändige Webapplikationen mit komplexer Applikationslogik grundsätzlich weniger gut geeignet. Andererseits bieten Skriptsprachen und vor Allem solche, welche innerhalb von HTML-Code sogenannte SkriptletElemente erlauben, im Web-Bereich einige Vorteile (siehe Abschnitt 1.4.2). Für aufwändige Web-basierte Anwendungen sollte daher ein eigenständiger Applikationsserver angebunden werden können. Die Entwicklung eines Web-Frontends für bestimmte Anwendungen mit Hilfe von DaVinci ist durchaus erfolgversprechend. Das Szenegraphenkonzept und die Interaktion über einen strikten URL-Formalismus hat sich als sehr nützlich erwiesen. Die Entwicklung wäre gegebenenfalls kostengünstiger als eine komplette Java-Lösung [Sch03]. Die Integration eines Applikationsservers wäre zum einen über XML-Protokolle wie SOAP oder XML/RPC möglich. Eine andere Möglichkeit bietet sich für Java durch die Java-Unterstützung von PHP an (siehe Abschnitt 1.4.1). Die Java-Integration wäre etwa über bestimmte models möglich, welche Zugriff auf bestimmte JavaObjekte haben. PHP bietet in seinem Funktionsumfang bereits viele Möglichkeiten zur Integration von diversen Standards und Umgebungen an. Man braucht sich dazu bloß die Dokumentation [The03a] anzusehen. Sinnvoll wäre etwa in Zukunft auch die Integration eines LDAP-Servers fürs Benutzermanagement. KAPITEL 7. AUSBLICK 7.1.5 83 Webservices Die Unterstützung von Webservices [Cer02] wäre eine nützliche Erweiterung für das Framework. Dazu können u. a. die von PHP zur Verfügung stehenden Funktionen für XML und SOAP verwendet werden. Die Architektur von DaVinci eignet sich sehr gut für die Integration von Webservices. Da ein Webservice laut Definition [W3C02] über eine eindeutige URL referenziert wird, kann es sehr einfach von einer Aktionsklasse bereitgestellt werden. Die Aktionsklasse kann Komponenten zur Generierung von WSDL-Dokumenten verwenden. Verschiedene Daten können über repositories integriert werden. 7.2 Zusammenfassung Abschließend bleibt zu sagen, dass die Entwicklung von Webapplikationen mit DaVinci bereits relativ komfortabel ist. Nach der Modellierung kann die Entwicklung relativ rasch durch Erstellen der einzelnen Klassen und Skripts erfolgen. Das Framework erfüllt seinen Zweck als Prototyp hervorragend. Die reine Entwicklungsdauer der Demo-Applikation umfasste etwa einen halben Tag, wenn man von vom Design und auch einigen Bugs, die während der Entwicklung in der Framework API beseitigt werden mussten, absieht. Erhebliche Probleme gibt es allerdings noch mit der Persistenz von repositories. Grundsätzlich werden model -Klassen innerhalb der Session persistent verwaltet. Besitzt ein model als Variable eine Referenz auf ein repository, so wird dieses jedoch nicht offen gehalten. Zur Zeit werden vom Manager alle repositories am Ende eines Requests geschlossen. Es muss also vom model beim nächsten Request wieder geöffnet werden. Grund dafür ist, dass die hierarchische Datenstruktur des verwendeten SimpleTree repository beim Speichern der Instanz innerhalb der Session zerstört wird. Das Problem wurde auch in Abschnitt 3.2.5 angesprochen. Ein weiteres Problem stellt die Übergabe von Objekten bei PHP4 dar. Objekte werden nämlich standardmäßig by-value übergeben, was soviel bedeutet, dass Objekte beim Übergeben an Funktionen kopiert werden. Bei der neuen PHP5 Version werden Objekte standardmäßig by-reference übergeben. Aus mehreren weiteren Gründen, wird deshalb die Portierung von DaVinci nach PHP5 in den nächsten Monaten ins Haus stehen. Es wäre auch sinnvoll, die Integration einer der Script Running Magic (siehe Abschnitt 3.2.5) ähnlichen Komponente, nochmals zu überdenken. Anhang A Details zum DaVinci Framework Anhang A enthält einige Details, die das DaVinci Framework näher beschreiben. Es werden hier die Verzeichnisstruktur der Distribution (welche im Übrigen auf der beiliegenden CD-ROM enthalten ist), DaVinci Umgebungsvariablen und Datentypen, die Konfiguration und die API für repositories erklärt. 84 ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK A.1 85 Verzeichnisstruktur der DaVinci Distribution In Abbildung A.1 ist die Verzeichnisstruktur der DaVinci Distribution dargestellt. Die wichtigsten Ordner in der ersten Ebene sind conf/, lib/ und usr/. Der Ordner conf/ enthält zur Zeit eine Datei namens davinci.xml, welche Server-spezifische Parameter enthält (siehe Abschnitt A.3.1). Im Verzeichnis lib/ befinden sich alle Basisklassen des Frameworks. All diese Klassen sind Bestandteil des Core Layers (siehe Abschnitt 6.1.2). Die Framework-API wird ausschließlich durch diese Klassen gebildet. Alle Klassen und Scripts einer konkreten Webapplikation befinden sich im Verzeichnis der Distribution unter usr/. Zu diesen benutzerspezifischen Dateien gehören alle actions, models, views und diverse XML-Konfigurationsdateien. Die Definitionen der repositories einer Webapplikation befinden sich nicht in Dateien, sondern sind im sogenannten Master-repository gespeichert (siehe Abschnitt A.5.4). Die weiteren Ordner der Distribution enthalten verschiedene Konsolenscripts (bin/), diverse temporäre Dateien (z. B. Datenbank-Inhalte als SQL-Skripts) und eine Dokumentation (docs/). Eine Ausführliche Installationsanleitung befindet sich in der Datei INSTALL im Hauptverzeichnis der Distribution. A.1.1 Mehrere Webapplikationen auf einem Server Um auf einem Webserver fallweise mehrere DaVinci-basierte Webapplikationen parallel betreiben zu können, wurden die benutzerspezifischen Klassen und Scripts vom restlichen Programmcode des Frameworks getrennt und im Ordner usr/ abgelegt. Dieser Ordner enthält die beiden weiteren Ordner htdocs/ und webapp/. Der Ordner htdocs/ gleicht dem öffentlichen Ordner des Webservers (beziehungsweise eines virtuellen Hosts, falls diese verwendet werden) und enthält nichts weiteres als ein Index-Script und die Datei index.php (siehe 4.2.1). Fallweise können auch statische Dateien wie Cascading Stylesheets oder Bilddateien hier abgelegt werden. Dieser Ordner ist im Web öffentlich und sichtbar. Alle Klassen und Scripts der zugehörigen Webapplikation befinden sich hingegen im Ordner webapp/. Somit sind auch Sicherheitsrisiken aus dem Weg geräumt. Dateien der Webapplikation können dadurch nicht über einen expliziten GET-Request von außen erreicht werden, sondern werden bei Bedarf vom Framework selbst eingebunden. Nach Installation des Frameworks kann der usr/-Ordner an jede beliebige Stelle am Server verschoben werden. |-|-|-|-| | | |-‘-- bin conf docs lib |-- common |-- core ‘-- storage tmp usr |-- htdocs ‘-- webapp diverse Konsolenscripts allgemeine Konfigurationsdateien Dokumentation Basisklassen des Frameworks diverse Hilfsklassen Hauptklassen, u.a. Manager-Klassen Klassen für die Datenbankanbindung temporäre Daten benutzerspezifische Dateien Index-Script, FrontController und statische Daten Klassen und Scripts der Webapplikation Abbildung A.1: Verzeichnisstruktur der DaVinci Distribution. ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK /usr/local/phpdavinci/ Framework Distribution /var/www |-- [virtual_host_1] | |--htdocs | |--webapp | ‘--logs |-- [virtual_host_2] | |--htdocs | |--webapp | ‘--logs virtuelle Hosts mit versch. Webapplikationen 86 öffentliches Verzeichnis Webapplikation eventuell Log-Dateien des Webservers Abbildung A.2: Mehrere Webapplikationen auf einem Server. In einer Linux-Umgebung wäre zum Beispiel eine Verzeichnisstruktur gemäß Abb. A.2 sinnvoll. A.1.2 DaVinci bei einem Webspace-Provider betreiben Möchte man das Framework bei einem Webspace-Provider einrichten, hat man nicht die nötigen Zugriffsrechte für die Installation des Frameworks unter /usr/local (unter Linux). In diesem Fall müsste man die Distribution wenn möglich außerhalb des öffentlichen Ordners im Home-Verzeichnis ablegen. Hat man nur für den öffentlichen Ordner (bei Apache zumeist htdocs/) Schreibrechte, sollte der Zugriff auf den Ordner welcher die Distribution enthält für HTTP-Requests unbedingt gesperrt werden. Die Verzeichnisstruktur sieht möglicherweise dann so aus: /home/kunde001/www |--htdocs |--logs |--phpdavinci ‘--webapp A.2 öffentliches Verzeichnis eventuell Log-Dateien des Webservers Framework Distribution Webapplikation Umgebungsvariablen PHP4 stellt alle globalen Parameter in einem assoziativen Array namens $GLOBALS zur Verfügung. Dieses Array kann für bestimmte Zwecke sehr dienlich sein. Es eignet sich unter anderem hervorragend für Konfigurationsparameter, die global benötigt werden. Da PHP4 noch keine statischen Instanzvariablen unterstützt, kann man mit Hilfe dieses globalen Arrays auch statische Variablen simulieren, indem man sie darin ablegt. Im DaVinci Framework wurde das $GLOBALS Array einerseits für Umgebungsvariablen verwendet und andererseits enthält es alle vorhandenen statischen Instanzvariablen. Das Array enthält in der ersten Ebene die für DaVinci relevanten Schlüssel application, request, session und static. Diese Struktur wurde mit Absicht an die application, request und session scopes, wie sie bei Java Servlets verwendet werden, angelehnt [Hun01]. Der Schlüssel application zeigt auf ein assoziatives Array, welches applikationsübergreifende Parameter enthält und der Schlüssel request auf ein weiteres Array, welches requestbezogene Parameter enthält. Der Schlüssel session ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 87 enthält alle Session-Variablen. Alle statischen Instanzen von Klassen (insbesondere Singleton -Klassen) sind unter static zu finden. Diese können und sollen allerdings unbeachtet bleiben. Die Verwendung der Variablen erfolgt nämlich von den zugehörigen Klassen transparent und ist nach außenhin ohnehin nicht relevant. A.3 Konfiguration Alle Konfigurationsparameter sind im DaVinci Framework in XML-Dateien definiert. Im Rahmen dieser Diplomarbeit wurde für die Konfigurationsdateien weder eine DTD (Document Type Definition), noch ein XML-Schema spezifiziert, da der verwendete Parser (Expat 1 ) ohnehin keine Validierung vornimmt. Die Klasse ConfigFileParser, welche die Konfigurationsdateien einliest, gibt allerdings bei den meisten fehlerhaften Angaben eine Fehlermeldung aus. Nach Installation der Distribution (die Einrichtung ist u. a. in Abschnitt A.1 beschrieben bzw. als Readme-Datei in der Distribution) sollte vorerst die Datei conf/davinci.xml angepasst werden. Sie enthält allgemeine Werte, die den Applikationsserver betreffen. Jede einzelne Webapplikation erfordert im Stammverzeichnis des webapp/-Ordners eine weitere Konfigurationsdatei. Diese Datei muss webapp.xml heißen. Sie wird vom Framework bei jedem Request eingelesen. A.3.1 Konfiguration des Servers: davinci.xml Die Datei conf/davinci.xml enthält als Wurzelelement das Element <DaVinci>. Innerhalb dieses Elements können verschiedene Parameter über Unterelemente definiert werden. Zur Zeit ist die Angabe der beiden folgenden Elemente erlaubt: • <phpIncludePath> • <dsnMapping> Zusätzlicher include-Pfad DaVinci benutzt einige Pakete des PEAR Projektes und erfordert deshalb eine Installation von PEAR am Webserver. Es kann jedoch vorkommen, dass bei einem Webservice-Provider kein PEAR installiert ist. In diesem Fall können die benötigten PEAR-Pakete auch manuell ins eigene Home-Verzeichnis gespeichert werden. Mit dem folgenden Parameter kann ein zusätzlicher include-Pfad definiert werden. DaVinci versucht dann diesen Pfad dem include_path von PHP (siehe [The03a, Abschnitt I.4]) hinzuzufügen. Es können auch mehrere Pfade, mit Doppelpunkten getrennt, angegeben werden. Das Element ist optional und darf nur einmal vorkommen. <phpIncludePath> [ i n c l u d e _ p a t h ]</ phpIncludePath> < !−− B e i s p i e l : −−> <phpIncludePath>/ u s r / s h a r e / p e a r : / u s r / l i b /php</ phpIncludePath> 1 Expat ist ein relativ einfacher und dafür sehr schneller XML-Parser, der keine Validierung durchführt. Er ist als Extension bereits in der PHP-Distribution enthalten. ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 88 Globale DSN-Kürzel Registrierte repositories erfordern die Angabe einer Datenbank, in der die Daten des repositories gespeichert werden. Die Angabe dieser Datenbank erfolgt über data source names (DSN) wie in Abschnitt 4.5.1 beschrieben. Um eine Webapplikation besser portieren zu können, wurden sogenannte DSN-Kürzel (shortcuts) eingeführt. Anstatt eines DSN kann nämlich auch ein Kürzel mit einer Raute als Prefix angegeben werden. Das Kürzel #local_mysql zeigt etwa, laut obigen Beispiel, auf die Datenbank mysql://user:pwd@localhost/davinci. Will man eine Webapplikation auf einen anderen Server transferieren muss bloß das Kürzel über den Eintrag in der Konfigurationsdatei geändert werden. Zudem erspart man sich die Angabe des langen DSN-Pfades bei repositories, die alle in der selben Datenbank untergebracht sind. Das Element ist optional und kann mehrmals vorkommen. <dsnMapping i d=" [ s h o r t c u t ] "> [ dsn_mapping ]</ dsnMapping> < !−− B e i s p i e l : −−> <dsnMapping i d=" l o c a l _ m y s q l "> m y s q l : // u s e r : p w d @ l o c a l h o s t / d a v i n c i </ dsnMapping> A.3.2 Konfiguration der Webapplikation Die Konfigurationsdatei der Webapplikation muss sich im Stammverzeichnis des Applikationsordners befinden (webapp/) und webapp.xml heißen. Alle Konfigurationsparameter müssen innerhalb des Elements <DaVinciConfiguration> angegeben werden. Folgende Elemente sind zulässig: • <indexFile> • <masterRepository> • <dsnMapping> • <include> • <viewTree> • <model> Für jede einzelne Webapplikation können in der weitere DSN-Kürzel mit dem Element <dsnMapping> definiert werden. Die Syntax ist gleich wie bei der ServerKonfigurationsdatei. Wurde in der Server-Konfigurationsdatei bereits ein Kürzel mit dem selben Namen definiert, hat dieses Vorrang. Dateiname des Front-Controller Skripts Der folgende Parameter definiert den Dateinamen des Front-Controller Scripts. In der Distribution heißt das Script davinci.php. Eine besonders schöne URL erhält man, wenn man das Script davinci (ohne Endung) nennt. Dies ist allerdings nur möglich, wenn sich beim Webserver der standardmäßige MIME-Typ für Dateiformate ohne Endung angeben lässt. Hat man bei Apache Zugriff auf die Konfigurationsdatei (httpd.conf), läßt sich das mit der Zeile ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 89 DefaultType application/x-httpd-php erreichen. Der Parameter ist erforderlich und darf nur einmal vorkommen. <i n d e x F i l e> [ s c r i p t _ f i l e n a m e ]</ i n d e x F i l e> < !−− B e i s p i e l : −−> <i n d e x F i l e>d a v i n c i . php</ i n d e x F i l e> Master-Repository festlegen Im Master-repostiory speichert der Repository-Manager die Definitionen aller registrierten repositories (siehe Abschnitt A.5.4). Es dürfen keine Webapplikationen die selbe Datenbank für ihr Master-Repository verwenden. Der Parameter ist erforderlich und darf nur einmal vorkommen. <m a s t e r R e p o s i t o r y> [ dsn | s h o r t c u t ]</ m a s t e r R e p o s i t o r y> < !−− B e i s p i e l e : −−> <m a s t e r R e p o s i t o r y>#l o c a l _ d a v i n c i _ i n t r a n e t</ m a s t e r R e p o s i t o r y> <m a s t e r R e p o s i t o r y>m y s q l : // user:pwd@mysql / d a v i n c i _ i n t r a n e t</ m a s t e r R e p o s i t o r y> Einbindung weiterer Konfigurationsdateien Mit dem <include>-Parameter können weitere Konfigurationsdateien eingebunden werden. Der Parser setzt beim Einlesen in der angegebenen Datei fort. Das Element ist optional und kann mehrmals, auch verschachtelt vorkommen. <i n c l u d e> [ f i l e n a m e ]</ i n c l u d e> < !−− B e i s p i e l : −−> <i n c l u d e>u i . xml</ i n c l u d e> Definition von View-Bäumen Alle benötigten View-Bäume müssen über <viewTree>-Elemente in der Konfigurationsdatei spezifiziert werden. Die Definition der View-Bäume wurde bereits in Abschnitt 4.4.1 behandelt. Spezifikation von models Alle models die verwendet werden, müssen mit je einem eigenen <model>-Element angegeben werden. Ansonsten wird das model nicht initialisiert und ist somit nicht verfügbar. Wurde ein model bereits für einen Knoten in einem View-Baum angegeben, ist die explizite Angabe nicht mehr erforderlich. Eine doppelte Spezifikation ist jedoch unproblematisch. <model> [ model_mapping ]</ model> < !−− B e i s p i e l : −−> <model>c o n t e n t . N a v i g a t i o n</ model> ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK A.4 90 DaVinci Datentypen Bei PHP werden grundsätzlich alle Typen von Variablen dynamisch umgewandelt (dynamic type casting, siehe [The03a, Abschnitt II.7]). Diese Eigenschaft ermöglicht zwar vor allem bei kleineren, unkritischen Scripts eine bequeme Handhabung von Variablen, macht jedoch bei größeren Projekten viele Probleme. Vor allem auch bei der Datenbankanbindung ist es unbedingt notwendig, dass der Applikation der richtigen Typ einer Variablen bekannt ist. Bei DaVinci wird deshalb der Typ aller ein- und ausgehenden Variablen vordefiniert. Alle Variablen die über den Request in das Framework eingehen und alle Variablen die aus der Datenbank gelesen und in die Datenbank geschrieben werden, erhalten eine eindeutige Typenbezeichnung und werden je nach Bedarf korrekt umgewandelt. Die Typen werden über Konstanten angegeben, welche in jener Datei definiert sind, in der sich die Klasse DaVinci befindet. Die folgenden Typen wurden vorerst definiert: DATATYPE_BOOLEAN DATATYPE_INTEGER DATATYPE_FLOAT DATATYPE_VARCHAR DATATYPE_TEXT DATATYPE_BLOB DATATYPE_SIMPLETIME DATATYPE_SIMPLEDATE DATATYPE_ISO8601DATE DATATYPE_UNIXTIMESTAMP DATATYPE_HASHTABLE A.4.1 boolscher Wert (true/false) Ganzzahl (plattformabhängige Größe) Fließkommazahl (plattformabhängige Größe) kurze Zeichenkette (max. 255 Bytes) lange Zeichenkette (String) Bytefolgen (wie TEXT) Uhrzeit im Format HH:MM:SS Datum im Format YYYY:MM:DD Datumsformat nach ISO8601 Unix-Zeitstempel in Sekunden (assoziatives) Array Typenkonvertierung von Request-Parametern Alle erforderlichen Pfadinfo- und POST-Parameter einer Aktion werden im Konstruktor der Aktionsklasse vordefiniert. Dabei muss auch der Typ dieser Parameter angegeben werden. Bei eingehenden Requests werden vom Action-Manager die Pfadinfo- und POST-Parameter in die entsprechenden DaVinci Datentypen konvertiert. Die im Array $parameters befindlichen Werte innerhalb der Aktionsklasse sind bereits im richtigen Datentyp verfügbar. Die Abbildung zwischen den DaVinci Typen und den nativen PHP-Datentypen ist in der privaten Funktion _typeCast() der Klasse ActionManager fix definiert. A.4.2 Typenkonvertierung von und zu Datenbanken Ähnlich wie bei Request-Parametern werden auch Datenbank-Werte auf dem Weg ins Framework bzw. in die Datenbank zurück konvertiert. Jede Datenbankklasse muss drei Funktionen implementieren, die für diese Typenumwandlung verantwortlich sind: ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 91 typeCast(): Die Funktion dient wie die gleichnamige Funktion im Action-Manager zur Typenkonvertierung von Werten die von der Datenbank ins Framework eingelesen werden. convert2dbType(): Diese Funktion wird für die Erstellung der Datenbanktabelle benötigt. Beim Ausführen des SQL CREATE-Kommandos müssen die Datentypen aller Attribute der Relation definiert werden. Da jedes Datenbanksystem verschiedene Datentypen verwendet bzw. die Bezeichnungen sehr stark variieren, muss für jeden DaVinci Datentyp ein passender Datenbank-Datentyp angegeben werden. prepare4db(): Die Funktion bereitet den Wert eines DaVinci Datentyps auf eine SQL-Abfrage vor. A.5 Repository API Die API zur Verwendung von repositories ist bereits sehr komplex. Es Bedarf einiger Übung, um repositories richtig einsetzen zu können. Als Beispiel der Anwendung sei auch auf den Quellcode im Abschnitt B.1 verwiesen. Der Code erstellt die zur Demo-Applikation aus Kapitel 5 benötigten repositories. A.5.1 Erstellen von repositories Repositories werden ganz einfach über die entsprechende Klasse (zur Zeit CollectionRepository oder SimpleTreeRepository) erstellt. Der eindeutige Bezeichner muss bereits im Konstruktur angegeben werden. Das Layout (die Feld-Definitionen) wird über eine RepositoryLayout -Instanz definiert und mit der Funktion setLayout() dem repository zugewiesen. Soll das repository an eine Datenbank angebunden werden, muss mittels der Funktion setDSN() ein DSN-Parameter angegeben werden. Folgendes Beispiel demonstriert das Erstellen einer neuen Collection mit der Bezeichnung simple_textpages: $ t r e e = new C o l l e c t i o n R e p o s i t o r y ( ' s i m p l e _ t e x t p a g e s ' ) ; $ l a y o u t = new R e p o s i t o r y L a y o u t ( ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' t i t l e ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 255) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' image ' , DATATYPE_BLOB) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' t e x t ' , DATATYPE_TEXT) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' l a s t _ u p d a t e ' , DATATYPE_UNIXTIMESTAMP) ; $ t r e e −>s e t L a y o u t ( $ l a y o u t ) ; $ t r e e −>setDSN ( '#l o c a l _ m y s q l ' ) ; Dieses CollectionRepository hat als Attribute die Felder title, image, text und last_update. Die Funktion addFieldDefinition () der Klasse RepositoryLayout erfordert als Parameter den Feldnamen, den DaVinci Datentyp (siehe Abschnitt A.4) und ein optionales, assoziatives Array mit zusätzlichen Optionen. Folgende Optionen sind zur Zeit erlaubt: FIELDOPTION_NOTNULL: Gleicht der Option NOT NULL des SQL Create Befehls. Die Option erfordert einen boolschen Wert (true oder false). ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 92 FIELDOPTION_LENGTH: Gleicht der Option LENGTH des SQL Create Befehls. Es wird ein Integer-Wert erwartet. Bei Verwendung des Typs DATATYPE_VARCHAR muss diese Option angegeben werden. FIELDOPTION_DEFAULT: Gleicht der Option DEFAULT des SQL Create Befehls. Mit dieser Option kann ein Standardwert für das Attribut definiert werden. DSN-Notation Wurde der DSN-Parameter im repository gesetzt, kann eine Datenbank angebunden werden. Es stehen dann weitere Funktionen zur Verfügung, mit denen Datensätze geladen, gespeichert und gelöscht werden können. Die Spezifikation des DSN-Parameters erfolgt gemäß der folgenden Notation: dbms://[username]:[password]@host[:port]/database Beispiel: mysql://davinci:passme@localhost/intranet Die in eckige Klammern gesetzten Parameter sind optional und können ausgelassen werden. Zur Zeit ist als DBMS nur das Kürzel mysql für MySQL erlaubt, da noch keine anderen Datenbanksysteme unterstützt werden. A.5.2 Offline-Manipulation von Einträgen Die Funktionen zur Offline-Manipulation sind: newRecord(): Die Funktion dient zum Erstellen eines neuen Datensatzes. Zurückgegeben wird eine Referenz des neu erzeugten Eintrags. Die ID des neuen Datensatzes wird vom Framework vergeben. get(): Die Funktion liefert eine Referenz zum Datensatz der angegebenen ID zurück. getAll(): Diese Funktion liefert eine Referenz auf den internen Datensatz-Container zurück, indem alle Einträge enthalten sind. getWhere(): Die Funktion liefert einen Datensatz zurück, bei dem ein bestimmtes Feld einen bestimmten Wert hat. Es wird allerdings nur immer der erste gefundene Eintrag zurückgegeben. Das bedeutet, dass die Funktion nur auf ein Feld angewendet werden sollte, welches eindeutige Einträge (unique) enthält. getSize(): Die Funktion gibt die Anzahl der vorhandenen (geladenen) Datensätze zurück. beginWalk(): Datensätze können mit dieser Funktion durchwandert werden. Der Aufruf von beginWalk() startet die Sequenz und setzt intern einen Zeiger auf den ersten Datensatz. Anschließend kann mit der Funktion nextRecord() stets der nächste Datensatz abgeholt werden, solange bis die Funktion false zurückliefert. beginWalkWhere(): Diese Funktion erlaubt zusätzlich die Angabe einer Bedingung. Es werden nur jene Datensätze durchwandert, bei denen ein bestimmtes Feld einen bestimmten Wert aufweist (vgl. getWhere()). ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 93 delete(): Mit dieser Funktion kann ein Eintrag gelöscht werden. Wurde eine Datenbank angebunden wird auch der Eintrag in der Datenbank gelöscht. Wurde keine Datenbank angebunden, gleicht die Funktion der Funktion unload(). dump(): Diese Funktion dient vorwiegend zum Debugging. Alle vorhandenen Einträge werden ähnlich wie bei DaVinci::dump() formatiert dargestellt. Die Funktion ist deshalb notwendig, da in den Datensätzen Referenzen zum eigenen repository vorhanden sind und DaVinci::dump() (bzw. in Folge die PHPFunktion var\_dump()) nicht angewendet werden kann. Alle Datensätze eines repositories sind Objekte einer dem Typ des repositories zugehörigen Datensatz-Klasse (CollectionRecord bzw. SimpleTreeRecord). Will man einen Datensatz auslesen, wird über die get ()-Methode des repositories das Datensatz-Objekt zurückgegeben. Anschließend können einzelne Werte über set ()Methoden der Datensatz-Klasse verändert werden. A.5.3 DB-Manipulation von Einträgen Bei einer angebundenen Datenbank stehen einige weitere Funktionen zur Verfügung mit denen Einträge geladen, gespeichert oder gelöscht werden können. Bevor eine Datenbank verwendet werden kann, muss die zugehörige Tabelle initialisiert werden. Folgende Funktionen können im Fall einer angebundenen Datenbank verwendet werden: initTable(): Die Funktion erstellt die zugehörige Tabelle im jeweiligen Datenbanksystem. dropTable(): Die Funktion löscht die Tabelle mitsamt den Daten. load(): Lädt einen bestimmten Datensatz ins repository. Als Parameter muss die ID übergeben werden. loadAll(): Diese Funktion lädt alle vorhandenen Datensätze ins repository. Als Parameter können optional eine SQL ORDER BY- und eine LIMIT-Syntax angegeben werden. loadWhere(): Die Funktion lädt alle Datensätze, die bestimmte Vorraussetzungen erfüllen. Es muss zumindest ein Parameter angegeben werden, welcher der SQL WHERE-Syntax entspricht. Die optionalen Parameter von loadAll () sind auch hier möglich. unload(): Entfernt einen Datensatz aus dem repository. Ist der Eintrag auch in der Datenbank vorhanden, wird dieser beibehalten. unloadAll(): Entfernt alle Einträge aus dem repository. unloadWhere(): Entfernt Einträge, bei denen ein bestimmtes Feld einen bestimmten Wert enthält. Hinweis: Die Funktion loadWhere() erfordert zum Unterschied von dieser Funktion und getWhere() einen Parameter in der Form der SQL-WHERE Syntax. ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 94 modified(): Diese Funktion dient zum Überprüfen, ob ein bestimmter Eintrag geändert wurde, seitdem er von der Datenbank geladen wurde. stored(): Die Funktion dient zum Überprüfen ob ein bestimmter Eintrag bereits in der Datenbank gespeichert ist. save(): Die Funktion speichert den Datensatz einer bestimmten ID, welche als Parameter angegeben werden muss. saveAll(): Die Funktion erfordert keinen Parameter und speichert automatisch alle geöffneten und geänderten Datensätze. Das repository merkt sich intern, ob Einträge geändert wurden und speichert diese. delete(): Mit dieser Funktion wird ein einzelner Eintrag aus der Datenbank und dem repository gelöscht. Anschließend sei ein Beispiel dargestellt, indem ein Datensatz aus einer angebundenen Datenbank eingelesen und geändert wird, ein neuer Eintrag erstellt und alle Einträge gespeichert werden. Zuletzt wird der zuvor erstellte Eintrag wieder gelöscht. Dieses Beispiel bezieht sich wiederum auf das repository aus den letzten Code-Beispielen: $ c o n t e n t −>l o a d ( 1 2 ) ; $ r e c o r d 1 =& $ c o n t e n t −>g e t ( 1 2 ) ; $ r e c o r d 1 −>s e t ( ' l a s t _ u p d a t e ' , time ( ) ) ; $ r e c o r d 2 =& $ c o n t e n t −>newRecord ( ) ; $ r e c o r d 2 −>s e t ( ' t i t l e ' , ' Welcome , ' ) ; $ r e c o r d 2 −>s e t ( ' t e x t ' , ' t h i s ␣ i s ␣ a ␣ s i m p l e ␣ t e s t ␣ page . ' ) ; $ c o n t e n t −>s a v e A l l ( ) ; $newID = $ r e c o r d 2 −>i d ; $ c o n t e n t −>delete ( $newID ) ; A.5.4 Die Klasse RepositoryManager Der Repository-Manager verwaltet alle registrierten repositories einer Webapplikation. Er bietet Funktionen zum Öffenen und Schließen von repositories. Benötigt eine Aktionsklasse oder ein model ein repository, kann mit dem Aufruf von RepositoryManager::open() eine Referenz abgeholt werden. Alle geöffneten repositories bleiben während eines Requests offen. Wird dasselbe repository von einer anderen Komponente benötigt, bekommt es vom Manager einen Referenz auf die gleiche Instanz zurück. Somit kann von verschiedenen Ressourcen auf die selbe Instanz zugegriffen werden. Die öffentlichen Funktionen des Managers sind: open(): Die Funktion öffnet ein registriertes repository über den angegebenen eindeutigen Bezeichner und gibt eine Referenz auf die Instanz zurück. close(): Mit dieser Funktion kann ein repository geschlossen werden. Genaugenommen wird einfach die Instanz wieder gelöscht. ANHANG A. DETAILS ZUM DAVINCI FRAMEWORK 95 register(): Mit dieser Funktion können neue repositories beim Manager registriert werden. deregister(): Diese Funktion entfernt ein registriertes repository aus dem Masterrepository. initMasterRepository(): Initialisiert das Master-repository. Diese Funktion muss beim Erstellen einer neuen Webapplikation einmal aufgerufen werden. Die Tabelle für das Master-repository wird dadurch erstellt. Die Datenbank wird in der Konfigurationsdatei über den Parameter <masterRepository> (siehe Abschnitt A.3.2). Repositories registrieren Will man ein repository dauerhaft verwenden, sollte es beim Repository-Manager registriert werden. Das bedeutet, dass das repository anschließend über den Funktionsaufruf RepositoryManager::open() geöffnet werden kann. Im Hintergrund wird dabei die repository-Definition samt Layout in ein spezielles Master-repository gespeichert, welches intern vom Manager verwaltet wird. Die Datenbank, indem dieses Master-repository liegt, muss in der Konfigurationsdatei der Webapplikation über das Element <masterRepository> angegeben werden (siehe Abschnitt A.3.2). Jede Webapplikation hat ihr eigenes Master-repository. Werden mehrere Webapplikationen am selben Server betrieben, muss sichergestellt sein, dass für jedes ihrer Masterrepositories eine eigene Datenbank verwendet wird. Ansonsten kommt es zu Konflikten bei den Tabellen. Die Layout-Definition wird beim Registrieren vom Framework in eine eigene XML-Definition umgewandelt und als Textfeld im Master-repository gespeichert. Beim Öffenen eines repositories über den Manager, wird die XML-Definition geparst und das entsprechende Layout wird dem repository wieder zugewiesen. Die für eine neue Webapplikation erforderlichen repositories können einerseits direkt mit SQL-Befehlen über die Konsole des DBMS in die Tabelle geschrieben werden. In diesem Falle muss sehr darauf geachtet werden, dass die XML-Definition des Layouts fehlerfrei ist. Ein repository kann andererseits auch mit der vom Framework bereitgestellten API erstellt werden. Durch die API als Basis, können sehr einfach auch dynamisch neue repositories angelegt werden. Anhang B Quellcode In diesem Anhang sind einige Quellcodes der Demo-Applikation aus Kapitel 5 zum Nachschlagen abgedruckt. Es handelt sich dabei um die Hilfsfunktion zum Erstellen der beiden repositories, um eine Aktionsklasse und um eine model-Klasse. 96 ANHANG B. QUELLCODE B.1 97 Hilfsaktion zum Erstellen der repositories Der folgende Code generiert die beiden repositories links und addressbook. Es wird ein Objekt der Klasse SimpleTree instanziert. Anschließend wird der erforderliche data source name zugewiesen. Für das Kürzel #local_homebase existiert in der Konfigurationsdatei der Webapplikation (siehe Anhang A, Abschnitt A.3.2, Seite 88ff) der folgende Eintrag: <dsnMapping i d=" local_homebase "> m y s q l : // www:www@localhost / homebase </ dsnMapping> Die Definition des Layouts erfolgt über eine Instanz der Klasse RepositoryLayout. Nach Erstellen der Feld-Definitionen wird das Layout dem repository zugewiesen. Zum Schluss wird das repository für die Verwendung der angebundenen Datenbank initialisiert und beim Repository-Manager registriert. Die beiden repositories sind dann über den Aufruf von RepositoryManager::open() für immer verfügbar. function execute () { // c r e a t e a d d r e s s b o o k $ r e p = new S i m p l e T r e e R e p o s i t o r y ( ' a d d r e s s b o o k ' ) ; $rep−>setDSN ( '#local_homebase ' ) ; $ l a y o u t = new R e p o s i t o r y L a y o u t ( ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' i s _ f o l d e r ' , DATATYPE_BOOLEAN) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' folder_name ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 255) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' f i r s t n a m e ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' secondname ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' s t r e e t ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' z i p c o d e ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 8) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' c i t y ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' phone ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' c e l l p h o n e ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' e m a i l ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' i c q ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 60) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' p i c t u r e ' , DATATYPE_BLOB) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' comment ' , DATATYPE_TEXT) ; $rep−>s e t L a y o u t ( $ l a y o u t ) ; // i n i t r e p o s i t o r y and r e g i s t e r a t manager $rep−>i n i t T a b l e ( ) ; RepositoryManager : : r e g i s t e r ( $rep , ' a ␣ s i m p l e ␣ a d d r e s s b o o k ' ) ; // c r e a t e l i n k r e p o s i t o r y $ r e p = new S i m p l e T r e e R e p o s i t o r y ( ' l i n k s ' ) ; $rep−>setDSN ( '#local_homebase ' ) ; ANHANG B. QUELLCODE 98 $ l a y o u t = new R e p o s i t o r y L a y o u t ( ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' i s _ f o l d e r ' , DATATYPE_BOOLEAN) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' is_homepage ' , DATATYPE_BOOLEAN) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' folder_name ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 255) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' t i t l e ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 255) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' u r l ' , DATATYPE_VARCHAR, Array (FIELDOPTION_LENGTH = > 255) ) ; $ l a y o u t −>a d d F i e l d D e f i n i t i o n ( ' comment ' , DATATYPE_TEXT) ; $rep−>s e t L a y o u t ( $ l a y o u t ) ; // i n i t r e p o s i t o r y and r e g i s t e r a t manager $rep−>i n i t T a b l e ( ) ; RepositoryManager : : r e g i s t e r ( $rep , ' s i m p l e ␣ l i n k s ␣ c o l l e c t i o n ' ) ; r e t u r n true ; } B.2 SetModule als beispielhafte Aktionsklasse Die folgende Klasse definiert die Aktion SetModule/[module_id]“ und dient zur Wahl zwischen den Modulen homepage, [addressbook und links. Die Aktion steht über das View-Skript mainframe.navigation_bar zur Verfügung. Es wurde ein PfadinfoParameter definiert, anhand dessen der Schalter mainframe.body im View-Baum geändert wird. c l a s s SetModule e x t e n d s A b s t r a c t A c t i o n { f u n c t i o n SetModule ( ) { $ t h i s −>_addPathParamDef ( ' module_id ' , DATATYPE_VARCHAR, ' homepage ' ) ; } function execute () { i f ( $ t h i s −>p a r a m e t e r s [ ' module_id ' ] ! = n u l l ) { switch ( $ t h i s −>p a r a m e t e r s [ ' module_id ' ] ) { case ' homepage ' : ViewGenerator : : s e t S w i t c h ( ' mainframe . body ' , ' homepage ' ) ; break ; case ' a d d r e s s b o o k ' : ViewGenerator : : s e t S w i t c h ( ' mainframe . body ' , ' a d d r e s s b o o k ' ) ; break ; case ' l i n k s ' : ViewGenerator : : s e t S w i t c h ( ' mainframe . body ' , ' l i n k s ' ) ; break ; } } r e t u r n true ; } } ANHANG B. QUELLCODE B.3 99 Links model Das Links-model implementiert die Applikationslogik für die Link-Datenbank. Es bindet das links-repository an, liefert Daten an die entsprechenden View-Skripts und verwaltet die Datenbankeinträge. <?php c l a s s L i n k s e x t e n d s AbstractModel { var $ l i n k s R e p o s i t o r y ; var $homepageUrl ; var $ s e l e c t e d F o l d e r ; var $ s e l e c t e d R e c o r d ; /∗ implement c o n s t r u c t o r and a b s t r a c t f u n c t i o n s ∗/ f u n c t io n Links ( ) { // c h e c k f o r r o o t node , c r e a t e i f i t doesn ' t e x i s t $ t h i s −>l i n k s R e p o s i t o r y =& RepositoryManager : : open ( ' l i n k s ' ) ; i f ( $ t h i s −>l i n k s R e p o s i t o r y −>l o a d T r e e ( ) == f a l s e ) $ t h i s −>_ i n i t L i n k s T r e e ( ) ; // i n i t f i r s t −time s e l e c t e d f o l d e r $ r o o t =& $ t h i s −>l i n k s R e p o s i t o r y −>getRootNode ( ) ; $ t h i s −>s e l e c t e d F o l d e r = $ r o o t −>i d ; // i n i t homepage u r l $ r e c o r d =& $ t h i s −>l i n k s R e p o s i t o r y −>getWhere ( ' is_homepage ' , true ); i f ( $ r e c o r d ! = n u l l ) $ t h i s −>homepageUrl = $ r e c o r d −>g e t ( ' u r l ' ) ; } function requestInit () { $ t h i s −>l i n k s R e p o s i t o r y =& RepositoryManager : : open ( ' l i n k s ' ) ; } f u n c t i o n _loadTree ( ) { i f ( $ t h i s −>l i n k s R e p o s i t o r y −>l o a d T r e e ( ) == f a l s e ) $ t h i s −>_ i n i t L i n k s T r e e ( ) ; } f u n c t i o n requestEnd ( ) { } /∗ p r i v a t e f u n c t i o n s ∗/ function _initLinksTree () { $ r o o t =& $ t h i s −>l i n k s R e p o s i t o r y −>createRootNode ( ) ; $ r o o t −>s e t ( ' i s _ f o l d e r ' , true ) ; $ r o o t −>s e t ( ' is_homepage ' , f a l s e ) ; $ r o o t −>s e t ( ' folder_name ' , ' bookmarks ' ) ; $ t h i s −>l i n k s R e p o s i t o r y −>s a v e A l l ( ) ; $ t h i s −>s e l e c t e d F o l d e r = $ r o o t −>i d ; } /∗ s e r v e v i e w d a t a ∗/ f u n c t i o n getViewData ( $ v i e w I d ) { switch ( $ v i e w I d ) { ANHANG B. QUELLCODE 100 case " mainframe . body . l i n k s . t r e e " : $ t h i s −>_loadTree ( ) ; r e t u r n Array ( ' c u r r e n t _ f o l d e r ' => $ t h i s −>s e l e c t e d F o l d e r , ' t r e e ' => $ t h i s −>l i n k s R e p o s i t o r y ) ; break ; case " mainframe . body . l i n k s . r i g h t _ c a n v a s . f o l d e r " : $ t h i s −>_loadTree ( ) ; $ r e c o r d s = Array ( ) ; $ t h i s −>l i n k s R e p o s i t o r y −>beginTreeWalkWhere ( ' i s _ f o l d e r ' , f a l s e , $ t h i s −>s e l e c t e d F o l d e r , f a l s e , 1 ) ; while ( $ r e c o r d =& $ t h i s −>l i n k s R e p o s i t o r y −>nextNode ( ) ) $records [ ] = $record ; r e t u r n Array ( ' r e c o r d s ' => $ r e c o r d s , ' f o l d e r ' => $ t h i s −> l i n k s R e p o s i t o r y −>g e t ( $ t h i s −>s e l e c t e d F o l d e r ) ) ; break ; case " mainframe . body . l i n k s . r i g h t _ c a n v a s . e d i t _ f o l d e r " : $ t h i s −>l i n k s R e p o s i t o r y −>l o a d ( $ t h i s −>s e l e c t e d F o l d e r ) ; $ r e c o r d = $ t h i s −>l i n k s R e p o s i t o r y −>g e t ( $ t h i s −> selectedFolder ) ; return $record ; break ; case " mainframe . body . l i n k s . r i g h t _ c a n v a s . e d i t _ r e c o r d " : $ t h i s −>l i n k s R e p o s i t o r y −>l o a d ( $ t h i s −>s e l e c t e d R e c o r d ) ; $ r e c o r d = $ t h i s −>l i n k s R e p o s i t o r y −>g e t ( $ t h i s −> selectedRecord ) ; return $record ; break ; case " mainframe . body . homepage " : r e t u r n ( s t r l e n ( $ t h i s −>homepageUrl ) > 0) ? $ t h i s −> homepageUrl : ' about : b la n k ' ; break ; default : r e t u r n n u l l ; break ; } } /∗ p u b l i c f u n c t i o n s ∗/ function s e l e c t F o l d e r ( $id ) { $ t h i s −>s e l e c t e d F o l d e r = $ i d ; } function selectRecord ( $id ) { $ t h i s −>s e l e c t e d R e c o r d = $ i d ; } function createRecord () { $ t h i s −>_loadTree ( ) ; $ p a r e n t =& $ t h i s −>l i n k s R e p o s i t o r y −>g e t ( $ t h i s −>s e l e c t e d F o l d e r ) ; $ r e c o r d =& $ t h i s −>l i n k s R e p o s i t o r y −>c r e a t e C h i l d N o d e ( $ p a r e n t ) ; $ r e c o r d −>s e t ( ' i s _ f o l d e r ' , f a l s e ) ; $ r e c o r d −>s e t ( ' is_homepage ' , f a l s e ) ; $ r e c o r d −>s e t ( ' t i t l e ' , ' new␣ l i n k ' ) ; $ t h i s −>l i n k s R e p o s i t o r y −>s a v e A l l ( ) ; $ t h i s −>s e l e c t e d R e c o r d = $ r e c o r d −>i d ; } function createFolder () { ANHANG B. QUELLCODE 101 $ t h i s −>_loadTree ( ) ; $ p a r e n t =& $ t h i s −>l i n k s R e p o s i t o r y −>g e t ( $ t h i s −>s e l e c t e d F o l d e r ) ; $ r e c o r d =& $ t h i s −>l i n k s R e p o s i t o r y −>c r e a t e C h i l d N o d e ( $ p a r e n t ) ; $ r e c o r d −>s e t ( ' i s _ f o l d e r ' , true ) ; $ r e c o r d −>s e t ( ' is_homepage ' , f a l s e ) ; $ r e c o r d −>s e t ( ' folder_name ' , ' new␣ f o l d e r ' ) ; $ t h i s −>l i n k s R e p o s i t o r y −>s a v e A l l ( ) ; $ t h i s −>s e l e c t e d F o l d e r = $ r e c o r d −>i d ; } f u n c t i o n s a v e F o l d e r ( $folder_name ) { $ t h i s −>_loadTree ( ) ; $node =& $ t h i s −>l i n k s R e p o s i t o r y −>g e t ( $ t h i s −>s e l e c t e d F o l d e r ) ; $node−>s e t ( ' folder_name ' , $folder_name ) ; $ t h i s −>l i n k s R e p o s i t o r y −>s a v e A l l ( ) ; } f u n c t i o n saveRecord ( $ t i t l e , $ u r l , $comment , $is_homepage ) { $ t h i s −>_loadTree ( ) ; $node =& $ t h i s −>l i n k s R e p o s i t o r y −>g e t ( $ t h i s −>s e l e c t e d R e c o r d ) ; $node−>s e t ( ' t i t l e ' , $ t i t l e ) ; $node−>s e t ( ' u r l ' , $ u r l ) ; $node−>s e t ( ' comment ' , $comment ) ; $prevHome =& $ t h i s −>l i n k s R e p o s i t o r y −>getWhere ( ' is_homepage ' , true ) ; i f ( $is_homepage ) { $ t h i s −>homepageUrl = $ u r l ; i f ( $prevHome ) $prevHome−>s e t ( ' is_homepage ' , f a l s e ) ; } else { i f ( ! $prevHome | | $prevHome−>i d == $node−>i d ) $ t h i s −> homepageUrl = ' ' ; } $node−>s e t ( ' is_homepage ' , $is_homepage ) ; $ t h i s −>l i n k s R e p o s i t o r y −>s a v e A l l ( ) ; } } ?> Inhalt der CD-ROM Die CD-ROM enthält zum einen die Diplomarbeit im PDF-Format und einige zitierte Dokumente, sofern im Literaturverzeichnis angegeben. Zum anderen ist darauf die Distribution des DaVinci Prototypen zu finden. Eine kurze Installationsanweisung befindet sich in der Datei README im Verzeichnis der Distribution. Die Verzeichnisinhalte im Detail: phpdavinci: Der DaVinci Prototyp inklusive Installationsanweisung. thesis: Die Diplomarbeit als PDF-Dokument und zitierte Dokumente. essentials: Einige tools wie Apache, MySQL und PHP. 102 Literaturverzeichnis [AMM98] Atzeni, P., G. Mecca und P. Merialdo: Design and Implementation of Data-Intensive Web Sites. In: Conference On Extended Database Technology (EDBT’98), Valencia, Spanien, März 1998. [BGP01] Baresi, Luciano, Franca Garzotto und Paolo Paolini: Extending UML for Modeling Web Applications. In: 34th Hawaii International Conference on System Sciences (HICSS-2001), Maui, Hawaii, Januar 2001. IEEE Internet Society. Kopie auf CD-ROM. [BKM99] Baumeister, Hubert, Nora Koch und Luis Mandel: Towards a UML Extension for Hypermedia Design. In: UML ’99, Seiten 28–30, Fort Collins, Colorado, USA, Oktober 1999. Kopie auf CD-ROM. [BM98] Baumeister, Hubert und Christoph Maier: Description Techniques for Distributed Hypermedia Systems. Technischer Bericht 9808, Institut für Informatik der Ludwig Maximilian Universität München, München, 1998. Kopie auf CD-ROM. [Boo01] Booch, Grady: The architecture of Web applications. URL, http://www. ibm.com/developerworks/library/it-booch_web/, Juni 2001. Kopie auf CDROM. [Cer02] Cerami, Ethan: Web Services Essentials. O’Reilly, Sebastopol, CA, USA, 2002. [CFM02] Cero, Stefano, Piero Fraternali und Maristella Matera: Conceptual Modeling of Data-Intensive Web Applications. In: IEEE Internet Computing, Seiten 20–30. IEEE Computer Society, Los Alamitos, CA, USA, Juli/August 2002. Kopie auf CD-ROM. [CFP99] Ceri, S., P. Fraternali und S. Paraboschi: Design Principles for Data-Intensive Web Sites. In: SIGMOD Record, Band 24. März 1999. [Che76] Chen, P.: The Entity-Relationship Model – Toward a Unified View of Data. ACM Transactions on Database Systems, 1(1):9–36, März 1976. Kopie auf CD-ROM. [Con99] Conallen, Jim: Modeling Web Applications with UML. In: Communications of the ACM, Band 42, Seiten 63–70. ACM Press, New York, Oktober 1999. Kopie auf CD-ROM. 103 LITERATURVERZEICHNIS 104 [Con03] Conallen, Jim: Building Web Applications with UML. Addison-Wesley, Boston, MA, USA, 2 Auflage, 2003. [Cym00] Cymerman, Michael: Secure a Web application, Java-style. URL, http://www-106.ibm.com/developerworks/java/library/j-jw-javastyle. html, Mai 2000. Kopie auf CD-ROM. [FGM+ 99] Fielding, R., J. Gettys, J. Mogul, H. Frystyk, L. Masinter, P. Leach und T. Berners-Lee: Hypertext Transfer Protocol – HTTP/1.1. URL, http://www.ietf.org/rfc/rfc2616.txt, Juni 1999. Kopie auf CD-ROM. [Fie00] Fielding, Roy Thomas: Architectural Styles and the Design of Networkbased Software Architectures. Doktorarbeit, University of California, 2000. [Fra00] Fraternali, P.: Tools and Approaches for Data-intensive Web applications: A Survey. In: ACM Computing Society. ACM Press, 2000. [FSK+ 02] Finkelstein, Anthony, Andrea Savigni, Gerti Kappel, Werner Retschitzegger, Brirgit Pöll, Wieland Schwinger, Thomas Hofer und Christian Feichtner: Ubiquitous Web Application Development – A Framework for Understanding. In: The 6th Multiconference on Systemics, Cybernetics and Informatics (SCI2002), Web-Engineering Track, Orlando, Florida, USA, Juli 2002. Kopie auf CD-ROM. [FV01] Flurry, Greg und Wayne Vicknair: Technology for e-busines: The IBM Application Framework for e-business. IBM Systems Journal, 40(1), 2001. Kopie auf CD-ROM. [Gam94] Gamma, Erich: Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Boston, MA, USA, 1994. [GC00] German, D. und D. Cowan: Towards a Unified Catalog of Hypermedia Design Patterns. In: 33rd Hawaii International Conference on System Sciences (HICSS 2000), Band 6, Maui, Hawaii, Jänner 2000. Kopie auf CD-ROM. [GM01] Ginige, Athula und San Murugesan: The Essence of Web Engineering. In: IEEE MultiMedia, Seiten 22–25. IEEE Computer Society, Los Alamitos, CA, USA, April-Juni 2001. Kopie auf CD-ROM. [GPS95] Garzotto, F., P. Paolini und D. Schwabe: HDM – A Model-Based Approach to Hypertext Application Design. In: ACM Transactions on Information Systems, Band 11. ACM Press, New York, Januar 1995. [HC98] Hunter, Jason und William Crawford: Java Servlet Programming. O’Reilly, Sebastopol, CA, USA, 1998. [HL02] Hightower, Richard und Nicholas Lesiecki: Java Tools for Extreme Programming. Wiley, New York, 2002. LITERATURVERZEICHNIS [HS94] 105 Halasz, Frank und Mayer Schwartz: The Dexter hypertext reference model. Communications of the ACM, 37(2):30–39, 1994. Kopie auf CDROM. [Hun97] Hunt, J.: Smalltalk and Object Orientation: An Introduction. Springer, 1997. [Hun01] Hunter, Jason: Java Servlet Programming. O’Reilly, Sebastopol, CA, USA, 2. Auflage, 2001. [KD02] Knight, Alan und Naci Dai: Objects and the Web. In: IEEE Software, Seiten 51–59. IEEE Computer Society, Los Alamitos, CA, USA, März/April 2002. Kopie auf CD-ROM. [KK02] Koch, N. und A. Kraus: The Expressive Power of UML-based Web Engineering. In: CYTED (Herausgeber): Second Int. Workshop on WebOriented Software Technology (IWWOST ’02), Seiten 105–120, Malaga, Juni 2002. [Kra00] Krause, Jörg: PHP 4 – Grundlagen und Profiwissen. Hanser, München, 2000. [KRP+ 02] Kappel, Gerti, Werner Retschitzegger, Birgit Pröll, Rainer Unland und Bahram Vojdani: Architektur von WebInformationssystemen. In: Rahm, Erhard und Gottfried Vossen (Herausgeber): Web & Datenbanken. Dpunkt Verlag, Heidelberg, 2002. Kopie auf CD-ROM. [LCC00] Li, Jingfeng, Jian Chen und Ping Chen: Modeling Web Application Architecture with UML. In: 36th International Conference on Technology of Object-Oriented Languages and Systems (TOOLS-Asia’00), Seiten 265– 274, Xi’an, China, Oktober/November 2000. Kopie auf CD-ROM. [LCC+ 03] Leiner, Barry M., Vinton G. Cerf, David D. Clark, Robert E. Kahn, Leonard Kleinrock, Daniel C. Lynch, Jon Postel, Larry G. Roberts und Stephen Wolff: A Brief History of the Internet. URL, http://www.isoc.org/internet/history/brief.shtml, August 2003. Kopie auf CD-ROM. [LHSG02a] Lowe, David, Brian Henderson-Sellers und Alice Gu: Web Extensions to UML: Using the MVC Triad. In: Lecturer Notes in Computer Science, Band 2503, Seiten 55–69. Springer Verlag, Heidelberg, 2002. Kopie auf CD-ROM. [LHSG02b] Lowe, David, Brian Henderson-Sellers und Alice Gu: Web Modelling Languages: the gap between requirements and current exemplars. In: Australien Web Conference (AUSWEB02), Queensland, Juli 2002. Kopie auf CD-ROM. [Li03] Li, Sing: High-impact Web tier clustering, Part 1: Scaling Web services and applications with JavaGroups. URL, http://www-106.ibm.com/ developerworks/java/library/j-cluster1/, Juli 2003. Kopie auf CD-ROM. LITERATURVERZEICHNIS 106 [Nie99] Nielsen, J.: Designung Web Usability. New Riders Publishing, Indianapolis, 1999. [Pre02] Prescod, Paul: Second Generation Web Services. URL, http:// webservices.xml.com/pub/a/ws/2002/02/06/rest.html, Februar 2002. Kopie auf CD-ROM. [PSRO02] Pastor, Oscar, Daniel Schwabe, Gustavo Rossi und Luis Olsina: Web-Oriented Software Technolgy. In: Hernàndez, J. und A. Moreira (Herausgeber): ECOOP 2002 Workshops, Band 2548 der Reihe Lecture Notes in Computer Science. Springer-Verlag, Heidelberg, 2002. Kopie auf CD-ROM. [Qus03] Qusay, H. Mahmoud: Servlets and JSP Pages Best Practices. URL, http://developer.java.sun.com/developer/technicalArticles/ javaserverpag%es/servlets_jsp/, März 2003. Kopie auf CD-ROM. [Rad02] Radwin, Michael J.: Making the Case for PHP at Yahoo! Vortrag auf der PHP Conference 2002 in Millbrae, Kalifornien, Oktober 2002. Kopie der Folien auf CD-ROM. [RBP+ 91] Rumbaugh, James, Michael Blaha, William Premerlani, Frederick Eddy und William Lorensen: Object-Oriented Modeling and Design. Prentice Hall, New York, 1991. [REL01] Rossi, Gustavo, Luiselena Esmeraldo und Fernando Lyardet: Engineering Web Applications for Reuse. In: IEEE MultiMedia, Seiten 20– 31. IEEE Computer Society, Los Alamitos, CA, USA, Januar-März 2001. Kopie auf CD-ROM. [RJB99] Rumbaugh, James, Ivar Jacobson und Grady Booch: The Unified Modeling Language Reference Manual. Addison-Wesley, Boston, MA, USA, 1999. [RO02] Rossi, G. und L. Olsina: A Quantitative Method for Quality Evaluation of Web Sites and Applications. In: IEEE MultiMedia, Band 9. IEEE Computer Society, Los Alamitos, CA, USA, 2002. Kopie auf CD-ROM. [RS00] Retschitzegger, Werner und Wieland Schwinger: Towards Modeling of Data Web Applications – A Requirements’ Perspective. In: Proceedings of the Americas Conference on Information Systems (AMCIS 2000), Band 1, Seiten 149–155, Long Beach, CA, USA, August 2000. Kopie auf CD-ROM. [RSG99] Rossi, G., D. Schwabe und A. Garrido: Designing Computational Hypermedia Applications. In: Journal of Digital Information (JODI), Band 1. Department of Information and Library Studies, Loughborough University, UK, Februar 1999. [Sau94] Sauer, Hermann: Relationale Datenbanken: Addison-Wesley, München, 3. Auflage, 1994. Theorie und Praxis. LITERATURVERZEICHNIS [Sch03] 107 Schotte, Björn: PHP im E-Business. Vortrag auf der CeBit 2003 in Hannover, 2003. Kopie der Folien auf CD-ROM. [SRB03] Schwabe, Daniel, Gustavo Rossi und Simone Barbosa: Abstraction, Composition and Lay-Out Definition Mechanisms in OOHDM. URL, http://www-di.inf.puc-rio.br/∼schwabe//MM95/MainPage.html, Juli 2003. Kopie auf CD-ROM. [SS02] Schmidt, Stephan und Gerd Schaufelberger: Brücke an Maschinenraum: Interprozesskommunikation mit PHP4 und Shared Memory. PHP Magazin, 1, 2002. [SSJ02] Singh, Inderjeet, Beth Stearns und Mark Johnson: Designing Enterprise Applications with the J2EE Platform. Addison-Wesley, Boston, MA, USA, 2002. Kopie auf CD-ROM. [St02] Schwinger, Wieland und the UWA Consortium: Ubiquitous Web Applications. In: Proceedings of the eBusiness and eWorks Conference (e2002), Prag, Oktober 2002. Kopie auf CD-ROM. [Sun02a] Sun Microsystems: Dynamic Web Applications at a Glance. URL, http://java.sun.com/programs/solution-templates/pdf/DynamicWebR4.pdf, 2002. Kopie auf CD-ROM. [Sun02b] Sun Microsystems: Java BluePrints – Model-View-Controller. URL, http://java.sun.com/blueprints/patterns/MVC-detailed.html, 2002. Kopie auf CD-ROM. [Sun03] Sun Microsystems: Java Server Pages – Tag Libraries. URL, http: //java.sun.com/products/jsp/taglibraries.html, Juli 2003. [SW00] Smith, Conny U. und Lloyd G. Williams: Building Responsive and Scalable Web Applications. In: Computer Measurement Group’s 2000 International Conference (CMG2000), Orlando, Florida, USA, Dezember 2000. Software Engineering Research and L&S Computer Technology, Inc. Kopie auf CD-ROM. [The03a] The PHP Group: PHP Dokumentation. URL, http://www.php.net/ manual/de/, August 2003. Kopie auf CD-ROM. [The03b] The PHP Group: PHP Usage for June 2003. URL, http://www.php. net/usage.php, Juni 2003. [Tho96] Thompson, Della (Herausgeber): The Oxford Quick Reference Dictionary. Oxford University Press, 1996. [Ude02] Uden, Lorna: Design Process for Web Applications. In: IEEE MultiMedia, Seiten 47–55. IEEE Computer Society, Los Alamitos, CA, USA, Oktober-Dezember 2002. Kopie auf CD-ROM. [W3C99] W3C: HTML 4.01 Specification. URL, http://www.w3.org/TR/HTML4, Dezember 1999. Kopie auf CD-ROM. LITERATURVERZEICHNIS 108 [W3C02] W3C: Web Services Architecture Requirements. URL, http://www.w3.org/ TR/wsa-reqs, November 2002. [WHK97] Wahl, M., T. Howes und S. Kille: Lightweight Directory Access Protocol (v3). URL, http://www.ietf.org/rfc/rfc2251.txt, Dezember 1997. Kopie auf CD-ROM. [Zen01] Zend Technologies Ltd.: Zend Engine 2.0 Design Draft. URL, http: //www.zend.com/engine2/ZendEngine-2.0.pdf, 2001. Kopie auf CD-ROM. [Zol01] Zoltan, Erik: Server-side scripting languages. URL, http://www-106. ibm.com/developerworks/web/library/wa-sssl.html, April 2001. Kopie auf CD-ROM.