Diplomarbeit - der ganze bazen

Transcription

Diplomarbeit - der ganze bazen
Eidesstattliche Erklärung
Hiermit erkläre ich, dass ich die vorliegende Arbeit selbstständig erstellt, keine
anderen als die angegebenen Quellen benutzt und keine fremde Hilfe in Anspruch
genommen habe.
Felix Krüger
Hamburg, den 29.09.09
Hochschule für Angewandte Wissenschaften Hamburg
Fakultät Design, Medien und Information
Studiengang Medientechnik
Konzeption und Entwicklung einer
webbasierten Medienbibliothek
Diplomarbeit
verfasst und vorgelegt von
Felix Krüger
zur Erlangung des akademischen Grades
Diplom-Ingenieur (FH)
durchgeführt bei
TUDOCK – Pahlmann und Wolf GbR, Hamburg
betreut von
Niels Pahlmann, TUDOCK – Pahlmann und Wolf GbR
Prof. Andreas Plaß, HAW Hamburg
Hamburg, September 2009
I
Inhaltsverzeichnis
1 Einleitung...................................................................................................................1
1.1 Zielsetzung..................................................................................................................................1
1.2 Auswahl der technischen Mittel.........................................................................................2
1.3 Methodisches Vorgehen.........................................................................................................3
2 Anforderungen.........................................................................................................4
2.1 Anwendungsfälle/Anforderungen Benutzersicht.......................................................4
2.1.1 Hosting Service ................................................................................................................4
2.1.1.1 Benutzer kann über Webinterface zugreifen..............................................4
2.1.1.2 Hochgeladene Dateien können importiert werden..................................4
2.1.1.3 Die Metadaten werden automatisch importiert........................................5
2.1.1.4 Metadaten können bearbeitet werden..........................................................5
2.1.1.5 Einträge werden in Listenform dargestellt.................................................5
2.1.1.6 Die Einträge der Bibliothek sind filterbar....................................................5
2.1.1.7 Einträge können sortiert werden....................................................................5
2.1.1.8 Reiter ermöglichen paralleles Arbeiten........................................................5
2.1.1.9 Wiedergabelisten können angelegt werden...............................................5
2.1.1.10 Benutzer kann Musik abspielen lassen......................................................6
2.1.1.11 Einzelne Titel können bewertet werden....................................................6
2.1.2 Community.........................................................................................................................6
2.1.2.1 Benutzer kann sich registrieren.......................................................................6
2.1.2.2 Dateien können über den Browser importiert werden..........................6
2.1.2.3 Bibliotheken können mit anderen Nutzern geteilt werden..................7
2.1.2.4 Playlisten können verschickt werden............................................................7
2.1.2.5 Metadaten können übergreifend bearbeitet werden..............................7
2.1.2.6 Es kann auf externe Datenquellen zugegriffen werden..........................7
2.1.2.7 Verschiedene Datenformate..............................................................................7
2.1.2.8 Weitere Community-Funktionen.....................................................................8
2.1.3 Online-Vertrieb.................................................................................................................8
2.1.3.1 Es kann ein Account erstellt werden..............................................................8
2.1.3.2 Benutzer kann auf Bibliothek des Dienstleisters zugreifen..................8
2.1.3.3 Der Zugriff kann über verschiedenen Clients erfolgen...........................8
II
2.2 Anforderungen aus Entwicklersicht.................................................................................9
2.2.1 Benutzeroberfläche........................................................................................................9
2.2.1.1 Bedienkonzept ähnlich wie bei Desktop-Anwendungen.......................9
2.2.1.2 Rückmeldung bei Fehlern...................................................................................9
2.2.1.3 Browserkompatibilität......................................................................................10
2.2.1.4 Verschiedene Auflösungen..............................................................................10
2.2.2 Erweiterbarkeit/Flexibilität.....................................................................................11
2.2.2.1 Modularität............................................................................................................11
2.2.2.2 Multi-Client-Fähigkeit........................................................................................11
2.2.2.3 Austauschbare Persistenzschicht.................................................................11
2.2.2.4 Weitere Datenformate.......................................................................................12
2.2.3 Daten..................................................................................................................................12
2.2.3.1 Normalisierung ...................................................................................................12
2.2.3.2 Variable Filterung................................................................................................12
2.2.3.3 Flexibilität der Datenstruktur........................................................................12
2.2.3.4 Speicherort der Medien....................................................................................13
2.2.4 Sicherheit.........................................................................................................................13
2.2.4.1 Authentifizierung................................................................................................13
2.2.4.2 Validierung.............................................................................................................13
2.2.4.3 Zugriffsrechte........................................................................................................13
2.2.5 Trennung von Server und Client.............................................................................13
2.2.6 Client..................................................................................................................................14
2.2.7 Performance....................................................................................................................14
2.2.7.1 Scriptlaufzeiten....................................................................................................14
2.2.7.2 Datentransfer........................................................................................................14
2.2.8 Import................................................................................................................................14
3 Konzept....................................................................................................................16
3.1 Technologiewahl.....................................................................................................................16
3.1.1 Webserver........................................................................................................................16
3.1.2 PHP Framework............................................................................................................17
3.1.3 JavaScript Framework................................................................................................17
3.1.4 Medienwiedergabe.......................................................................................................17
3.2 Programmierrichtlinien......................................................................................................17
III
3.2.1 PHP.....................................................................................................................................18
3.2.2 Javascript..........................................................................................................................18
3.2.3 Dateistruktur..................................................................................................................19
3.3 Grafische Benutzeroberfläche...........................................................................................20
3.3.1 Aufbau/Funktionalität................................................................................................20
3.3.2 Single Page Interface...................................................................................................21
3.3.3 MVC.....................................................................................................................................22
3.4 Anwendungsarchitektur.....................................................................................................23
3.4.1 Datenstruktur.................................................................................................................23
3.4.2 Schichtenarchitektur...................................................................................................24
3.4.3 Server - Client Schnittstelle Ext Direct.................................................................26
3.4.4 Sicherheitsmechanismen...........................................................................................27
3.4.5 Fehlerbehandlung.........................................................................................................28
3.4.6 Module...............................................................................................................................28
3.4.7 Datenfluss........................................................................................................................29
3.4.7.1 Client.........................................................................................................................29
3.4.7.2 Server.......................................................................................................................30
4 Entwicklung der Anwendung...........................................................................31
4.1 Serverseitige Programmierung........................................................................................31
4.1.1 Start der Anwendung..................................................................................................31
4.1.1.1 Bootstrap-Datei und Htaccess........................................................................31
4.1.1.2 Initialisierung........................................................................................................31
4.1.1.3 Konfiguration........................................................................................................31
4.1.1.4 Aufruf der Front-Controller ...........................................................................32
4.1.1.5 Authentifizierung................................................................................................32
4.1.2 Front-Contoller/Views...............................................................................................33
4.1.3 Controller.........................................................................................................................33
4.1.4 Models/Filter..................................................................................................................35
4.1.4.1 Items.........................................................................................................................36
4.1.4.2 Listen........................................................................................................................38
4.1.4.3 Request....................................................................................................................40
4.1.4.4 Filter.........................................................................................................................42
4.1.4.5 Response.................................................................................................................43
IV
4.1.4.6 Verwendete Entwurfsmuster.........................................................................43
4.1.4.6.1 Fluent Interfaces.........................................................................................43
4.1.4.6.2 Lazy Acquisition.........................................................................................43
4.1.5 Backend............................................................................................................................44
4.1.5.1 Definition der Schnittstelle..............................................................................44
4.1.5.2 Implementierung.................................................................................................44
4.1.5.3 Konfiguration........................................................................................................45
4.1.6 Module...............................................................................................................................46
4.1.6.1 Core...........................................................................................................................46
4.1.6.2 Ext..............................................................................................................................47
4.1.6.2.1 Der Index-Controller.................................................................................47
4.1.6.2.2 Ext Direct.......................................................................................................48
4.1.6.3 Audio, Playlist und Import...............................................................................49
4.1.7 Helfer.................................................................................................................................49
4.1.7.1 Debugging...............................................................................................................49
4.1.7.2 Minify........................................................................................................................50
4.2 Clientseitige Anwendung....................................................................................................50
4.2.1 Initialisierung.................................................................................................................50
4.2.2 Zusammenspiel der MVC-Komponenten.............................................................50
4.2.3 Controller.........................................................................................................................51
4.2.4 Models...............................................................................................................................51
4.2.5 View....................................................................................................................................52
4.2.6 Ext Direct..........................................................................................................................53
4.2.7 Module (Auszug)...........................................................................................................54
4.2.7.1 Bibliothek...............................................................................................................54
4.2.7.2 Player........................................................................................................................55
5 Erweiterbarkeit der Anwendung....................................................................57
5.1 Zusätzliche Clients mit XML-RPC Webservice............................................................57
5.2 Neues Datenformat aus externer Quelle.......................................................................58
6 Vor- und Nachteile der Anwendung...............................................................60
6.1 Schichtenarchitektur............................................................................................................60
6.2 Trennung von Server- und Client-Anwendung..........................................................61
6.3 MVC im Browser.....................................................................................................................62
V
6.4 Vergleich mit Desktop-Applikationen............................................................................64
7 Fazit/Ausblick........................................................................................................68
8 Anhang.....................................................................................................................71
A Literaturverzeichnis...............................................................................................................72
B Tabellenverzeichnis................................................................................................................76
C Abbildungsverzeichnis...........................................................................................................77
D Datenstruktur............................................................................................................................78
E API..................................................................................................................................................81
F Anwendungsbeispiel...............................................................................................................82
G Verwendete Internet-Techniken........................................................................................83
G.1 HTTP....................................................................................................................................83
G.2 PHP ......................................................................................................................................84
G.3 MySQL.................................................................................................................................85
G.4 Javascript/Ajax................................................................................................................85
G.5 Audio und Video im Browser.....................................................................................86
Einleitung
1
1 Einleitung
1.1 Zielsetzung
Seit einigen Jahren lässt sich beobachten, dass für immer mehr Desktop-Anwendungen webbasierte Äquivalenzen entstehen. Vorreiter wie Google entwickeln
webbasierte Office-Anwendungen, Kalender oder Projektverwaltungen, die vom
Desktop bekannte Funktionalitäten in den Webbrowser verlagern und mit zusätzlichen Features anreichern. Alle diese webbasierten Anwendungen verlangen eine
neue Art, Webseiten zu entwickeln. Sie verlangen Benutzeroberflächen, die denen
von Desktop-Anwendungen in nichts nachstehen. Durch den Gebrauch von Ajax ist
es möglich, nicht mehr nur einzelne Webseiten auszuliefern, die über Links miteinander verbunden sind, sondern Applikationen zu erstellen, die im Client ausgeführt werden und bei Bedarf Daten vom Server laden.
In dieser Diplomarbeit wird eine solche Rich Internet Application konzeptioniert
und entwickelt. Ziel ist es, eine grundlegende Lösung für eine webbasierte Medienbibliothek zu entwerfen und aufzuzeigen welche Möglichkeiten dieser Ansatz bietet. Dabei wird angestrebt, eine Software zu entwickeln, die als Basis für weitere
Entwicklungsstufen dienen kann, in denen die spezifischen Vorteile einer webbasierten Anwendung zum Tragen kommen. Dazu gehört z.B. die Interaktion der
Benutzer untereinander, die Vielfalt der möglichen Datenquellen und die zunehmende Mobilität der Internet-fähigen Endgeräte (Stichwort UMTS). Die Betrachtungen und auch die Entwicklung werden anhand des Medientyps Audio ausgeführt, was nicht heißt, dass die Konzepte nicht auch für andere Medientypen angewendet werden können.
Eine webbasierte Medienbibliothek bringt mehrere Vorteile für den Benutzer mit
sich. Die steigende Anzahl der von einer Person verwendeter Computer macht es
oft mühsam, die eigenen Mediendateien zwischen all diesen zu synchronisieren.
Ein Server, auf den von überall aus zugegriffen werden kann, bietet hier eine zentrale Schnittstelle für die verschiedenen Clients und gleichzeitig eine sichere
Einleitung
2
Backup-Lösung. Bei der Konzeption der Serveranwendung muss allerdings darauf
geachtet werden, dass die verschiedenartigen Endgeräte über unterschiedliche
Technologien verfügen und somit auch unterschiedliche Implementierungen der
clientseitigen Anwendung verlangen.
Ein weiterer Vorteil bietet sich durch die Verbindung der webbasierten Medienbibliothek mit Community-Funktionen. Das gegenseitige Vorstellen der eigenen Lieblingsmusik oder einfach nur das gemeinsame Pflegen der Metadaten stellen einen
Mehrwert für den Benutzer dar. Diese Möglichkeiten sind nur ein Beispiel für den
erweiterten Nutzen der hier zu entwickelnden Anwendung. Sie müssten ggf. auf
ihre medienrechtliche Legalität hin überprüft werden.
1.2 Auswahl der technischen Mittel
Die Entscheidung bei der Wahl technischen Mittel für diese Diplomarbeit beruht
im Wesentlichen auf drei Faktoren.
Die verwendeten Mittel sollen möglichst weit verbreitete Open-Source-Produkte
sein, damit die Entwicklung lizenzkostenfrei erfolgen kann, keine Abhängigkeiten
von Herstellerfirmen entstehen können und für eine Weiterentwicklung alle Möglichkeiten offen stehen.
Des Weiteren sind die Vorkenntnisse des Diplomanden in Bezug auf die jeweilige
Software/Programmiersprache und die im betreuenden Betrieb verwendeten
Technologien ein Auswahlkriterium. Bei guten Vorkenntnissen kann die Anwendung effizienter entwickelt werden und eine hochwertigere Lösung erzielt werden.
Der letzte und natürlich wichtigste Faktor ist, dass die Technologien für das Vorhaben geeignet sind.
Eine genaue Beschreibung, welche Technologien für welchen Bereich gewählt wurden, findet sich im Konzept unter 3.1 .
Einleitung
3
1.3 Methodisches Vorgehen
Zunächst werden drei mögliche Anwendungsfälle für die Software dargestellt,
wobei nur einer davon konkret ausgearbeitet werden soll und die weiteren insofern eine Rolle spielen, als dass sie mit der hier vorgestellten Entwicklung in einem
weiteren Schritt umgesetzt werden können sollen. Aus den Anwendungsfällen
werden technische Anforderungen abgeleitet, die als Grundlage für das Konzept
und die Entwicklung gelten.
Im konzeptionellen Teil wird die Software-Architektur erläutert. Ein wesentlicher
Fokus liegt hier auf der Erweiterbarkeit und der Trennung zwischen Server- und
Client-Anwendung.
Im nächsten Schritt werden die vorgestellten Konzepte umgesetzt und ihre Implementierung vorgestellt. Hier wird Wert darauf gelegt, keinen Quelltext aufzulisten,
sondern die Zusammenhänge der einzelnen Komponenten und ihre Funktionsweise darzustellen.
Im Folgenden wird an zwei Beispielen aufgezeigt, wie sich die Anwendung erweitern lässt und wo die Vor- und Nachteile der hier entwickelten Software liegen. Das
Fazit fasst die gewonnenen Erkenntnisse bezüglich des Nutzens der entwickelten
Rich Internet Application zusammen und mündet in einer abschließenden Bewertung.
Anforderungen
4
2 Anforderungen
In diesem Abschnitt werden zunächst verschiedene Anwendungsfälle skizziert, die
für eine webbasierte Medienbibliothek grundsätzlich denkbar sind. Anhand dieser
Use-Cases werden die Anforderungen an die Anwendung zunächst aus Benutzersicht und anschließend aus Sicht des Entwicklers hergeleitet. Der Fokus der
Diplomarbeit liegt dabei auf der Ausarbeitung des ersten Anwendungsfalls. Die
beiden weiteren kurz skizzierten Anwendungsfälle verdeutlichen zusätzliche
Anforderungen, die es im Hinblick auf eine spätere Erweiterung der Software zu
berücksichtigen gilt.
2.1 Anwendungsfälle/Anforderungen Benutzersicht
2.1.1 Hosting Service
Der erste Anwendungsfall beschreibt den Nutzen einer webbasierten Medienbibliothek als Hosting Service. Der Benutzer kann hier ein Online-Backup seiner
Musiksammlung anlegen und die Titel über ein Webinterface unabhängig von Ort,
Betriebssystem und installierter Software (mit Ausnahme eines Browsers) verwalten und anhören.
2.1.1.1 Benutzer kann über Webinterface zugreifen
Zunächst ruft der Benutzer die entsprechende Internetadresse der Webanwendung in seinem Browser auf und meldet sich über ein Login-Formular an. Nach
dem ersten Einloggen findet er eine leere Bibliothek vor.
2.1.1.2 Hochgeladene Dateien können importiert werden
Um die eigene Bibliothek zu befüllen lädt der Benutzer mit einem FTP-Programm
beliebig viele Audiodateien auf den Server. Im Webinterface gibt es einen Menüpunkt „Bibliothek Synchronisieren“, über den die hochgeladenen Dateien in die
Anwendung importiert werden können. Es wird sichergestellt, dass keine Titel
doppelt importiert werden.
Anforderungen
5
2.1.1.3 Die Metadaten werden automatisch importiert
Die Anwendung liest die vorhandenen Metadaten (Id3-Informationen) aus den
Audiodateien aus und importiert sie in die Datenbank der Anwendung.
2.1.1.4 Metadaten können bearbeitet werden
Ein Kontextmenü bietet dem Benutzer die Möglichkeit, die Metadaten von einzelnen Einträgen zu bearbeiten. Es öffnet sich ein Fenster, in dem die vorhandenen
Daten dargestellt und verändert werden können.
2.1.1.5 Einträge werden in Listenform dargestellt
Die Einträge der Datenbank werden in einer Listenform dargestellt, die dem
Benutzer einen übersichtlichen Zugriffspunkt auf die Medien ermöglicht.
2.1.1.6 Die Einträge der Bibliothek sind filterbar
Über verschiedene, in Reihe geschaltete Filter kann der Benutzer durch seine
Musiksammlung navigieren. Es ist möglich nach Genre, Interpret, Album und
einem Suchwort zu filtern.
2.1.1.7 Einträge können sortiert werden
Die angezeigten Einträge lassen sich über verschiedene Kriterien sortieren, einzelne Spalten können aus- und eingeblendet und in der Breite verändert werden.
2.1.1.8 Reiter ermöglichen paralleles Arbeiten
Die verschiedenen Ansichten laden sich in einzelnen Tabs, zwischen denen hin und
her gesprungen werden kann.
2.1.1.9 Wiedergabelisten können angelegt werden
Weiterhin besteht die Möglichkeit, Wiedergabelisten anzulegen. Beliebig viele Titel
können in eine bestehende Liste hineingezogen werden. Beim Klicken auf eine
Liste öffnet sich ein zusätzlicher Tab. So kann leicht zwischen der Bibliothek und
den verschiedenen Playlisten hin und her geschaltet werden. In diesem Tab können die Titel umsortiert und abgespielt werden.
Anforderungen
6
2.1.1.10 Benutzer kann Musik abspielen lassen
Der integrierte Player verfügt neben den Standardfunktionen wie Start, Stopp, Vor
und Zurück über einen Lautstärke-Regler und eine Zeitleiste. Durch einen Doppelklick können einzelne Titel abgespielt werden. Ist ein Song zu Ende, werden die
weiteren Titel anhand der gewählten Filtereinstellungen bzw. der Wiedergabeliste
automatisch abgespielt. Eine zuschaltbare Zufallsfunktion kann bei Bedarf Variation in die Abspielreihenfolge bringen. Eine Anzeige verrät, welcher Titel gerade
abgespielt wird.
2.1.1.11 Einzelne Titel können bewertet werden
Der aktuell laufende Titel kann vom Benutzer bewertet werden. Die aktuelle
Bewertung wird jeweils angezeigt.
2.1.2 Community
Ein weiterer Anwendungsfall ist, die Medienbibliothek in ein Community-Portal
einzubinden. Hier hat der Benutzer nicht nur Zugriff auf seine eigene Musik. Er
kann zusätzlich auf die Sammlung von seinen Freunden in der Community zugreifen und Wiedergabelisten teilen. Dieser Anwendungsfall baut auf den Funktionalitäten von 2.1.1 auf, die hier nicht noch einmal aufgeführt werden.
2.1.2.1 Benutzer kann sich registrieren
Zuerst muss sich der Benutzer registrieren. In einem Formular müssen alle als
Pflichtangaben markierten Informationen angegeben werden.
2.1.2.2 Dateien können über den Browser importiert werden
Nach dem ersten Einloggen hat der Benutzer die Möglichkeit, Musikdateien zu seinem Account hinzuzufügen. Er wählt die gewünschten Dateien über ein Formular
von der Festplatte aus und lädt sie anschließend hoch.
Anforderungen
7
2.1.2.3 Bibliotheken können mit anderen Nutzern geteilt werden
Der Benutzer kann seine eigene Bibliothek für andere Mitglieder freigeben.
Dadurch ergeben sich weitere Funktionalitäten: Als Einschränkung für die Anzeige
der Bibliothek kann angegeben werden, ob nur die eigenen Dateien oder auch die
von Freunden freigegebenen angezeigt werden sollen.
2.1.2.4 Playlisten können verschickt werden
Angelegte Wiedergabelisten können an andere Mitglieder verschickt werden. Sie
erscheinen beim anderen Benutzer in einer entsprechenden Tabelle.
2.1.2.5 Metadaten können übergreifend bearbeitet werden
Einzelne Einträge der Bibliothek können im Kollektiv bearbeitet werden, sodass
ein anderer Benutzer zum Beispiel weitere Schlüsselwörter hinzufügen oder einen
Song bewerten kann. Der Besitzer einer Datei kann einsehen, wer wann welche
Änderungen an den Metainformationen seiner Inhalte vorgenommen hat und sie
ggf. rückgängig machen.
2.1.2.6 Es kann auf externe Datenquellen zugegriffen werden
Über eine zusätzliche Ansicht kann auf externe Quellen zugegriffen werden. Denkbar ist beispielsweise eine Anbindung an die API von Youtube.
2.1.2.7 Verschiedene Datenformate
Es gibt die Möglichkeit, Videodateien in die Bibliothek zu importieren. Dazu wird
der Player um ein Videofenster erweitert, welches sich bei Bedarf öffnet. Über
einen weiteren Menüpunkt können verschiedene Internetradios durchsucht und
abgespielt werden. Hierbei handelt es sich um bestehende Radio-Streams, die von
der Anwendung verlinkt werden.
Anforderungen
8
2.1.2.8 Weitere Community-Funktionen
Es ist denkbar, dass weitere Community-Funktionen in die Anwendung integriert
werden, die nicht direkt mit der Bibliothek zu tun haben. Im Rahmen dieser
Diplomarbeit soll darauf jedoch nicht weiter eingegangen werden, da sie mit dem
Thema nur indirekt zu tun haben.
2.1.3 Online-Vertrieb
Der letzte hier vorzustellende Anwendungsfall bezieht sich auf die Integration der
Medienbibliothek in einen Onlineshop für Mediendateien. Der Benutzer kann hier
über ein Webinterface auf die über ein Online-Portal erworbene Musik zugreifen,
ohne sie zuerst hochladen zu müssen. Dieser Anwendungsfall schließt die Funktionen von 2.1.1 mit ein, sie werden hier nicht erneut aufgeführt.
2.1.3.1 Es kann ein Account erstellt werden
Der Benutzer muss zuerst einen Account für den Onlineshop erstellen. Sobald dieser Vorgang abgeschlossen ist und der Kunde sich für ein Angebot des Anbieters
entschieden hat, kann er auf das Web-Interface zugreifen.
2.1.3.2 Benutzer kann auf Bibliothek des Dienstleisters zugreifen
Das Hochladen der eigenen Dateien entfällt in diesem Anwendungsfall. Dafür kann
ein Benutzer auf die vom Dienstleister zur Verfügung gestellten, kostenpflichtigen
Inhalte zugreifen. Der Benutzer hat die Möglichkeit zu wählen, ob er die komplette
Bibliothek für einen monatlichen Festpreis zur Verfügung gestellt bekommt oder
ob er alternativ nur auf die einzeln bezahlten Inhalte zugreifen kann.
2.1.3.3 Der Zugriff kann über verschiedenen Clients erfolgen
Zusätzlich zum Zugriff über den Browser hat der Benutzer die Möglichkeit über
andere Clients, wie z.B. einer AIR1 oder Java Applikation auf dem Handy auf die
Bibliothek zuzugreifen und die gewünschten Titel abzuspielen.
1 Mit AIR (Adobe Integrated Runtime) lassen sich Rich Internet Applications für den Desktop
erstellen, die ohne Browser auskommen. [WIKI06]
Anforderungen
9
2.2 Anforderungen aus Entwicklersicht
Die abgeleiteten Anforderungen beziehen sich konkret auf den in 2.1.1 vorgestellten Anwendungsfall (Hosting Service). Die anderen Anwendungsfälle spielen insofern eine Rolle, als dass sie in einer späteren Ausbaustufe ohne grundlegende
Änderungen an der Architektur umgesetzt werden können sollen.
2.2.1 Benutzeroberfläche
Die Anforderungen an die Benutzeroberfläche, die aus dem Anwendungsfall 2.1.1
Hosting Service hervorgehen, ergeben sich aus Benutzergewohnheiten beim
Umgang mit computerbasierten Medienbibliotheken und der geforderten Flexibilität im Hinblick auf die Erweiterbarkeit.
2.2.1.1 Bedienkonzept ähnlich wie bei Desktop-Anwendungen
Um die in 2.1.1.8 und 2.1.1.9 beschriebenen Funktionalitäten umsetzen zu können,
müssen bewährte Bedienkonzepte von gewohnten Desktop-Anwendungen verwendet werden. Dazu gehören z.B. Drag'n'Drop- und Tab-Funktionen.
2.2.1.2 Rückmeldung bei Fehlern
Falls es Fehler bei der Kommunikation mit dem Server gibt, muss der Benutzer
darüber aufgeklärt werden, damit er sich ggf. an den Administrator wenden kann.
Anforderungen
10
2.2.1.3 Browserkompatibilität
Abbildung 1: Verbreitung der verschiedenen Browserversionen [WWW29]
Da die Anwendung zunächst in einem Browser ausgeführt wird, muss eine möglichst hohe Kompatibilität mit den gängigen Browsern und Betriebssystemen
erreicht werden. Es kann davon ausgegangen werden, dass veraltete Browser wie
z.B. der Internet Explorer 5 nur noch einen sehr geringen Marktanteil besitzen und
somit vernachlässigt werden können. Außerdem wird für die Benutzung der
Medienbibliothek ein Flash-Plugin sowie aktiviertes Javascript vorausgesetzt.2
2.2.1.4 Verschiedene Auflösungen
Die Anwendung muss auf unterschiedlichen Auflösungen bedienbar bleiben. Dazu
muss das Interface so gestaltet werden, dass es sich an die jeweilige Auflösung des
Browser-Fensters anpasst.
2 Die aktuelle Verbreitung von Flash und Javascriipt liegt bei ca. 87% und 98% [WWW30].
Anforderungen
11
2.2.2 Erweiterbarkeit/Flexibilität
Da sich die Anwendung in verschiedenen Use-Cases einsetzen lassen soll, ist es
erforderlich eine flexible Anwendungsarchitektur zu entwerfen, mit der es möglich
ist, Erweiterungen vorzunehmen, ohne bestehende Teile modifizieren zu müssen
(Offen/Geschlossen Prinzip [FRE08]). Diese Grundannahme ist gleichzeitig Basisvoraussetzung für die weiteren technischen Anforderungen.
2.2.2.1 Modularität
Die Anwendung muss möglichst modular aufgebaut sein, so dass einzelne Module
einfach hinzugefügt oder entfernt werden können, ohne dass dies Auswirkungen
auf andere Programmteile hat.
2.2.2.2 Multi-Client-Fähigkeit
Es muss sichergestellt werden, dass später weitere Schnittstellen für verschiedene
Clients, wie sie im Anwendungsfall 2.1.3 gefordert sind, einfach hinzugefügt werden können.
Dazu muss das Ausgabeformat der Daten unabhängig von der eigentlichen Programmlogik (Domäne) sein. Verschiedene Webservices können so den jeweiligen
Client mit den Controllern der eigentlichen Applikation verbinden. Auch die
Authentifizierung ist dadurch auf unterschiedliche Weise möglich.
2.2.2.3 Austauschbare Persistenzschicht
Die Persistenzschicht3 muss austauschbar sein, weil beispielsweise ein Onlineshop
(Anwendungsfall 2.1.3 ) erwartungsgemäß seine eigene Datenstruktur mit sich
bringt. Es gilt: Die Quelle der Daten soll nicht die Anwendungslogik beeinflussen
und umgekehrt.
3 Der Begriff Persistenz benennt in der Informatik die dauerhafte Speicherung von Daten in einer
Datenbank oder einem Dateisystem. [WIKI16]
Anforderungen
12
2.2.2.4 Weitere Datenformate
Wie in 2.1.2.7 beschrieben, muss es die Möglichkeit geben, weitere Datenformate
(z.B. für Videos) anzulegen. Die bestehende Architektur darf davon nicht beeinflusst werden.
2.2.3 Daten
Bei der Struktur der Datenspeicherung muss ein möglichst optimaler Kompromiss
zwischen Flexibilität und Performance sowie Wartbarkeit gefunden werden.
2.2.3.1 Normalisierung
Um Redundanzen zu vermeiden, sollten die Daten möglichst normalisiert vorliegen.
2.2.3.2 Variable Filterung
Es soll möglich sein, die Musikdatenbank in möglichst kurzer Zeit über bestimmte
Attribute zu Filtern und durch Suchbegriffe einzugrenzen (siehe 2.1.1.6). Eine flexible Umsetzung soll es einfach machen, neue Filter hinzuzufügen.
2.2.3.3 Flexibilität der Datenstruktur
Aus 2.1.2.6 und 2.1.2.7 ergibt sich die Notwendigkeit, die Persistenzschicht unabhängig von der Anwendungslogik selbst zu gestalten, so dass ggf. auf eine systemfremde bzw. geänderte Datenbank zugegriffen werden kann.
Der Zugriff auf die Daten muss so flexibel gestaltet sein, dass es relativ einfach ist,
die Datenstruktur zu verändern, ohne Änderungen im Quellcode der Models vorzunehmen. Das Bewertungssystem einer Single-User-Application kommt beispielsweise mit einem einzelnen Datenfeld aus. Bei mehreren Benutzern muss hier die
Datenstruktur entsprechend geändert werden können, ohne dass dies Auswirkungen auf die restliche Anwendung hat.
Anforderungen
13
2.2.3.4 Speicherort der Medien
Der Speicherort der Mediendateien darf nicht fest in den Datensätzen stehen,
damit die Dateien bei Bedarf auch über einen anderen Server ausgespielt werden
können.
2.2.4 Sicherheit
2.2.4.1 Authentifizierung
Grundlegende Mechanismen stellen sicher, dass das System nur mit authentifizierten Benutzern kommuniziert.
2.2.4.2 Validierung
Benutzereingaben werden auf ihre Validität überprüft und nur im Erfolgsfall an die
Datenhaltungsschicht weitergegeben.
2.2.4.3 Zugriffsrechte
Da es sich bei den Mediendateien um urheberrechtlich geschütztes Material handeln kann, muss sichergestellt werden, dass jeweils nur dazu autorisierte Benutzer
Zugriff auf sie erhalten. Genauso dürfen Einträge in der Datenbank nur von berechtigten Benutzern gelesen, bzw. bearbeitet werden.
2.2.5 Trennung von Server und Client
Damit es später einfach ist, neue Clients für die Anwendung zu programmieren,
wird eine strikte Trennung von Server und Client angestrebt. Das bedeutet, dass
die grafische Benutzeroberfläche möglichst unabhängig arbeiten muss und nur
Daten in vorgegebenen Formaten mit dem Server austauscht. Hier ist also ein serviceorientierter Ansatz4 zu wählen, der maximale Flexibilität gewährleisten kann.
4 „Services sind (...) als Softwarekomponenten zu verstehen, die so konstruiert sind, dass sie sich
auf einfache Weise mit anderen Softwarekomponenten verbinden lassen.“ [WWW33]
Anforderungen
14
2.2.6 Client
Der Client muss flexibel anpassbar sein, damit er auf möglichst einfache Weise in
verschiedene Kontexte wie z.B. eine bestehende Community eingebunden werden
kann. Demzufolge muss die Architektur modular aufgebaut sein und das Design so
weit wie möglich von den Funktionalitäten getrennt vorliegen.
Webseiten laden sich standardmäßig komplett neu, sobald man auf einen Link
klickt. Damit der Wiedergabefluss der Medien nicht gestört wird (2.1.1.10), ist dieses Verhalten zu unterbinden. Es darf beim Navigieren durch die verschiedenen
Funktionen der Anwendung nicht zu einer Unterbrechung der Wiedergabe kommen.
2.2.7 Performance
Die Anwendung muss möglichst performant arbeiten, damit der Benutzer nicht
von langen Ladezeiten abgeschreckt wird.
2.2.7.1 Scriptlaufzeiten
Die Scriptlaufzeiten auf dem Server inklusive Datenbankabfragen und der Ausführung von Javascript-Quellcode im Browser müssen für eine maximale Performance
optimiert sein.
2.2.7.2 Datentransfer
Die zwischen Client und Server ausgetauschten Daten müssen auf das Wesentliche
beschränkt werden. Dazu gehört, dass möglichst wenig redundante Daten übertragen werden.
2.2.8 Import
Der automatische Import (2.1.1.2 und 2.1.1.3) muss die in den Audiodateien vorhandenen Informationen auslesen und daraus die für die Anwendung benötigten
Daten extrahieren und speichern. Es muss sichergestellt werden, dass die gleichen
Anforderungen
15
Dateien nicht mehrfach importiert werden, d.h. dass es für eine Audiodatei jeweils
nur einen Eintrag in der Datenbank geben darf, auch wenn der Benutzer, die Datei
ein zweites Mal importiert.
Konzept
16
3 Konzept
3.1 Technologiewahl
Wie schon in der Einleitung angedeutet wurde, handelt es sich bei der Wahl der
Technologien um einen pragmatischen Ansatz. Ein wissenschaftlicher Vergleich
würde den Rahmen dieser Diplomarbeit übersteigen, stattdessen fließen vor allem
Erfahrungen aus der Praxis in die Entscheidungen ein. Aus Kostengründen kommen nur Open-Source-Technologien in Frage.
3.1.1 Webserver
Die Basis für die Anwendung bildet eine LAMP (Linux, Apache, MySQL, PHP)
Umgebung. Diese weit verbreitete Lösung zeichnet sich durch ihre hohe Verfügbarkeit und einen großen Rückhalt in der Open-Source-Community aus. Des Weiteren
setzen auch viele andere Webanwendungen auf diesem System auf. [WWW06]
Außerdem kommt vorteilhaft hinzu, dass diese Kombination von Software auf den
meisten Webpaketen von Internet Service Providern bereits installiert ist.
Die Scriptsprache PHP ist im Gegensatz zu C# oder Java speziell auf das Erstellen
von Webseiten zugeschnitten und es gibt viele Frameworks und Bibliotheken, die
auch in dieser Webanwendung zum Einsatz kommen.
Konzept
17
3.1.2 PHP Framework
Um das Programmieren des PHP-Quellcodes effizient zu gestalten, bietet es sich an,
ein Framework zu verwenden. Das Zend Framework ist ein von vielen getestetes
und bewährtes PHP-Framework. Viele Entwurfsmuster5 wie z.B. das MVC-Konzept
sind hier schon integriert und lassen sich komfortabel verwenden. [MOE08, Seite
13-14]
3.1.3 JavaScript Framework
Für das komplexe Benutzerinterface der Medienbibliothek reichen HTML und CSS
nicht aus. Zum Erstellen von Desktop-ähnlichen Webanwendungen, stellt die Klassenbibliothek Ext JS eine umfangreiche Sammlung von GUI-Komponenten mit AjaxUnterstützung zur Verfügung [WIKI05]. Die Komponenten von Ext JS bilden viele
der geforderten Funktionalitäten ab (siehe 2.1.1.6, 2.1.1.7, 2.1.1.8 und 2.1.1.9) und
lassen sich mit geringfügigen Erweiterungen in die Anwendung einbinden.
3.1.4 Medienwiedergabe
Zum Abspielen der Medien im Browser wird ein Plugin benötigt, da der neue
HTML-5 Standard leider noch nicht von allen Browsern unterstützt wird
[WWW08]. Es bietet sich an den JW FLV Player zu verwenden, da er viele MedienFormate verarbeiten kann und eine Javascript-API zur Verfügung stellt, mit der
man den Player über ein Javascript Interface steuern kann [WWW09].
3.2 Programmierrichtlinien
Programmierrichtlinien legen den Grundstein für übersichtliche und wartbare
Software. Sie erleichtern es später anderen Entwicklern, sich in das System einzuarbeiten. In den Richtlinien soll auch festgehalten werden, wie die Verzeichniss5 „Entwurfsmuster (engl. design patterns) sind bewährte Lösungs-Schablonen für
wiederkehrende Entwurfsprobleme in Softwarearchitektur und Softwareentwicklung. Sie
stellen damit eine wiederverwendbare Vorlage zur Problemlösung dar, die in einem
bestimmten Zusammenhang einsetzbar ist.“ [WIKI17]
Konzept
18
truktur der Anwendung aufgebaut ist, damit leicht herauszufinden ist, welche Programmteile an welchem Ort zu finden sind. Als einheitlicher Namensraum wird
„Mel“ (Abk. für Media Library) verwendet.
3.2.1 PHP
Der Coding Standard des PHP-Quellcodes basiert im Wesentlichen auf dem von
Zend definierten Standard des Zend-Frameworks. Dies ist sinnvoll, da sich eine
Vielzahl von Entwicklern diesem Standard angeschlossen hat und der Programmierstil so auch mit dem verwendeten Framework konsistent ist. [WWW03]
Die wichtigsten Punkte seien hier kurz beschrieben:
Klassennamen müssen mit dem Verzeichnis, in dem sie sich befinden, übereinstimmen. Der Klassenname einer Datei in „Mel/Core/Helper.php“ lautet demzufolge
„Mel_Core_Hepler“. Variablen und Funktionsnamen werden im „camelCase“-Format notiert. Konstanten werden komplett groß geschrieben.
Für Klassen und Methoden müssen Kommentare im phpDocumenter-Format
erstellt werden [WWW04].
3.2.2 Javascript
Mit ein paar Modifikationen wird bei der Javascript-Programmierung der gleiche
Standard wie bei PHP angewendet.
Klassen werden hier in assoziativen Arrays definiert. Das heißt, eine Datei
„Mel/Helper.js“ würde als „Mel.Helper“ definiert. Das entspricht dem bei Ext JS
angewendeten Prinzip.
Konzept
19
3.2.3 Dateistruktur
Abbildung 2: Screenshot Dateisystem
Die Anwendung selbst befindet sich im Verzeichnis „app“. Darunter liegend wird
zwischen „client“ und „server“ unterschieden. Dann kommt der Name der Anwendung und der Modulname. Anschließend erfolgt die Einordnung in die verschiedenen Zuständigkeiten (z.B. Controller und Models). Beispiel: Das PHP-Model „Item“
aus dem Modul „Audio“ ist über folgenden Dateipfad zu erreichen:
„app/server/Mel/Playlist/Models/Item.php“.
CSS und Bilddateien werden unterhalb des „skin“-Ordners abgelegt. Durch eine
zusätzliche Ordnerebene haben es Entwickler später einfacher, weitere Skins zu
erstellen und einzubinden.
Einstellungen finden sich im „conf“-Ordner und Bibliotheken in „lib“.
Zu importierende Mediendateien werden im Ordner „upload“ hinterlegt. Von dort
aus werden sie während des Importierens in den „media“ Ordner kopiert. Damit
das Verzeichnis nicht irgendwann so viele Einträge hat, dass es die Performance
beeinträchtigt, werden die Dateien nach Jahr, Monat und Tag einsortiert.
Konzept
20
3.3 Grafische Benutzeroberfläche
3.3.1 Aufbau/Funktionalität
Abbildung 3: Grundlayout
Die Hauptanwendung besteht aus vier Grundelementen. Links befinden sich der
Player und eine Auflistung der Playlisten. Daneben ist Platz für variablen Inhalt,
der in Reitern dargestellt wird. Über diesen beiden Elementen befindet sich eine
Toolbar.
Der Reiter „Bibliothek“ besteht aus einer Toolbar mit einem Suchfeld. Darunter
befinden sich drei Filter mit vorgegebenen Auswahlmöglichkeiten. Klickt man im
ersten Filter einen Wert an, so aktualisieren sich die weiteren Filter entsprechend
der nun vorhandenen Möglichkeiten. Unter den Filtern befindet sich eine Liste der
gefundenen Einträge aus der Datenbank. Die einzelnen Spalten können vom Benutzer über Haltepunkte in der Kopfzeile angepasst werden und nach der entsprechenden Spalte sortiert werden. Mit einem Rechtsklick können einzelne Datensätze bearbeitet werden. Dazu öffnet sich ein zusätzliches Fenster mit Bearbei-
Konzept
21
tungsoptionen. Außerdem hat der Benutzer die Möglichkeit, einzelne Titel der
Liste per Drag'n'Drop nach links in einer bereits vorhandene Wiedergabeliste zu
ziehen.
Die Ansicht einer Wiedergabeliste entspricht der des Medienbrowsers, nur dass
das Suchfeld und die Filter ausgeblendet sind.
Der Player besteht aus einem Statusfeld, in dem in der Regel der aktuell gespielte
Titel angezeigt wird. Direkt darunter sind die verschiedenen Kontrollelemente für
den Player angeordnet.
3.3.2 Single Page Interface
Abbildung 4: Single Page Interface-Elemente innerhalb einer Seite [WWW05]
Die Wiedergabe des aktuellen Titels im Player darf beim Stöbern durch die Bibliothek nicht unterbrochen werden (siehe 2.2.6 ). Beim herkömmlichen Ansatz von
Multi Page Interfaces stellt dies ein Problem dar, da der Browser bei jedem Aufruf
einer neuen Seite die aktuelle Wiedergabe unterbrechen würde. Dieses Problem
ließe sich durch ein Einbinden der Hauptseite als Inlineframe zwar umgehen, eine
Ajax-basierte Lösung ist in diesem Fall jedoch die zeitgemäßere Variante, ein Single
Page Interface umzusetzen. Denn hier kommen außerdem weitere Vorteile zum
Tragen: Durch Ajax ist es möglich, nur einzelne Daten vom Server nachzuladen.
Konzept
22
Dies steigert einerseits die Performance und senkt zudem den Programmieraufwand, da bei Verwendung eines Frameworks wie Ext JS auf das manuelle Erstellen
von HTML-Seiten komplett verzichtet werden kann. [WWW05]
3.3.3 MVC
Der Client der webbasierten Medienbibliothek stellt eine eigenständige Anwendung dar, die lediglich Daten und Einstellungen mit der Serveranwendung austauscht. Von daher macht es Sinn bewährte Programmierkonzepte für grafische
Benutzeroberflächen, wie sie z.B. aus der JAVA-Welt bekannt sind, zu verwenden.
Abbildung 5: Aufbau des Clients
In dieser Anwendung wird das komplette MVC auf dem Client implementiert, da es
unabhängig vom Server (abgesehen von Daten) arbeiten soll. Das Fachkonzept
beinhaltet die gesamte Daten-, Zustands- und Anwendungslogik. Es bildet die Basis
der Anwendung und ist durch eine Schnittstelle mit den Daten des Servers verbunden. Hier wird z.B. die gesamte Logik des Players abgebildet. Die Präsentationsschicht stellt die Benutzeroberfläche grafisch dar – die Aufgabe der Steuerung und
somit die Verbindung zwischen Fachkonzept und Präsentation übernimmt der
Controller. Der Controller hat außerdem die Möglichkeit mit dem Server zu kommunizieren. [FRE08, Seite 529-550]
Konzept
23
3.4 Anwendungsarchitektur
3.4.1 Datenstruktur
Abbildung 6: Datenstruktur
Die wesentlichen Daten, die für die Applikation nach Anwendungsfall 2.1.1 benötigt werden, sind Musiktitel, Playlisten und Benutzer. Sie werden in MySQL-Tabellen mit der Speicher-Engine MyISAM hinterlegt. Da es sich nicht um sensible Daten
handelt, kann bei dieser Anwendung auf eine Transaktionssicherheit zugunsten
der Performance verzichtet werden. Die Tabelle „audio“ enthält alle wichtigen
technischen Daten und die Metainformationen, die sich aus den Id3-Tags von Mp3Dateien auslesen lassen. Zusätzlich werden der relative Speicherpfad, eine Verknüpfung zum Benutzer, ein „deleted“-Flag, sowie Erstellungs- und Änderungszeit
Konzept
24
gespeichert. Nutzer sollen außerdem für jeden Titel Stichworte eingeben können.
Dafür werden zwei zusätzliche Tabellen angelegt, die eine m:n Verknüpfung realisieren.
Bei diesem Entwurf wird an einer Stelle bewusst die dritte Normalform verletzt,
was folgende Gründe hat: Die Attribute Künstler und Genre hängen theoretisch
direkt vom Album ab und müssten eigentlich in eine andere Relation ausgelagert
werden. Da aber nicht davon auszugehen ist, dass die Metainformationen aller zu
importierenden Audiodateien korrekt gepflegt sind, stellt dies ein Risiko beim
automatischen Import dar. Nur weil an einer Stelle der Künstlername falsch
geschrieben wurde, soll nicht ein weiterer Datensatz für ein Album angelegt werden, dass vielleicht schon existiert. Des Weiteren ist es möglich, dass eine Datei
zwar einen Künstler hat, aber zu keinem Album gehört. Aus diesen Gründen ist es
sinnvoller, die entsprechenden Attribute nicht auszulagern. Das hat zusätzlich den
Vorteil, dass die Datenstruktur einfacher bleibt und die Datenabfragen nicht durch
eine zusätzliche Verknüpfung verlangsamt werden.
Die Speicherung der Wiedergabelisten wird in zwei Tabellen aufgespalten. „playlists“ enthält Titel und den Besitzer. Die einzelnen Einträge werden in der Tabelle
„playlists_entries“ gespeichert. Hier wird auf die Audio-ID und die Wiedergabeliste
verwiesen. Eine Spalte „sorting“ ermöglicht das manuelle Sortieren von Einträgen.
Die Tabelle für den Benutzer besteht nur aus den wichtigsten Daten: E-Mail, Passwort und Upload-Verzeichnis sowie „deleted“-Flag und Erstellungs- und Änderungsdatum.
Die Datenbankstruktur als MySQL-Export befindet sich im Anhang D.
3.4.2 Schichtenarchitektur
Da der Client eine eigenständige Applikation mit MVC-Muster darstellt, entspricht
das hier verwendete Schema nicht dem normalerweise angewendeten Model 2Muster [FRE08, Seite 549], das von vielen Webseiten benutzt wird. Da außerdem
vom Server keine HTML-Seiten ausgeliefert werden (mit Ausnahme der Startseite),
Konzept
25
gibt es keine Notwendigkeit für eine serverseitige Präsentationsschicht. Stattdessen wird vor den eigentlichen Controller eine zusätzliche Schicht gesetzt. Das Frontend oder auch die Serviceschicht stellt eine austauschbare Schnittstelle zwischen
Client und serverseitigem Controller dar. Es ist für die Umwandlung der verschiedenen Daten zuständig und ruft nach erfolgreicher Authentifizierung den Controller auf, um die eigentlichen Aktionen auszuführen. Die zurückgegebenen Daten
werden wieder in das entsprechende Format umgewandelt und an den Client
übermittelt. Da der Server hauptsächlich für die Bereitstellung von Daten zuständig ist, enthalten die Models vor allem die nötigen Daten und weniger eine
Geschäftslogik. Die Persistenzschicht der Models (im Weiteren auch Backend
genannt) ist austauschbar und entkoppelt sie von der Art der Datenspeicherung.
Abbildung 7: Anwendungsschichten
Die zusätzliche Serviceschicht ist notwendig, um der geforderten Flexibilität im
Umgang mit verschiedenen Clients gerecht zu werden. So muss bei der Implementierung eines neuen Clients nur eine zusätzliche Frontend-Klasse erstellt werden,
die für die Implementierung eines Webservices und evtl. für die Auslieferung der
Client-Anwendung zuständig ist. Diese Struktur entspricht dem Adapter-Entwurfsmuster: „Das Adapter-Muster konvertiert die Schnittstelle einer Klasse in die
Schnittstelle, die der Client erwartet. Adapter ermöglichen die Zusammenarbeit
von Klassen, die ohne nicht zusammenarbeiten könnten, weil sie inkompatible
Schnittstellen haben“ [FRE08, Seite 243].
Konzept
26
Der Controller ist für die eigentliche Steuerung des Programmablaufs zuständig. In
ihm werden Models instanziiert und entsprechende Operationen aufgerufen. In
der Regel implementieren die Controller hauptsächlich CRUD6-Funktionen. Dazu
werden die Models entweder mit den Daten, die vom Frontend übergeben werden,
gefüllt oder die Daten werden aufgrund verschiedener Bedingungen über die Persistenzschicht geladen. Wie die Models wiederum mit der Persistenzschicht
zusammenarbeiten, ist für den Controller nicht sichtbar.
Die Aufgabe der verschiedenen Models in dieser Anwendung ist hauptsächlich die
Datenhaltung. Sie enthalten die benötigten Informationen über den Datentyp und
sind verantwortlich für die Validierung der Daten, bevor sie gespeichert werden.
Für das Lesen oder Schreiben der Daten, ist die zugewiesene Persistenzschicht
zuständig. Das jeweilige Backend kann über eine Konfigurationsdatei festgelegt
werden. Zusätzlich ist es möglich, das Backend zur Laufzeit zu ändern. Dies ist zum
Beispiel nötig, wenn verschiedene Quellen in einer Anwendung die Daten liefern.
Die Datenschicht sorgt für eine persistente Datenhaltung. Sie enthält die nötige
Logik, um aus übergebenen Parametern beispielsweise Datenbankbefehle zu generieren und sie auszuführen. Durch ein Austauschen dieser Schicht können auch
andere Datenquellen verwendet werden. Möglich wäre es, die Daten über einen
Webservice oder oder aus der Datenbank einer anderen Anwendung wie beispielsweise iTunes7 zu beziehen .
3.4.3 Server - Client Schnittstelle Ext Direct
Die aktuelle Version von Ext JS bietet die neue Schnittstelle Ext Direct, mit der man
direkt aus dem Javascript Quellcode heraus auf Funktionen des Servers zugreifen
kann [WWW10]. Dieses Verfahren soll die konkrete Schnittstelle zwischen Server
und Client bereit stellen. Der Vorteil dieser Vorgehensweise ist, dass bei der Programmierung des Clients auf sehr einfache Weise mit dem Server kommuniziert
werden kann. Ein weiterer Vorteil ist, dass mehrere Abfragen in zeitlich kurzen
6 CRUD steht für Create, Read, Update und Delete [WIKI07]
7 Medienbibliothek von der Firma Apple
Konzept
27
Abständen getätigt werden sollen, automatisch zu einem HTTP-Request zusammengefasst werden. Bei der Aktualisierung mehrerer Filter kann dies zum Beispiel
einen Performance-Vorteil bringen.
Um die erwähnten Funktionen für den Client zur Verfügung zu stellen, müssen in
der Serveranwendung drei Voraussetzungen geschaffen werden. Zunächst muss
definiert werden, welche Methoden aufrufbar sein sollen. Dann muss der Server
dem Client eine Liste verfügbarer Methoden zur Verfügung stellen. Um diese Funktionen dann auch wirklich aufrufbar zu machen, muss der Server die eingehenden
Anfragen an die entsprechenden Klassen und ihre Methoden weiterleiten.
Damit das Zend-interne Routing weiterhin verfügbar bleibt, wird diese Funktionalität in ein eigenes Modul ausgelagert.
3.4.4 Sicherheitsmechanismen
Liest man die Top-Ten der Sicherheitsprobleme in Webanwendungen der OWASP
(Open Web Application Security Project), fällt einem schnell auf, dass die meisten
Sicherheitslücken durch fehlende Überprüfung von eingehenden Daten entstehen
[WWW11]. Diese Aufgabe wird in der hier zu entwickelnden Webanwendung auf
verschiedene Schichten verteilt: Das Frontend muss überprüfen, dass eingehende
Parameter mit denen der aufzurufenden Controller übereinstimmen. Ist dies nicht
der Fall, wird ein entsprechender Fehler zurückgegeben. Im weiteren Programmverlauf muss in den Models eine Validierung der Daten stattfinden, sodass sie nur
an die Datenschicht weitergegeben werden, wenn sie den Erwartungen entsprechen. Ansonsten wirft das System eine Exception. Um Cross-Site-Scripting vorzubeugen, werden HTML-Zeichen von Strings maskiert, so dass keine fremden
HTML-Befehle und somit auch keine Script-Anweisungen in den Browser gelangen
können. Gleichzeitig muss die Datenschicht dafür sorgen, dass keine datenbankspezifischen Manipulationen möglich sind (Stichwort SQL-Injections [T3N, Seite
54]).
Konzept
28
Da die Anwendung nur für registrierte Benutzer zugänglich ist, muss bei jedem
HTTP-Request festgestellt werden, mit welchem Client der Server gerade kommuniziert und ob dieser dazu berechtigt ist. Um einen einmal authentifizierten Benutzer wieder zu erkennen, werden Cookies verwendet, die vom Client im HTTP-Header mitgesendet werden. Diese Überprüfung und die Initialisierung der Benutzerund Sitzungsdaten ist Aufgabe des Frontends. Schlägt die Authentifizierung fehl,
wird der Programmablauf abgebrochen.
3.4.5 Fehlerbehandlung
Es ist immer möglich, dass beim Programmablauf auf dem Server Fehler auftreten.
Damit der Benutzer trotz eines Fehlers eine Rückmeldung über diesen Umstand
erhalten kann, müssen die einzelnen Komponenten aussagekräftige Fehler werfen.
Diese Fehler werden vom Frontend abgefangen und an den Client zurückgegeben.
Der Client wiederum ist dafür zuständig, den Benutzer über den aufgetretenen
Fehler zu informieren und ihm ggf. Handlungsalternativen bereit zu stellen. So
kann zum Beispiel bei einem abgelaufenen Login eine Möglichkeit zum erneuten
Einloggen dargestellt werden.
3.4.6 Module
Um eine möglichst lose Kopplung zu erreichen, werden die Programmteile zusätzlich in Module eingeteilt. In jedem Modul werden die einzelnen Schichten implementiert, sie müssen im Wesentlichen eigenständig arbeiten können.
Es gibt nur ein übergeordnetes Module, von dem alle anderen abhängen: Das CoreModul beinhaltet Funktionalitäten und abstrakte Klassen, bzw. Interfaces, die von
allen anderen Modulen benutzt werden können und müssen. Es bildet die Grundlage für die Anwendung. Ein weiteres, für die erfolgreiche Benutzung der Anwendung benötigtes Modul ist ein aktiviertes Frontend-Modul, welches eine eigene
Schicht bildet und sich als Schnittstelle vor den Controllern der verschiedenen
Module befindet. In diesem Modul befinden sich lediglich Frontend-Controller, die
jeweils für die Implementation eines Services verantwortlich sind.
Konzept
29
3.4.7 Datenfluss
3.4.7.1 Client
Abbildung 8: Datenfluss Client
Die Schnittstelle der Ein- und Ausgabe von Daten in der Client-Anwendung entspricht der View-Komponente. Eingehende Daten werden nach erfolgreicher Validierung an den Controller übergeben. Genauer gesagt registriert sich der Controller beim View für entsprechende Ereignisse und holt sich die Daten beim Eintreffen derselben ab. Der Controller weiß, wie er mit diesen Daten umgehen soll und
manipuliert im Normalfall das Model. Das Model ist über die Ext Direct-Komponente mit dem Server verbunden. Aus Sicht des clientseitigen Models stellt Ext
Direct die Persistenzschicht dar. Wie der Server die Daten behandelt, ist hier nicht
erheblich. Wichtig für das Model ist, dass die Daten persistent vorliegen.
Ext Direct ist in der Lage mehrere Aufrufe parallel zu verarbeiten. Ein entsprechend zu definierendes Zeitintervall legt fest, wie lange gewartet wird, bevor ein
Request abgesendet wird. Die Antworten werden in der gleichen Reihenfolge weiterverarbeitet. Wirft der Server bei einem der Methodenaufrufe eine Ausnahme,
wird diese explizit abgefangen und dem Benutzer dargestellt (Anforderung
2.2.1.2). Im Erfolgsfall werden die Daten an das Model zurückgegeben, welches
wiederum eine Aktualisierung des Views zur Folge hat.
Konzept
30
3.4.7.2 Server
Abbildung 9: Datenfluss Server
Die serverseitige Anwendung nimmt alle eingehenden Daten über die FrontendSchicht auf. Diese sorgt für dem Aufruf des entsprechenden Controllers und die
Übergabe der Variablen. Der Controller hat die Möglichkeit, Models zu erstellen
und auf ihnen verschiedene Operationen auszuführen. Auf das Backend haben die
Controller keinen direkten Zugriff. Soll ein Model beispielsweise gespeichert werden, kommuniziert es selbst mit dem aktuellen Backend. Tritt hier irgendwo ein
Fehler auf (in der Regel beim Validieren der Models) fängt das Frontend diesen ab
und gibt die entsprechende Meldung an den Client zurück.
Entwicklung der Anwendung
31
4 Entwicklung der Anwendung
4.1 Serverseitige Programmierung
4.1.1 Start der Anwendung
4.1.1.1 Bootstrap-Datei und Htaccess
Die Anwendung wird bei jeder Anfrage über eine Bootstrap8 Datei gestartet. Damit
auch jeder Request von dieser Datei bearbeitet werden kann, wird in einer .htaccess-Datei9 eine „RewriteRule“ definiert, die jede Anfrage, die nicht auf eine Bildoder Javascript-Datei zeigt, an die „index.php“ weiterleitet. In letzterer werden
lediglich die Pfade zu den Klassendateien definiert. Mit einem Aufruf der statischen
Methode „Mel::run()“ wird die Applikation gestartet.
4.1.1.2 Initialisierung
In der beschriebenen Funktion „Mel::run()“ wird zunächst der Zend-Autoloader
initiiert. Dieser sorgt im folgenden Ablauf dafür, dass Dateien automatisch inkludiert werden, wenn ein Objekt der beinhaltenden Klasse erstellt wird. Damit der
Autoloader funktioniert, ist es wichtig, dass die Dateinamen mit den Klassennamen
überstimmen (siehe 3.2.3 ).
Die Startklasse „Mel“ fungiert gleichzeitig als zentrales Register. Hier wird zum
Beispiel das Datenbankobjekt abgelegt, welches die Zugriffe zur Datenbank steuert.
4.1.1.3 Konfiguration
Im Konfigurationsverzeichnis befinden sich drei Dateien, in denen sich Konfigurationen einstellen lassen:
8 Als „Bootstrapping“ bezeichnet man das Starten einer Anwendung durch ein Startscript.
[WIKI15]
9 Mit .htaccess-Dateien lassen sich verzeichnisweise Einstellungen für den Apache-Webserver
vornehmen. [WWW12]
Entwicklung der Anwendung
32
Eine Datei ist dafür zuständig, die Verbindungsparameter für die Instanziierung
des Datenbankobjekts zur Verfügung zu stellen. Hier werden der Adapter und die
Zugangsdaten zur Datenbank definiert.
In der Datei „app.php“ werden alle Einstellungen für die Anwendung vorgenommen. Hier sind viele Parameter einzustellen, auf die die einzelnen Module später
zurückgreifen können.
In einer Sprachdatei werden schließlich Benennungen von einzelnen GUI-Komponenten definiert. So werden sie von der eigentlichen Anwendung abgekoppelt und
lassen sich später einfach ändern.
Alle Konfigurationsdateien verfügen über ein Format, dass sich durch die PHP
Funktion „parse_ini_file()“ auslesen lässt.
4.1.1.4 Aufruf der Front-Controller
Für das Routing und Aufrufen der Front-Controller wird die im Zend Framework
enthaltene Klasse „Zend_Controller_Front“ verwendet. Sie ist Teil des integrierten
MVC-Patterns und ruft einen Dispatcher [WWW13] auf, der die Initialisierung der
Front-Controller übernimmt und die entsprechenden Aktionen ausführt.
http://www.domain.tld/[module]/[controller]/[methode]/
Der erste Teil des Url-Pfads unter der Hauptseite gibt das aufzurufende Modul an.
Dieser Parameter ist optional, als Fallback-Variante wird immer das Default-Modul
ausgewählt (einzustellen über die Konfigurationsdatei). Der zweite Teil gibt den
aufzurufenden Front-Controller und der dritte die aufzurufende Methode an.
4.1.1.5 Authentifizierung
Ein Plugin im Dispatcher leitet das Routing zur Laufzeit mit Berücksichtigung auf
die (nicht) vorhandene Autorisierung ggf. um. Falls Benutzername und Passwort
angegeben wurden, wird überprüft, ob die Kombination gültig ist. Bei erfolgreicher
Prüfung der Zugangsberechtigung, wird ein Objekt mit den Daten des Benutzers
erstellt und in der Registry gespeichert. Falls die Autorisierung fehlgeschlagen ist,
wird überprüft, ob der Controller eine Authentifizierung verlangt. Wenn dies der
Entwicklung der Anwendung
33
Fall ist, wird das Routing auf eine Methode umgelenkt, die die entsprechende Meldung an den Benutzer zurück gibt. Dazu muss der Controller das Interface
„Mel_Core_FrontendController_Interface“ implementieren.
4.1.2 Front-Contoller/Views
Die Funktion der Views wird in dieser Anwendung nur bei der Auslieferung der
Startseite und einiger statischer Informationsseiten verwendet. Die eigentliche
Benutzeroberfläche wird durch den Javascript-Quellcode im Browser erzeugt.
Beim Ausliefern von Daten wird die Funktionalität des Views serverseitig nicht
benötigt. Die Front-Controller müssen lediglich dafür sorgen, dass die Daten im
entsprechenden Format ausgegeben werden.
Die Front-Controller bieten den Einstiegspunkt für die eigentliche Anwendung. Sie
sind abgeleitet von der Klasse „Zend_Controller_Action“ und werden vom Dispatcher aufgerufen. In der Initialisierungs-Methode kann definiert werden, ob der
Controller einen View zur Ausgabe benötigt oder nicht. Des Weiteren können Helfer initialisiert werden, die in den View-Scripten zur Verfügung stehen sollen.
View-Scripte bestehen aus PHTML-Dateien, die sowohl HTML als auch PHP-Code
enthalten können. Sie werden von den Front-Controllern ggf. automatisch inkludiert und können auf Variablen zugreifen, die dem View im Controller zugeteilt
wurden.
Grundsätzlich unterschieden wird zwischen geschützten Front-Controllern, die
Methoden implementieren müssen, die bei fehlgeschlagener Authentifizierung aufgerufen werden und solchen, die keine weitere Zugriffskontrolle benötigen.
4.1.3 Controller
Die eigentlichen Controller der Anwendung können von den Front-Controllern aufgerufen werden. Die Controller implementieren aus zwei Gründen das Singleton
Entwurfsmuster [SCH09, Seite 164-172]: Zum einen wird pro Serveraufruf nur
eine Instanz des Controllers benötigt. Bei mehreren Aufrufen kann so Speicher
Entwicklung der Anwendung
34
gespart werden. Zum anderen kann durch das Singleton-Pattern eine verlässliche
Zugriffskontrolle realisiert werden. Die statische Methode „getInstance()“, die eine
Instanz der Klasse zurückgeben soll, tut dies nur, wenn ein gültiges BenutzerObjekt initialisiert wurde. Andernfalls wird eine Exception geworfen und keine
Instanz zurückgegeben, da sonst trotz Exception weiter mit der Instanz gearbeitet
werden könnte. Bei Controllern, die keine Zugriffskontrolle benötigen, kann dieses
Verhalten mit Hilfe eines zusätzlichen Parameters in der zu implementierenden
Methode „getInstance()“ unterdrückt werden.
Abbildung 10: UML Diagramm - Umsetzung Singleton Pattern
Welche Methoden generell vom Client aufgerufen werden dürfen, wird durch
Annotations festgelegt, die in PHP in Form von PHP-Doc-Kommentaren realisiert
werden können [SCH09, Seite 141]. Diese Kommentare können mit Hilfe von
Reflections10 ausgelesen werden. Webservices (als Front-Controller) nutzen die so
gewonnenen Informationen, um eine dynamische Liste der zur Verfügung stehenden Methoden zu erstellen.
10 PHP stellt Möglichkeiten zum Auslesen von Klasseninformationen bereit [WWW14].
Entwicklung der Anwendung
4.1.4 Models/Filter
Abbildung 11: UML Sequenzdiagramm - Controller, Models, Backend
35
Entwicklung der Anwendung
36
Die Geschäftslogik der Anwendung besteht im Wesentlichen aus fünf verschiedenen Arten von Models: Das ist zum einen das Item, welches einen einzelnen Datensatz repräsentiert und die List, die eine Sammlung von Items enthalten kann. Weitere Models dienen der Kommunikation zwischen List und Backend: Das RequestObjekt teilt der Datenhaltungschicht in einer einheitlichen Form mit, welche Parameter bei der Datenabfrage berücksichtigt werden sollen. Dieses Request-Objekt
kann verschiedene Typen von Filter-Objekten enthalten, welche Bedingungen für
die zurückzugebenden Daten enthalten. Als Ergebnis liefert das Backend ein
Response-Objekt, welches die List zur Initialisierung der Items verwendet.
4.1.4.1 Items
Abbildung 12: UML Mel_Core_Model_Item_Abstract
Items haben die Aufgabe, einen einzelnen Datensatz zu repräsentieren. Welche Felder und Feldtypen ein Item enthält, wird in der zentralen Konfigurationsdatei definiert. Auch Verknüpfungen mit anderen Items können in der Konfiguration angegeben werden.
Das Backend, mit dem das Item zum Lesen und Schreiben kommuniziert, kann
konfiguriert werden. Sollte es nötig sein, das Backend während der Laufzeit zu
wechseln, kann das über die Methode „setBackend()“ realisiert werden.
Entwicklung der Anwendung
37
Ein Item lässt sich durch verschiedene Methoden initiieren: Es gibt die Möglichkeit,
nur einen eindeutigen Bezeichner oder eine andere Bedingung anzugeben, die an
das Backend weitergereicht wird. Alle Daten werden in diesem Fall vom Backend
zur Verfügung gestellt. Wenn ein neuer Datensatz erstellt oder ein bestehender
verändert werden soll, kann das Item durch ein Array mit Key/Value Paaren mit
Werten befüllt werden.
Bevor ein Item zum Speichern an das Backend weitergegeben werden kann, müssen die enthaltenen Daten validiert werden. Dazu werden die vom Zend Framework zur Verfügung gestellten Validatoren verwendet, die einheitliche Interfaces
für verschiedene Datentypen zur Verfügung stellen. Soll ein Item gespeichert werden und es ist nicht valide, wird eine Exception mit den entsprechenden Validierungsfehlern geworfen.
Entwicklung der Anwendung
38
4.1.4.2 Listen
Abbildung 13: UML-Diagramm - Zusammenhang List und Item
Listen repräsentieren einen Satz von Items. Sie stellen gleichzeitig die Schnittstelle
zum Backend dar, um sie zu laden. Genauso wie bei den Items lässt sich das
Backend konfigurieren und zur Laufzeit austauschen. Um dem Backend mitzuteilen, welche Daten geladen werden sollen, wird vom Controller ein Request-Objekt
angefordert, welches bearbeitet werden kann und dann über eine commit-Funktion der List an das Backend zur Datenabfrage weitergereicht wird. Das Backend
gibt ein Response-Objekt zurück, das die angefragten Daten enthält. Aufgrund dieses Objekts initialisiert die Liste die einzelnen Items, auf die im weiteren Verlauf
zugegriffen werden kann.
Entwicklung der Anwendung
Die abstrakte Klasse „Mel_Core_Model_List“ implementiert das Iterator-Muster,
welches es möglich macht, über die enthaltenen Elemente mit einer foreachSchleife zu iterieren [FRE08 Seite 316-386].
Das Speichern einer Liste wird an die einzelnen Items delegiert.
39
Entwicklung der Anwendung
40
4.1.4.3 Request
Abbildung 14: UML Diagramm - Request und Filter
Ein Problem der konzeptionierten Schichtenarchitektur ergibt sich dadurch, dass
der Controller keine Kenntnis über das verwendete Backend besitzt. Demzufolge
lassen sich keine SQL-Abfragen aus dem Controller heraus erstellen, die die
gewünschten Daten von der Datenbank abfragen. Damit nicht für jede Abfrage eine
neue Methode in List und Backend erstellt werden muss, die die Daten über eine
maßgeschneiderte SQL-Abfrage liefert, wurde das Request-Objekt entwickelt. Es
Entwicklung der Anwendung
41
fungiert als Vermittler zwischen Controller und Backend, welcher von der List
initialisiert wird und danach vom Controller mit den gewünschten Parametern
befüllt wird. Danach wird das Request-Objekt vom Controller zurück an die Liste
gegeben, die es dann wiederum mit ihrem Backend gegen die zurückzugebenden
Daten austauscht.
Das Request-Objekt wurde in Anlehnung an das „Zend_Db_Select“-Objekt [MOE08,
Seite 78-88] entwickelt, welches eine objektorientierte Erstellung von SQL-Abfragen ermöglicht.
Das hier verwendete Abfrage-Objekt unterstützt dagegen keine SQL-spezifischen
Funktionen. Es kennt lediglich die vorhandenen Datenfelder (Konfiguration der
Items). Diese werden ihm beim Initialisieren von der List übergeben. Sie werden
zur Validierung der vom Controller angeforderten Daten benötigt.
Der Controller kann folgende Parameter im Request-Objekt einstellen (in Klammern jeweils der korrespondierende MySQL-Befehl):
– Es kann ausgewählt werden, welche Datenfelder ausgelesen werden sollen
(SELECT).
– Es können Filter hinzugefügt werden, aus denen das Backend AbfrageBedingungen generiert (WHERE).
– Es kann definiert werden wie viele Datensätze ab welcher Stelle abgefragt
werden sollen (LIMIT).
– Es kann eine Sortierung angegeben werden (ORDER BY).
– Es kann angegeben werden, nach welchem Feld gruppiert werden soll
(GROUP BY).
– Eltern-Datensätze eines Feldes mit eigenem Model können über loadParentData() geladen werden (einfache Variante von JOIN).
Entwicklung der Anwendung
42
In der Liste der gängigen SQL-Befehle zum Abfragen von Datensätzen fehlen hier
nur FROM (um anzugeben, welche Tabelle abgefragt werden soll) und die verschiedenen Varianten von JOIN. Beide verlangen (mit Ausnahme der im letzten Stichpunkt genannten) Kenntnisse über die Datenstruktur. Diese soll aber unabhängig
von der Anwendung sein (siehe 2.2.3.3). Deshalb muss das Backend die dafür
benötigten Informationen selber generieren.
4.1.4.4 Filter
Zur Generierung der Bedingungen der Abfrage in einem Response-Objekt werden
Filter eingesetzt, die über ein einheitliches Interface
(„Mel_Core_Model_Filter_Interface“) verfügen. Die Filter werden über die statische
Methode einer Klasse zum Initialisieren der verschiedenen Typen erstellt (Fabrik),
die aus dem zu übergebenen Filternamen und der Konfiguration einen neuen Filter
erzeugt und zurück gibt.
Name
Parameter
Beschreibung
SQL-Befehl
IsEqual
Feldname,
Das Feld muss einen bestimmten
field = value
Wert
Wert haben.
Feldname,
Das Feld muss mit einem Teil des
Wert
Wertes übereinstimmen.
Feldname,
Das Feld, muss mit einem der
field IN (value1,
Werte
Werte übereinstimmen.
value2 ...)
Wert
Ein durchsuchbares Feld muss
field1 LIKE value OR
dem Wert entsprechen.
field2 = value ...
IsLike
IsIn
Search
field LIKE value
Tabelle 1: Liste der implementierten Filter
Jeder Filter muss eine „isValid()“-Methode implementieren, die aufgrund der übergebenen Feldnamen feststellen kann, ob die Filterbedingung über ein gültiges Feld
filtert. Das Backend hat die Aufgabe, gültige Filter in die Datenabfrage einzubeziehen.
Entwicklung der Anwendung
43
4.1.4.5 Response
Das Response-Objekt enthält eine Reihe von Datensätzen, mit denen eine Liste ihre
Items erstellen kann. Als weiteres Attribut wird die zur Verfügung stehende
Gesamtzahl der Einträge mitgeführt. Das Objekt ist die Rückgabe eines Request
von der List an das Backend. Es bildet eine einheitliche Schnittstelle zwischen den
beiden Schichten.
4.1.4.6 Verwendete Entwurfsmuster
4.1.4.6.1 Fluent Interfaces
Alle Klassen der Domänenschicht sind mit Fluent Interfaces ausgestattet. Das
bedeutet, dass alle Methoden, die eigentlich ohne Rückgabewerte auskommen,
eine Referenz des Objekts („$this“) zurückgeben. So ist es möglich, mehrere Funktionsaufrufe miteinander zu verketten, ohne für jeden Aufruf eine neue Zeile Quellcode beginnen zu müssen. Das macht den Quelltext schlanker und leichter les- und
wartbar. [WIKI08]
4.1.4.6.2 Lazy Acquisition
Die verschiedenen Models machen Gebrauch vom Entwurfsmuster Lazy Acquisition. [WWW15] So werden Objekte und Daten erst dann geladen, wenn sie wirklich
benötigt werden. Als Beispiel sei hier die Initialisierung des Backends genannt:
Angenommen, eine Liste initialisiert eine Reihe von Items mit Hilfe den vom
Backend gelieferten Daten, um Sie an das Frontend weiterzugeben. Ohne Lazy
Instantiation würde jedes Item sein eigenes Backend initiieren, ohne dass es im
weiteren Verlauf benötigt wird. Um dies zu verhindern, wird das Backend immer
erst beim ersten Aufruf der zugehörigen Getter-Methode „getBackend()“ initialisiert. Das spart in vielen Fällen Ressourcen und verringert die Scriptlaufzeiten
(Anforderung 2.2.7.1).
Auch die Felddefinitionen und Validatoren werden auf diese Art und Weise geladen.
Entwicklung der Anwendung
44
4.1.5 Backend
4.1.5.1 Definition der Schnittstelle
Die Persistenzschicht hat die Aufgabe, eine zuverlässige Datenspeicherung und
Datenabfrage zu gewährleisten. Über festgelegte Schnittstellen können die Daten
mit der Anwendungsschicht ausgetauscht werden. Alle Backend-Klassen müssen
das Interface „Mel_Core_Backend_Interface“ implementieren.
Zur Abfrage von Daten werden zwei Grundfunktionen verwendet. Für die Abfrage
einzelner Datensätze wird entweder eine ID oder ein anderes Wert-Attribut-Paar
an das Backend als Parameter übergeben. Diese Methode ist für das Initialisieren
einzelner Items vorgesehen. Die Methode „getResult()“ erwartet ein RequestObjekt. Dieses muss vom Backend ausgelesen werden und bei der Abfrage der
zugrunde liegenden Ressource berücksichtigt werden. Als Rückgabewert wird ein
Response-Objekt mit den einzelnen Datensätzen und einer Gesamtanzahl der mit
den entsprechenden Filtern zur Verfügung stehenden Datensätzen erwartet.
Für die Speicherung muss jedes Backend öffentliche „update()“- und „create()“Methoden implementieren. Als Eingabeformat wird ein Objekt des Typs
„Mel_Core_Model_Item_Interface“ erwartet.
4.1.5.2 Implementierung
Das für die Anwendung entwickelte Backend greift auf eine MySQL-Datenbank
zurück. Es wurde eine abstrakte Klasse entwickelt, die die Grundfunktionalitäten
für das Lesen und Speichern in unterschiedlichen Tabellen zur Verfügung stellt. In
den abgeleiteten Klassen müssen lediglich einige Konfigurationsparameter wie
Tabellenname und spezielle Felddefinitionen für verknüpfte Tabellen erstellt werden. Für Anforderungen, die nicht von der abstrakten Klasse abgedeckt werden,
können vorhandene Methoden überladen oder hinzugefügt werden.
Die aufwändigste Aufgabe, die das Backend in diesem Fall zu leisten hat, ist die allgemeine Umwandlung des Request-Objekts in eine passende SQL-Abfrage. Für das
Erstellen der SQL-Abfrage wird eine Erweiterung der schon in Kapitel 4.1.4.3
Entwicklung der Anwendung
45
erwähnten Klasse „Zend_Db_Select“ verwendet. Um die Abfrage generieren zu können, wird eine Kenntnis der verwendeten Datenstruktur benötigt. Wie sich diese
gestaltet, kann in der Konfigurationsdatei (siehe 4.1.5.3)definiert werden.
Nach der Erstellung des Select-Objekts wird aufgrund der Konfiguration evaluiert,
welche vom Request-Objekt geforderten Felder in der Haupttabelle liegen. Als
nächstes werden die Werte des Paginators an das Select-Objekt übergeben und die
Filter in WHERE-Bedingungen umgewandelt. Eventuell angegebene Gruppierungsfelder werden ebenfalls an das Select-Statement übergeben.
Falls die Datenstruktur Besonderheiten aufweist, die sich nicht durch die vorhandenen Konfigurationsmöglichkeiten abbilden lassen, wird zusätzlich eine Methode
aufgerufen, die von den abgeleiteten Klassen überschrieben werden kann. In dieser Methode kann das so erstellte Select-Objekt individuell manipuliert werden.
Für das Abfragen einzelner Datensätze werden einfache Select-Statements erstellt,
die den geforderten Bedingungen der Abfrage gerecht werden. Falls diese Bedingungen auf mehrere Datensätze zutreffen, wird der Erste zurückgegeben.
Das Anlegen und Aktualisieren von bestehenden Datensätzen erfolgt über die
„update()“- und „insert()“-Methoden des MySQL-Adapters. Die aktualisierten
Daten werden an den Aufrufer zurückgegeben.
4.1.5.3 Konfiguration
Grundlage der Konfiguration bilden die Felder des übergeordneten Items. Für alle
Felder, in denen für das Backend nichts anderes definiert wurde, wird davon ausgegangen, dass sie sich mit dem gleichen Namen in der definierten Stammtabelle
befinden. Wenn ein Feld auf eine andere Weise abgefragt werden muss oder sich
zusätzliche Daten in einer verknüpften Tabelle befinden, lässt sich dies mit den in
Tabelle 2 aufgeführten Parametern konfigurieren.
Entwicklung der Anwendung
Parameter
Mögliche
46
Beschreibung
Werte
tableField
Spaltenname Weicht der Name der Spalte in der Tabelle von dem
einer Tabelle Feldnamen ab, kann der Spaltenname hier
eingetragen werden.
parentTable
table
Gültige
Tabelle, in der sich übergeordnete Informationen
MySQL-
befinden – Wie die Tabelle verknüpft wird, muss in
Tabelle
dem Parameter tableWhere angegeben werden.
Gültige
Tabelle, in der sich das Feld befindet. Wie die Tabelle
MySQL-
verknüpft wird, kann in dem Parameter tableWhere
Tabelle
angegeben werden. Wenn es zusätzlich eine
mxmTable gibt, muss tableWhere nicht angegeben
werden.
mxmTable
tableWhere
Gültige
Tabelle, über die eine Verknüpfung zu table
MySQL-
hergestellt wird. Die Bedingung dafür muss in
Tabelle
mxmWhere angegeben werden.
Gültiger
Bedingung für die Verknüpfung mit parentTable
MySQL-
oder table
Ausdruck
mxmWhere
Gültiger
Bedingung für die Verknüpfung mit mxmTable und
MySQL-
table
Ausdruck
searchable
true/false
Ist dieses Feld gesetzt, wird es bei einer Suchabfrage
berücksichtigt.
Tabelle 2: Liste der verfügbaren Konfigurationseinstellungen für Datenfelder
4.1.6 Module
4.1.6.1 Core
Das Core-Modul enthält alle Klassen und Interfaces, die für die grundlegenden
Funktionalitäten der verschiedenen Anwendungsschichten und deren Kommunikation untereinander benötigt werden. Das sind im Wesentlichen abstrakte Klassen, die die zugehörigen Interfaces implementieren und von anderen Modulen
Entwicklung der Anwendung
47
durch Vererbung verwendet werden können. Zusätzlich befinden sich hier konkrete Implementierungen der Klassen für die Kommunikation zwischen den verschiedenen Schichten (z.B. Request und Response sowie Filter) und Klassen, die
modulübergreifende Funktionen zur Verfügung stellen. Dazu gehören Helfer-Funktionen für die Initialisierungs- und Registry-Klasse Mel und die gesamte Logik der
Benutzersteuerung. Auf die einzelnen Klassen wird hier nicht weiter eingegangen,
da sie in den vorhergehenden Abschnitten bereits beschrieben wurden.
4.1.6.2 Ext
Das Modul Ext stellt alle Funktionalitäten zur Verfügung, die für die Auslieferung
des auf Ext JS basierenden Clients benötigt werden. Dazu gehören im Wesentlichen
die Frontend-Controller sowie einige Helfer und View-Scripte.
4.1.6.2.1 Der Index-Controller
Der Index-Controller ist für die Auslieferung der Webseite zuständig und implementiert das Interface „Mel_Core_FrontendController_Interface“. Das bedeutet,
dass er die nötigen Methoden zum Einloggen implementieren muss und nur bei
authentifizierten Benutzern die eigentlichen Methoden aufgerufen werden können.
Hat der Benutzer sich über die Login-Maske autorisiert, wird die eigentliche IndexSeite dargestellt. Diese besteht aus einer normalen HTML-Seite mit inkludierten
JavaScript- und CSS-Dateien, die über die Konfigurationsdatei festgelegt werden
können. Über einen Autoload-Konfigurationsparameter können alle JavascriptDateien eines bestimmten Verzeichnisses automatisch einbezogen werden und
müssen nicht einzeln angegeben werden.
Im Hauptteil des HTML-Markups steht lediglich eine Meldung, die dem Benutzer
mitteilt, dass die Applikation geladen wird. Denn die eigentliche Benutzeroberfläche wird durch den Aufruf der clientseitigen Anwendung erstellt. Bei diesem Aufruf werden die Konfigurationseinstellungen und einige Initialisierungsparameter
vom Server an den Client übergeben.
Eine zusätzlich Methode erstellt eine Sprachdatei, über die sich das Vokabular des
Clients einstellen lässt.
Entwicklung der Anwendung
48
4.1.6.2.2 Ext Direct
Ext JS stellt mit Ext Direct eine Technologie zur Verfügung, mit der serverseitige
Funktionen vom Client aus direkt aufgerufen werden können (siehe 4.2.6 ). Um
dieses Verhalten zu ermöglichen, muss der Server zwei Anforderungen erfüllen: Er
muss dem Client eine Liste der zur Verfügung stehenden Methoden anbieten (API)
und er muss bei eingehende Anfragen, die entsprechenden Methoden auf dem Server aufrufen und im JSON-Format11 zurückgeben (Routing). Diese beiden Funktionalitäten sind im Direct-Controller implementiert. Grundlage dafür bildet eine von
Tommy Maintz entwickelte Bibliothek12, die an einer Stelle leicht erweitert wurde.
Um die API zu erstellen, muss ein Objekt des Typs „ExtDirect_API“ instanziiert werden, dem einige Parameter übergeben werden. Mit der Methode „add()“ kann man
ein Array von Klassennamen übergeben, die vom Client aus aufrufbar sein sollen.
Den Methoden dieser Klasse müssen bestimmte PHP-Doc Kommentare vorangestellt werden, damit sie erkannt werden (siehe 4.1.3 letzter Absatz). Damit das
Auslesen der PHP-Doc-Kommentare nicht bei jedem Aufruf neu gestartet werden
muss, werden die Ergebnisse in einer Datei zwischengespeichert und nur bei
Änderungen erneuert.
Die so erstellte API wird als Javascript-Datei in den Header der Hauptseite eingebunden und steht somit der clientseitigen Anwendung zur Verfügung.
Anfragen des Clients an die serverseitige Anwendung werden von der Methode
„indexAction()“ des Front-Controllers angenommen. Der Router „Mel_Ext_Router“
kümmert sich um die Erstellung der benötigten Objekte, das Aufrufen der
gewünschten Methode und das Zurückgeben des Ergebnisses an den Browser. Tritt
bei der Ausführung der Methode ein Fehler auf, wird dieser von einem Try-CatchBlock abgefangen und kann so als Fehlermeldung zurückgegeben werden. Der Client hat daraufhin die Möglichkeit, entsprechend auf den Fehler zu reagieren. Die
Klasse „Mel_Ext_Router“ ist eine Erweiterung von „ExtDirect_Router“, die die
11 JSON steht für JavaScript Object Notation und wird für den Datenaustausch zwischen Server
und Client eingesetzt. [FLA07, Seiten 538-539]
12 Eine Liste verschiedener „Server-side-Stacks“ für Ext Direct wird im Forum von Ext JS frei zur
Verfügung gestellt. [WWW16]
Entwicklung der Anwendung
49
Methode „rpc()“ (Abk. für remote procedur call) überlädt. Dies war nötig, da die
aufzurufenden Controller das Singleton Pattern implementieren und nicht über
den „new“-Operator, sondern nur über die statische Methode „getInstance()“
initialisiert werden können. Zusätzlich wurde zu der im Fehlerfall generierten Antwort der Typ der geworfenen Exception hinzugefügt.
4.1.6.3 Audio, Playlist und Import
Das Modul Audio ist zuständig für die Verwaltung der Musikdatenbank. Es stellt
dem Client die zum Abspielen, Filtern und Anzeigen benötigten Daten zur Verfügung und bietet zudem die Möglichkeit einzelne oder mehrere Datensätze zu verändern. Dementsprechend finden sich in diesem Modul alle serverseitigen Anwendungsschichten mit Ausnahme des Frontends wieder.
Die serverseitige Anwendungslogik für die Funktionen rund um die Wiedergabelisten steckt in dem Modul Playlist.
Die Importfunktion der Audiodateien wurde in ein eigenes Modul ausgelagert. Hier
werden die einzelnen Dateien ausgelesen. Mit Hilfe einer externen Bibliothek13
werden die Id3-Metatags ausgewertet und entsprechende Audio-Items erstellt und
gespeichert.
4.1.7 Helfer
4.1.7.1 Debugging
Für das Debugging einer Ajax-Applikation eignen sich keine normalen Befehle zum
Ausgeben von Variablen (z.B. „echo()“ oder „print_r()“), da sie das Format der
zurückgegeben Daten zerstören und so in der Client-Anwendung einen Fehler produzieren würden. Als Alternative bietet sich eine Extension namens Firephp14 für
13 Weitere Informationen zur verwendete Bibliothek GetId3 finden sich auf der Projektseite
www.getid3.org [WWW17]
14 Firebug [WWW18] ist ein Tool für Webentwickler, mit dem der im Browser generierte Quelltext
inspiziert, Javascript debuggt und Ajax-Requests verfolgt werden können. Mit der Extension
FirePHP [WWW19] können zusätzlich serverseitige Variablen in der Konsole angezeigt werden.
Entwicklung der Anwendung
50
den Firefox an, mit der sich Variablen anzeigen lassen, die im HTTP-Header mitgesendet werden. Um diese Header zu erzeugen stellt das Zend Framework einen
Klasse zur Verfügung, die in der Medienbibliothek Anwendung findet.
4.1.7.2 Minify
Um die Performance der Auslieferung der Anwendung an den Client zu steigern
wird die Applikation Minify [WWW20] verwendet. Sie erlaubt das serverseitige
Komprimieren und Zusammenfügen von Javascript- und CSS-Dateien.
4.2 Clientseitige Anwendung
4.2.1 Initialisierung
Die Initialisierung des User-Interfaces erfolgt über einen Aufruf der Starter- und
Registry-Klasse „Mel“. Die Instanz des Objekts wird in einer globalen Variable
abgelegt und ist so von allen Stellen der Anwendung aus erreichbar.
Beim Aufruf wird ein Start-Controller festgelegt, der für die eigentliche Initialisierung der Controller, Models und GUI-Komponenten zuständig ist.
4.2.2 Zusammenspiel der MVC-Komponenten
Wie im Konzept unter 3.3.3 nachzulesen ist, basiert die clientseitige Anwendung
auf dem MVC-Konzept. Die Ausgestaltung dieses Konzepts wird im Folgenden kurz
beschrieben, um die anschließenden Abschnitte leichter verständlich zu machen.
Jede GUI-Komponente wird durch ein Triple von Controller, Model und View repräsentiert. Der Controller ist für die Initialisierung zuständig und bietet Schnittstellen für andere Komponenten. Jeder Controller initialisiert eine Instanz des zugehörigen Models. Im Model werden wiederum die einzelnen Teile der GUI-Komponente initiert. Controller und View implementieren das Observer-Muster. Der View
ist in diesem Fall das Beobachtungssubjekt, welches allen Beobachtern Mitteilungen macht, sobald der Benutzer eine bestimmt Aktion ausgeführt hat. Der Control-
Entwicklung der Anwendung
51
ler registriert sich beim View, um auf diese Ereignisse mit einem Methodenaufruf
zu reagieren. Innerhalb des Aufrufs lassen sich der Status des Models oder direkt
andere View-Komponenten anpassen.
4.2.3 Controller
In der Anwendung gibt es drei verschiedene Arten von Controllern. Die Start-Controller sind zuständig für die Initialisierung von Ext Direct und die Erstellung des
Viewports (Grundlayout). Die einzelnen Komponenten des Viewports werden von
den untergeordneten Controllern erstellt. Die Instanzen der verschiedenen Controller werden in dem Registry-Objekt „MEL“ gehalten und können so als Singletons aufgerufen werden. Die Controller der einzelnen Tabs der Anwendung (siehe
2.1.1.8) sind keine Singletons, da für jeden Tab ein eigener Controller zuständig ist.
Die einzelnen Controller können über das Model des übergeordneten Tabs-Controllers angesprochen werden (hier werden die Instanzen gehalten). Die verschiedenen Controller können sich bei den zugehörigen View-Komponenten für Benutzeraktionen registrieren und so darauf reagieren. Die Controller selbst sind
zustandslos, Statusinformationen werden im Model gespeichert.
4.2.4 Models
Die Models beinhalten die eigentliche Anwendungslogik. Sie erstellen die benötigten Komponenten des Views und bieten Schnittstellen für Controller an, um Statusänderungen zu vollziehen bzw. bestimmte Aktionen auszuführen. Sie können bei
Zustandsänderungen direkt auf den untergeordneten View zugreifen und ihn so
manipulieren.
Entwicklung der Anwendung
52
4.2.5 View
Abbildung 15: Baumstruktur der View-Komponenten
Die einzelnen View-Komponenten erweitern in der Regel bestehende Ext JS-Komponenten. Dabei handelt es sich hauptsächlich um verschiedene Formen von PanelObjekten, die in einer Baumstruktur (Composite-Muster15, siehe Abbildung 15)
angeordnet sind. Diese Baumstruktur findet sich auch in der Benennung/Ordnerstruktur wieder, so dass einzelne Komponenten leicht wieder zu finden sind. In
Tabelle 3 sind die erweiterten View-Komponenten aufgelistet.
15 Die Baumstruktur des View entspricht dem Composite-Entwurfsmuster [FRE08, Seite 533]
Entwicklung der Anwendung
Name
Funktion
Viewport
Der Viewport bildet das oberste Element der GUI-Komponenten.
53
Verschiedene Grundlayouts können definiert werden. Er bildet das
Gerüst für die untergeordneten Elemente.
Panel
Ein einfaches Panel kann verschiedene Inhalte darstellen oder
weitere Panels beinhalten.
TabPanel
Ein TabPanel kann mehrere Panels enthalten, zwischen denen über
Reiter hin- und hergeschaltet wird.
EditorGrid
Das EditorGrid ist die Erweiterung eines Panels. Es stellt Daten in
Form einer Tabelle (Grid) dar. Wie die Daten darzustellen und zu
laden sind, wird in den enthaltenen Store- und ColumnModelObjekten definiert.
DirectStore
Der DirectStore lädt Daten über eine Schnittstelle vom Server und
stellt sie dem Grid zur Verfügung.
ColumnMod Im ColumnModel werden die Datenformate und spezielle
el
Darstellungsoptionen für die einzelnen Spalten eines Grids
definiert.
Toolbar
Eine Toolbar bietet die Möglichkeit, einzelne Buttons oder
Dropdown-Menüs in den oberen Teil eines Panels einzubinden.
Flashpanel
Das Flashpanel ist eine Erweiterung von Ext JS, mit der sich
Flashobjekte einbinden lassen.
Tabelle 3: Verwendete View-Komponenten der Ext JS Library
4.2.6 Ext Direct
Die Nutzung der „Remoting API“ Ext Direct mit Ext JS gleicht einem normalen
Funktionsaufruf. Über einen zu definierenden Namensraum können die serverseitig implementierten Methoden der verschiedenen Controller aufgerufen werden.
Zusätzlich zu den Parametern, die an den Server weitergegeben werden, kann eine
Callback-Funktion angegeben werden, die den Rückgabewert weiterverarbeitet.
Der aufgerufenen Javascript-Funktion ist es nicht möglich den entsprechenden
Wert direkt zurückzugeben, da die Kommunikation via Ajax asynchron ist.
[WWW21] Werden mehrere Aufrufe innerhalb eines bestimmten Intervalls getä-
Entwicklung der Anwendung
54
tigt, sorgt Ext Direct dafür, dass sie zusammen in einem einzigen Ajax-Request
abgesendet werden. Das verringert nicht nur den Datenverkehr und die Serverlast,
sondern hat zusätzlich den Vorteil, dass die Reihenfolge der Bearbeitung auf dem
Server mit relativ großer Wahrscheinlichkeit erhalten bleibt und auch der Client
die Callback-Funktionen in entsprechender Reihenfolge aufruft. Hierdurch kann
z.B. das Aktualisieren eines Datensatzes und das Laden des aktualisierten Datenbestandes direkt hintereinander erfolgen. Würde man zwei einzelne Ajax-Requests
hintereinander ausführen, dürfte der zweite Aufruf erst bei Rückkehr des ersten
geschehen, da sonst nicht ausgeschlossen werden könnte, dass der zweite den ersten überholt. So würden die veralteten Daten zurückgegeben werden, was zu
Inkonsistenzen der Datenbestände führen würde.
4.2.7 Module (Auszug)
Eine vollständige Beschreibung der einzelnen Module der clientseitigen Anwendung würde an dieser Stelle den Rahmen sprengen. Deswegen seien hier nur einzelne zentrale Komponenten aufgeführt, um an diesen Beispielen den Inhalt der
vorigen Abschnitte zu verdeutlichen.
4.2.7.1 Bibliothek
Die Bibliothek ist der zentrale Zugriffspunkt für den Benutzer auf seine Musikdatenbank. Sie wird in einem Tab aufgerufen und kann so parallel mit anderen Inhalten angezeigt werden. Sie besteht aus den Filtern im oberen Bereich und dem zentralen Grid, welches die einzelnen Datensätze anzeigt.
Damit der Benutzer die Möglichkeit hat, sukzessive seine Musikauswahl weiter
einzuschränken, sind die Filter in Reihe geschaltet: Zuerst kommt der Suchfilter,
dann Genre, Künstler und Album. Die einzelnen Filter bestehen aus Models, die den
aktuellen Zustand speichern und den jeweils nötigen View-Komponenten. Die
Instanzen der Filter sind im Model der Bibliothek verortet. Der Controller der
Bibliothek registriert sich bei den Filtern als Beobachter. Stellt der Benutzer einen
Filter an bzw. um, sorgt der Controller dafür, dass alle nachgelagerten Filter und
die Liste der Musiktitel neu geladen werden.
Entwicklung der Anwendung
55
Das Grid, welches die Einträge aus der Datenbank enthält, verfügt über verschiedenen Funktionalitäten:
– Sortierung der Spalten in auf- und absteigender Reihenfolge
– Einzelne Spalten können in der Breite verändert und ein oder ausgeblendet
werden.
– Die Einträge können selektiert werden.
– Die Einträge können per Drag'n'Drop in eine bestehende Playliste geschoben werden.
– Drückt man mit der rechten Maustaste auf selektierte Einträge, können einzelne oder mehrere Einträge gleichzeitig bearbeitet werden. Dazu öffnet
sich ein Fenster, in dem die Attribute über ein Formular editiert werden.
– Mit Doppelklick wird der entsprechende Eintrag im Player abgespielt. Ein
kleines Symbol kennzeichnet den aktuell gespielten Titel
4.2.7.2 Player
Der Controller des Players bietet Schnittstellen an, um die Wiedergabe des Players
steuern zu können. Der eigentliche Algorithmus, welcher Titel z.B. bei dem Befehl
„next()“ abgespielt wird, befindet sich im zugehörigen Model, da es hierfür nötig
ist, auf den aktuellen Status einzugehen. Bei aktivierter Zufallsfunktion wird beispielsweise ein anderer Auswahl-Algorithmus verwendet als im Standardmodus.
Der Zugriff auf den Flashplayer wird über die API des eingebundenen JW FLV
Media Players realisiert. Diese API ermöglicht es, den Player mittels Javascript zu
steuern, sowie bestimmte Ereignisse abzufangen und darauf zu reagieren.16 So feuert der Flashplayer beispielsweise nach dem Beenden des gerade abgespielten
Titels ein Ereignis. Dieser Vorgang wird vom Controller überwacht. Tritt das Ereignis ein, ruft der Controller die „next()“-Methode des Models auf, um den nächsten
Song abzuspielen.
16 Mehr Informationen zum verwendeten Flashplayer befinden sich unter 3.1.4
Entwicklung der Anwendung
56
Die Ansicht des Players besteht aus einer Statusanzeige, dem Flashplayer und einigen Steuerelementen, die das Verhalten des Players regeln. Die einzelnen Komponenten werden vom Model aktualisiert, sobald ein neuer Titel abgespielt wird.
Erweiterbarkeit der Anwendung
57
5 Erweiterbarkeit der Anwendung
Eine wesentliche Anforderung an die zu entwickelnde Anwendung war es, eine flexible Software zu entwickeln, auf deren Basis es möglich wäre, weitere Anwendungsfälle zu realisieren. In diesem Abschnitt soll anhand von zwei Beispielen
untersucht werden, inwiefern diese Anforderung erfüllt wurde. Dazu wird erläutert, wie ein weiterer Client erstellt werden könnte und wie es möglich ist, ein weiteres Datenformat aus einem externen Webservice in die Anwendung zu integrieren.
5.1 Zusätzliche Clients mit XML-RPC Webservice
Der in der Medienbibliothek integrierte Webservice für Ext Direct ist speziell für
den Ext JS-Client entworfen worden. Dieser Webservice kann generell auch von
anderen Clients angesprochen werden, nur müsste dafür in der jeweiligen Programmiersprache ein Adapter entwickelt werden, der die entsprechenden Aufrufe
generiert. Eine komfortablere Lösung für die Entwicklung weiterer Clients wäre es,
an dieser Stelle einen weit verbreiteten Standard einzusetzen. Wie in 3.4.2
beschrieben, können durch die verwendete Schichtenarchitektur verschiedene
Webservices parallel betrieben werden.
XML-RPC ist eine Methodik für das entfernte Aufrufen von Methoden. Die Kommunikation basiert auf dem HTTP-Protokoll und benutzt XML-Strukturen zum Formatieren der Daten. [WIKI09] Da der Standard auf HTTP aufsetzt, lassen sich Cookies
für die Authentifizierung verwenden. Für den Einsatz von XML-RPC gibt es Implementationen in fast allen Programmiersprachen, die einfach zu verwenden sind.17
Ein weiterer Grund für die Verwendung von XML-RPC ist, dass das Zend Framework eine Klasse zum Erstellen eines XML-RPC-Servers anbietet.
17 Implementationen für XML-RPC gibt es z.B. in Perl, Python, Java, C/C++, PHP, Microsoft .NET,
Delphi, WebObjects, Zope [WWW22] und ActionScript 3 [WWW23]
Erweiterbarkeit der Anwendung
58
Die einzige Voraussetzung für die serverseitige Implementierung des Webservices
ist, dass ein neues Modul angelegt wird, welches einen Frontend-Controller beinhaltet. In diesem muss ein XML-RPC-Server erstellt werden, dem die nötigen Controller-Klassen der Anwendung übergeben werden. Das reicht aus, um einer beliebigen Client-Anwendung den Zugriff auf die gleichen Daten/Funktionen zu erlauben wie der in dieser Arbeit vorgestellten Ext JS Anwendung. So ist es denkbar,
eine iPhone-Application, eine Java-Anwendung oder ein Plugin für DesktopAnwendungen wie z.B. Songbird18 zu entwickeln, die es dem Benutzer ermöglichen, unterwegs oder zu Hause auf unterschiedliche Weise auf ihre Musikdatenbank zuzugreifen.
5.2 Neues Datenformat aus externer Quelle
Das Anlegen eines neuen Datenformats soll anhand der Youtube-API19 zum Auslesen und Hochladen von Videos dargestellt werden.
Für die Implementierung des neuen Datenformats muss zunächst ein neues Modul
angelegt werden, welches einen Controller, die notwendigen Models und ein
Backend für die Verarbeitung der Daten zur Verfügung stellt.
Der Controller stellt wie im Modul Audio den Zugriffspunkt für die Client-Anwendung dar. Denkbare Methoden wären hier z.B. „getList()“ oder „upload()“.
Das Model entspricht dem Audio-Model, nur dass ein Video natürlich etwas andere
Attribute vorhält, wie z.B. Thumbnails. Die Einstellungen können wie bei den anderen Models über die Konfigurationsdatei vorgenommen werden. Der einzige
wesentliche Unterschied zum Audio-Modul tritt bei der Implementierung des
Backends auf. Hier wird nicht auf die eigene Datenbank zugegriffen. Stattdessen
wird die Youtube-API verwendet, um die Daten zu lesen und zu schreiben. Auch
hierfür stellt das Zend Framework eine Bibliothek zur Verfügung. So kann mit Hilfe
18 Sonbird ist ein Musicplayer von Mozilla, der mit Plugins erweitert werden kann. [WWW24]
19 Youtube stellt eine API zur Verfügung, über die die Inhalte der Webseite mittels eines
Webservices für andere Anwendungen abrufbar sind. Auch das hinzufügen von Videos ist mit
diesem Webservice möglich. [WWW25]
Erweiterbarkeit der Anwendung
59
der Klasse „Zend_Gdata_Youtube“ auf einfache Weise auf den Webservice zugegriffen werden. Das Backend kann also diese Klasse benutzen, um die Daten auszulesen und kann sie daraufhin in gewohnter Form an die Anwendungsschicht zurückgeben. Auch zum Speichern von neuen Videos kann das Backend auf die externe
Schnittstelle zurückgreifen.
Für die clientseitige Implementierung wird empfohlen, einen neuen Controller mit
zugehörigem Model und View anzulegen, der den Inhalt eines weiteren Tabs darstellt. So kann ein Interface erstellt werden, das es ermöglicht, nach Videos auf
Youtube zu suchen oder z.B. nach bestimmten Kanälen zu filtern. Zum Abspielen
der Videos kann der bereits integrierte JW FLV Media Player verwendet werden.
Er müsste lediglich etwas vergrößert dargestellt werden, um das Video sichtbar zu
machen. Zusätzlich verfügt der Player über einen Vollbild-Modus, so dass die
Videos trotz der beschränkten Breite in der linken Spalte auch in Großformat angesehen werden können.
Vor- und Nachteile der Anwendung
60
6 Vor- und Nachteile der Anwendung
In diesem Kapitel werden noch einmal die Besonderheiten der entwickelten
Anwendung beschrieben und auf ihre Vor- und Nachteile hin untersucht.
6.1 Schichtenarchitektur
Die für die serverseitige Anwendung zum Einsatz gekommene Schichtenarchitektur hat sich als sehr nützlich erwiesen, um die Anwendung so flexibel zu gestalten,
dass sie sehr einfach zu erweitern ist (siehe Abschnitt 5 ). Die Trennung der einzelnen Zuständigkeiten gibt der Applikation zudem eine klare Struktur und macht sie
einfach wartbar und für andere Entwickler leichter zu verstehen. Außerdem ist der
Datenfluss der Anwendung klar ersichtlich, da jede Schicht nur mit der jeweils
unter ihr liegenden kommuniziert.
Diese Limitierung bringt allerdings auch ein paar Nachteile mit sich. So ist es z.B.
nicht möglich, spezielle Datenbankabfragen direkt im Controller zu realisieren,
was in anderen Anwendungen oft der Fall ist. Für jede noch so kleine Abfrage von
Daten müssen Methoden in jeder einzelnen Schicht der Anwendung implementiert
werden. Es wurde zwar versucht, entsprechende Abfragen mit einem RequestObjekt (siehe 4.1.4.3) zu abstrahieren, sodass nicht in jedem Fall eine neue
Methode angelegt werden muss. Doch es hat sich herausgestellt, dass es kompliziert ist, die vielfältigen Möglichkeiten einer SQL-Abfrage auf diese Weise zu verallgemeinern. Eine Anforderung an die Software war (siehe 2.2.2.3), die Persistenzschicht austauschen zu können. Folglich führte an der Schichtenarchitektur kein
Weg vorbei. Flexibilität heißt in diesem Fall also auch, sich auf den kleinsten
gemeinsamen Nenner zu einigen und Funktionen, die nur bestimmte Persistenzschichten unterstützen, nicht allgemein verwenden zu können.
Ein weiterer Nachteil an der starren Schichtenarchitektur ist, dass die Geschäftslogik mit Funktionalitäten ausgestattet werden muss, die eigentlich nur an das
Backend weitergegeben werden. Eine mögliche Alternative wäre es, die Schichtenarchitektur an dieser Stelle aufzuheben und dem Controller direkten Zugriff auf die
Vor- und Nachteile der Anwendung
61
Persistenzschicht zu gewähren. Dieses Verfahren wird z.B. im PHP-Framework
Flow320 und in Tine 2.021 angewendet. Aus Gründen der Übersichtlichkeit und der
Vereinfachung der Aufgaben der Controller wurde diese Methode hier nicht angewendet.
6.2 Trennung von Server- und Client-Anwendung
Die strikte Trennung von Server und Client ist eine Konsequenz der geforderten
Multi-Client-Fähigkeit (2.2.2.2) und der Anforderung, dass sich die Webseite ähnlich wie eine Desktop-Anwendung bedienen lassen soll (2.2.1.1). Die so entstandene RIA (Rich Internet Application) hat einige Vor- und Nachteile gegenüber herkömmlichen Internetseiten. Ein Nachteil besteht darin, dass die anfängliche Ladezeit relativ hoch ist, da zunächst die komplette Javascript-Anwendung heruntergeladen werden muss (im gepackten Zustand ca. 210kb). Dieser Nachteil wird im folgenden Verlauf allerdings vermindert, da nur noch Daten vom Server geladen werden müssen und keine komplexen HTML-Dokumente. Das macht die Bedienung
insgesamt flüssiger. Ein weiterer Punkt, der bei Javascript-Anwendungen im Browser beachtet werden muss, ist, dass der Browser nur begrenzten Arbeitsspeicher
zur Verfügung hat und das Ausführen von Javascript unter Umständen sehr langsam ist22. Da die aktuelle Version des verwendeten Javascript-Frameworks Ext JS
speziell daraufhin optimiert wurde, macht sich dieses Problem allerdings kaum
bemerkbar. Es ist jedoch davon auszugehen, dass eine Medienbibliothek mit tausenden von Einträgen, die gleichzeitig angezeigt werden sollen, für PerformanceProbleme sorgt. Eine Abhilfe hierfür könnte sein, dass die Bibliothek zukünftig mit
einem Pagebrowser ausgestattet wird, der dafür sorgt, dass immer nur eine
begrenzte Anzahl von Einträgen auf einmal angezeigt wird.
20 Flow3 ist ein PHP Framework, dass für die neue Typo3 Version 5 entwickelt wurde. Das hier
verwendete Persistenz-Framework liefert dem Controller die aggregierten Models. [WWW26]
21 Tine 2.0 ist eine webbasierte Groupware, in der der Controller direkten Zugriff auf das Backend
hat. [WWW27]
22 Es gibt im Internet viele Blog-Einträge, die sich mit dem Thema befassen, z.B.: [WWW28].
Speziell der Internet Explorer ist in einigen Bereichen sehr langsam, was das Ausführen von
Javascript angeht.
Vor- und Nachteile der Anwendung
62
Als Nachteil kann noch betrachtet werden, dass für die Verwendung der Anwendung ein moderner Browser benötigt wird, wobei die in 2.2.1.3 aufgeführten Statistiken belegen, dass der Großteil aller Internetnutzer über einen solchen Browser
verfügt.
Trotz dieser Probleme ist festzuhalten, dass die Benutzeroberfäche einige Funktionen bietet, die über den Umfang einer normalen Webseite deutlich hinausgeht. Da
ist z.B. die flüssige Bedienung, die nur möglich ist, weil sich die Webseite nicht bei
jedem Klick neu laden muss. Da sind auch verschiedene Bedienkonzepte wie
Rechtsklick und Drag'n'Drop, die ohne Javascript im Browser nicht realisierbar
wären. Des Weiteren kann ein ununterbrochenes Abspielen von Audiodateien nur
gewährleistet werden, wenn die Anwendung als Single Page Interface realisiert ist
(siehe 3.3.2 ).
6.3 MVC im Browser
Vergleicht man die Anzahl der auf Wikipedia gelisteten MVC-Frameworks für PHP
und Javascript, fällt einem auf, dass es fast zehn mal mehr Frameworks für PHP
gibt (46 zu 5) und dass keines der gängigen Javascript-Frameworks ein eigenes
MVC-Konzept verwendet. [WIKI12] Das liegt vor allem daran, dass es wesentlich
mehr Webseiten gibt, die hauptsächlich mit PHP generiert werden und Javascript
nur als in den Views eingekapselte Code-Schnipsel verwenden. Trotzdem zeigt
diese Tatsache auf, dass der generelle Trend hin zu Webseiten mit Ajax [WWW32]
anscheinend noch nicht dazu geführt hat, die Anwendung im Browser als eigenständig zu betrachtet und dementsprechend bewährte Entwurfsmuster wie MVC
auch dort anzuwenden. An der hier entwickelten Webanwendung kann jedoch
gezeigt werden, dass es durchaus Sinn macht, die Komplexität des Javascript-Codes
durch das MVC-Pattern zu verringern und klarer zu strukturieren. Ursprünglich
wurde das MVC-Muster für grafische Benutzeroberflächen entwickelt23, warum
sollte man es also nicht gerade hier anwenden?
23 Das serverseitig oft verwendete MVC-Muster ist eigentlich eine Abwandlung des urspünglichen
Musters und nennt sich Model 2 [FRE08, Seite 549]
Vor- und Nachteile der Anwendung
63
Bei genauer Betrachtung der in der RIA verwendeten Javascript Bibliothek Ext JS
kann man erkennen, dass für einen speziellen Anwendungsfall eine Trennung zwischen View und Model implementiert wurde. Die verschiedenen Varianten des
Store-Objekts können als Model betrachtet werden, denn sie repräsentieren eine
bestimmte Form von Daten, die die Grundlage für eine View-Komponente bilden
(z.B. für ein Grid). Es ist jedoch so, dass diese Stores relativ stark an eine
bestimmte, eindimensionale Form der Daten und an ihre Resource (meist auf dem
Server liegende Daten) gebunden sind. Um eine eigene Anwendungslogik (für z.B.
den Player) zu implementieren, braucht es an dieser Stelle zusätzlich eigene
Models. Controller gibt es in Ext JS nicht und man wird durch den Aufbau der ViewKomponenten oft dazu verleitet, Funktionalitäten, die eigentlich in einen Controller gehören, im View zu implementieren. Denn was bei einem bestimmten Ereignis
passieren soll, kann in der View-Komponente selbst definiert werden. Dem MVCMuster entsprechender wäre es, an dieser Stelle einen Controller zu erstellen, der
die entsprechende Komponente beobachtet und auf Ereignisse reagieren kann.
Aus diesen Gründen wurden eigene Controller und Models entwickelt, die die von
Ext JS bereit gestellten Komponenten (hauptsächlich View-Komponenten) ergänzen. So sind die Zuständigkeiten der verschiedenen Module klar getrennt und die
verschiedenen Vorteile des MVC-Entwurfsmuster kommen zum Tragen.
Die Implementierung wurde an einer Stellen etwas anders realisiert, als das Entwurfsmuster normalerweise vorsieht. „The model and controller have no direct
knowledge of the view“ [WIKI12]. Aus verschiedenen Gründen wurde das MVCEntwurfsmuster hier etwas anders interpretiert. Aus Gründen der Praktikabilität
und Flexibilität ist der Controller das übergeordnete Element, welches das Model
initialisiert. Das Model wiederum initialisiert die View-Komponenten. So besteht
die Möglichkeit, dass der Controller und das Model Einfluss darauf nehmen können, auf welche Weise der View erstellt wird. Sie können bei Bedarf direkt auf den
View zugreifen und ihn manipulieren. Das verstößt an dieser Stelle zwar gegen das
Observer-Muster zwischen Model und View, vereinfacht dafür aber an vielen Stel-
Vor- und Nachteile der Anwendung
64
len die Programmierung. Das Muster ist auch deswegen nicht nötig, da es in der
Anwendung nicht vorkommt, dass ein Model auf verschiedene Arten repräsentiert
wird.
6.4 Vergleich mit Desktop-Applikationen
Der Vergleich der entwickelten webbasierten Medienbibliothek mit entsprechenden Desktop-Applikationen soll weniger auf die konkrete Implementierung als auf
die generellen, strukturellen Unterschiede abzielen. Es soll aufgezeigt werden, wo
die jeweiligen Anwendungen an ihre Grenzen stoßen, für welchen Anwendungszweck sie am ehesten geeignet sind und wie die verschiedenen Vorteile miteinander verbunden werden könnten. Verglichen werden die Grundfunktionalitäten der
Webanwendung mit denen von Desktop-Anwendungen wie Itunes, Windows
Media Player, Winamp, Songbird oder Real Media.
Abbildung 16: Screenshot der entwickelten Anwendung
Vor- und Nachteile der Anwendung
65
Die wesentlichen Limitierungen der webbasierten Medienbibliothek bestehen
darin, dass sie in einem Browser ausgeführt wird, der für die Javascript-Anwendung eine Art Sandbox24 darstellt. Es ist z.B. nicht möglich, direkt auf das Dateisystem zuzugreifen oder mit anderen Anwendungen zu interagieren. Das hat zur
Folge, dass es z.B. nicht umsetzbar ist, Dateien per Drag'n'Drop in die Anwendung
zu ziehen oder per Kontextmenü aus dem Dateibrowser mit der Webapplikation zu
starten. Das Importieren von Audio-CDs in die Medienbibliothek – ein wesentliches Feature der genannten Desktop-Anwendungen – ist somit auch nicht machbar. Der umgekehrte Prozess – das Brennen einer Audio-CD – ist auf diesem Weg
natürlich genauso wenig realisierbar. Ein weiterer Nachteil ist, dass die Webanwendung nur mit einem nicht allzu langsamen Internetanschluss benutzt werden
kann und dass die Musikdateien, bevor sie online gehört werden können, zunächst
hoch geladen werden müssen. Das kann je nach Internetanschluss und Größe der
Musiksammlung einige Zeit in Anspruch nehmen und erfordert in der jetzigen Version ein FTP-Programm. Ein derzeit noch bestehendes Manko ist auch, dass die
online editierten Dateien nicht einfach zurück transferiert werden können, um sie
beispielsweise auf einem MP3-Player abzuspielen. Durch entsprechenden Programmieraufwand könnte hierfür aber eine Lösung geschaffen werden.
Die Limitierungen der Desktop-Anwendungen entstehen vor allem durch die
lokale Datenhaltung. Die Daten liegen alle nur lokal vor und müssen bei Benutzung
verschiedener Rechner hin und her kopiert werden. Das ist nicht nur aufwändig,
sondern kann bei großen Sammlungen auch viel Platz auf der Festplatte in
Anspruch nehmen. Hinzu kommt, dass bei der Neuinstallation eines Betriebssystems oder einem Wechsel der Anwendung in der Regel die kompletten Dateien neu
indiziert werden müssen, da jede Anwendung eine interne Datenbank aufbaut. Ein
weiteres Problem ist, dass die Abfrage dieser Datenbank den eigenen Rechner
belastet, was manche Systeme bei vielen Einträgen extrem langsam macht. Bei
einem verteilten System wie der Webanwendung können die Lasten (GUI und
Datenbank) besser verteilt werden, da sie auf verschiedenen Prozessoren laufen.
24 Der Begriff Sandbox bezeichnet in der IT eine Software, die abgeschirmt vom eigentlichen
System ausgeführt wird. [WIKI13]
Vor- und Nachteile der Anwendung
66
Hinzu kommt, dass der Benutzer bei einer webbasierten Lösung von jedem Rechner mit Internetanschluss aus ohne Installation einer Software auf die Medienbibliothek zugreifen kann.
Vorteile der Webanwendung bestehen in den möglichen Erweiterungen, die in den
Anwendungsfällen 2.1.2 und 2.1.3 sowie im Kapitel 5 kurz erläutert werden und
nicht direkter Bestandteil der hier vorgestellten Medienbibliothek sind. Trotzdem
sind diese Optionen hier aufzuführen, da sie die prinzipiellen Unterschiede zwischen Desktop- und Webanwendung deutlich machen.
Mit der RIA ist es möglich, die Inhalte nicht nur selber zu verwenden, sondern sie
auch mit anderen Benutzern zu teilen. Auf dieser Basis sind viele Funktionen denkbar, die mit einer normalen Desktop-Anwendung nicht realisierbar sind bzw. bis
jetzt nicht realisiert wurden. Ein paar Beispiele sind z.B.:
– Verschicken von Wiedergabelisten/Titeln an andere Benutzer
– Gegenseitiges Vorstellen von neuer Musik
– Gemeinsames Pflegen der Metainformationen
Die Verknüpfung der Anwendung mit einem Online-Vertrieb bringt für den Benutzer außerdem die Möglichkeit, zeitlich begrenzt auf eine umfassende Bibliothek
zuzugreifen (Flatrate). In diesem Fall macht es aufgrund der Masse wenig Sinn, die
kompletten Daten auf den lokalen Rechner herunterzuladen und sie mit DRM25 zu
schützen.
Ein großer Pluspunkt der webbasierten Anwendung ist es schließlich, dass verschiedene Clients dafür entwickelt werden können. So ist es z.B. möglich, einen Client auf Basis von Adobe AIR zu erstellen. Ein solcher Client hebt gleichzeitig die
Limitierungen der Javascript-Anwendung auf, da mit Adobe AIR Webanwendungen
programmiert werden können, die in den Desktop eingebunden sind. Der Zugriff
auf das Dateisystem und die Interaktion mit anderen Betriebssystem-spezifischen
25 DRM steht für Digital Rights Managment, eine Möglichkeit, die Benutzung digitaler Inhalte auf
bestimmt Verwendungszwecke zu limitieren [WIKI14]
Vor- und Nachteile der Anwendung
67
Komponenten ist somit machbar. Ein weitere Client könnte dieselbe Musiksammlung außerdem auf das Handy bringen, sie somit mobil und herkömmliche MP3Player damit überflüssig machen.
Fazit/Ausblick
68
7 Fazit/Ausblick
In dieser Diplomarbeit wurde vorgestellt, wie sich mit Hilfe von Open-Source-Produkten eine gewöhnliche Desktop-Anwendung – konkret eine Medienbibliothek –
in den Browser bringen lässt. Die für die serverseitige Anwendung entwickelten
Konzepte sind so allgemein, dass sie auch für viele ähnliche Problemfälle verwendet werden können.
Es hat sich gezeigt, dass die konzeptionierte Schichtenarchitektur die Anwendung
sehr flexibel und übersichtlich strukturiert und eine einfache Erweiterbarkeit
gewährleistet. Der einzige Nachteil, der dadurch entsteht, ist, dass Datenbankabfragen abstrahiert werden müssen. Dies führt dazu, dass die Funktionalitäten auf
den kleinsten gemeinsamen Nenner verschiedener DBMS (Datenbank Management Systeme) reduziert werden müssen, was in der entwickelten Anwendung
jedoch zu keinen Problemen geführt hat.
Die umgesetzte Trennung von Server- und Client-Anwendung führt dazu, dass die
Struktur der Software auf dem Server vereinfacht werden kann, da sie im Wesentlichen nur noch für den Datenaustausch zwischen Client und Datenbank zuständig
ist. Ein weiterer Vorteil ist, dass die Anwendung unabhängig von dem eingesetzten
Client verwendet werden kann.
Um die geforderten, umfangreichen Funktionalitäten der Client-Anwendung
umsetzen zu können, wurde auf das Javascript Framework Ext JS gesetzt und das
MVC-Entwurfsmuster in den Browser integriert. Diese Kombination hat gezeigt,
dass es möglich ist, Rich Internet Applications im Browser zu erstellen, die in
puncto Bedienbarkeit und Anwendungsarchitektur mit Desktop-Anwendungen
ebenbürtig sind.
Wie in Abschnitt 6.4 beschrieben, bestehen jedoch einige grundsätzliche Limitierungen in Browser-Anwendungen, da sie aus Sicherheitsgründen keinen kompletten Zugriff auf den Client-Rechner haben. Sehr interessant wäre es hier, eine Verschmelzung von Desktop- und Webanwendung zu schaffen um die jeweiligen
Fazit/Ausblick
69
strukturellen Nachteile zu überwinden. Möglich wäre es z.B. einen AIR-Client für
die Medienbibliothek zu entwickeln, da Adobe mit dieser Technik genau den
Ansatz verfolgt, Webanwendungen in den Desktop zu integrieren.
Dass die Anforderung der einfachen Erweiterbarkeit (2.2.2 ) erfüllt ist, wurde im
Abschnitt 5 an zwei Beispielen verdeutlicht. Ob dies auch für andere Beispiele gilt,
lässt sich natürlich erst im konkreten Fall beurteilen. Dennoch wurde hier aufgezeigt, welche prinzipiellen Möglichkeiten bestehen und wie sie genutzt werden
können.
Interessant wäre es, die beiden in dieser Diplomarbeit nicht näher ausgeführten
Anwendungsfälle umzusetzen, da sie die wesentlichen Vorteile einer webbasierten
Anwendung deutlicher ausspielen könnten und dem Benutzer Funktionalitäten
bereit stellen würden, die derzeit keine aktuelle Medienbibliothek bieten kann.
Die parallel zur schriftlichen Arbeit entwickelte Software lässt auf den ersten Blick
keine Unterschiede der Bedienbarkeit im Vergleich zu Desktop-Anwendungen
erkennen (siehe Link in Anhang F). Diese Betrachtung ist natürlich erstmal nur
subjektiv und wäre in einem weiteren Schritt von geeigneten Testpersonen zu
belegen. Ob sich die Performance in der Praxis auch mit vielen Datensätzen halten
lässt, bleibt ebenso zu untersuchen. Die kurze Entwicklungszeit von nur zwei
Wochen kann als Beleg dafür gewertet werden, dass die aufgestellten Konzepte
funktionieren. Trotzdem ist die jetzige Version nur als Beta-Version zu verstehen,
da davon auszugehen ist, dass sie noch einige Bugs enthält, die mit ausführlichem
Testen aufgespürt werden müssen.
Für die zukünftige Verwendung der Entwicklung gibt es generell zwei unterschiedliche Lösungen. Die eine wäre zu versuchen, sie kommerziell zu vertreiben. Es
bedeutet allerdings noch einige Arbeit, eine marktreife Version fertigzustellen.
Gerade die Variante als Teil eines Online-Vertriebs könnte hier jedoch sehr viel versprechend sein, da bisher kein Anbieter von Audio-Inhalten mit einem ausgereiften
Software-Konzept für Flatrate-Angebote aufwarten kann.
Fazit/Ausblick
70
Die andere Möglichkeit wäre, das Projekt unter einer Open-Source Lizenz zu veröffentlichen. Auch dieser Schritt setzt weitere Maßnahmen voraus: So müsste eine
Installationsroutine erstellt werden und eine Art Extension-Manager programmiert werden, mit dem es möglich ist, Erweiterungen aus der Open-Source-Community in die Anwendung zu integrieren. Wichtig wäre es auch, die Applikation
ausreichend bekannt zu machen, damit sich eine lebhafte Gemeinde um das Projekt bilden kann, die die möglichen Erweiterungen in Angriff nimmt.
Welche der beiden Ansätze verfolgt werden kann/soll, ist durch Gespräche mit der
betreuenden Firma und geeigneten Experten zu diskutieren, um rechtliche und
wirtschaftliche Aspekte der Varianten näher zu durchleuchten.
Abschließend ist festzuhalten, dass der in dieser Diplomarbeit vorgestellte Ansatz,
Open-Source-Produkte wie Apache, Zend Framework, Ext JS und JW FLV Media
Player mit einer flexiblen Software-Architektur zu verbinden, eine extrem leistungsstarke Möglichkeit bietet, browserbasierte Anwendungen zu erstellen.
Anhang
71
8 Anhang
A Literaturverzeichnis...............................................................................................................72
B Tabellenverzeichnis................................................................................................................76
C Abbildungsverzeichnis...........................................................................................................77
D Datenstruktur............................................................................................................................78
E API..................................................................................................................................................81
F Anwendungsbeispiel...............................................................................................................82
G Verwendete Internet-Techniken........................................................................................83
G.1 HTTP....................................................................................................................................83
G.2 PHP ......................................................................................................................................84
G.3 MySQL.................................................................................................................................85
G.4 Javascript/Ajax................................................................................................................85
G.5 Audio und Video im Browser.....................................................................................86
Anhang
72
A
Literaturverzeichnis
BAR05:
PHP - Einstieg für Anspruchsvolle (2005)
Andreas Barchfeld - Addison-Wesley
ISBN: 3-8273-2181-6
FLA07:
JavaScript - Das umfassende Referenzwerk (2007)
David Flanagan - O'Reilly Verlag
ISBN: 978-3-89721-491-0
FRE08:
Entwurfsmuster von Kopf bis Fuß (2008)
Eric Freeman, Elisabeth Freeman - O'Reilly
ISBN: 3-89721-421-0
MOE08:
Zend Framework - Grundlagen und Referenz (2008)
Carsten Möhrke - Galileo Computing
ISBN: 978-3-8362-1068-3
SCH09:
PHP Design Patterns (2009)
Stefan Schmidt - O'Reilly Verlag
ISBN: 978-3-89721-864-2
T3N:
t3n 06/2007 - 08/2007 (2007)
yeebase media solution GbR
TAN01:
Computernetzwerke (2000)
Andrew S. Tanenbaum - Markt und Technik
ISBN: 3827295688
WIKI01:
Hypertext Transfer Protocol (2009)
http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
WIKI02:
Hypertext Transfer Protocol (2009)
http://de.wikipedia.org/wiki/Hypertext_Transfer_Protocol
WIKI03:
MySQL (2009)
http://de.wikipedia.org/wiki/Mysql
WIKI04:
JavaScript (2009)
http://de.wikipedia.org/wiki/JavaScript
WIKI05:
Ext (JavaScript library) (2009)
http://en.wikipedia.org/wiki/Ext_JS
WIKI06:
Adobe Integrated Runtime (2009)
http://de.wikipedia.org/wiki/Adobe_Integrated_Runtime
WIKI07:
CRUD (2009)
http://de.wikipedia.org/wiki/CRUD
WIKI08:
Fluent Interface (2009)
http://de.wikipedia.org/wiki/Fluent_Interface
Anhang
WIKI09:
73
XMP-RPC (2009)
http://de.wikipedia.org/wiki/XML-RPC
WIKI11:
Ogg Controversy (2009)
http://en.wikipedia.org/wiki/Ogg_controversy
WIKI12:
Wikipedia: Model-view-controller (2009)
http://en.wikipedia.org/wiki/Model-view-controller
WIKI13:
Sandbox (2009)
http://de.wikipedia.org/wiki/Sandbox
WIKI14:
Digitale Rechteverwaltung (2009)
http://de.wikipedia.org/wiki/Digitale_Rechteverwaltung
WIKI15:
Bootstrapping (2009)
http://de.wikipedia.org/wiki/Bootstrapping_(Informatik)
WIKI16:
Persistenz (2009)
http://de.wikipedia.org/wiki/Persistenz_(Informatik)
WIKI17:
Entwurfsmuster (2009)
http://de.wikipedia.org/wiki/Entwurfsmuster
WWW01:
MySQL-Tabellentypen: Ein Vergleich (2009)
http://phpperformance.de/mysql-tabellentypen-ein-vergleich/
WWW02:
Speicher-Engines und Tabellentypen: (2009)
http://dev.mysql.com/doc/refman/5.1/de/storage-engines.html
WWW03:
Zend Framework: Documentation (2009)
http://framework.zend.com/manual/de/coding-standard.html
WWW04:
phpDocumentor (2009)
http://manual.phpdoc.org
WWW05:
Cutting EdgeSingle Page Interface und AJAX-Muster (2009)
http://msdn.microsoft.com/de-de/magazine/cc507641.aspx
WWW06:
LAMP (2009)
http://de.wikipedia.org/wiki/LAMP
WWW08:
Was in einem Web ohne Flash möglich ist (2009)
http://www.netzwelt.de/news/80040-webstandards-web-ohne-flash-moeglich.html
WWW09:
JW FLV Media Player 4.5 (2009)
http://www.longtailvideo.com/players/jw-flv-player/
WWW10:
Ext.Direct Remoting Specification (2009)
http://extjs.com/products/extjs/direct.php
WWW11:
Top 10 2007 OWASP (2007)
http://www.owasp.org/index.php/Top_10_2007
WWW12:
Apache Tutorial: .htaccess files (2009)
http://httpd.apache.org/docs/2.2/howto/htaccess.html
Anhang
WWW13:
74
Der Dispatcher (2009)
http://framework.zend.com/manual/de/zend.controller.dispatcher.html
WWW14:
Reflection (2009)
http://www.php.net/manual/de/language.oop5.reflection.php
WWW15:
Lazy Acquisition (2001)
http://www.kircher-schwanninger.de/michael/publications/LazyAcquisition.pdf
WWW16:
Ext.Direct - Server-side Stacks (2009)
http://www.extjs.com/forum/showthread.php?t=67992
WWW17:
getID3() (2009)
http://getid3.org/
WWW18:
Firebug (2009)
https://addons.mozilla.org/de/firefox/addon/1843
WWW19:
FirePHP (2009)
http://www.firephp.org/
WWW20:
Minify (2009)
http://code.google.com/p/minify/
WWW21:
Ext.Direct (2009)
http://www.extjs.com/products/extjs/direct.php
WWW22:
XML-RPC Homepage (2009)
http://www.xmlrpc.com/
WWW23:
XMLRPC for Actionscript 3.0 (2009)
http://danielmclaren.net/2007/08/03/xmlrpc-for-actionscript-30-free-library/
WWW24:
Songbird (2009)
http://getsongbird.com/
WWW25:
Developer's Guide: Data API Protocol (2009)
http://code.google.com/intl/de-DE/apis/youtube/2.0/developers_guide_protocol_audience.html
WWW26:
Flow3 Persistence (2009)
http://flow3.typo3.org/documentation/manuals/flow3/flow3.persistenceframework/
WWW27:
Tine 2.0 Application Layout (2009)
http://www.tine20.org/wiki/index.php/Developers/Concepts/Application_Layout
WWW28:
A Study of Ajax Performance Issues (2009)
http://www.coachwei.com/blog/_archives/2008/1/22/3480119.html
WWW29:
Browser Verbreitung (2009)
http://gs.statcounter.com/#browser_version-ww-daily-20090321-20090321-bar
WWW30:
Verbreitung von Webtechnologien (2009)
http://www.webmasterpro.de/portal/webanalyse-technologien.html
WWW32:
Keeping Up With The Ajax Trend (2009)
http://www.developer.com/services/article.php/3562876/Keeping-Up-With-The-Ajax-Trend.htm
Anhang
WWW33:
75
SOA (2009)
http://www.computerwoche.de/soa-expertenrat/faq/
Anhang
B
76
Tabellenverzeichnis
Tabelle 1: Liste der implementierten Filter..............................................................................42
Tabelle 2: Liste der verfügbaren Konfigurationseinstellungen für Datenfelder........46
Tabelle 3: Verwendete View-Komponenten der Ext JS Library........................................53
Anhang
C
77
Abbildungsverzeichnis
Abbildung 1: Verbreitung der verschiedenen Browserversionen [WWW29]...........10
Abbildung 2: Screenshot Dateisystem........................................................................................19
Abbildung 3: Grundlayout...............................................................................................................20
Abbildung 4: Single Page Interface-Elemente innerhalb einer Seite [WWW05].......21
Abbildung 5: Aufbau des Clients...................................................................................................22
Abbildung 6: Datenstruktur............................................................................................................23
Abbildung 7: Anwendungsschichten...........................................................................................25
Abbildung 8: Datenfluss Client......................................................................................................29
Abbildung 9: Datenfluss Server.....................................................................................................30
Abbildung 10: UML Diagramm - Umsetzung Singleton Pattern.......................................34
Abbildung 11: UML Sequenzdiagramm - Controller, Models, Backend........................35
Abbildung 12: UML Mel_Core_Model_Item_Abstract............................................................36
Abbildung 13: UML-Diagramm - Zusammenhang List und Item.....................................38
Abbildung 14: UML Diagramm - Request und Filter.............................................................40
Abbildung 15: Baumstruktur der View-Komponenten.......................................................52
Abbildung 16: Screenshot der entwickelten Anwendung..................................................64
Abbildung 17: Funktionsweise von PHP [WIKI02]...............................................................84
Anhang
D
---------
78
Datenstruktur
phpMyAdmin SQL Dump
version 3.1.2deb1ubuntu0.1
http://www.phpmyadmin.net
Host: localhost
Erstellungszeit: 21. September 2009 um 14:43
Server Version: 5.0.75
PHP-Version: 5.2.6-3ubuntu4.2
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--- Datenbank: `mel`
-CREATE DATABASE `mel` DEFAULT CHARACTER SET latin1 COLLATE
latin1_swedish_ci;
USE `mel`;
-- ---------------------------------------------------------- Tabellenstruktur für Tabelle `audio`
-CREATE TABLE IF NOT EXISTS `audio` (
`id` int(11) NOT NULL auto_increment,
`user` int(11) NOT NULL,
`crdate` int(11) NOT NULL,
`tstamp` int(11) NOT NULL,
`deleted` tinyint(1) NOT NULL,
`filesize` int(11) NOT NULL,
`fileformat` varchar(20) NOT NULL,
`filename` varchar(255) NOT NULL,
`directory` varchar(255) NOT NULL,
`bitrate` float NOT NULL,
`length` float NOT NULL,
`title` varchar(255) NOT NULL,
`artist` varchar(255) NOT NULL,
`album` varchar(255) NOT NULL,
`genre` varchar(255) NOT NULL,
`comment` text NOT NULL,
`cover` varchar(255) NOT NULL,
`favorite` tinyint(1) NOT NULL,
`vote` int(11) NOT NULL,
`track` varchar(11) NOT NULL,
`bpm` float NOT NULL,
Anhang
79
`year` int(11) NOT NULL,
`hits` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
AUTO_INCREMENT=240 ;
-- ---------------------------------------------------------- Tabellenstruktur für Tabelle `audio_tags`
-CREATE TABLE IF NOT EXISTS `audio_tags` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;
-- ---------------------------------------------------------- Tabellenstruktur für Tabelle `audio_tags_mxm`
-CREATE TABLE IF NOT EXISTS `audio_tags_mxm` (
`audio` int(11) NOT NULL,
`tag` int(11) NOT NULL,
PRIMARY KEY (`audio`,`tag`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
-- ---------------------------------------------------------- Tabellenstruktur für Tabelle `playlists`
-CREATE TABLE IF NOT EXISTS `playlists` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) NOT NULL,
`user` int(11) NOT NULL,
`deleted` tinyint(1) NOT NULL,
`tstamp` int(11) NOT NULL,
`crdate` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;
-- ---------------------------------------------------------- Tabellenstruktur für Tabelle `playlists_entries`
Anhang
80
-CREATE TABLE IF NOT EXISTS `playlists_entries` (
`id` int(11) NOT NULL auto_increment,
`playlist` int(11) NOT NULL,
`audio` int(11) NOT NULL,
`sorting` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
AUTO_INCREMENT=238 ;
-- ---------------------------------------------------------- Tabellenstruktur für Tabelle `users`
-CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL auto_increment,
`upload_dir` varchar(255) NOT NULL,
`email` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`deleted` int(11) NOT NULL,
`crdate` int(11) NOT NULL,
`tstamp` int(11) NOT NULL,
`password` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
Anhang
E
81
API
Eine mit dem phpDocumenter [WWW04] erstellte API ist auf der beiliegenden CD
zu finden oder im Web aufrufbar unter:
http://www.felixkrueger.net/mel/api
Anhang
F
82
Anwendungsbeispiel
Die installierte Anwendung ist im Web aufrufbar unter:
http://www.felixkrueger.net/mel/melone
Email: [email protected]
Passwort: melone
Anhang
G
83
Verwendete Internet-Techniken
G.1
HTTP
Das Hypertext Transfer Protocol bildet die Grundlage für den Austausch von Daten,
die zum Aufbau einer Webseite benötigt werden. Es befindet sich auf der Schicht 7
(Anwendungsschicht) des Internetprotokollstapels TCP/IP.
HTTP ist ein verbindungsloses Protokoll. Damit es Anwendungen möglich ist, Sitzungsdaten zu speichern, kann eine Session-ID erzeugt werden. Diese wird in den
Header-Daten als Cookie mitgesendet und erlaubt so das Entwickeln von Anwendungen, die sitzungsspezifische Daten benötigen.
Die wichtigsten HTTP-Request Methoden sind GET und POST. Mit ihnen fragt ein
Client eine bestimmte Datei mittels einer URL an und bekommt Sie vom Webserver
ausgeliefert. Es ist möglich, diesen Anfragemethoden Parameter zu übergeben, die
die Ausgabe steuern.
Verschiedene Statuscodes im Header geben an, ob die Anfrage erfolgreich war
(200), die Datei z.B. nicht gefunden wurde (404) oder ein nicht autorisierter
Zugriff vorliegt (403). [TAN01, Seite 129], [WIKI01]
Anhang
G.2
84
PHP
Abbildung 17: Funktionsweise von PHP [WIKI02]
PHP (PHP Hypertext Preprocessor) ist eine weit verbreitete Open-Source-Scriptsprache zum dynamischen Generieren von Webseiten. Der Quelltext wird zur Laufzeit ausgeführt und muss nicht vorher kompiliert werden.
Im Wesentlichen wird PHP dazu benutzt, serverseitig Textdateien zu generieren,
die über das Hypertext Transfer Protocol von einem Client abgerufen werden. Die
Übergabe von GET- oder POST-Parametern kann dabei zu Steuerungszwecken verwendet werden (beispielsweise eine Seiten-ID). Es ist z.B. auch möglich PDFDateien oder Bilder mit PHP zu erzeugen.
PHP unterstützt eine große Anzahl von Datenbanken (wie z.B. MySQL), mit deren
Hilfe eine Trennung von Programmierung und Inhalt geschaffen werden kann.
In früheren Versionen wurde PHP hauptsächlich zur Bearbeitung von Formulardaten verwendet. Seit Version 5 besitzt PHP alle wichtigen Funktionen, die zum
objektorientierten Programmieren benötigt werden. Durch neue Sprachkonstrukte wie z.B. Überladung, Exceptions und Reflections ist die Scriptsprache PHP
so mächtig geworden, dass viele Webseiten komplett mit ihr generiert werden.
[BAR05 / Seite 68]
Anhang
G.3
85
MySQL
MySQL ist ein relationales Datenbank Management System und ist mit über sechs
Millionen Installationen das weltweit am meisten verbreitete System seiner Art. Es
wird häufig in Verbindung mit PHP eingesetzt und stellt mit seiner Structured
Query Language (SQL) ein flexibles System zur Speicherung von Daten dar.
[WIKI03]
Die Daten werden in einzelnen Tabellen gespeichert, die über Schlüssel mit einander verknüpft werden können.
Es gibt verschiedene Speicherengines für MySQL. Die am häufigsten verwendeten
sind MyISAM und InnoDB, wobei MyISAM schneller, aber nicht-transaktionssichere ist und InnoDB transaktionssicher, dafür aber etwas langsamer ist.
[WWW01, WWW02]
G.4
Javascript/Ajax
JavaScript ist eine clientseitige Scriptsprache, die heutzutage vor allem für DOMManipulationen im Browser oder das clientseitige Überprüfen von Formulardaten
verwendet wird. Es ist eine „moderne, schlanke, dynamisch typisierte, objektorientierte, aber klassenlose Skriptsprache, die dennoch allen objektorientierten Programmierparadigmen unter anderem auch – aber eben nicht ausschließlich – auf
der Basis von Prototypen gerecht wird.“ [WIKI04]
Ajax (Asynchronous Javascript and XML) ist eine Technik, mit der per JavascriptAufruf Daten für eine Webseite nachgeladen werden, ohne dass dafür die komplette Webseite aktualisiert werden muss. Die Daten werden dabei in Form von
XML kodiert. In der Praxis wird anstatt von XML oft JSON (Javascript Object Notation) als Schnittstellenformat verwendet.
Es existieren zahlreiche Frameworks für Java Script, die die Programmierarbeit
wesentlich vereinfachen und mit wenigen Befehlen komplexe Animationen ermöglichen.
Anhang
G.5
86
Audio und Video im Browser
Die bisher einzig mögliche Variante um audiovisuelle Medien im Browser auszugeben, war es ein Plugin dafür einzusetzen. Solche gibt es für verschiedene Audiound Videoformate, die bekanntesten darunter sind Windows Media, Quicktime und
Real Media. Der Trend geht jedoch in die Richtung, ein Flash-Plugin zum Abspielen
solcher Medien zu verwenden, welches mittlerweile den höchsten Verbreitungsgrad besitzt. [WWW30] Neben dem Vorteil der hohen Reichweite besteht zudem
die Möglichkeit, das Aussehen des Players zu gestalten, was in den anderen Fällen
nur schwer bis gar nicht realisierbar ist.
Mit HTML 5 wird es bald eine zusätzliche Variante geben Audio und Video in den
Browser einzubetten. Der neu entwickelte Standard sieht vor, dass Browser diese
Medien in Zukunft ohne Plugin abspielen können. Die aktuellen Versionen von
Firefox und Safari haben diese Technologie bereits eingeführt, doch gibt es noch
Streitigkeiten zwischen den Browser-Herstellern bezüglich der unterstützten Formate, sodass ein einheitlicher Standard noch etwas auf sich warten lassen wird.
[WIKI11]